一、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&amp;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的事务管理。

本题代码在:   链接

最新文章

  1. SQL Server 2008 R2:快速清除日志文件的方法
  2. [转载]ERP实施40问 60分钟外行变专家
  3. 20145318 GDB调试汇编堆栈分析
  4. 理论沉淀:隐马尔可夫模型(Hidden Markov Model, HMM)
  5. xml基础学习笔记03
  6. 为了让vi命令也可以使用vim的配置,需要修改 vi /etc/bashrc 增加一行 alias vi=&#39;vim&#39;此时,经过上面配置已经可以显示语法高亮了
  7. ubuntu下安装pthread的manpages(man 手册) 在Ubuntu中查看STL帮助
  8. Java [Leetcode 337]House Robber III
  9. Javascript做图片无缝平滑滚动
  10. bzoj2285
  11. 搜索(四分树):BZOJ 4513 [SDOI2016 Round1] 储能表
  12. NetAnalyzer笔记 之 六 用C#打造自己的网络连接进程查看器(为进程抓包做准备)
  13. JDK Debug
  14. Linux下mpi环境配置与执行步骤(Ubuntu为例)
  15. zoj1028-Flip and Shift
  16. 与众不同 windows phone (21) - Device(设备)之摄像头(拍摄照片, 录制视频)
  17. 简单的利用JS来判断页面是在手机端还是在PC端打开的方法
  18. Mongodb密码安全设置
  19. curl模拟请求
  20. 解决 Vue 动态生成 el-checkbox 点击无法赋值问题

热门文章

  1. legend3---19、要更多的从服务器端控制元素的显示和隐藏,而不要是页面端
  2. FLYAI
  3. pgpool 的配置文件详解
  4. http-proxy-middleware及express实现反向代理
  5. Web前端接入人机识别验证码---腾讯防水墙
  6. API的查看
  7. C++队列和链表
  8. 123457123456#0#-----com.twoapp.TruckCarRun01--前拼后广--大卡车游戏jiemei
  9. 【Leetcode_easy】783. Minimum Distance Between BST Nodes
  10. c# 结构体struct注意事项