`

Servlet托管Spring进行管理

 
阅读更多
Servlet托管Spring时,
1、重写servlet中的init()方法,在servlet中使用WebApplicationContext 获取bean对象:
如下:
ArrivingShipsImpl asi;
public void init() throws ServletException {          
        super.init();
        ServletContext servletContext = this.getServletContext();  
        WebApplicationContext ctx =    WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
        asi = (ArrivingShipsImpl)ctx.getBean("arrivingShipsImpl");
    }


2、实现ApplicationContextAware接口的SpringConetextUtil类,利用回调方法,设置上下文对象,通过上下文对象获取bean对象

@Component
public class SpringContextUtil implements ApplicationContextAware{

	private static ApplicationContext	applicationContext;

	/**
	 * 实现ApplicationContextAware接口的回调方法,设置上下文环境
	 */
	public void setApplicationContext(ApplicationContext applicationContext){
		SpringContextUtil.applicationContext = applicationContext;
	}

	public static ApplicationContext getApplicationContext(){
		return applicationContext;
	}
	/**
	 * 获取对象
	 */
	public static Object getBean(String name) throws BeansException{
		return applicationContext.getBean(name);
	}
}



3、动态代理形式的:
http://blog.csdn.net/yaerfeng/article/details/7368541

思路:把servlet配置为spring的bean,就可以实现其他bean的注入,然后使用代理servlet来辅助配置和运行:

一、代理servlet的写法:

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
/**
 * HttpServlet 代理
 * @author lwei
 * @since 2011-03-17
 * @version 1.0
 */
public class HttpServletProxy extends HttpServlet {

  /**
   * random serialVersionUID
   */

  private static final long serialVersionUID = -7208519469035631940L;
  Log logger = LogFactory.getLog(HttpServletProxy.class);
  private String targetServlet;
  private HttpServlet proxy;
  public void init() throws ServletException {
      this.targetServlet = getInitParameter("targetServlet");
      getServletBean();
      proxy.init(getServletConfig());
      logger.info(targetServlet + " was inited by HttpServletProxy  successfully......");
  }

  private void getServletBean() {
      WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
      this.proxy = (HttpServlet) wac.getBean(targetServlet);
  }


  @Override
  public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, RuntimeException {
      proxy.service(request, response);      
 }



}

二、业务servlet的写法:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * @author lwei
 */
public class UserCheckServlet extends HttpServlet {

  /**
   * random serialVersionUID
   */
  private static final long serialVersionUID = 3075635113536622929L;
  private UserService userService;(UserService 是spring托管的bean,通过set方法注入)
  public void setUserService (UserService userService) {
      this.userService = userService;
  }
  public UserCheckServlet() {
      super();
  }

  public void init() throws ServletException {
      super.init();
  }


  @Override
  public void service(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
       throws ServletException, IOException, RuntimeException {
     ....
     ....
     userService.getUserByCode();(注入后bean的使用)
     ....
     ....
 }   
}


三、业务serlvet配置为spring的bean:
<bean id="userCheckServlet" class="com.XXX.xxxxx.web.UserCheckServlet " />

四、web.xml中业务servlet的配置:
<servlet>
      <servlet-name>UserCheckProxy</servlet-name>
      <servlet-class>com.XXX.xxxx.web.HttpServletProxy</servlet-class>
     <init-param>
         <param-name>targetServlet</param-name>
         <param-value>userCheckServlet</param-value>(业务servlet配置为spring的bean时的名字)
     </init-param>
 </servlet>
 <servlet-mapping>
     <servlet-name>UserCheckProxy</servlet-name>
     <url-pattern>/UserCheck</url-pattern>
    </servlet-mapping>




1
1
分享到:
评论
2 楼 di1984HIT 2016-09-07  
学习了!!!  
1 楼 jsjzhou 2013-01-13  
总感觉不是太喜欢这集中方式.
(1)第一种方式手动把每个依赖注入进来. 麻烦
(2)通过proxy, 平白无故的生成了一个代理类.

我个人比较倾向于同注解的方式. 在servlet里面把需要的组件用@AUtowried或@Resource注解标注, 然后在servlet的init方法里面通过类似ApplicationContext.getAutowireCapableBeanFactory().autowireBean(this)方法注入spring中的组件. 好处是通用, 不会生成很多临时类.

相关推荐

    Spring中文帮助文档

    15.5.1. 注入 Spring 托管的 beans 15.6. WebWork 15.7. 更多资源 16. Portlet MVC框架 16.1. 介绍 16.1.1. 控制器 - MVC中的C 16.1.2. 视图 - MVC中的V 16.1.3. Web作用范围的Bean 16.2. DispatcherPortlet...

    Spring API

    15.5.1. 注入 Spring 托管的 beans 15.6. WebWork 15.7. 更多资源 16. Portlet MVC框架 16.1. 介绍 16.1.1. 控制器 - MVC中的C 16.1.2. 视图 - MVC中的V 16.1.3. Web作用范围的Bean 16.2. DispatcherPortlet ...

    Spring 2.0 + Struts 1.2 + Hibernate 3.2 + DWR 2.0 的JavaEE应用示例

    学习对象:熟悉JavaScript, 了解JSTL, servlet/JSP, Struts 1.2, Hibernate, Spring, Ajax技术。 该示例使用MyEclipse 5.5 IDE用来整合四个技术(Struts 1.2, Spring 2.0, Hibernate 3.2和Ajax技术)的轻量级的...

    HTTP-Proxy-Servlet:Smiley的HTTP代理实现为Java Servlet

    HTTP代理对于AJAX应用程序与托管Web应用程序以外的主机上的Web可访问服务进行通信很有用。 它是反向代理,实际上不是转发代理,尽管Servlet的模板形式可能会使这条线模糊。 这几乎不是第一个代理,为什么我要编写...

    barefoot:在没有 springboot 或 webserver/tomcat 的情况下托管 spring-mvc RestControllers-开源

    一个轻量级框架,可以将 RestController 和 servlet 作为无服务器云功能执行,无需 springboot、嵌入式 tomcat 或完整 tomcat。

    WEB项目-集成Flex3+BlazeDS3.2+Spring2.5.6集成方式一

    原创作品手录 前言:本讲是在【第二讲:WEB项目-集成Flex3+BlazeDS3.2】的基础上添加Spring功能; 集成方式一:直接采用servlet配置模式,...目标:集成Spring,托管Flex的message请求,使Flex便利使用Spring容器Bean

    PSMetadataFetcherJava:Spring Boot服务能够获取有关Play Store托管的Android应用程序的信息

    Google不提供对easilly的API访问,以方便地检索Android应用程序的有用数据,例如将实际发布的版本与设备上安装的版本进行比较并最终提示进行更新。 完成此任务的常用方法是提供一种服务或一​​个网页,用于在其中...

    SpringBoot-MybatisPlus-Redis 外卖系统源码.zip

    后台系统普通用户:登录后台管理系统,对菜品、套餐、订单等进行管理 项目亮点 亮点技术:Redis缓存、Git托管代码、Nginx部署静态资源并反向代理、MySQL事务、SpringBoot和MyBatisPlus使用、阿里云短信服务 项目收获...

    barcode-scanner-poc:Spring Boot-Angular Code128-QR代码阅读器

    条形码扫描仪 Spring Boot-Angular / Code128-QR代码阅读器 这是一个QR码阅读器/编写器和Code128阅读器Web应用程序。... Spring boot .jar应用程序托管webapp。 要运行它,请执行mvn spring-boot:run

    JavaServer Faces 2.0完全参考手册(JSF2.0中文版) 1/2

    《JavaServer Faces 2.0完全参考手册》对所有jsf功能都进行了解释,包括请求处理生命周期、托管bean、页面导航、组件开发、ajax、验证器、国际化和安全。贯穿全书的专家组意见提供了关于jsf设计的内部信息。 推荐...

    JavaServer Faces 2.0完全参考手册(JSF2.0中文版).part1

    《JavaServer Faces 2.0完全参考手册》对所有jsf功能都进行了解释,包括请求处理生命周期、托管bean、页面导航、组件开发、ajax、验证器、国际化和安全。贯穿全书的专家组意见提供了关于jsf设计的内部信息。 推荐...

    easyweb:网络框架

    将spring托管的bean注入到easyweborm: 提供基于nutz的ORM框架,和Easyweb web无缝集成apps: 提供的demo等appdocs: 相关设计说明文档快速入门初始化Easyweb.initialize()常见初始化时机:如果使用了spring模块,则...

    jaslyna:为工具链创建

    HTTP代理对于AJAX应用程序与托管Web应用程序以外的主机上的Web可访问服务进行通信很有用。 它是反向代理,实际上不是转发代理,尽管Servlet的模板形式可能会使这条线模糊。 这几乎不是第一个代理,为什么我要编写...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    1.2.1 JSP、Servlet和JavaBean及 替代技术 14 1.2.2 JSF及替代技术 15 1.2.3 EJB组件技术简介 15 1.3 JBoss的下载和安装 15 1.3.1 下载和安装JBoss服务器 16 1.3.2 配置JBoss的服务端口 18 1.3.3 进入控制台 19 ...

    TechIt-Java-Rest

    该存储库托管使用Spring和Hibernate在Java中实现的后端。 软件需求 需要JDK 1.8+和Maven来构建项目,并且需要运行MySQL 5.5+和支持Servlet 3.1规范(例如Tomcat 8.5+)的Java EE应用服务器。 使用Eclipse进行开发 ...

    intc-customer-locator

    它使用连接到内存数据库中H2的Spring Boot后端来维护某些状态,提供了一个简单的Bootstrap / JQuery UI,该UI直接托管在tomcat servlet上。 运行应用程序 使用Docker Compose 先决条件:Docker #docker-compose up...

Global site tag (gtag.js) - Google Analytics