zoukankan      html  css  js  c++  java
  • (四)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&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的事务管理。

    本题代码在:   链接


     

  • 相关阅读:
    从头认识java-14.2 进一步了解数组
    移植MonkeyRunner的图片对照和获取子图功能的实现-UiAutomator/Robotium篇
    JVM —— 移除永久代
    三层架构与四大天王之——查
    unity3D中使用Socket进行数据通信(一)
    npm使用指南
    java命令模式
    共享内存通讯编程
    jade 入门
    MongoDB数据库进阶 --- 增删查改...
  • 原文地址:https://www.cnblogs.com/shyroke/p/6736061.html
Copyright © 2011-2022 走看看