`

用Spring将Service注入到Servlet中(注解模式)

阅读更多
〈转〉原文地址:http://www.coridc.com/archives/2758.html

将Servlet与Spring进行整合,使Service层能注入到Servlet中,当然,这里的Servlet是纯正的Servlet 3,而不是Struts的ActionServlet或者是SpringMVC啥啥的。

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

方法一:

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

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>
  <description>活动发起模块活动查询分页Servlet</description>
  #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>
如果采用我们这种代理的方法,则配置应该修改为:

<servlet>
  <description>活动发起模块活动查询分页Servlet</description>
  #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>
注意:默认情况下,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;

@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. <br />
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}

/**
* The doGet method of the servlet. <br />
*
* 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. <br />
*
* 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. <br />
*
* @throws ServletException if an error occurs
*/
public void init() throws ServletException {
// Put your code here
}

}
最后,请留心在Spring配置文件中,配置上自动扫描包的路径:

<context:component -scan base-package="com.telek.pba.*.dao.impl,
com.telek.pba.*.service.impl,
com.telek.pba.*.servlet"></context:component>
大功告成!
分享到:
评论

相关推荐

    Spring中文帮助文档

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

    Spring.html

    Spring IOC 控制反转:把创建对象的权利交给Spring 创建对象 1.... 2.... 3.... 构造器注入 ... set注入 ...在Servlet中使用WebApplicationContextUtils获取容器对象 5.使用容器对象去获取Service对象

    Spring API

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

    springboot学习思维笔记.xmind

    web项目设置在Servlet的context parameter中 事件Application Event 自定义事件,集成ApplicationEvent 定义事件监听器,实现ApplicationListener 使用容器发布事件 Spring高级话题 Spring Aware ...

    Spring.3.x企业应用开发实战(完整版).part2

    16.7.2 使用Spring Servlet API模拟对象 16.7.3 使用Spring RestTemplate测试 16.7.4 使用Selenium测试 16.8 小结 第17章 实战案例开发 17.1 论坛案例概述 17.1.1 论坛整体功能结构 17.1.2 论坛用例描述 17.1.3 主要...

    springjdbc

    -- service注入 --&gt; &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx=...

    Spring3.x企业应用开发实战(完整版) part1

    16.7.2 使用Spring Servlet API模拟对象 16.7.3 使用Spring RestTemplate测试 16.7.4 使用Selenium测试 16.8 小结 第17章 实战案例开发 17.1 论坛案例概述 17.1.1 论坛整体功能结构 17.1.2 论坛用例描述 17.1.3 主要...

    spring_MVC源码

    本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子没有介绍到数据层的内容,现在这一篇补上。下面开始贴代码。 文中用的框架版本:spring 3,hibernate 3,没有的,自己上网下。 先说...

    SpringMVC+Hibernate全注解整合

    &lt;bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; &lt;property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /&gt; ...

    java微信公众号MVC开发框架

    微信接口服务类位于com.github.jweixin.jwx.weixin.service包中,在spring配置文件中通过扫描包载入服务,在web mvc框架和微信控制器类中都可以通过@Autowired注解注入,与其他spring普通的服务类主键使用方式一致,...

    课程

    实现解耦spring是一个容器,容器中存放的是java对象如何使用弹簧把项目中需要使用的对象放入到容器中让容器完成对象的创建,对象之间关系的管理从容器中获取需要使用的对象dao类,service类,controller类,工具类,...

Global site tag (gtag.js) - Google Analytics