项目: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.到StudentController的save方法 |
@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.同添加一样,转到StudentController的delete方法 |
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.同添加一样,转到StudentController的get方法 |
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.提交到StudentController的update()方法 |
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小时内删除。
发表评论