`

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源代码下载地址

    Spring的源代码托管在GitHub上,你可以访问Spring官方网站(https://spring.io/)找到链接,或者直接前往GitHub(https://github.com/spring-projects/spring-framework)进行下载。下载时,选择合适的分支,如主...

    一个基于springcloud的麻将订房管理系统源码.zip

    1. **Spring Cloud**:系统采用Spring Cloud构建,这意味着它使用了Eureka进行服务注册与发现,Hystrix作为断路器以防止服务雪崩,Zuul或Gateway作为API网关,以及Spring Cloud Config进行配置管理。 2. **微服务...

    JSF与Spring完美结合

    3. **创建JSF Managed Beans**:JSF中的Managed Beans可以被Spring管理。在`faces-config.xml`中声明Managed Bean,并在`applicationContext.xml`中定义对应的Spring Bean。 4. **数据绑定和事件处理**:JSF的EL...

    spring+cxf小demo

    总的来说,这个【Spring+CXF小Demo】是一个很好的起点,可以帮助开发者了解如何在Spring环境中使用CXF构建Web服务,并进行客户端调用。它涉及到的技能包括XML配置、注解驱动编程、服务暴露与消费等,对于理解分布式...

    java应用程序实现jetty 集成jersey 和spring

    3. 使用`@Component`和`@Path`注解:将Spring的Bean与Jersey的资源类关联,允许Spring管理资源类的生命周期。 4. 配置Jersey-Spring桥接:通过`ResourceConfig`注册Spring应用上下文,使Spring能够处理依赖注入。 ...

    Spring Cloud、Spring Boot、Git、GitHub、Jenkins、Vue等尚硅谷全套视频

    Spring Boot的核心特性包括:内嵌Servlet容器(如Tomcat或Jetty),默认配置,starter POMs,健康检查,外部化配置等。 【Git】 Git是一款分布式版本控制系统,用于追踪对文件的修改,便于多人协作开发。Git的强大...

    Spring CXF Restful 实例

    这些实现可以是Spring管理的bean,这样可以利用Spring的依赖注入和其他特性。 4. **使用JAX-RS注解**:在接口和实现类的方法上添加JAX-RS注解,如`@Path`、`@GET`、`@POST`、`@PathParam`等,来指定资源路径和HTTP...

    Struts Spring Hibernate整合实践

    - 创建 Spring 的配置文件,定义需要托管的 Bean,包括Action、Service、DAO等,可以利用@Autowired注解自动注入依赖。 - 用户登录和注册功能的实现,通常涉及到Action处理请求,Service处理业务逻辑,以及...

    OSGI应用中整合Spring、Mybatis、Spring MVC案例

    通常,我们需要一个OSGI兼容的Servlet容器,如Pax Web,来托管Spring MVC的应用。同时,Spring MVC的配置也需要适应OSGI环境,比如Controller类需要作为OSGI服务注册,以便于路由请求。 在本案例的"OSGI教程"中,你...

    第二章 Servlet 基础

    Servlet由Web服务器或应用服务器托管,并在其内部运行。它们的主要特点包括: 1. **动态内容生成**:Servlet能够根据用户的请求动态生成内容,这对于创建交互式的Web应用程序至关重要。 2. **容器管理**:Servlet的...

    spring icefaces hibernate 整合

    这种整合能够实现强大的功能,例如通过Spring的AOP进行事务管理,利用Hibernate简化数据库操作,以及通过IceFaces提供丰富的用户体验。在实际项目中,这样的架构能够提高开发效率,同时保证系统的可维护性和扩展性。

    Xfire配置Web Service+Spring+Hibernate详细配置流程

    要实现Web服务,Spring需要配置一个Servlet容器(如Tomcat)来托管应用。然后,定义一个服务接口和实现,使用Spring的`@WebService`注解标记接口,`@Endpoint`注解标记服务实现类。同时,配置WSDL文件生成和发布,...

    spring-boot使用指南

    - GitHub:Spring Boot 的源代码托管在 GitHub 上,可以直接提交 issue 或者参与贡献。 - 邮件列表:加入 Spring Boot 的邮件列表,与其他开发者交流经验和心得。 #### 第一步骤 开始使用 Spring Boot 前,需要了解...

    CXF2.6.4+Spring3.1.1+Jetty7.5.4

    Apache CXF处理服务的创建和交互,Spring管理应用的依赖和生命周期,而Jetty则作为一个轻量级的服务器承载这些服务。通过理解这三个组件的功能和它们之间的协同工作,开发者能够快速搭建和维护Web服务。在实际操作时...

    struts2-spring-plus

    1. **自动装配**:该插件可以自动将Spring管理的Action实例注入到Struts2的ActionContext中,无需手动配置Action类的实例化过程。 2. **减少样板代码**:通过插件,开发者不再需要在Action类中编写getter和setter...

    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...

    struts+spring+hibernate的jar包

    通过Struts处理用户请求,Spring管理业务逻辑和服务,Hibernate负责数据持久化,可以大大提高开发效率和应用的质量。在实际项目中,通常会结合使用Spring的AOP特性进行事务管理和权限控制,以及Struts的拦截器进行...

    Pro Spring MVC---Apress-2012

    - **状态管理**:掌握 Spring Web Flow 中的状态管理和过渡机制。 ##### 7. 利用 Spring Web Flow 构建应用 - **多页面案例**:解决复杂多步骤表单的问题。 - **不同消费者视图**:为不同类型的用户提供定制化的...

    spring+springMVC+hibernate+maven+tomcat7整合,myEclipse项目(完整html页面模板)

    在这个myEclipse项目中,我们看到的是一个基于SSH(Spring、SpringMVC、Hibernate)的整合应用,同时利用了Maven进行依赖管理和构建,以及Tomcat7作为应用服务器。现在,让我们详细探讨一下这些技术: 1. **Spring*...

    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 ...

Global site tag (gtag.js) - Google Analytics