• SSH整合


    技术分析之SSH框架的整合


    技术分析之SSH框架开发的基本回顾

    1.1.1    SSH框架的整合方式一:零障碍整合(带有Hibernate配置文件)

    1.1.1.1 创建web项目,引入相关jar包.

    【Struts2】

    D:struts2struts-2.3.24appsstruts2-blankWEB-INFlib*.jar

    Struts2需要了解的jar包:

    struts2-convention-plugin-2.3.24.jar            ---Struts2注解的开发包.

    struts2-json-plugin-2.3.24.jar                  ---Struts2整合AJAX返回JSON数据.

    struts2-spring-plugin-2.3.24.jar                ---Struts2整合Spring的插件包.

    【Hibernate】

    D:hibernate-release-5.0.7.Finallib equired*.jar

    1.1.1.1 引入相关的配置文件:

    【Struts2】

    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>/*</url-pattern>

      </filter-mapping>

    struts.xml

     

    【Hibernate】

    核心配置:hibernate.cfg.xml

     

     

    映射文件:

     

    【Spring】

    web.xml

      <!-- 配置Spring的核心监听器 -->

      <listener>

        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

      </listener>

     

      <context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>classpath:applicationContext.xml</param-value>

      </context-param>

    applicationContext.xml

     

    log4j.propertiess

     

    1.1.1.2 引入相关的页面并进行修改:

     

    1.1.1.3 创建包结构和相关的类:

    1.1.1.1 Struts2和Spring的整合:方式一:Action类由Struts2自己创建

    【编写Action中的save方法】

        /**

         * 保存客户的执行的方法:save

         */

        public String save(){

            System.out.println("Action中的save方法执行了...");

            return NONE;

        }

     

    【配置Action类】

        <package name="ssh" extends="struts-default" namespace="/">

            <action name="customer_*" class="cn.itcast.ssh.web.action.CustomerAction" method="{1}">

           

            </action>

        </package>

     

    【在Action中调用业务层的类】

    配置Service:

        <!-- 配置Service -->

        <bean id="customerService" class="cn.itcast.ssh.service.impl.CustomerServiceImpl">

       

        </bean>

     

    在Action中调用

    // 传统方式的写法

            WebApplicationContext webApplicationContext = WebApplicationContextUtils

                    .getWebApplicationContext(ServletActionContext.getServletContext());

            CustomerService customerService = (CustomerService) webApplicationContext.getBean("customerService");

     

    ***** 这种写法很麻烦的,因为需要在每个Action中的每个方法上获取工厂,通过工厂获得类.

    为了简化这个代码引入一个插件的包:

    struts2-spring-plugin-2.3.24.jar

    在这个插件中开启一个Struts2常量

    * <constant name="struts.objectFactory" value="spring" />

        * 默认的情况下struts2将这个常量关闭的,现在引入插件以后,将常量开启了,引发下面的一些常量生效.

    struts.objectFactory.spring.autoWire = name

    那么就可以在Action中提供想注入的属性了:

    public class CustomerAction extends ActionSupport implements ModelDriven<Customer> {

        // 模型驱动使用的对象

        private Customer customer = new Customer();

     

        @Override

        public Customer getModel() {

            return customer;

        }

       

        // 注入业务层的类:

        private CustomerService customerService;

     

        public void setCustomerService(CustomerService customerService) {

            this.customerService = customerService;

        }

     

     

        /**

         * 保存客户的执行的方法:save

         */

        public String save() {

            System.out.println("Action中的save方法执行了...");

            // 传统方式的写法

            /*WebApplicationContext webApplicationContext = WebApplicationContextUtils

                    .getWebApplicationContext(ServletActionContext.getServletContext());

            CustomerService customerService = (CustomerService) webApplicationContext.getBean("customerService");*/

           

            // 自动注入

            customerService.save(customer);

            return NONE;

        }

    }

    【在Service中编写save方法】

    public class CustomerServiceImpl implements CustomerService {

     

        @Override

        public void save(Customer customer) {

            System.out.println("Service中的save方法执行了...");

        }

     

    }

    1.1.1.1 Struts2和Spring的整合方式二:Action类由Spring创建.(推荐)

    【引入插件包】

    struts2-spring-plugin-2.3.24.jar

     

    【Action交给Spring管理】

    将Action配置到Spring中.

        <!-- 配置Action -->

        <bean id="customerAction" class="cn.itcast.ssh.web.action.CustomerAction" scope="prototype">

         <!—必须手动注入属性-->

        <property name="customerService" ref="customerService"/>

        </bean>

     

    Action的配置:

        <package name="ssh" extends="struts-default" namespace="/">

            <action name="customer_*" class="customerAction" method="{1}">

           

            </action>

        </package>

     

    1.1.1.2 在业务层调用DAO

    【将DAO配置到Spring中】

        <!-- 配置DAO -->

        <bean id="customerDao" class="cn.itcast.ssh.dao.impl.CustomerDaoImpl">

       

        </bean>

    【在业务层注入Dao】

    public class CustomerServiceImpl implements CustomerService {

     

        // 注入Dao

        private CustomerDao customerDao;

       

        public void setCustomerDao(CustomerDao customerDao) {

            this.customerDao = customerDao;

        }

     

        @Override

        public void save(Customer customer) {

            System.out.println("Service中的save方法执行了...");

            customerDao.save(customer);

        }

     

    }

     

        <!-- 配置Service -->

        <bean id="customerService" class="cn.itcast.ssh.service.impl.CustomerServiceImpl">

        <property name="customerDao" ref="customerDao"/>

        </bean>

     

    1.1.1.3 Spring整合Hibernate:

    【创建映射文件】

    <hibernate-mapping>

        <class name="cn.itcast.ssh.domain.Customer" table="cst_customer">

            <id name="cust_id">

                <generator class="native"/>

            </id>

           

            <property name="cust_name"/>

            <property name="cust_user_id"/>

            <property name="cust_create_id"/>

            <property name="cust_source"/>

            <property name="cust_industry"/>

            <property name="cust_level"/>

            <property name="cust_linkman"/>

            <property name="cust_phone"/>

            <property name="cust_mobile"/>

        </class>

    </hibernate-mapping>

     

    【加载到核心配置文件】

            <!-- 加载映射文件 -->

            <mapping resource="cn/itcast/ssh/domain/Customer.hbm.xml"/>

    【在Spring的配置文件中完成如下配置】

        <!-- 配置Hibernate中的sessionFactory -->

        <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">

        <property name="configLocations" value="classpath:hibernate.cfg.xml"/>

        </bean>

     

    【改写DAO】

    public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao {

     

        @Override

        public void save(Customer customer) {

            System.out.println("DAO中的save方法执行了...");

           

        }

     

    }

     

        <!-- 配置DAO -->

        <bean id="customerDao" class="cn.itcast.ssh.dao.impl.CustomerDaoImpl">

        <property name="sessionFactory" ref="sessionFactory"/>

        </bean>

    【调用模板中的方法】

        @Override

        public void save(Customer customer) {

            System.out.println("DAO中的save方法执行了...");

            // 保存:

            this.getHibernateTemplate().save(customer);

        }

    1.1.1.4 配置Spring的事务管理:

    【配置事务管理器】

        <!-- 配置事务管理器 -->

        <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">

        <property name="sessionFactory" ref="sessionFactory"/>

        </bean>

     

    【注解事务管理的开启】

        <!-- 开启事务管理的注解 -->

        <tx:annotation-driven transaction-manager="transactionManager"/>

    【在业务层添加一个注解】

    1.1.1    SSH框架的整合方式二:不带Hibernate的配置文件

    1.1.1.1 复制一个SSH1的项目.

     

    1.1.1.2 查看Hibernate的配置文件:

    Hibernate的配置文件包含如下内容:

    连接数据库必要的参数:

    Hibernate的属性:

    连接池的配置:

    映射文件的引入:

    1.1.1.3 替换数据库连接参数和连接池的配置:

    创建jdbc.properties

    jdbc.driverClass=com.mysql.jdbc.Driver

    jdbc.url=jdbc:mysql:///ssh1

    jdbc.username=root

    jdbc.password=123

     

    在Spring中引入外部属性文件

        <!-- 引入外部属性文件 -->

        <context:property-placeholder location="classpath:jdbc.properties"/>

    配置连接池:

          <!-- 配置c3p0连接池: -->

        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

        <property name="driverClass" value="${jdbc.driverClass}"/>

        <property name="jdbcUrl" value="${jdbc.url}"/>

        <property name="user" value="${jdbc.username}"/>

        <property name="password" value="${jdbc.password}"/>

        </bean>

    1.1.1.4 配置Hibernate的其他属性及映射:

        <!-- 配置Hibernate中的sessionFactory -->

        <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">

        <!-- 注入连接池 -->

        <property name="dataSource" ref="dataSource"/>

       

        <!-- 配置Hibernate的相关属性 -->

        <property name="hibernateProperties">

             <props>

                 <!-- 配置Hibernate的方言 -->

                 <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>

                 <!-- 显示SQL -->

                 <prop key="hibernate.show_sql">true</prop>

                 <!-- 格式化SQL -->

                 <prop key="hibernate.format_sql">true</prop>

                 <!-- 映射到DDL的自动创建 -->

                 <prop key="hibernate.hbm2ddl.auto">update</prop>

             </props>

        </property>

       

        <!-- 配置引入映射文件 -->

        <property name="mappingResources">

             <list>

                 <value>cn/itcast/ssh/domain/Customer.hbm.xml</value>

             </list>

        </property>

        </bean>

    1.1.2    HibernateTemplate的使用:

    public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao {

     

        @Override

        public void save(Customer customer) {

            System.out.println("DAO中的save方法执行了...");

            // 保存:

            this.getHibernateTemplate().save(customer);

        }

     

        @Override

        public void update(Customer customer) {

            this.getHibernateTemplate().update(customer);

        }

     

        @Override

        public void delete(Customer customer) {

            this.getHibernateTemplate().delete(customer);

        }

     

        @Override

        public Customer findById(Long id) {

            return this.getHibernateTemplate().load(Customer.class, id);

        }

     

        @Override

        public List<Customer> findAllByHQL() {

            List<Customer> list = (List<Customer>) this.getHibernateTemplate().find("from Customer");

            return list;

        }

       

        public List<Customer> findAllByQBC(){

            DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);

            List<Customer> list = (List<Customer>) this.getHibernateTemplate().findByCriteria(detachedCriteria);

            return list;

        }

     

    }

    1.1.3    延迟加载的问题的解决:OpenSessionInViewFilter

      <filter>

        <filter-name>OpenSessionInViewFilter</filter-name>

        <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>

      </filter>

     

      <filter-mapping>

        <filter-name>OpenSessionInViewFilter</filter-name>

        <url-pattern>*.action</url-pattern>

      </filter-mapping>

  • 相关阅读:
    48.Warning: (vsim-3534) [FOFIR]
    47.MIF和COE文件格式
    46.谈谈SDRAM的作用
    45.modelsim仿真include文件
    44.do文件格式
    43.技术与产品的价值
    42.JTAG接口使用注意
    41.使用Chipscope时如何防止reg_wire型信号被优化掉
    40.格雷码与二进制码之间的转换
    39.原码、反码、补码的转换
  • 原文地址:https://www.cnblogs.com/xujingyang/p/7017701.html
Copyright © 2020-2023  润新知