`

使用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呢

相关推荐

    Struts通过拦截器实现登录后跳转到登录前页面

    本话题主要探讨如何利用拦截器实现在用户成功登录后,将其重定向到登录前访问的页面。 首先,理解Struts2的拦截器工作原理。拦截器是基于Java的动态代理机制实现的,它们按照配置的顺序形成一个拦截器链,每个请求...

    Struts2权限控制

    **三、Struts2拦截器实现权限控制** 1. **自定义拦截器**:你可以创建自定义拦截器来实现特定的权限检查。在拦截器中,可以检查用户的登录状态、角色权限等,并根据检查结果决定是否允许请求继续执行Action。 2. **...

    Struts2 + Hibernate 分页程序实例

    1. **配置Struts2框架**:在`struts.xml`文件中配置Action、拦截器等,以实现业务逻辑的调用。 2. **编写DAO层**:利用Hibernate提供的API进行数据访问操作,如查询、更新等。 3. **实现分页逻辑**:在DAO层或...

    Struts2 学习 2

    “第八讲 threadlocal.docx”讲述了ThreadLocal在Struts2框架中的使用。ThreadLocal是Java中一个线程局部变量,每个线程都有自己的副本,避免了多线程环境下的数据共享问题。在Struts2中,ThreadLocal被用来存储和...

    Mybatis PageHelper分页插件是一个应用于Mybatis中的分页插件系统.rar

    分页插件PageHelper是通过mybatis的拦截器实现分页功能的,拦截sql查询请求,添加分页语句,最终实现分页查询功能。 一、分页插件PageHelper支持的数据库类型? Oracle,MySql,MariaDB,SQLite等 二、分页插件...

    Mybatis实现分页的注意点

    使用拦截器实现分页时,需要在拦截器中获取 Page 对象,并根据 Page 对象的参数来修改 SQL 语句,实现分页功能。 注意点 在使用 Mybatis 实现分页时,需要注意以下几点: * 需要在拦截器中正确地获取 Page 对象。...

    ThreadLocal应用示例及理解

    假设我们需要一个线程安全的计数器,可以使用ThreadLocal实现: ```java public class ThreadLocalCounter { private static ThreadLocal&lt;Integer&gt; counter = new ThreadLocal(); public static void increment...

    springmvc 拦截器

    Spring MVC 拦截器是基于Java的... - 对于需要跨拦截器共享数据的情况,可以使用ThreadLocal变量。 通过深入了解和熟练使用Spring MVC拦截器,开发者可以更好地控制请求处理流程,提高应用程序的灵活性和可扩展性。

    使用ThreadLocal管理“session”数据

    2. **为什么使用ThreadLocal管理Session?** 在传统的多线程Web应用中,由于多个线程可能会处理同一个请求,如果直接在全局变量中存储session信息,可能会导致线程安全问题。而ThreadLocal提供了一个线程局部的存储...

    ThreadLocal

    2. 使用`set`方法设置线程局部变量的初始值。 3. 在需要访问该变量的线程中,通过`get`方法获取变量副本。 4. 当不再需要使用ThreadLocal时,建议清除线程局部变量,防止内存泄漏。可以调用`remove`方法来实现。 ...

    java中ThreadLocal类的使用

    2. **请求上下文**:在Web应用中,可以使用`ThreadLocal`保存HttpServletRequest或Session对象,方便在同一个请求处理链路中访问。 3. **线程状态**:记录线程执行过程中的状态,例如事务管理、计数器等。 然而,...

    Spring事务处理-ThreadLocal的使用

    在Spring事务管理中,连接池与ThreadLocal结合,确保每个线程在事务内使用的是同一连接,避免了事务间的干扰。例如,`HikariCP`和`C3P0`等流行的连接池实现都支持与Spring事务管理的无缝集成。 在实际应用中,理解...

    ThreadLocal和事务

    在这个小型简单练习中,我们看到如何结合c3p0数据源、ThreadLocal以及事务管理,来创建一个在MVC三层结构中实现互不干扰的转账操作。 首先,让我们深入了解`ThreadLocal`。ThreadLocal是Java提供的一个线程绑定变量...

    ThreadLocal的几种误区

    然而,ThreadLocal在理解和使用过程中容易产生一些误区,这里我们将详细探讨这些常见的误解。 误区一:ThreadLocal是Java线程的一个实现 ThreadLocal并非Java线程的实现,它只是一个工具类,用于创建线程局部变量。...

    使用ThreadLocal解决代码分层问题

    javaee开发常见的模式有MVC模式,在C层中常常会再次分层,如:servlet(web层)、service(业务逻辑层)、dao(数据访问层),其中service和dao最容易混在一起,如转...所以,使用ThreadLocal可以解决这样的分层问题。

    Spring定时任务中使用ThreadLocal的坑

    NULL 博文链接:https://bijian1013.iteye.com/blog/2380233

Global site tag (gtag.js) - Google Analytics