当前位置:首页 > 开发 > 系统架构 > 架构 > 正文

自定义OpenSessionInViewer过滤器

发表于: 2013-12-11   作者:alleni123   来源:转载   浏览次数:
摘要: 摘自孔浩视频 spring部分-17_spring_SSH整合02_OpenSessionInViewer的讲解 思路就是创建一个filter,这个filter在视图请求的过程中获取到Spring所管理的SessionFactory对象。 这样便解决了视图层Session无法获取的问题。 1. 首先创建一个OpenSessionFilter.java OpenSessio
摘自孔浩视频 spring部分-17_spring_SSH整合02_OpenSessionInViewer的讲解


思路就是创建一个filter,这个filter在视图请求的过程中获取到Spring所管理的SessionFactory对象。 这样便解决了视图层Session无法获取的问题。

1. 首先创建一个OpenSessionFilter.java

OpenSessionFilter

package com.lj.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class OpenSessionFilter implements Filter {
	
	
	//Spring的工厂,在init中获取
	private WebApplicationContext wac;
	private static SessionFactory factory;
	private static ThreadLocal<Session> sessionHolder=new ThreadLocal<Session>();
	
	private static void setSession(Session session){
		sessionHolder.set(session);
	}
	
	public static Session getSession(){
		return sessionHolder.get();
	}
	
	private static void removeSession(){
		sessionHolder.remove();
	}
	
	
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		 
		/**
		 * 在这里获取Spring的工厂信息,在init里面就只会执行一次
		 * 使用WebApplicationContextUtils.getWebApplicationContext(ServletContext)来获取Web中的Spring工厂。
		 * 这种手段非常重要,要熟悉
		 */
		 
		wac=WebApplicationContextUtils.getWebApplicationContext(filterConfig.getServletContext());
		//我们在beans.xml中定义的sessionFactory <bean id="sessionFactory">
		factory=(SessionFactory) wac.getBean("sessionFactory");
		
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {
		//开启session
		System.out.println("begin");
	    /** 要获取SessionFactory,需要先获取Spring的工厂
		 *  如果使用new ClassPathXmlApplicationContext(),就会产生一个新工厂,和Servlet初始化时的工厂是两个对象
		 *  必须通过其他方法来获取
		 *  在Spring中可以通过Web
		 */
		
		//这里不能用getCurrentSession,要用openSession()
		try {
			setSession(factory.openSession());
			chain.doFilter(req, res);
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//关闭session
		System.out.println("back");
	}

	@Override
	public void destroy() {

	}

}


2. 在web.xml中配置filter

<filter>
		<filter-name>mySessionInViewerFilter</filter-name>
		<filter-class>com.lj.filter.OpenSessionFilter</filter-class>
	</filter>
	<filter-mapping>
		
		<filter-name>mySessionInViewerFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>


Note: 注意这里如果使用的是struts2, 那么struts2的url-pattern也是/*,所有的请求都会被struts2的拦截器拦截, 这个filter也就不会起作用了。
因此必须要将这个filter的配置放在Struts2的前面,才能正常使用。



这时就可以在Dao层调用这个类来获取Session,例如:
	public List<Group> list() {
		// TODO Auto-generated method stub
		//return this.getSession().createQuery("from Group").list();
		return OpenSessionFilter.getSession().createQuery("from Group").list();
	}


这样web容器便会在视图层中获取Session,并执行相应的Session操作。





==========================
Spring已经提供了OpenSessionInViewerFilter, 一般直接配置Spring的就可以了。
 
	<filter>
		<filter-name>openSessionInViewerFilter</filter-name>
		<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>openSessionInViewerFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping> 

自定义OpenSessionInViewer过滤器

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
实现MVC自定义过滤器,自定义Area过滤器,自定义Controller,Action甚至是ViewData过滤器 MVC开发中
MVC开发中几种以AOP方式实现的Filters是非常好用的,默认情况下,我们通过App_Start中的FilterConfi
一、系统过滤器使用说明   1、OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以
一、系统过滤器使用说明   1、OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以
一、系统过滤器使用说明   1、OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以
原文地址:http://www.cnblogs.com/kissdodog/archive/2013/05/21/3090513.html 一、系统过滤器使用
原文地址:http://www.cnblogs.com/kissdodog/archive/2013/05/21/3090513.html 一、系统过滤器使用
AngularJS另一个特点就是提供了过滤器,可以通过操作UNIX下管道的方式,操作数据结果。   通过使
一、系统过滤器使用说明   1、OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以
在WEBfrom时代 membership作为系统默认的身份验证提供程序,貌似很好用,但ASP.NET没有开源,我们又
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号