在使用spring容器的web应用中,业务对象间的依赖关系都可以用context.xml文件来配置,并且由spring容器来负责依赖对象 的创建。如果要在filter或者servlet中使用spring容器管理业务对象,通常需要使用WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext())来获得WebApplicationContext,然后调用WebApplicationContext.getBean(“beanName”)来获得对象的引用,这实际上是使用了依赖查找来获得对象,并且在filter或者servlet代码中硬编码了应用对象的bean名字。为了能在filter或者servlet中感知spring中bean,可采用如下步骤来实现:

    1、将filter或者servlet作为bean定义在context.xml文件中,和要应用的bean定义放在一起;2、实现一个filter代理或者servlet代理,该代理用WebApplicationContext来获得在context.xml中定义的filter或者servlet的对象,并将任务委托给context.xml中定义的filter或者servlet3、在web.xml中用ContextLoaderListener来初始化spring  的context,同时在filter代理或者servlet代理的定义中用初始化参数来定义context.xml中filter或者servlet的bean名字(或者直接受用代理的名称获得相应的filter或者servlet的名称)。4、在web.xml中定义filter代理或者servlet代理的mapping。利用这种方式就将filter或者servlet和业务对象的依赖关系用spring  来进行管理,并且不用在servlet中硬编码要引用的对象名字。具体实例如下:

1、spring与web配置
1.1 在applicationContext.xml中定义filter

  <bean id="springFilter" class="com.sirui.filter.SpringFilter">  <property name="name">  <value>SpringFilter</value>  </property>  </bean>说明:com.sirui.filter.SpringFilter为实现了javax.servlet.Filter接口的filter实现filter代理 实际上,filter代理不需要我们自己来实现,Spring提供了两种现成的filter代理 org.springframework.security.util.FilterToBeanProxy, org.springframework.web.filter.DelegatingFilterProxy,两者只是在web.xml中的配置上略有不同,下面就让我们一起看看如何在web.xml中进行配置。

1.2. 配置web.xml

 初始化spring的context ,因为是使用spring来管理,所以在使用filter前先要初始化spring的context,一般来说配置如下:

<context-param>

<param-name>contextConfigLocation</param-name>
<param-value>   /WEB-INF/applicationContext.xml  </param-value>  </context-param>  <listener>  <listener-class>  org.springframework.web.context.ContextLoaderListener  </listener-class>  

</listener>
2、Filter配置:
2.1 FilterToBeanProxy
<filter>

    <filter-name> springFilter </filter-name>  <filter-class>org.springframework.security.util.FilterToBeanProxy  </filter-class>  <init-param>  <param-name>targetBean</param-name>  <param-value>springFilter</param-value>  </init-param>
</filter>
说明:需要为FilterToBeanProxy提供上下文参数,这里我们配置的是targetBean属性,它告诉spring在context中查找的bean名称,所以当请求被过滤器拦截后FilterToBeanProxy会在applicationContext.xml中会查找id为springFilter的bean.我们也可以配置targetClass属性,意思就是查找该类型的bean.

2.2 DelegatingFilterProxy
<filter>

    <filter-name>springFilter</filter-name>  <filter-class>  org.springframework.web.filter.DelegatingFilterProxy  </filter-class>  

