`

自定义OpenSessionInViewer过滤器

阅读更多
摘自孔浩视频 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> 
分享到:
评论

相关推荐

    javaFilter自定义编码过滤器

    JavaFilter自定义编码过滤器知识点 一、Filter接口和 FilterChain接口 在 Java 中, Filter 接口和 FilterChain 接口是 Servlet 规范中的两个重要组件。 Filter 接口用于定义一个过滤器, FilterChain 接口用于将...

    GridControl的过滤器的自定义

    "GridControl 的过滤器自定义查询" DevExpress 的 GridControl 提供了强大的过滤器功能,允许开发者自定义查询条件以满足复杂的数据检索需求。在本文中,我们将探讨如何自定义 GridControl 的过滤器以实现复杂的...

    vue自定义过滤器,例如给文字加颜色

    vue.js的filter定义的方式,已经简单的demo,自定义过滤器如何给文字加颜色

    SpringSecurity学习之自定义过滤器的实现代码

    "SpringSecurity学习之自定义过滤器的实现代码" Spring Security学习之自定义过滤器的实现代码主要介绍了Spring Security学习之自定义过滤器的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有...

    Python Django模板之模板过滤器与自定义模板过滤器示例

    自定义模板过滤器则是在Django提供的过滤器基础上,扩展或修改现有功能,以满足特定需求。本文将结合实例,分析Django模板过滤器的功能、原理、使用方法以及在自定义模板过滤器时需要注意的相关操作事项。 首先,...

    EL、JSTL、自定义标签、过滤器的ppt

    EL、JSTL、自定义标签、过滤器的ppt

    Java使用Gateway自定义负载均衡过滤器

    Java 使用 Gateway 自定义负载均衡过滤器 Java 使用 Gateway 自定义负载均衡过滤器是指在 Java 项目中使用 Spring Cloud Gateway 框架来实现自定义的负载均衡过滤器,以解决多实例环境下的路由问题。 知识点一:...

    matlab自定义过滤器为先生的HDMI缩放.zip

    在本项目中,“matlab自定义过滤器为先生的HDMI缩放.zip”是一个包含MATLAB源码的压缩包,用于实现自定义的过滤器,主要用于处理HDMI信号的缩放问题。MATLAB是一种强大的数学计算和编程环境,特别适合进行信号处理和...

    在Django框架中自定义模板过滤器的方法

    ### 在Django框架中自定义模板过滤器的方法 #### 一、引言 Django作为最受欢迎的Python Web开发框架之一,提供了丰富的功能和强大的社区支持。在Django中,模板系统是一个非常重要的组成部分,用于处理前端展示...

    springboot整合swagger-bootstrap-ui,过滤器放开并解决自定义错误信息返回冲突-DEMO

    springboot整合swagger-bootstrap-ui,过滤器放开并解决自定义错误信息返回冲突-DEMO

    C# winfrom 自定义表单设计器

    **C# WinForm自定义表单设计器** 在.NET框架中,C#是一种广泛使用的编程语言,尤其在开发桌面应用程序时,WinForm是一个重要的选择。本文将深入探讨如何使用C#来构建一个自定义的WinForm表单设计器。这个设计器允许...

    SpringBoot的filter过滤器(源代码)

    SpringBoot的filter过滤器 一、过滤器的作用和概述 1.1 简述 1.2 使用场景 二、自定义过滤的两种方式 ...2.3.4自定义过滤器类UserLoginFilter.java 2.3.5 templates下的index页面 2.3.6被拦截后重定向的页面 2.3.7 测试

    自定义表单设计器演示版源码(C#).rar.rar

    自定义表单设计器是一种强大的工具,它允许用户根据自己的需求创建和定制各种数据输入界面,无需深入编程细节。本项目提供了C#语言实现的自定义表单设计器的演示版源码,这对于开发者来说是一个很好的学习资源,特别...

    【ASP.NET编程知识】ASP.NET mvc4中的过滤器的使用.docx

    使用自定义的授权过滤器,可以方便地实现各种授权逻辑,例如基于角色的访问控制、基于用户的访问控制等。 实现动作过滤器: 动作过滤器可以在动作方法前后执行,例如记录日志、检查参数等。开发者可以通过实现 ...

    Hangfire 仪表板的 一些授权过滤器_C#_代码_相关文件_下载

    在 "Hangfire.Dashboard.Authorization-master" 压缩包中,你将找到一组 C# 代码,这些代码提供了自定义授权过滤器的示例和实现。这些过滤器可以根据你的应用需求,比如用户身份验证、角色检查或其他业务规则,来...

    自定义Navigation导航器(支持动态配置)

    自定义Navigation导航器(支持动态配置) 自定义Navigation导航器(支持动态配置) 自定义Navigation导航器(支持动态配置) 自定义Navigation导航器(支持动态配置) 自定义Navigation导航器(支持动态配置) ...

    Vue过滤器的用法和自定义过滤器使用

    Vue提供了内置过滤器,如`capitalize`、`uppercase`、`lowercase`、`currency`等,但很多时候,我们需要创建自定义过滤器以满足特定的业务逻辑。自定义过滤器的定义语法如下: ```javascript Vue.filter('...

    安卓自定义时间选择器

    系统提供了预设的时间选择器对话框,但有时为了满足特定的UI设计或者功能需求,开发者需要自定义时间选择器。本教程将深入探讨如何在安卓平台上创建自定义的时间选择器。 首先,我们从基础开始。在安卓中,`...

    详解Angular的内置过滤器和自定义过滤器【推荐】

    Angular内置了多种过滤器,同时支持创建自定义过滤器,以满足特定项目的需求。 1. **货币格式化过滤器(currency)** Angular的`currency`过滤器用于将数值转换为货币格式。例如,`{{value | currency:'¥'}}`会将...

Global site tag (gtag.js) - Google Analytics