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相同