(四)spring+servlet 整合
一、Spring与Servlet的整合
-
1.1:
加入Spring的jar包。(要加web.jar包)
-
1.2:
- java工程中获取Spring的上下文对象。
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml")来初始化Spring的上下文环境。
-
- WEB工程中初始化Spring的上下文环境。
在web.xml中添加监听器(ContextLoaderListener继承ContextLoader类,ContextLoader的静态常量CONFIG_LOCATION_PARAM = "contextConfigLocation"
ContextLoaderListener读取Spring默认文件的位置就是"contextConfigLocation"的值,而这个值可以在web.xml <context-param>标签里设置contextConfigLocation): 如下:
<listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>
ContextLoaderListener读取Spring默认文件的位置:/WEB-INF/applicationContext.xml
可以改变读取的位置。配置context-param参数。
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring.xml</param-value> </context-param>
- 如上配置,ContextLoaderListener类负责初始化spring的上下文环境,其路径为spring.xml。
1.3 spring与servlet 的整合
- sping有三大特性: IOC(控制反转)/DI(依赖注入)/AOP(面向切面编程、代理模式),而servlet是单例模式只实例一次,一般我们使用servlet的时候并不定义成员属性,因为成员属性会被所有用户所共用,而DI是通过属性注入的方式这样就会冲突,所以servlet+spring只能使用spring中的IOC和AOP两种特性进行编程。
1.4 案例
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <% String path=request.getContextPath(); %> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <a href="<%=path%>/servlet/exam"> spring和servlet整合</a> </body> </html>
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>spring_servlet</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
<!-- 这个servlet只用于创建ApplicationContext对象,并不被人访问所以无须配置servlet-mapping -->
<servlet>
<servlet-name>loderServlet</servlet-name>
<servlet-class>servlet.LoderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- end --> <servlet> <servlet-name>exam</servlet-name> <servlet-class>servlet.Example</servlet-class> </servlet> <servlet-mapping> <servlet-name>exam</servlet-name> <url-pattern>/servlet/exam</url-pattern> </servlet-mapping> </web-app>
- spring.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <constructor-arg index="0" name="driverClassName" value="com.mysql.jdbc.Driver" ></constructor-arg> <constructor-arg index="1" name="url" value="jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=UTF-8" ></constructor-arg> <constructor-arg index="2" name="username" value="root"></constructor-arg> <constructor-arg index="3" name="password" value=""></constructor-arg> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <tx:advice id="advice_1" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="update*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <aop:config proxy-target-class="true"> <aop:pointcut expression="execution(* service..*.*(..))" id="poin_1"/> <aop:advisor advice-ref="advice_1" pointcut-ref="poin_1"/> </aop:config> <bean id="testService" class="service.TestService"> <property name="roledao"> <bean class="dao.RoleDao"> <property name="dataSource" ref="dataSource"></property> </bean> </property> <property name="userdao"> <bean class="dao.UserDao"> <property name="dataSource" ref="dataSource"></property> </bean> </property> </bean> </beans>
- Example.java
package servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.context.ApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import service.TestService; public class Example extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { TestService testService=(TestService)LoderServlet.getBean("testService");
testService.update(); } }
- LoderServlet.java
package servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import org.springframework.context.ApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import org.springframework.web.jsf.el.WebApplicationContextFacesELResolver; public class LoderServlet extends HttpServlet { private static ApplicationContext context=null; @Override public void init() throws ServletException { System.out.println("初始化servlet"); if(context==null){ context=WebApplicationContextUtils.getWebApplicationContext(this.getServletContext()); } } public static Object getBean(String beanName){ Object bean=null; bean=context.getBean(beanName); return bean; } @Override public void destroy() { // TODO Auto-generated method stub super.destroy(); } }
- TestService.java
package service; import dao.RoleDao; import dao.UserDao; public class TestService { private UserDao userdao; private RoleDao roledao; public void setUserdao(UserDao userdao) { this.userdao = userdao; } public void setRoledao(RoleDao roledao) { this.roledao = roledao; } public boolean update(){ boolean flag=false; try { this.userdao.update_1(); this.roledao.update_2(); flag=true; } catch (Exception e) { e.printStackTrace(); flag=false; throw new RuntimeException(e); } return flag; } }
- RoleDao.java
package dao; import org.springframework.jdbc.core.support.JdbcDaoSupport; public class RoleDao extends JdbcDaoSupport { public void update_2(){ this.getJdbcTemplate().update("update role set role_name='aa' where role_id=1 "); this.getJdbcTemplate().update("update role set role_name='bb' where role_id=2 "); } }
- UserDao.java
package dao; import org.springframework.jdbc.core.support.JdbcDaoSupport; public class UserDao extends JdbcDaoSupport{ public void update_1(){ this.getJdbcTemplate().update("update user set age=111 where userName='张三'"); this.getJdbcTemplate().update("update user set age=111 where userName='李四'"); } }
结果:
在Example类中调用TestService的update方法,这个方法又调用了UserDao的update_1方法和RoleDao的update_2方法,如果update_2方法出现异常,则update_1和update_2方法
同时回滚。 本例实现了servlet+spring的事务管理。
本题代码在: 链接