zoukankan      html  css  js  c++  java
  • 方法代码Strus2 + pagertaglib 实现分页总结

    本文是一篇关于方法代码的帖子

        看到坤哥的博客,自己竟然也现出这个问题了,那就在这行进一下总结习学!

        

    尚学堂的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代码如下:

        每日一道理
    生命不是一篇"文摘",不接受平淡,只收藏精彩。她是一个完整的过程,是一个"连载",无论成功还是失败,她都不会在你背后留有空白;生命也不是一次彩排,走得不好还可以从头再来,她绝不给你第二次机会,走过去就无法回头。
    package com.ssh.utile;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.struts2.ServletActionContext;
    
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
    
    public class PagerInterceptor extends MethodFilterInterceptor {
    	public static final String PAGE_SIZE_NAME = "ps";
    	@Override
    	protected String doIntercept(ActionInvocation invocation) throws Exception {
    		String result="";	
    		try {
    		   //在调用真正的方法之前在程线内设置pagesize和offset.
    		   HttpServletRequest httpRequest = ServletActionContext.getRequest();
    		   SystemContext.setOffset(getOffset(httpRequest));
    		   SystemContext.setPagesize(getPagesize(httpRequest));
    		   //调用真正的方法.
    		   result=invocation.invoke();
    		} catch (Exception e) {
    		   e.printStackTrace();
    		   throw new RuntimeException("分页时传入数参错出!");
    		}finally {
    		   //不管是不是调用真正的方法,都要移除程线内的ThreadLocal对象.
    		   SystemContext.removeOffset();
    		   SystemContext.removePagesize();
    		}
    	   return result;
    	}
    
    	private int getOffset(HttpServletRequest request) {
    	   int offset = 0;
    	   try {
    	    offset = Integer.parseInt(request.getParameter("pager.offset"));
    	   } catch (Exception ignore) {
    	   }
    	   return offset;
    	}
    	private int getPagesize(HttpServletRequest httpRequest) {
    	   // 首先判断request中是不是有pagesize数参,如果有这个数参,明证客户端正在请求变改每页示显的行数
    		   String psvalue = httpRequest.getParameter(PAGE_SIZE_NAME);
    		   if (psvalue != null && !psvalue.trim().equals("")) {
    			    Integer ps = 0;
    			    try {
    			    	ps = Integer.parseInt(psvalue);
    			    } catch (Exception e) {
    			    }
    			    if (ps != 0) {
    			    	httpRequest.getSession().setAttribute(PAGE_SIZE_NAME, ps);
    			    }
    		   }
    		   // 判断前当session中是不是有pagesize的值
    		   Integer pagesize = (Integer) httpRequest.getSession().getAttribute(PAGE_SIZE_NAME);
    		   if (pagesize == null) {
    			    Integer pageSize= Integer.parseInt(ServletActionContext.getServletContext().getInitParameter("pageSize"));//这里没有用try截拦异常,以为在它的下层截拦了异常.此处行进了每页录记数可配置的扩展功能.
    			    httpRequest.getSession().setAttribute(PAGE_SIZE_NAME, pageSize);
    			    return pageSize;
    		   }
    		   return pagesize;
    		}
    	}

        在Struts2的配置文件中配置如下:

    <interceptors>
    		    <interceptor name="pager" class="com.ssh.utile.PagerInterceptor" />
    		    <interceptor-stack name="myInterceptor">
    		    	<interceptor-ref name="pager">
    		    		<!--<param name="includeMethods">queryUser</param>-->
    		    	</interceptor-ref>
    	    		<interceptor-ref name="defaultStack"></interceptor-ref>
    		    </interceptor-stack>
    		</interceptors>
    <action name="user" class="userAction" >
    	     	<result name="showQuery">/showQuery.jsp</result>
    	    	<result name="error">/error.jsp</result>
    	    	<result name="showUpdate">/update.jsp</result>	    	
    	    	<result name="success">/pub_add_success.jsp</result>
    	    	<interceptor-ref name="myInterceptor"></interceptor-ref>   	
    	   </action>

        在web.xml中入加下面的配置:

        

    <context-param>
       <param-name>page_size</param-name>
       <param-value>5</param-value>
    </context-param>

        再加一句,应用Spring的AOP程编也是完全可以实现的.

    文章结束给大家分享下程序员的一些笑话语录: 现在社会太数字化了,所以最好是有一个集很多功能于一身的设备!

  • 相关阅读:
    React路由基本的使用(一)
    Codeforces Round #627 (Div. 3) C
    Codeforces Round #627 (Div. 3) B
    Codeforces Round #627 (Div. 3) A
    hdu2049 不容易系列之(4)——考新郎(组合,错排)
    Codeforces Round #626 (Div. 2) E. Instant Noodles(二分图,最大公因数)
    Codeforces Round #626 (Div. 2) D. Present(位运算)
    逆元的计算方法
    Educational Codeforces Round 83 D. Count the Arrays(组合,逆元,快速幂)
    hdu4460 Friend Chains(记忆化广度优先搜索)
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3049891.html
Copyright © 2011-2022 走看看