如何用spring将service注入到servlet中

2024-12-16 12:16:35
推荐回答(1个)
回答1:

方法一:

直接重写Servlet的Init()方法,代码如下:

[java] view plain copy
public void init(ServletConfig servletConfig) throws ServletException {
ServletContext servletContext = servletConfig.getServletContext();
WebApplicationContext webApplicationContext = WebApplicationContextUtils
.getWebApplicationContext(servletContext);
AutowireCapableBeanFactory autowireCapableBeanFactory = webApplicationContext
.getAutowireCapableBeanFactory();
autowireCapableBeanFactory.configureBean(this, BEAN_NAME);
}

这里的BEAN_NAME即为我们需要注入到Spring容器中的服务,但这并不是一个好的方法,因为我们需要在每一个Servlet中都进行这样的操作。

方法二:

我们可以写一个类似于“org.springframework.web.struts.DelegatingRequestProcessor”的委托的Bean,然后通过配置的方法把我们的服务注入到servlet中,具体方法如下,

Step 1:编写委托类DelegatingServletProxy
[java] view plain copy
package com.telek.pba.base.util;

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;

/**
* 以下是类似org.springframework.web.struts.DelegatingRequestProcessor的一个委托
* 用于通过配置的方法,在Servlet中注入Service
* @author liyinwei
*
*/
public class DelegatingServletProxy extends GenericServlet{

/**
*
*/
private static final long serialVersionUID = 1L;
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 {
this.targetBean = getServletName();
getServletBean();
proxy.init(getServletConfig());
}

/**
* 获取Bean
*/
private void getServletBean() {
WebApplicationContext wac = WebApplicationContextUtils
.getRequiredWebApplicationContext(getServletContext());
this.proxy = (Servlet) wac.getBean(targetBean);
}

}

Step 2:修改Web.xml配置

在纯Servlet模式下,我们的配置方式如下
[html] view plain copy

活动发起模块活动查询分页Servlet
launchActivityQueryServlet
LaunchActivityQueryServlet
com.telek.pba.launch.servlet.LaunchActivityQueryServlet



LaunchActivityQueryServlet
/servlet/launch/LaunchActivityQueryServlet



如果采用我们这种代理的方法,则配置应该修改为:
[html] view plain copy

活动发起模块活动查询分页Servlet
launchActivityQueryServlet
launchActivityQueryServlet
com.telek.pba.base.util.DelegatingServletProxy



launchActivityQueryServlet
/servlet/launch/LaunchActivityQueryServlet



注意:默认情况下,Servlet的配置中,LaunchActivityQuery的首字母一般为大写,而我们的标题中已注明,我们采用Spring的
注解模式,如果是自动扫描注解的话,默认情况下,注解的value值为首字母小写,即:launchActivityQuery,因此,在我们新的配置
中,要注意将首字母改为小写,否则会报无法找到Bean的错误。

Step 3:至此,我们就可以像SSH的注入方式一样,注入Servlet了,以下是个小示例:
[java] view plain copy
package com.telek.pba.launch.servlet;

import java.io.IOException;

import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;

import com.telek.pba.base.model.PbaUserInfo;
import com.telek.pba.launch.dao.IPbaActivityInfoCurrentDAO;

@Component
public class LaunchActivityQueryServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

//注入IPbaActivityInfoCurrentDAO
@Resource
private IPbaActivityInfoCurrentDAO pbaActivityInfoCurrentDAO;

/**
* Constructor of the object.
*/
public LaunchActivityQueryServlet() {
super();
}

/**
* Destruction of the servlet.

*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}

/**
* The doGet method of the servlet.

*
* This method is called when a form has its tag value method equals to get.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//sth to do
}

/**
* The doPost method of the servlet.

*
* This method is called when a form has its tag value method equals to post.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//sth to do
}

/**
* Initialization of the servlet.

*
* @throws ServletException if an error occurs
*/
public void init() throws ServletException {
// Put your code here
}

}

最后,请留心在Spring配置文件中,配置上自动扫描包的路径:
[html] view plain copy


大功告成!