Spring04

来源:互联网 发布:电脑主机 知乎 编辑:程序博客网 时间:2024/06/04 19:52

案例一使用SSH的整合完成客户的保存操作

1.1     案例需求

1.1.1   需求描述

使用SSH整合完成CRM的客户保存操作

1.2     相关知识点:

1.2.1   SSH简单的回顾:

1.2.1.1SSH的基本开发回顾

 

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

1.2.2.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

日志记录:

log4j的包由Spring引入.

数据库驱动:

Hibernate引入连接池:

D:\hibernate-release-5.0.7.Final\lib\optional\c3p0\*.jar

 

【Spring】

基本的开发:

AOP开发:

JDBC开发:

事务管理的开发:

整合Hibernate:

整合web项目:

1.2.2.2 引入相关的配置文件:

【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.2.2.3 引入相关的页面并进行修改:

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

 

1.2.2.5 Struts2Spring的整合:方式一:Action类由Struts2自己创建

【编写Action中的save方法】

    /**

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

     */

    public String save(){

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

        return NONE;

    }

 

【配置Action类】

    <packagename="ssh"extends="struts-default"namespace="/">

        <actionname="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 CustomerActionextends ActionSupportimplements ModelDriven<Customer> {

    // 模型驱动使用的对象

    private Customer customer= new Customer();

 

    @Override

    public Customer getModel() {

        return customer;

    }

   

    // 注入业务层的类:

    private CustomerServicecustomerService;

 

    publicvoid 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 CustomerServiceImplimplements CustomerService {

 

    @Override

    public voidsave(Customer customer) {

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

    }

 

}

 

1.2.2.6Struts2和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">

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

    <propertyname="customerService"ref="customerService"/>

    </bean>

 

Action的配置:

    <packagename="ssh"extends="struts-default"namespace="/">

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

       

        </action>

    </package>

 

1.2.2.7在业务层调用DAO

【将DAO配置到Spring中】

    <!-- 配置DAO -->

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

   

    </bean>

【在业务层注入Dao】

public class CustomerServiceImplimplements CustomerService {

 

    // 注入Dao

    privateCustomerDao customerDao;

   

    publicvoid setCustomerDao(CustomerDao customerDao) {

        this.customerDao= customerDao;

    }

 

    @Override

    public voidsave(Customer customer){

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

        customerDao.save(customer);

    }

 

}

 

    <!-- 配置Service -->

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

    <propertyname="customerDao" ref="customerDao"/>

    </bean>

 

1.2.2.8Spring整合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>

 

【加载到核心配置文件】

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

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

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

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

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

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

    </bean>

 

【改写DAO】

public class CustomerDaoImpl extendsHibernateDaoSupport implements CustomerDao {

 

    @Override

    public voidsave(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.2.2.9配置Spring的事务管理:

【配置事务管理器】

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

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

    <propertyname="sessionFactory"ref="sessionFactory"/>

    </bean>

 

注解事务管理的开启

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

    <tx:annotation-driventransaction-manager="transactionManager"/>

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

 

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

1.2.3.1复制一个SSH1的项目.

 

1.2.3.2查看Hibernate的配置文件:

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

连接数据库必要的参数:

Hibernate的属性:

连接池的配置:

映射文件的引入:

 

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

创建jdbc.properties

jdbc.driverClass=com.mysql.jdbc.Driver

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

jdbc.username=root

jdbc.password=123

 

在Spring中引入外部属性文件

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

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

配置连接池:

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

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

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

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

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

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

    </bean>

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

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

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

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

    <propertyname="dataSource"ref="dataSource"/>

   

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

    <propertyname="hibernateProperties">

         <props>

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

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

             <!--显示SQL -->

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

             <!--格式化SQL -->

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

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

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

         </props>

    </property>

   

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

    <propertyname="mappingResources">

         <list>

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

         </list>

    </property>

    </bean>

1.2.4   HibernateTemplate的使用:

public class CustomerDaoImpl extends HibernateDaoSupportimplements CustomerDao {

 

    @Override

    public voidsave(Customer customer) {

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

        // 保存:

        this.getHibernateTemplate().save(customer);

    }

 

    @Override

    public voidupdate(Customer customer) {

        this.getHibernateTemplate().update(customer);

    }

 

    @Override

    public voiddelete(Customer customer) {

        this.getHibernateTemplate().delete(customer);

    }

 

    @Override

    public Customer findById(Longid) {

        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(){

        DetachedCriteriadetachedCriteria = DetachedCriteria.forClass(Customer.class);

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

        return list;

    }

 

}

1.2.5   延迟加载的问题的解决: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>

 

原创粉丝点击