zoukankan      html  css  js  c++  java
  • S2SH整合

    Struts2、Spring、Hibernate三大框架在一个项目中的具体职责分配如下:

    三大框架整合,导入各个框架和整合所需的包(本项目采用的是Struts2.3+spring3.0+hibernate)

    1.添加Spring框架

    1)编写applicationContext-bean.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"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
        
        <bean id="date" class="java.util.Date"></bean>
        
    </beans>

    2)测试

    public class SSHTest {
        
        @Test
        public void spring(){
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-*.xml");
            System.out.println(context.getBean("date"));
        }
        
    }

    若测试通过,则spring框架添加成功

    2.添加Hibernate框架

    1)添加hibernate配置文件

    <?xml version='1.0' encoding='UTF-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
              "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
    
    <session-factory>
        <property name="dialect">
            org.hibernate.dialect.MySQLDialect
        </property>
        <property name="connection.url">
            jdbc:mysql://localhost:3306/shop
        </property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>
        <property name="connection.driver_class">
            com.mysql.jdbc.Driver
        </property>
        <property name="c3p0.initialPoolSize">5</property>
        <property name="c3p0.minPoolSize">10</property>
        <property name="c3p0.maxPoolSize">20</property>
        <property name="c3p0.checkoutTimeout">6000</property>
        <property name="show_sql">true</property>
    </session-factory>
    </hibernate-configuration>

    该配置文件中采用了数据库连接池

    2)编写测试工具类

    HibernateSessionFactory.java

    package cn.lsl.test;
    
    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateSessionFactory {
        
        private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
        private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
        private static Configuration configuration = new Configuration();
        private static org.hibernate.SessionFactory sessionFactory;
        private static String configFile = CONFIG_FILE_LOCATION;
    
        static {
            try {
                configuration.configure(configFile);
                sessionFactory = configuration.buildSessionFactory();
            } catch (Exception e) {
                System.err.println("%%%% Error Creating SessionFactory %%%%");
                e.printStackTrace();
            }
        }
    
        private HibernateSessionFactory() {
        }
    
        public static Session getSession() throws HibernateException {
            Session session = (Session) threadLocal.get();
    
            if (session == null || !session.isOpen()) {
                if (sessionFactory == null) {
                    rebuildSessionFactory();
                }
                session = (sessionFactory != null) ? sessionFactory.openSession()
                        : null;
                threadLocal.set(session);
            }
    
            return session;
        }
    
        
        public static void rebuildSessionFactory() {
            try {
                configuration.configure(configFile);
                sessionFactory = configuration.buildSessionFactory();
            } catch (Exception e) {
                System.err.println("%%%% Error Creating SessionFactory %%%%");
                e.printStackTrace();
            }
        }
    
        
        public static void closeSession() throws HibernateException {
            Session session = (Session) threadLocal.get();
            threadLocal.set(null);
    
            if (session != null) {
                session.close();
            }
        }
    
        
        public static org.hibernate.SessionFactory getSessionFactory() {
            return sessionFactory;
        }
    
        
        public static void setConfigFile(String configFile) {
            HibernateSessionFactory.configFile = configFile;
            sessionFactory = null;
        }
    
        
        public static Configuration getConfiguration() {
            return configuration;
        }
    }

    3)测试

    @Test
        public void hibernate(){
            System.out.println(HibernateSessionFactory.getSessionFactory());
        }

    若测试通过,则Hibernate框架添加成功

    3.Hibernate与Spring框架整合

    1)配置LocalSessionFactoryBean

    <!-- 
            1: Spring来管理Hibernate配置文件,就是取代了HibernateSessionFactory
         -->
        <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
             <!-- 加载hibernate的配置文件 -->
             <property name="configLocation" value="classpath:hibernate.cfg.xml" />
         </bean>

    2)配置hibernateTemplate

    <!-- 
             2.通过sessionFactory,返回session,在Spring由HibenrateTemplate封装session
          -->
          <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
              <!-- 需要sessionFactory -->
              <property name="sessionFactory" ref="sessionFactory" />
         </bean>

    3)配置事务管理器

     <!-- 
             3.配置事物管理器transactionManager
             如果要实现Spring的AOP声明式事务,则需要Spring提供事物管理器,所有session都是从sessionFactory创建的,
            事务管理器,需要控制sessionFactory
          -->
         <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
             <property name="sessionFactory" ref="sessionFactory" />
         </bean>

    4)配置事物通知

    <!-- 4 配置事务通知: 事务由事务管理器提供 -->
         <tx:advice id="advice" transaction-manager="transactionManager">
             <tx:attributes>
                 <tx:method name="save*" propagation="REQUIRED"/>
                 <tx:method name="delete*" propagation="REQUIRED"/>
                 <tx:method name="update*" propagation="REQUIRED"/>
                 <tx:method name="*" propagation="NEVER" read-only="true"/>
             </tx:attributes>
         </tx:advice>

    5)配置切入点表达式

     <!-- 5: 切入表达式: 配置运行的时候*包的*类切入通知 -->
         <aop:config>
             <aop:pointcut expression="execution(* cn.lsl.shop.service.impl.*.*(..))" id="pointcut"/>
             <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/>
         </aop:config>

    6)编写实体类和映射文件

    package cn.lsl.shop.pojo;
    
    public class Category implements java.io.Serializable {
        private Integer cid;
        private String ctype;
        private Boolean chot;
        private Integer aid;
        
        public Category() {
            super();
            // TODO Auto-generated constructor stub
        }
        public Category(String ctype, Boolean chot, Integer aid) {
            super();this.ctype = ctype;
            this.chot = chot;
            this.aid = aid;
        }
        public Integer getCid() {
            return cid;
        }
        public void setCid(Integer cid) {
            this.cid = cid;
        }
        public String getCtype() {
            return ctype;
        }
        public void setCtype(String ctype) {
            this.ctype = ctype;
        }
        public Boolean getChot() {
            return chot;
        }
        public void setChot(Boolean chot) {
            this.chot = chot;
        }
        public Integer getAid() {
            return aid;
        }
        public void setAid(Integer aid) {
            this.aid = aid;
        }
    }

    映射文件

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="cn.lsl.shop.pojo.Category" table="category">
            <id name="cid" type="java.lang.Integer">
                <column name="cid" />
                <generator class="native"></generator>
            </id>
            <property name="ctype" type="java.lang.String">
                <column name="ctype" length="20" />
            </property>
            <property name="chot" type="java.lang.Boolean">
                <column name="chot" />
            </property>
            <property name="aid" type="java.lang.Integer">
                <column name="aid" />
            </property>
        </class>
    </hibernate-mapping>

    最后记得在hibernate.cfg.xml文件中添加

    <mapping resource="cn/lsl/shop/pojo/Category.hbm.xml" />

    7)编写Service层

    package cn.lsl.shop.service.impl;
    
    import org.springframework.orm.hibernate3.HibernateTemplate;
    
    import cn.lsl.shop.pojo.Category;
    
    public class CategoryServiceImpl {
        private HibernateTemplate hibernateTemplate = null;
    
        public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
            this.hibernateTemplate = hibernateTemplate;
        }
        
        public void save(Category category){
            hibernateTemplate.save(category);
        }
    }

    并纳入Spring容器管理

    <bean id="categoryServiceImpl" class="cn.lsl.shop.service.impl.CategoryServiceImpl">
            <property name="hibernateTemplate" ref="hibernateTemplate" />
        </bean>

    8)测试

    /*
         * Spring管理Hibernate,采用AOP实现声明式事物
         * 
         * 加载Spring与Hibernate整合的jar包
         * */
        @Test
        public void springHibernate(){
            ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext-*.xml");
            CategoryServiceImpl categoryServiceImpl=(CategoryServiceImpl)context.getBean("categoryServiceImpl");
            Category category=new Category("test",false,1);
            categoryServiceImpl.save(category);
        }

    若数据成功插入数据库,则Spring和Hibernate整和成功

    4.添加struts2框架

    1)编写Action类

    package cn.lsl.shop.action;
    
    import cn.lsl.shop.service.impl.CategoryServiceImpl;
    
    public class TestAction {
       public String test(){
            System.out.println(categoryServiceImpl);
            return "success";
        }
    }

    2)编写配置文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
    <struts>
        <!-- 
                注意:添加jar包的时候要刷新tomcat中项目
            Struts 与Spring的整合作用: Spring来管理Action,从而实现Action与Service解耦
         -->
        <!-- struts-default 使用默认Struts拦截器 -->
        <package name="shop" extends="struts-default">
            <action name="testAction_*" class="cn.lsl.shop.action.TestAction" method="{1}">
                <!-- struts2中 重定向可以忽略工程名 -->
                <result name="success" type="redirect">/success.jsp</result>
            </action>
        </package>
    </struts>  

    3)配置web.xml文件

    <!-- 配置Struts2的过滤器 -->
        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>*.action</url-pattern>
        </filter-mapping>

    5.整合Spring和Struts2

    1)修改Action类,并纳入spring管理

    public class TestAction {
        
        private CategoryServiceImpl categoryServiceImpl=null;
        
        public void setCategoryServiceImpl(CategoryServiceImpl categoryServiceImpl) {
            this.categoryServiceImpl = categoryServiceImpl;
        } 
    
        public String test(){
            System.out.println(categoryServiceImpl);
            return "success";
        }
    }
    <bean id="testAction" class="cn.lsl.shop.action.TestAction">
            <property name="categoryServiceImpl" ref="categoryServiceImpl" />
        </bean>

    2)修改配置文件

    <package name="shop" namespace="/" extends="struts-default">
            <action name="testAction_*" class="testAction" method="{1}">
                <!-- struts2中 重定向可以忽略工程名 -->
                <result name="success" type="redirect">/success.jsp</result>
            </action>
        </package>

    3)在web.xml文件中配置Spring监听器

    <!-- 配置Spring的ContextLoaderListener监听器 -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:applicationContext-*.xml</param-value>
        </context-param>
        
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>

    4)测试

    http://localhost:8080/shop/testAction_test.action

  • 相关阅读:
    以查询功能谈下,三层架构中的工厂模式与其中反射的应用
    结对编程
    第四周周结
    知识思考
    自我介绍
    本周开发工作及内容
    第三周周结
    启航
    如何写出健壮的Java代码
    CentOS x64上Matlab R2015b的镜像安装方法与卸载
  • 原文地址:https://www.cnblogs.com/EvanLiu/p/4104641.html
Copyright © 2011-2022 走看看