项目:ht为了防止tp:/和谐/请去掉m/share/汉字link?shareid=446316952&uk=672642110
2014年12月9日星期二(jfinal)
今天是第一天入职,学习jfinal
    从表中可以看出, JFinal访问一个确切的Action(Action定义见3.2节)需要使用controllerKey与 method 来精确定位,当 method 省略时默认值为 index。urlPara 是为了能在 url 中携带参数值,urlPara 可以在一次请求中同时携带多个值,JFinal 默认使用减号“-”来分隔多个值(可通过 constants.  setUrlParaSeparator(String)设置分隔符) ,在 Controller 中可以通过 getPara(int index)分别取出这些值。controllerKey、method、urlPara这三部分必须使用正斜杠“/”分隔。
    注意,controllerKey 自身也可以包含正斜杠“/” ,如“/admin/article” ,这样实质上实现了struts2的namespace功能。
记忆技巧: 第一个参数为 String 类型的将获取表单或 url 中问号挂参的域值。第一个参数为 int 或无参数的将获取 urlPara 中的参数值。
2014年12月10日星期三
1.注意打字质量,几次打错字而出错!
2.理清逻辑思路,居然出现没有配置l
3.对陌生的质疑使我畏葸不前,要自信!
1.关于add
1.首先,页面是添加
<form action="/student/save" method="post">
    姓名:<input type="text" namejfinal项目实例="student.studentname"/>${studentnameMsg!}${studentnameLMsg!}
        </form>
2.l
<filter>
        <filter-name>jfinal</filter-name>
        <filter-class>JFinalFilter</filter-class>
        <init-param>
            <param-name>configClass</param-name>
            <param-value>fig.DemonConfig</param-value>
        </init-param>
    </filter>
   
    <filter-mapping>
        <filter-name>jfinal</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
3.demonconfig
/**
    * 配置路由
    */
    public void configRoute(Routes me) {
        me.add("/", StudentController.class);
        me.add("/student", StudentController.class);
        //me.add("/classes", StudentController.class);
       
    }
4.StudentControllersave方法
@Before(StudentValidator.class)
    public void save() {
        Student student = getModel(Student.class);
        student.save();
        forwardAction("/student");
    }
5.StudentValidator拦截
protected void validate(Controller c) {
        // 验证表单域name,返回信息key,返回信息value
        validateRequiredString("student.studentname", "studentnameMsg", "请输入学生名册");
        这里也可以用正则验证!validateRegex(field, regExpression, errorKey, errorMessage)
    }
6.反馈
7.转回/student,无参调用index()方法
@Before(StudentInterceptor.class)
    public void index() {
       
        List<Student> list = Student.dao.find("select * from student");
        System.out.println(list);
       
        setAttr("studentList", list);
       
        render("/index.html");
    }
8.StudentInterceptor拦截
public class StudentInterceptor implements Interceptor {
    public void intercept(ActionInvocation ai) {
        System.out.println("Before action invoking");
        ai.invoke();
        System.out.println("After action invoking");
    }
}
9.执行后
render("/index.html");
10.到index页面
<#list studentList as student>
      <tr>
                <td> ${student.studentname} </td>
                <td> ${student.studentage}</td>
                <td> ${student.studentsex} </td>
                <td>${Classes().classesname} </td>
          <td> <a href="/student/delete/${student.studentid}">删除</a>
          <a href="/student/get/${student.studentid}">修改</a> </td>
        </tr>
</#list>
2.关于delete
1.在页面传值
<a href="/student/delete/${student.studentid}">删除</a>
2.同添加一样,转到StudentControllerdelete方法
public void delete() {
        //获取表单域名为studentID的值
        //Student.dao.deleteById(getPara("studentID"));
        //获取url请求中第一个值
        Student.dao.deleteById(getParaToInt());
        forwardAction("/student");
       
    }
3.关于update
1.页面传值
<a href="/student/get/${student.studentid}">修改</a>
2.同添加一样,转到StudentControllerget方法
public void get() {
        Student student = Student.dao.findById(getParaToInt());
       
        setAttr("student", student);
       
        render("/index2.html");
    }
3.转到index2,提取修改的内容
<form action="/student/update" method="post">
            <input type="text" name="student.studentid" value="${student.studentid}"/>
            姓名:
            <input type="text" name="student.studentname"  value="${student.studentname}"/>
            <br />
            年龄:
            <input type="text" name="student.studentage" value="${student.studentage}"/>
            <br />
            性别:
            <input type="text" name="student.studentsex" value="${student.studentsex}"/>
            <br />
            班级:
            <input type="text" name="student.classesid" value="${student.classesid}" />
            <br />
            <input type="submit" value="保存" />
        </form>
4.提交到StudentControllerupdate()方法
public void update() {
        Student student = getModel(Student.class);
       
        student.update();
        forwardAction("/student");
    }
4.设置view视图为JSP
public void configConstant(Constants me) {
  me.setDevMode(true);
  me.setViewType(ViewType.JSP);
}
5.访问路径,同struts的命名空间
/**
    * 配置路由
    */
    public void configRoute(Routes me) {
        me.add("/", StudentController.class);
        me.add("/student", StudentController.class);
        //me.add("/classes", ClassController.class);
       
    }
注解ActionKey(“/add”)将打破原有路由,可以直接访问/add,而不是/student/add
@ActionKey("/add")
    public void add() {
       
        render("/add.html");
       
    }
