在servlet中注入spring容器中的bean
在使用spring容器的web应用中,业务对象间的依赖关系都可以用context.xml文件来配置,并且由spring容器来负责依赖对象 的创建。如果要在servlet中使用spring容器管理业务对象,通常需要使用WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext())来获得WebApplicationContext,然后调用WebApplicationContext.getBean("beanName")来获得对象的引用,这实际上是使用了依赖查找来获得对象,并且在servlet代码中硬编码了应用对象的bean名字。为了能在servlet中感知spring中bean,可采用如下步骤来实现:
1- 将servlet作为bean定义在context.xml文件中,和要应用的bean定义放在一起;
2- 实现一个代理servlet,该servlet用WebApplicationContext来获得在context.xml中定义的servlet的对象,并将任务委托给context.xml中定义的servlet
3- 在web.xml中用ContextLoaderListener来初始化spring 的context,同时在代理servlet的定义中用初始化参数来定义context.xml中servlet的bean名字。
4- 在web.xml中定义代理servlet的mapping.
利用这种方式就将servlet和业务对象的依赖关系用spring 来进行管理,并且不用在servlet中硬编码要引用的对象名字。
例子代码如下:
(1)代理servlet:
=======================================================================
package chen;
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;
public class ServletToBeanProxy extends GenericServlet {
private String targetBean;
private Servlet proxy;
public void init() throws ServletException {
System.out.println("proxy init");
this.targetBean = getInitParameter("targetBean");
getServletBean();
proxy.init(getServletConfig());
}
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
proxy.service(req, res);
}
private void getServletBean() {
WebApplicationContext wac =
WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
this.proxy = (Servlet)wac.getBean(targetBean);
}
}
=================================================================================
(2)web.xml中配置
<context-param>
<param-name>contextConfigLoaction</param-name>
<param-value>/WEB-INF/context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>ProxyBean</servlet-name>
<servlet-class>chen.ServletToBeanProxy</servlet-class>
<init-param>
<param-name>targetBean</param-name>
<param-value>servletBean</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ProxyBean</servlet-name>
<url-pattern>/ProxyBean</url-pattern>
</servlet-mapping>
(3) 完成实际任务的servlet定义,该servlet会引用另一个Book的对象
======================= ServletBean.java=======================
package chen;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* Servlet implementation class for Servlet: ServletBean
*
*/
public class ServletBean extends javax.servlet.GenericServlet implements javax.servlet.Servlet {
private Book book;
public ServletBean() {
super();
}
public void init() throws ServletException {
super.init();
}
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
book.showInfo();
}
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
}
================================Book.java==============================
package chen;
public class Book {
private String isbn;
private String name;
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void showInfo() {
System.out.println("book info...");
}
}
(4) context.xml配置
<beans>
<bean id="book" class="chen.Book"/>
<bean id="servletBean" class="chen.ServletBean">
<property name="book">
<ref bean="book"/>
</property>
</bean>
</beans>
注意,在web.xml中并不出现ServletBean的说明,取而代之的是ServletToBeanProxy的说明,并用初始化参数targetBean来定义要代理的Servlet在context.xml中的名字。
当在浏览器中输入http://localhost/webcontext/ProxyBean时 ,spring将会创建ServletBean一个实例,其引用的Book实例也会被创建。
对Filter,springframework1.2以后自带了org.springframework.web.filter.DelegatingFilterProxy 来实现Filter和业务对象之间的代理,不需要自行开发了
相关推荐
在"baseArch"这个文件夹中,可能包含了项目的基本架构,包括pom.xml文件、Spring配置文件(如applicationContext.xml、spring-servlet.xml)、MyBatis的Mapper接口和XML配置、Spring Security的配置文件,以及可能的...
在IT行业中,Web开发是至关重要的领域,而`JSP`、`Servlet`、`Spring`和`Struts`是构建高效、可扩展的企业级应用的基石。这些技术结合使用,能够实现强大的前后端交互,提供高效的数据处理和用户体验。 首先,`JSP ...
实验一之后,实验二和实验三进一步介绍了JSF(JavaServer Faces)+JPA(Java Persistence API)以及Struts+Spring+Hibernate框架。这些高级框架简化了数据访问和业务逻辑的处理,JSF提供了一种声明式UI开发方式,JPA...
JavaWeb家居电子商城管理系统,没有spring框架,纯servlet,线上家居电子商城系统,主要实现了用户注册,登录、浏览,查看家居商品信息,购物车,订单,支付,查看通知以及管理员对用户信息的管理,订单管理,商品...
《Java Web开发技术大全--JSP+Servlet+Struts 2+Hibernate+Spring+AJAX》.(李宁).[PDF].&ckook;
2. **Spring MVC**: Spring MVC 是Spring框架的一部分,专为构建Web应用程序而设计。它遵循模型-视图-控制器(MVC)架构模式,使开发人员能够分离业务逻辑、数据模型和用户界面。Spring MVC 提供了强大的数据绑定...
4. **连接池监控**: Druid提供了丰富的监控功能,可以在运行时查看连接池状态、SQL执行情况等,通过配置`spring.datasource.druid.web-stat-filter`和`spring.datasource.druid.stat-view-servlet`实现。 综上所述...
【标题】中的“基于jsp + servlet + jquery + easy-ui + ajax 的学生成绩管理系统”揭示...通过分析和参与这个项目,可以深入了解JSP、Servlet、jQuery、Easy-UI和Ajax的协同工作,以及Spring Boot在实际项目中的应用。
在这个特定的案例中,我们关注的是第七章关于Servlet的内容,结合了JSP(JavaServer Pages)、Servlet、Struts、Hibernate以及Spring这五种技术。以下是这些技术的相关知识点: 1. **Servlet**:Servlet是Java平台...
Web-Servlet模块是Spring MVC的基石,提供了模型-视图-控制器(Model-View-Controller)架构,使得开发Web应用程序更为简单。Web模块则提供了基础的Web上下文,适合非MVC的Web应用程序。 4. **AOP**:AOP模块提供了...
此外,它还提供了对Servlet、Filter和Listener的集成,使得Spring能够与任何Servlet容器(如Tomcat、Jetty)无缝协作。WebSocket API的集成则允许开发者创建实时双向通信的应用。 Spring Web MVC模块(spring-web...
【基于Servlet+Spring+Mybatis的客户关系管理系统】 在IT领域,客户关系管理(CRM)系统是企业管理和优化与客户关系的重要工具。本项目“基于Servlet+Spring+Mybatis的客户关系管理系统”是一个典型的Java Web应用...
2. **spring-beans-3.1.2.RELEASE.jar**:包含Spring处理bean定义和依赖注入的核心类,使得Spring Security可以动态地管理其组件。 3. **spring-web-3.1.2.RELEASE.jar**:提供了处理HTTP请求和响应的能力,以及...
3. **Web模块**:包含Web和Web-Servlet模块,为基于Servlet的Web应用提供了基础支持,如DispatcherServlet、ModelAndView等。 4. **AOP(面向切面编程)模块**:提供了面向切面的编程实现,允许开发者定义“切面”...
org.springframework.web.servlet.DispatcherServlet ) spring-webmvc 是 Spring MVC 的一个实现。spriing-webmvc 依赖于 spring-web如果直接使用spring-webmvc,就会隐式地添加 spring-web。不必显示添加 spring-...
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java...
2. **spring-context-3.2.0.RELEASE.jar**:上下文模块扩展了`spring-core`,引入了ApplicationContext接口,提供了一种管理和配置bean、事件传播、国际化和资源访问的环境。它还支持AOP(面向切面编程)和JMX(Java...
2. **spring-context**:扩展了spring-beans,引入了ApplicationContext接口,提供了一种更高级的容器,可以处理国际化、事件传播、资源加载等功能。 3. **spring-aop**:提供了AOP功能,包括定义切入点、通知、...
2. **spring-core-4.3.10.RELEASE.jar**:这个包包含了Spring框架的基本功能,如依赖注入、资源加载和通用的工具类。它是其他所有Spring模块的基础,提供了核心的IoC(控制反转)和DI(依赖注入)机制。 3. **...