</filter>
说明:使用DelegatingFilterProxy时不需要配置任何参数,spring会根据filter-name的名字来查找bean,所以这里spring会查找id为springFilter的bean.
2.3 配置filter的mapping
<filter-mapping>

    <filter-name>springFilter</filter-name>  <url-pattern>/*</url-pattern>  

</filter-mapping>
filter配置完成。推荐使用DelegatingFilterProxy,应为配置上更简单。

3、Servlet 配置
Servlet的配置与Filter的配置十分相似
3.1 在applicationContext.xml中定义servlet

  <bean id="springServlet" class="com.sirui.servlet.SpringServlet">  <property name="name">  <value>SpringServlet</value>  </property>  </bean>

说明:com.sirui.servlet.SpringServlet继承自 javax.servlet.http.HttpServlet
3.2 实现servlet代理,与filter不同,spring没有为servlet提供代理实现,需要我们自己来创建,不过放心,创建一个servlet代理十分简单,一个具体的实现如下:
package com.sirui.servlet;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class ServletToBeanProxy extends GenericServlet {

private String targetBean;
private Servlet proxy;
public void init() throws ServletException {  this.targetBean = getInitParameter("targetBean");  getServletBean();  proxy.init(getServletConfig());  

}
public void service(ServletRequest req, ServletResponse res)

       throws ServletException, IOException {  proxy.service(req, res);
}
private void getServletBean() {  WebApplicationContext wac = WebApplicationContextUtils  .getRequiredWebApplicationContext(getServletContext());  this.proxy = (Servlet) wac.getBean(targetBean);
}  

}
说明:相信看了代码就明白了,它利用targetBean属性在spring中查找相应的servlet,这很像FilterToBeanProxy的方式,所以我为其取名为ServletToBeanProxy。当然,我们也可以使用类似于DelegatingFilterProxy的方式,只需要将上述代码中标记为黄色的部分修改为this.targetBean=this.getServletName();即可,我们相应的命名为DelegatingServletProxy。

    配置web.xml和初始化spring的context 与filter中的说明一致,不再赘述。         

3.3 ServletToBeanProxy
<servlet>

    <servlet-name>springServlet</servlet-name>  <servlet-class>  com.sirui.servlet.proxy.ServletToBeanProxy  </servlet-class>  <init-param>  <param-name>targetBean</param-name>  <param-value>springServlet</param-value>  </init-param>  <load-on-startup>1</load-on-startup>  

</servlet>
3.4DelegatingServletProxy
<servlet>

    <servlet-name>springServlet</servlet-name>  <servlet-class>  com.sirui.servlet.proxy.DelegatingServletProxy  </servlet-class>  <load-on-startup>1</load-on-startup>
</servlet>

3.5 配置servlet的mapping
<filter-mapping>

    <filter-name>springServlet</filter-name>  <url-pattern>/servlet/*</url-pattern>
</filter-mapping>

servlet的配置完成。推荐使用DelegatingServletProxy,应为配置上更简单。

更多技术分享尽在java乐园

如何使用Spring管理Filter和Servlet相关推荐

  1. spring过滤器Filter 、 拦截器Interceptor 、 切片Aspect 详解

    springboot 过滤器Filter vs 拦截器Interceptor vs 切片Aspect 详解 1 前言 最近接触到了过滤器和拦截器,网上查了查资料,这里记录一下,这篇文章就来仔细剖析下过 ...

  2. 【spring boot2】第8篇:spring boot 中的 servlet 容器及如何使用war包部署

    嵌入式 servlet 容器 在 spring boot 之前的web开发,我们都是把我们的应用部署到 Tomcat 等servelt容器,这些容器一般都会在我们的应用服务器上安装好环境,但是 spr ...

  3. spring boot filter配置方式

    spring boot 加载外部filter方式 spring boot filter两种配置方式 1.自定义filter配置 2.加载外部jar包配置 spring boot filter两种配置方 ...

  4. 170630、springboot编程之普通类中调用spring管理的bean对象

    我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用 ...

  5. 在普通java类里获取Spring管理的bean

    转自:http://blog.csdn.net/a9529lty/article/details/42145545 如何取得Spring管理的bean  (请用第3种方法): 1.servlet方式加 ...

  6. 【spring】在servlet中注入spring的bean,servlet容器和spring容器

    一.Servlet容器 Servlet的整个生命周期好象都是由Servlet容器来处理的. 如果把它硬放到Spring容器中去创建,Servlet对象是可被Spring容器建出来,但Servlet容器 ...

  7. spring学习之将类交给spring管理,bean的注入,scope,集合注入,自动装配,生命周期,迟加载

    一.将类交给spring管理(IOC) 1.将类交给spring容器管理 如何将一个类交给spring容器进行管理呢? 方法很简单,只需要在applicationContext.xml中加入对应的xm ...

  8. Spring Boot Filter过滤器 实现登录

    Spring Boot Filter过滤器 实现登录 Filter类 package com.citi.test;import java.io.IOException;import javax.ser ...

  9. spring security filter获取请求的urlpattern

    序 本文主要讲一下如何在spring security filter里头获取请求的HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE BEST_MATCHIN ...

最新文章

  1. UVALive 4216 Pole Position
  2. MyBatis子查询
  3. 接下来学习计划2020.11.9
  4. css内容渐入效果实现
  5. The content of element type configuration must match (properties?,settings?,typeAliases?,typeHand...
  6. SAP License:ERP厂商比较
  7. 使用过滤器实现网站访问计数器的功能
  8. 解决win2003默认不能使用移动硬盘的问题
  9. CSS3弹性盒模型flexbox布局基础版
  10. edius隐藏快捷键_EDIUS快捷键集锦
  11. Android虚拟机上安装apk软件指南
  12. 百度地图地图API(常用)
  13. 苹果开发证书导出P12的问题
  14. 常用的字符串方法大全
  15. python unit test什么意思_Pycharm上python和unittest两种姿势傻傻分不清楚
  16. mes系统和plc通讯案例_MES与PLC实时通信系统研究
  17. 商城项目15_采购需求、合并采购单、领取采购单、完成采购、仓库流程图
  18. 低版本360浏览器下,PDF.js部分文字显示不全的问题
  19. avro-java,proto-java
  20. git撤回上一次的提交

热门文章

  1. java 大整数编程_Java编程--RSA算法中的大整数运算
  2. 大湾区菜篮子基地 谋定·农业大健康-林裕豪:从玉农业再次入选
  3. CentOS7安装MySQL并设置远程登录
  4. 如何快速下载maven依赖jar包
  5. Java多线程使用场景
  6. 动态创建的 CEdit 被限制长度,增加 ES_AUTOHSCROLL 属性;被无法Tab激活焦点,增加 WS_TABSTOP 属性(转)...
  7. Hibernate中启用日志
  8. 小心as陷阱(c#)
  9. 研究阿里钉钉近三年,我们总结了10大企业级产品的营销套路
  10. 一名优秀的初创企业员工怎么做好工作计划