Chinaunix首页 | 论坛 | 博客
  • 博客访问: 731099
  • 博文数量: 178
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1507
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-27 23:20
文章分类

全部博文(178)

文章存档

2015年(58)

2014年(121)

我的朋友

分类: Java

2014-09-29 17:22:43

如何用SpringService注入到Servlet中(注解模式)

发布于 20130728

by 贝壳里的海

归档于 JavaEE开发

项目背景:由于工作需要,原本需要在Extjs4.2 MVC +DWR3 +Spring3.1 + Hibernate3.3.2下做一个分页查询,以Extjsgridpanel作为页面组件,以DWR作为控制器。然而,在多日翻墙查看英文资料依然未能解决的情况下(诸如各种版本的DWRProxyListRange等等),无奈用Servlet代替DWR,将ServletSpring进行整合,使Service层能注入到Servlet中,当然,这里的Servlet是纯正的Servlet 3,而不是StrutsActionServlet或者是SpringMVC啥啥的。

解决方法有两种(推荐使用第二种)

方法一:

直接重写ServletInit()方法,代码如下:

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

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模式下,我们的配置方式如下(以下由于代码高亮插件的问题,请将代码中的#替换成尖括号)

  活动发起模块活动查询分页Servlet

  #display-name#launchActivityQueryServlet#/display#

  #servlet-name#LaunchActivityQueryServlet#/servlet-name#

  #servlet-class#com.telek.pba.launch.servlet.LaunchActivityQueryServlet#/servlet-class#

#servlet#

 

#servlet-mapping#

  #servlet-name#LaunchActivityQueryServlet#/servlet-name#

  #url-pattern#/servlet/launch/LaunchActivityQueryServlet#/url-pattern#

#/servlet-mapping#

如果采用我们这种代理的方法,则配置应该修改为:

  活动发起模块活动查询分页Servlet

  #display-name#launchActivityQueryServlet#/display#

  #servlet-name#launchActivityQueryServlet#/servlet-name#

  #servlet-class#com.telek.pba.base.util.DelegatingServletProxy#/servlet-class#

#servlet#

 

#servlet-mapping#

  #servlet-name#launchActivityQuery#/servlet-name#

  #url-pattern#/servlet/launch/LaunchActivityQueryServlet#/url-pattern#

#/servlet-mapping#

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

Step 3:至此,我们就可以像SSH的注入方式一样,注入Servlet了,以下是个小示例:

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;

 

@Componentpublic 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配置文件中,配置上自动扫描包的路径:

com.telek.pba.*.service.impl,  com.telek.pba.*.servlet">

大功告成!

 

阅读(1365) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~