zoukankan      html  css  js  c++  java
  • Spring管理Filter和Servlet(在servlet中注入spring容器中的bean)

    在使用spring容器的web应用中,业务对象间的依赖关系都可以用context.xml文件来配置,并且由spring容器来负责依赖对象 的创建。如果要在servlet中使用spring容器管理业务对象,通常需要使用WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext())来获得WebApplicationContext,然后调用WebApplicationContext.getBean("beanName")来获得对象的引用,这实际上是使用了依赖查找来获得对象,并且在servlet代码中硬编码了应用对象的bean名字。为了能在servlet中感知spring中bean,可采用如下步骤来实现:
    1- 将filter或servlet作为bean定义在context.xml文件中,和要应用的bean定义放在一起;
    2- 实现一个代理servlet,该servlet用WebApplicationContext来获得在context.xml中定义的servlet的对象,并将任务委托给context.xml中定义的servlet
    3- 在web.xml中用ContextLoaderListener来初始化spring 的context,同时在代理servlet的定义中用初始化参数来定义context.xml中servlet的bean名字。
    4- 在web.xml中定义代理servlet的mapping.
    利用这种方式就将servlet和业务对象的依赖关系用spring 来进行管理,并且不用在servlet中硬编码要引用的对象名字。

    具体实例如下:

    Filter

    1.       在applicationContext.xml中定义filter

           <bean id="springFilter" class="com.netqin.filter.SpringFilter">
                  <property name="name">
                      <value>SpringFilter</value>
                  </property>
           </bean>

    说明:com.netqin.filter.SpringFilter为实现了javax.servlet.Filter接口的filter

    2.       实现filter代理

    实际上,filter代理不需要我们自己来实现,Spring提供了两种现成的filter代理

    org.springframework.security.util.FilterToBeanProxy,

    org.springframework.web.filter.DelegatingFilterProxy,两者只是在web.xml中的配置上略有不同,下面就让我们一起看看如何在web.xml中进行配置。

    3.       配置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>

     Filter配置: 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.

    <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.

     配置filter的mapping

    <filter-mapping>

            <filter-name>springFilter</filter-name>

            <url-pattern>/*</url-pattern>

        </filter-mapping>

    OK!filter配置完成。推荐使用DelegatingFilterProxy,应为配置上更简单。

    Servlet

    Servlet的配置与Filter的配置十分相似

    1.       在applicationContext.xml中定义servlet

        <bean id="springServlet" class="com.netqin.servlet.SpringServlet">

                  <property name="name">

                      <value>SpringServlet</value>

                  </property>

           </bean>

    说明:com.netqin.servlet.SpringServlet继承自

    javax.servlet.http.HttpServlet

    2.       实现servlet代理

    与filter不同,spring没有为servlet提供代理实现,需要我们自己来创建,不过放心,创建一个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。

    3.       配置web.xml

    初始化spring的context

    与filter中的说明一致,不再赘述。

    Servlet配置:

    ServletToBeanProxy

    <servlet>

            <servlet-name>springServlet</servlet-name>

            <servlet-class>

                com.netqin.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>

     

    <servlet>

            <servlet-name>springServlet</servlet-name>

            <servlet-class>

                com.netqin.servlet.proxy.DelegatingServletProxy

            </servlet-class>

            <load-on-startup>1</load-on-startup>

        </servlet>

    4.       配置servlet的mapping

    <filter-mapping>

            <filter-name>springServlet</filter-name>

            <url-pattern>/servlet/*</url-pattern>

        </filter-mapping>

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

    例子代码如下:
    (1)代理servlet:
    =======================================================================
    ackage che
    import java.io.IOExceptio
    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.WebApplicationContextUtil
    ublic class ServletToBeanProxy extends GenericServlet {  private String targetBea
    rivate Servlet proxy;   public void init() throws ServletException {  System.out.println("proxy init");    this.targetBean = getInitParameter("targetBean");    getServletBean();    proxy.init(getServletConfig()); }
    ublic void service(ServletRequest req, ServletResponse res)   throws ServletException, IOException {    proxy.service(req, res)
    rivate void getServletBean() {    WebApplicationContext wac =   WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());  this.proxy = (Servlet)wac.getBean(targetBean);   }  }
    =================================================================================
    (2)web.xml中配置
    <context-param>  <param-name>contextConfigLoaction</param-name>  <param-value>/WEB-INF/context.xml</param-value> </context-param>  <listener>  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet>  <servlet-name>ProxyBean</servlet-name>  <servlet-class>chen.ServletToBeanProxy</servlet-class>  <init-param>   <param-name>targetBean</param-name>   <param-value>servletBean</param-value>  </init-param> </servlet>
    <servlet-mapping>  <servlet-name>ProxyBean</servlet-name>  <url-pattern>/ProxyBean</url-pattern> </servlet-mapping>
    (3) 完成实际任务的servlet定义,该servlet会引用另一个Book的对象
    ======================= ServletBean.java=======================
    ackage che
    import java.io.IOExceptio
    import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse
    /** * Servlet implementation class for Servlet: ServletBean * */ public class ServletBean extends javax.servlet.GenericServlet implements javax.servlet.Servlet {
    rivate Book book;      public ServletBean() {  super(); }      public void init() throws ServletException {   super.init();   }
    ublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {  book.showInfo();   }
    ublic Book getBook() {  return book; }
    ublic void setBook(Book book) {  this.book = book; }   }
    ================================Book.java==============================
    ackage che
    ublic class Book { private String isbn; private String name;    public String getIsbn() {  return isbn; } public void setIsbn(String isbn) {  this.isbn = isbn; } public String getName() {  return name; } public void setName(String name) {  this.name = name; }   public void showInfo() {  System.out.println("book info..."); }  }
    (4) context.xml配置
    <beans> <bean id="book" class="chen.Book"/> <bean id="servletBean" class="chen.ServletBean">  <property name="book">   <ref bean="book"/>  </property> </bean></beans>
    注意,在web.xml中并不出现ServletBean的说明,取而代之的是ServletToBeanProxy的说明,并用初始化参数targetBean来定义要代理的Servlet在context.xml中的名字。
    当在浏览器中输入http://localhost/webcontext/ProxyBean时 ,spring将会创建ServletBean一个实例,其引用的Book实例也会被创建。
    对Filter,springframework1.2以后自带了org.springframework.web.filter.DelegatingFilterProxy 来实现Filter和业务对象之间的代理,不需要自行开发了。
  • 相关阅读:
    例题6-8 Tree Uva548
    例题6-7 Trees on the level ,Uva122
    caffe Mac 安装
    Codeforces Round #467 (Div. 1) B. Sleepy Game
    Educational Codeforces Round37 E
    Educational Codeforces Round 36 (Rated for Div. 2) E. Physical Education Lessons
    Good Bye 2017 E. New Year and Entity Enumeration
    Good Bye 2017 D. New Year and Arbitrary Arrangement
    Codeforces Round #454 D. Seating of Students
    浙大紫金港两日游
  • 原文地址:https://www.cnblogs.com/duanxz/p/3772979.html
Copyright © 2011-2022 走看看