您现在的位置: 爱51代码网 >> 范文 >> 文章正文
Strus2 + pager-taglib 实现分页

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] 下一页

  • 上一篇文章:

  • 下一篇文章: 没有了
  • 最新文章 热点文章 相关文章
    E-business suite system servic
    ZOJ 3700 Ever Dream 文章中单词
    TortoiseGit和msysGit安装及使用
    asp中有一段javascipt的网页鼠标
    sharepoint 2010 获取用户信息Us
    设计包含max函数的队列
    随机从数组中取出指定的不重复的
    mysql主从同步延迟方案解决的学习
    青岛科学六年级下册教材分析
    生日旅行总结
    sharepoint 2010 获取用户信息Us
    mysql主从同步延迟方案解决的学习
    生日旅行总结
    中小板生日快乐随感
    送生日快乐桑葚乳酪小蛋糕
    写给女儿的生日快乐
    总分公司财务核算
    恢复使用繁体字可行性研究报告
    青少年吸烟心理探析
    保险受益人制度相关问题的探讨
    linux内核启动时R2的值来历
    JS中setInterval、setTimeou
    javascript 中强制执行 toSt
    SQL Server UNIQUE失效
    SQLServer2005中的企业管理器
    SQL Sever 如何修改主键数据
    sqlserver如何根据给出的时间
    解决SecureCRT连接linux超时
    dos编程:查询百度蜘蛛IP的命
    CSS下img图片多余空白或者是
     



    设为首页 | 加入收藏 | 网站地图 | 友情链接 |