2014年12月11日星期四
使用jfinal放到tomcat运行出错!
1.MyEclipse中tomcat启动错误;原因是没有为tomcat配置JDK
2.在发布的项目里要写绝对路径,不然出现资源不到错误
1.开始使用jfinal自带服务是这样的
<a href="/student/add">添加</a>
2.删掉自带服务,放进tomcat后要配置路径
  <a href="${contextPath}/student/add">添加</a>
3.需要在config里配置上下文路径
public void configHandler(Handlers me) {
        me.add(new ContextPathHandler("contextPath"));//设置上下文路径
    }
3.对映射路径的理解
在访问index()方法时,里面可以使用render系列方法,这时候就要考虑到路径的问题。上面这两条看的时候不注意,在项目实践中发现大有问题。加“/”表示绝对路径,就要写全以webroot为根的路径,“/”就是代表webroot,如果下面有个student文件夹,则访问student的里面的index.html就要render(“/student/index.html”);而第一列则表示相对所映射路径的位置,这个映射路径是在rout路由里面配置
    public void configRoute(Routes me) {
        System.out.println("这里进入到config路由");
        me.add("/", StudentController.class);
        me.add("/student", StudentController.class);
    }
前面一个参数表示映射到的路径,这样添加映射的结果就是我可以直接访问该映射路径下的文件了,因此,我可以直接render(“index.html”);注意:千万不要加”/”
4.页面列表显示
5.页面中重复元素提取
当页面出现重复的元素的时候,比如添加和修改有共同的部分
<form action="${contextPath}/user/doAddUser" method="post">
    <#include "userform.html">
  </form>
但要求userform.html要重新设置编码,设置为utf-8,设置长度和大小防止有人捣乱
6.更新出错
没有主键,应当如下设置
<p><input type="hidden" value="${(user.id)!''}" name="user.id"></p>
7.分页
1.后台是这样的
String sql = "from t_user order by id desc";
        int pageNum = getParaToInt("pageNum", 1);//默认值是1
        setAttr("pageNum", pageNum);
        setAttr("objectlist",User.dao.paginate(pageNum, 2, "select *", sql));
        render("index.html");//即这里可省略
2.前台显示是这样的
<#list objectlist.list as user>
                  <tr>
                      <td>${user.id}</td>
                      <td>${user.username}</td>
                      <td>${alname}</td>
                      <td>${bile}</td>
                      <td>${user.address}</td>
                      <td>
<a href="${contextPath}/user/delteById/${user.id}">删除</a>
<a href="${contextPath}/user/queryUserById/${user.id}">修改</a>
                      </td>
                  </tr>
</#list>
</table>
<P>当前第${pageNum}页,总共:${alRow}条,总共:${alPage}页</P>
关键是objectlist.list这里,是因为分页又是一个list,再次取出来,
关于分页的源码来自jfinal-1.8-bin-with-src.jar/com.jfinal.plugin.activerecord/Page.class
修改后
<#List() as user>
                  <tr>
                      <td>${user.id}</td>
                      <td>${user.username}</td>
                      <td>${alname}</td>
                      <td>${bile}</td>
                      <td>${user.address}</td>
                      <td>
                          <a href="${contextPath}/user/delteById/${user.id}">删除</a>
                          <a href="${contextPath}/user/queryUserById/${user.id}">修改</a>
                      </td>
                  </tr>
              </#list>
          </table>
          <P>当前第${userPage.pageNumber}页,总共:${alRow}条,总共:${alPage}页</P>
          <#include "/common/_paginate.html" />
    <@paginate currentPage=userPage.pageNumber alPage actionUrl="${contextPath}/user/" />
/**
    * 查询所有
    */
    public void index(){//假如页面和方法一致,默认跳到方法名为名称的页面
        setAttr("userPage", User.dao.paginate(getParaToInt(0, 1), 5));
    }
public class User extends Model<User> {
    private static final long serialVersionUID = 1L;
    public static User dao = new User();
    /**
    * 所有 sql 写在 Model 或 Service 中,不要写在 Controller 中,养成好习惯,有利于大型项目的开发与维护
    */
    public Page<User> paginate(int pageNumber, int pageSize) {
        return paginate(pageNumber, pageSize, "select *", "from t_user order by id asc");
    }
}
8.
1.global全局
这个要配置在config里面
public void configInterceptor(Interceptors me) {
        me.add(new GlobalTestInterceptor());   
    }
2.ControllerInterceptor
@Before(ControllerTestInterceptor.class)
public class InterceptorController extends Controller{
3.ActionInterceptor
@Before(ActionTestInterceptor.class)
    public void index(){
        System.out.println("这是中间执行方法");
        renderText("success");
    }
4.拦截效果
5.清除
1)清除上一级
@ClearInterceptor//清除上一级(Controller级别)
    public void destroyControllerInterceptor(){
       
        System.out.println("这是清除上一级之后的");
        renderText("successful");
    }
清除效果
2)清除多级
@ClearInterceptor(ClearLayer.ALL)//清除上一级(Controller级别)
    public void destroyAllInterceptor(){
       
        System.out.println("这是清除多级之后的");
        renderText("successfully");
    }
清除效果
6.
更高级的拦截,Handler
public void configHandler(Handlers me) {
        me.add(new FakeStaticHandler());
        /**设置网站基本参数**/
        me.add(new EnterParaHandler());
        /**设置访问监控**/
        //me.add(new VisitLogHandler());
    }
web请求发出后,Handler首先接管请求,然后才是。因此,可以在这里进行路径拦截设置。
9.事物

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。