jfial学习笔记.docx
《jfial学习笔记.docx》由会员分享,可在线阅读,更多相关《jfial学习笔记.docx(21页珍藏版)》请在冰豆网上搜索。
jfial学习笔记
项目:
ht为了防止tp:
/和谐/yun.baidu.co请去掉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(intindex)分别取出这些值。
controllerKey、method、urlPara这三部分必须使用正斜杠“/”分隔。
注意,controllerKey自身也可以包含正斜杠“/”,如“/admin/article”,这样实质上实现了struts2的namespace功能。
记忆技巧:
第一个参数为String类型的将获取表单或url中问号挂参的域值。
第一个参数为int或无参数的将获取urlPara中的参数值。
2014年12月10日星期三
1.注意打字质量,几次打错字而出错!
2.理清逻辑思路,居然出现没有配置web.xml
3.对陌生的质疑使我畏葸不前,要自信!
1.关于add
1.首先,页面是添加
姓名:
${studentnameMsg!
}${studentnameLMsg!
}
2.到web.xml
jfinal
com.jfinal.core.JFinalFilter
configClass
com.demo.config.DemonConfig
jfinal
/*
3.到demonconfig
/**
*配置路由
*/
publicvoidconfigRoute(Routesme){
me.add("/",StudentController.class);
me.add("/student",StudentController.class);
//me.add("/classes",StudentController.class);
}
4.到StudentController的save方法
@Before(StudentValidator.class)
publicvoidsave(){
Studentstudent=getModel(Student.class);
student.save();
forwardAction("/student");
}
5.被StudentValidator拦截
protectedvoidvalidate(Controllerc){
//验证表单域name,返回信息key,返回信息value
validateRequiredString("student.studentname","studentnameMsg","请输入学生名册");
这里也可以用正则验证!
validateRegex(field,regExpression,errorKey,errorMessage)
}
6.反馈
7.转回/student,无参调用index()方法
@Before(StudentInterceptor.class)
publicvoidindex(){
Listlist=Student.dao.find("select*fromstudent");
System.out.println(list);
setAttr("studentList",list);
render("/index.html");
}
8.被StudentInterceptor拦截
publicclassStudentInterceptorimplementsInterceptor{
publicvoidintercept(ActionInvocationai){
System.out.println("Beforeactioninvoking");
ai.invoke();
System.out.println("Afteractioninvoking");
}
}
9.执行后
render("/index.html");
10.到index页面
<#liststudentListasstudent>
${student.studentname} | ${student.studentage} | ${student.studentsex} | ${student.getClasses().classesname} | 删除 修改 |
#list>
2.关于delete
1.在页面传值
删除
2.同添加一样,转到StudentController的delete方法
publicvoiddelete(){
//获取表单域名为studentID的值
//Student.dao.deleteById(getPara("studentID"));
//获取url请求中第一个值
Student.dao.deleteById(getParaToInt());
forwardAction("/student");
}
3.关于update
1.页面传值
修改
2.同添加一样,转到StudentController的get方法
publicvoidget(){
Studentstudent=Student.dao.findById(getParaToInt());
setAttr("student",student);
render("/index2.html");
}
3.转到index2,提取修改的内容
姓名:
年龄:
性别:
班级:
4.提交到StudentController的update()方法
publicvoidupdate(){
Studentstudent=getModel(Student.class);
student.update();
forwardAction("/student");
}
4.设置view视图为JSP
publicvoidconfigConstant(Constantsme){
me.setDevMode(true);
me.setViewType(ViewType.JSP);
}
5.访问路径,同struts的命名空间
/**
*配置路由
*/
publicvoidconfigRoute(Routesme){
me.add("/",StudentController.class);
me.add("/student",StudentController.class);
//me.add("/classes",ClassController.class);
}
注解ActionKey(“/add”)将打破原有路由,可以直接访问/add,而不是/student/add
@ActionKey("/add")
publicvoidadd(){
render("/add.html");
}
2014年12月11日星期四
使用jfinal放到tomcat运行出错!
1.MyEclipse中tomcat启动错误;原因是没有为tomcat配置JDK
2.在发布的项目里要写绝对路径,不然出现资源找不到错误
1.开始使用jfinal自带服务是这样的
添加
2.删掉自带服务,放进tomcat后要配置路径
添加
3.需要在config里配置上下文路径
publicvoidconfigHandler(Handlersme){
me.add(newContextPathHandler("contextPath"));//设置上下文路径
}
3.对映射路径的理解
在访问index()方法时,里面可以使用render系列方法,这时候就要考虑到路径的问题。
上面这两条看的时候不注意,在项目实践中发现大有问题。
加“/”表示绝对路径,就要写全以webroot为根的路径,“/”就是代表webroot,如果下面有个student文件夹,则访问student的里面的index.html就要render(“/student/index.html”);而第一列则表示相对所映射路径的位置,这个映射路径是在rout路由里面配置
publicvoidconfigRoute(Routesme){
System.out.println("这里进入到config路由");
me.add("/",StudentController.class);
me.add("/student",StudentController.class);
}
前面一个参数表示映射到的路径,这样添加映射的结果就是我可以直接访问该映射路径下的文件了,因此,我可以直接render(“index.html”);注意:
千万不要加”/”
4.页面列表显示
5.页面中重复元素提取
当页面出现重复的元素的时候,比如添加和修改有共同的部分
<#include"userform.html">
但要求userform.html要重新设置编码,设置为utf-8,设置长度和大小防止有人捣乱
6.更新出错
没有主键,应当如下设置
''}"name="user.id">
7.分页
1.后台是这样的
Stringsql="fromt_userorderbyiddesc";
intpageNum=getParaToInt("pageNum",1);//默认值是1
setAttr("pageNum",pageNum);
setAttr("objectlist",User.dao.paginate(pageNum,2,"select*",sql));
render("index.html");//即这里可省略
2.前台显示是这样的
<#listobjectlist.listasuser>
${user.id} | ${user.username} | ${user.realname} | ${user.mobile} | ${user.address} | 删除 修改 |
#list>
当前第${pageNum}页,总共:
${objectlist.totalRow}条,总共:
${objectlist.totalPage}页
关键是objectlist.list这里,是因为分页又是一个list,再次取出来,
关于分页的源码来自jfinal-1.8-bin-with-src.jar/com.jfinal.plugin.activerecord/Page.class
修改后
<#listuserPage.getList()asuser>
${user.id} | ${user.username} | ${user.realname} | ${user.mobile} | ${user.address} | 删除 修改 |
#list>
当前第${userPage.pageNumber}页,总共:
${userPage.totalRow}条,总共:
${userPage.totalPage}页
<#include"/common/_paginate.html"/>
<@paginatecurrentPage=userPage.pageNumbertotalPage=userPage.totalPageactionUrl="${contextPath}/user/"/>
/**
*查询所有
*/
publicvoidindex(){//假如页面和方法一致,默认跳到方法名为名称的页面
setAttr("userPage",User.dao.paginate(getParaToInt(0,1),5));
}
publicclassUserextendsModel{
privatestaticfinallongserialVersionUID=1L;
publicstaticUserdao=newUser();
/**
*所有sql写在Model或Service中,不要写在Controller中,养成好习惯,有利于大型项目的开发与维护
*/
publicPagepaginate(intpageNumber,intpageSize){
returnpaginate(pageNumber,pageSize,"select*","fromt_userorderbyidasc");
}
}
8.拦截器
1.global全局拦截器
这个要配置在config里面
publicvoidconfigInterceptor(Interceptorsme){
me.add(newGlobalTestInterceptor());
}
2.ControllerInterceptor
@Before(ControllerTestInterceptor.class)
publicclassInterceptorControllerextendsController{
3.ActionInterceptor
@Before(ActionTestInterceptor.class)
publicvoidindex(){
System.out.println("这是中间执行方法");
renderText("success");
}
4.拦截效果
5.清除拦截器
1)清除上一级
@ClearInterceptor//清除上一级拦截器(Controller级别)
publicvoiddestroyControllerInterceptor(){
System.out.println("这是清除上一级之后的");
renderText("successful");
}
清除效果
2)清除多级
@ClearInterceptor(ClearLayer.ALL)//清除上一级拦截器(Controller级别)
publicvoiddestroyAllInterceptor(){
System.out.println("这是清除多级之后的");
renderText("successfully");
}
清除效果
6.拦截器栈
更高级的拦截,Handler
publicvoidconfigHandler(Handlersme){
me.add(newFakeStaticHandler());
/**设置网站基本参数**/
me.add(newEnterParaHandler());
/**设置访问监控**/
//me.add(newVisitLogHandler());
}
当web请求发出后,Handler首先接管请求,然后才是拦截器。
因此,可以在这里进行路径拦截设置。
9.事物
2014年12月12日星期五
1.validator校验器
1.在页面上的显示
用户名称:
''}"maxlength="20"size="50"/>${(userNameMsg)!
'此字段不能为空'}
真实姓名:
''}"maxlength="20"size="50"/>${(realNameMsg)!
'此字段不能为空'}
此字段不能为空---这是在开始的时候显示的内容,如果不写,则不显示内容,出错了显示
2.在后台拦截
/**
*处理增加记录的方法
*/
@Before(UserValidator.class)
publicvoiddoAddUser(){
Useruser=getModel(User.class);//可以加一个参数取别名
user.set("userpass","123456");
booleanflag=user.save();
if(flag){
redirect("/user/");
}else{
renderText("Sorry,savefailure");
}
}
3.进入校验器拦截
publicclassUserValidatorextendsValidator{
/**
*错误处理
*/
protectedvoidhandleError(Controllerc){
StringactionKey=getActionKey();
Stringview=null;
c.keepModel(User.class);//保存上一次提交时候的表单记录
if("/user/doAddUser".equals(actionKey)){
//这个ActionKey表示添加记录操作
view="adduser.html";
}
if("/user/updateUser".equals(actionKey)){
System.out.println("zhelisssssssss");
view="edituser.html";
}
c.render(view);
}
/**
*校验方法
*/
protectedvoidvali