在Spring中配置servlet

在servlet的编程中,如果想用到Spring的注入功能,其实很简单:

看个例子程序:

package en.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.context.WebApplicationContext;

import en.dao.UserDao;

public class UserLogin extends HttpServlet {

	private UserDao dao;
	
	public UserDao getDao() {
		return dao;
	}

	public void setDao(UserDao dao) {
		System.out.println("Injection seccess!");
		this.dao = dao;
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
			this.doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html");
		request.setCharacterEncoding("utf-8");
		String path="/userLogin.jsp";
		//WebApplicationContext context = (WebApplicationContext)request.getSession().getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
		//dao = (UserDao)context.getBean("userDao");
		dao.save();
		request.getRequestDispatcher(path).forward(request, response);
	}

}

 可以发现,该servlet引用了一个持久层的类UserDao,而这个类,我们不想直接实例化,而是由Spring进行注入。那么问题是如何在servlet中调用Spring的框架实现该注入呢?当然一种比较笨拙的办法就是直接获取。也就是上述代码中被注释的那一段。然而很明显这不是最佳的解决方案,因为这样做就相当于将代码写死了。而实际上我们可以用一个代理的servlet来完成这一个功能。看代码:

package en.filter;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class ServletToBeanProxy extends HttpServlet {

	private String targetBean;
	private Servlet proxy;

	@Override
	public void service(ServletRequest req, ServletResponse res)
			throws ServletException, IOException {
		proxy.service(req, res);
	}
	public void init()throws ServletException{
		System.out.println("inti...");
		targetBean = this.getInitParameter("targetBean");
		System.out.println(targetBean);
		getServletBean();
		proxy.init(getServletConfig());
		
	}
	private void getServletBean() {
		WebApplicationContext wac =
		WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
		this.proxy = (Servlet)wac.getBean(targetBean);
	}

}

下面是该servlet的web.xml配置:

 <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>ServletToBeanProxy</servlet-name>
    <servlet-class>en.filter.ServletToBeanProxy</servlet-class>
    <init-param>
    	<param-name>targetBean</param-name>
    	<param-value>userLoginServlet</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>UserLogin</servlet-name>
    <url-pattern>/UserLogin</url-pattern>
</servlet-mapping>

 首先,我们来理清一下代码的执行顺序。当我们在客户端输入网址:http://localhost:8080/ProjectName/UserLogin的时候,服务器就会去调用这个代理的servlet。然而这个代理的servlet到底做了什么呢?可以分几步来描述:一:获得init参数,这个参数就是实际要访问的servlet,他会在Spring的配置文件中定义。二:通过WebApplicationContext去Spring容器中得到目标servlet,当然名字就是init参数中配置的名字。三:将获得的servlet强制转换为Servlet,然后执行目标servlet。OK,这样就完成了注入。

      那么,如果我们有另外一个业务的servlet怎么办呢?是不是还要在写一个ServletToBeanProxy 似地代理类呢?当然是不用的。我们只需要修改web.xml就行了。需要修改的地方只有init参数和url-parrten两处。代理类的代码是完全一样的,可以重用。这样,在servlet中就能感知到Spring的注入了。  而要注意的是,目标servlet是不需要在web.xml当中配置的。

猜你喜欢

转载自littie1987.iteye.com/blog/1036000