Strus2 + pager-taglib 实现分页
尚学堂的OA 中实现时用Filter来为ThreadLocal对象的PagerSize和Offset设值.这样就可以动态加入值而不用修改manager层的代码逻辑,这是AOP(面向切面编程)的思想.
经本人测试直接把代码移植过来后在Struts1.x中使用没有问题,而在Strus2中使用时出现异常:ognl.OgnlException: target is null for setProperty(null, "offset", [Ljava.lang.String;@c3dfb9),查阅相关资料,有两种方法,第一种方法:在Struts2中加入修改配置webwork.devMode = false;第二种方法是:写一段这样的代码: HttpServletRequest request=ServletActionContext.getRequest(); if(request.getParameter("pager.offset")==null){ offset=0; }else{ offset=Integer.parseInt(request.getParameter("pager.offset")); System.out.println("offset:"+offset); }
经过分析第一种方法显然是在规避问题,根本没有解决.第二种方法加入后代码具有侵入性,这样就失去了AOP编程无侵入性的意义.我现在提供第三种方法:在原来的Action中加入这样一句:public Pager pager=new Pager();建一个Pager类,其中有两个变量pagerSize和offset并实现getter和setter方法;原因很简单提示一下,Sturts2支持Pojo.
本人在测试时发现使用Filter时是不能精确定位到列表显示的方法和页面上的,这样不是造成很多的不需要的重复吗.能不能精确定位到显示列表的方法上呢?采购流程
一开始想到了JDK的动态代理来实现,但这样需要在客户端调用时使用代理类.后来想到了使用Spring的AOP编程.这样确实能够实现刚才的想法.后来想到了使用Struts2的拦截器,拦截器是层层嵌套的能和Struts2很好的配合.OK,就使用拦截器了.去掉原来的Filter,改用PagerInterceptor代码如下:
[java] view plaincopyprint? 01.package com.ssh.utile; 02. 03.import javax.servlet.http.HttpServletRequest; 04. 05.import org.apache.struts2.ServletActionContext; 06. 07.import com.opensymphony.xwork2.ActionInvocation; 08.import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; 09. 10.public class PagerInterceptor extends MethodFilterInterceptor { 11. public static final String PAGE_SIZE_NAME = "ps"; 12. @Override 13. protected String doIntercept(ActionInvocation invocation) throws Exception { 14. String result=""; 15. try { 16. //在调用真正的方法之前在线程内设置pagesize和offset. 17. HttpServletRequest httpRequest = ServletActionContext.getRequest(); 18. SystemContext.setOffset(getOffset(httpRequest)); 19. SystemContext.setPagesize(getPagesize(httpRequest)); 20. //调用真正的方法. 21. result=invocation.invoke(); 22. } catch (Exception e) { 23. e.printStackTrace(); 24. throw new RuntimeException("分页时传入参数出错!"); 25. }finally { 26. //不管是否调用真正的方法,都要移除线程内的ThreadLocal对象.
[1] [2] 下一页
|