`

使用ThreadLocal结合struts2的拦截器实现分页

阅读更多
1、定义PageModel类
public class PageModel {
	private int total;
	private List datas;
	private int pageSize;
	private int offset;
	
	public int getPageSize() {
		return pageSize;
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	public int getOffset() {
		return offset;
	}
	public void setOffset(int offset) {
		this.offset = offset;
	}
	public int getTotal() {
		return total;
	}
	public void setTotal(int total) {
		this.total = total;
	}
	public List getDatas() {
		return datas;
	}
	public void setDatas(List datas) {
		this.datas = datas;
	}
}




2、定义ThreadLocal类
public class MyThreadLocal {
	private static ThreadLocal tl = new ThreadLocal();
	
	public static void setValue(PageModel pm) {
		tl.set(pm);
	}
	
	public static PageModel getValue() {
		PageModel pm = (PageModel) tl.get();
		if(pm == null) {
			pm = new PageModel();
		}
		return pm;
	}
	
	public static  void remove() {
		tl.remove();
	}
}


3、定义我们自己的拦截器
public class PageModelInterceptor extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation invoke) throws Exception {
		int offset = 0;
		try {
			offset = Integer.parseInt(ServletActionContext.getRequest()
					.getParameter("pager.offset"));
		} catch (NumberFormatException e) {
		}
		int pageSize = 5;
		PageModel pm = MyThreadLocal.getValue();
		pm.setOffset(offset<0 ? 0 : offset);
		pm.setPageSize(pageSize<0 ? Integer.MAX_VALUE : pageSize);
                  //将pagemodel中相关的分页数据设置好之后放到Threadlocal中
//在后台进行查询的时候从ThreadLocal中取出PageModel对象然后使用分页数据即可。
		MyThreadLocal.setValue(pm);
		try {
			return invoke.invoke();
		}finally {
//注意等到整个拦截器执行完成即一个ThreadLocal完成它的工作后要清除里面的内容
			MyThreadLocal.remove();
		}
	}
}



4、在struts.xml配置文件中加入我们的拦截器
<interceptors>
<!--定义拦截器 -->
	<interceptor name="pageModelInterceptor" class="com.bjsxt.oa.util.PageModelInterceptor"/>
			  <interceptor-stack name="myInterceptorStack">
                <interceptor-ref name="exception"/>
<!--加入我们自己定义的拦截器,在拦截器中把分页数据设置到ThreadLocal里然后再dao层取出用于分页 -->
                <interceptor-ref name="pageModelInterceptor"/>
                <interceptor-ref name="alias"/>
                <interceptor-ref name="servletConfig"/>
                <interceptor-ref name="i18n"/>
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="chain"/>
                <interceptor-ref name="debugging"/>
                <interceptor-ref name="scopedModelDriven"/>
                <interceptor-ref name="updatableInterceptor"/>
                <interceptor-ref name="modelDriven"/>
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="checkbox"/>
                <interceptor-ref name="multiselect"/>
                <interceptor-ref name="staticParams"/>
                <interceptor-ref name="actionMappingParams"/>
                <interceptor-ref name="params">
                  <param name="excludeParams">dojo\..*,^struts\..*,pager.offset</param>
                </interceptor-ref>
                <interceptor-ref name="conversionError"/>
                <interceptor-ref name="validation">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
                <interceptor-ref name="workflow">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
            </interceptor-stack>
		</interceptors>	

<default-interceptor-ref name="myInterceptorStack"/>		
1
1
分享到:
评论
1 楼 moment52 2013-08-04  
为什么会选择用拦截器,不用action呢

相关推荐

Global site tag (gtag.js) - Google Analytics