读书人

Spring治理filter和servlet无硬编码

发布时间: 2012-10-06 17:34:01 作者: rapoo

Spring管理filter和servlet,无硬编码bean

?

?????? <propertyname="siteSpecialTestDao"ref="jczc.siteSpecialTestDao"/>

</bean>

说明:com.jsptpd.jczc.temp.GongGuanTest继承自javax.servlet.http.HttpServlet,如下:

package com.jsptpd.jczc.temp;

?

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

import com.jsptpd.jczc.signal.dao.impl.SiteSpecialTestDaoImpl;

?

public class GongGuanTest extendsHttpServlet {

?????? privatestatic final long serialVersionUID = 1L;

?????? privateString name;

?????? privateSiteSpecialTestDaoImpl siteSpecialTestDao;

?

?????? publicSiteSpecialTestDaoImpl getSiteSpecialTestDao() {

????????????? returnsiteSpecialTestDao;

?????? }

?

?????? publicvoid setSiteSpecialTestDao(SiteSpecialTestDaoImpl siteSpecialTestDao) {

????????????? this.siteSpecialTestDao= siteSpecialTestDao;

?????? }

?

?????? publicString getName() {

????????????? returnname;

?????? }

?

?????? publicvoid setName(String name) {

????????????? this.name= name;

?????? }

?

?????? protectedvoid doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {

????????????? doPost(request,response);

?????? }

?

?????? protectedvoid doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {

?

????????????? response.setContentType("text/html;charset=utf-8");

????????????? PrintWriterout = response.getWriter();

????????????? out.println("<!DOCTYPEHTML PUBLIC \"-//W3C//DTD HTML 4.01Transitional//EN\">");

????????????? out.println("<HTML>");

????????????? out.println("? <HEAD><TITLE>AServlet</TITLE></HEAD>");

????????????? out.println("? <BODY>");

????????????? request.setCharacterEncoding("utf-8");

?????? ??? out.println(name.toString() +"<br>");

????????????? out.println(siteSpecialTestDao.toString()+ "<br>");

????????????? out.println("? </BODY>");

????????????? out.println("</HTML>");

????????????? out.flush();

????????????? out.close();

?????? }

?

}

?

2.实现servlet代理,创建一个servlet代理十分简单,一个具体的实现如下:

package com.jsptpd.jczc.temp.proxy;

?

import java.io.IOException;

import javax.servlet.GenericServlet;

import javax.servlet.Servlet;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

importorg.springframework.web.context.WebApplicationContext;

importorg.springframework.web.context.support.WebApplicationContextUtils;

?

public class ServletToBeanProxy extendsGenericServlet {

???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() {

???????//实现一个servlet代理,该代理用WebApplicationContext来获得在applicationContext.xml中定义的servlet的对象,并将任务委托给applicationContext.xml中定义的servlet;

???????WebApplicationContext wac =WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());

???????this.proxy = (Servlet) wac.getBean(targetBean);

??? }

}

?

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

?

3.配置web.xml

初始化spring的context,与filter中的说明一致。

<context-param>

????????????? <param-name>contextConfigLocation</param-name>

????????????? <param-value>

???????????????????? /WEB-INF/spring-configs/base/applicationContext.xml

????????????? </param-value>

</context-param>

<listener>

???????<listener-class>

???????????org.springframework.web.context.ContextLoaderListener

???????</listener-class>

</listener>

?

4.Servlet配置:

?

ServletToBeanProxy代理的配置

<servlet>

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

???????<servlet-class>

?????????????????com.jsptpd.jczc.temp.proxy.ServletToBeanProxy

???????</servlet-class>

???????<init-param>

???????????<param-name>targetBean</param-name>

???????????<param-value>springServlet</param-value>

???????</init-param>

</servlet>

<servlet-mapping>

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

????????????? <url-pattern>/gongguantest.htc</url-pattern>

</servlet-mapping>

?

DelegatingServletProxy代理的配置

<servlet>

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

???????<servlet-class>

???????????com.jsptpd.jczc.temp.proxy.DelegatingServletProxy

???????</servlet-class>

</servlet>

<servlet-mapping>

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

????????????? <url-pattern>/gongguantest.htc</url-pattern>

</servlet-mapping>

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

?

备注:红色即为要和applicationContext.xml中为filter和servlet配置的bean的id相同

读书人网 >编程

热点推荐