SSH整合

技术分析之SSH框架的整合


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

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

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

【Struts2】

D:\struts2\struts-2.3.24\apps\struts2-blank\WEB-INF\lib\*.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.Final\lib\required\*.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>

 

posted @ 2015-06-15 14:46  oldmonk  阅读(173)  评论(0编辑  收藏  举报
Fork me on GitHub