SSH框架整合-慕课课程

SSH框架整合-慕课课程

学习时间:2018年12月3日
慕课链接:基于SSH实现员工管理系统之框架整合篇
内容:Struts2+Hibernate+Spring框架整合,分为Struts2整合Spring和Spring整合Hibernate两步进行
源码:Github:SSH_Base

一、开发环境搭建

1. jar 包导入

2. 引入相关配置文件

  • web.xml-->Struts2 过滤器配置

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

    >struts-2.3.36-all.zip\struts-2.3.36\apps\struts2-blank-2.3.36.war\WEB-INF\classes\struts2.xml
  • web.xml -->Spring 核心监听器

    > ContextLoaderListener--> ContextLoader --> 105:contextConfigLocation
    <!-- 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

3. 创建包结构和实体

- 包结构:
    - com.ssh.action
    - com.ssh.dao-
    - com.ssh.domain - 实体 product
    - com.ssh.service

二、Struts2整合Spring

1. 页面创建

  • 使用struts2标签 布局页面
<s:form action="" method="post" namespace="/" theme="simple">
    <table border="1" width="400">
        <tr>
            <td>商品名称:</td>
            <td><s:textfield name="pname"/></td>
        </tr>
        <tr>
            <td>商品价格:</td>
            <td><s:textfield name="price"/></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" value="添加" /></td>
        </tr>
    </table>
</s:form>

2. 编写Action,Service,Dao的类

  • com.ssh.action

    ProductAction //商品管理的Action
    public class ProductAction extends ActionSupport implements ModelDriven<Product>{
        //^extends ActionSupport implements ModelDriven<Product> (模型驱动的接口)
        //模型驱动使用的类
        private Product product = new Product();
        @Override
        public Product getModel() {
            // TODO Auto-generated method stub
            return product;
        }
        /*注入Service  struts2-spring-plugin-2.3.36.jar > struts-plugin.xml > struts.objectFactory
                >struts.objectFactory.spring.autoWire = name 自动装配*/    
        /*Struts 和Spring 整合过程中按名字自动注入业务层的类*/
        private ProductService productService;
    
        public void setProductService(ProductService productService) {
            this.productService = productService;
        }
    }
  • com.ssh.dao

    ProductDao //商品管理的DAO
  • com.ssh.domain

    实体 product
  • com.ssh.service

    ProductService //商品管理的业务层
    //业务层 注入Dao的类
    private ProductDao productDao;
    
    public void setProductDao(ProductDao productDao) {
        this.productDao = productDao;
    }

3. 配置Action,Service,Dao的类

  • aplicationContext.xml 配置业务层的类 *

    <!-- 配置业务层的类 -->
    <bean id="productService" class="com.epoint.ssh.service.ProductService">
        <property name="productDao" ref="productDao"/>
    </bean>
    
    <!-- 配置DAO的类 -->
    <bean id="productDao" class="com.epoint.ssh.dao.ProductDao">
    </bean>
  • Struts2和Spring整合的两种方式

    • (1) Action 类由Struts2 自身创建

      • struts2.xml————><s:form action="product_save" method="post" namespace="/" theme="simple">

        • 在applicationContext.xml中配置Service DAO 两个<bean>标签(上一步*)
    • (2)actio 类交给Spring创建

      <!--配置action类  -->
      <bean id="productAction" class="com.epoint.ssh.action.ProductAction" scope="prototype">  
              <!--手动注入service  -->
              <property name="productService" ref="productService"></property>
      </bean>
      <package name="ssh" extends="struts-default" namespace="/">
          <action name="product_*" class="productAction" method="{1}" >
          </action>
      </package>
  • Action中执行的方法

三、Sprinng整合 Hibernate

1. 创建数据库

  • create database myssh

2. 创建映射文件 以及Spring中的配置

  • /ssh/src/com/epoint/ssh/domain/Product.hbm.xml

    --> /org/hibernate/hibernate-mapping-3.0.dtd
    <hibernate-mapping>
            <class name="com.epoint.ssh.domain.Product" table="product">
                <id name="pid" column="pid">
                    <generator class="native"/><!-- native表示自增 -->
                </id> 
                <property name="pname" column="pname" length="20"/>
                <property name="price" column="price"/>
            </class>
        </hibernate-mapping>
  • applicationContext.xml

    <!-- 引入外部配置文件 -->
    <context:property-placeholder location="classpath:jdbc.properties"/> 
    <!-- 配置连接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/myssh?useSSL=false"/>
        <property name="user" value="root"/>
        <property name="password" value="Gepoint"/>
    </bean>
    <!-- 配置Hibernate -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <!--注入连接池  -->
        <property name="dataSource" ref="dataSource"></property>
        <!--配置Hibernate属性  -->
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop><!--方言  -->
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>    
            </props>
        </property>
        <!--加载Hibernate配置文件  -->
        <property name="mappingResources">
            <list>
                <value>com/epoint/ssh/domain/Product.hbm.xml</value>
            </list>
        </property>
    </bean>

3. 编写DAO的代码

  • 注入SessionFactory:

    • 在 Dao 上extends HibernateDaoSupport
    • 配置applicationContext中的Dao
    <bean id="productDao" class="com.epoint.ssh.dao.ProductDao">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
  • 在Dao中调用模板完成保存操作

    this.getHibernateTemplate().save(product)

4. 添加事务管理

<!-- 配置事务管理 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 开启注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

5.问题

  • 错误1: Causedby:java.lang.ClassNotFoundException:com.mchange.v2.c3p0.ComboPooledDataSource

    解决:
    1.导入c3p0-0.9.2.1.jar和mchange-commons-java-0.2.3.4.jar(有的导入就解决,有的还会报错,报错的看第二步)
    2.对于 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><bean> 中的class不能直接复制粘贴,要通过“提示”敲出来,如果直接复制或者不按提示敲出来可能还会继续报同样的错误
  • 错误2:Loading class 'com.mysql.jdbc.Driver'. This is deprecated.

    解决:
    com.mysql.jdbc.Driver 改为 com.mysql.cj.jdbc.Driver
  • 错误3:MYSQL:WARN: Establishing SSL connection without server's identity verification is not recommended.

    解决:
    jdbc:mysql://localhost:3306/test?useSSL=false
  • 错误4: java.sql.SQLException: Access denied for user 'root '@'localhost' (using password: YES)

    解决:
    参考:java.sql.SQLException

相关推荐