1. 程式人生 > >SSH框架的整合

SSH框架的整合

SSH框架的整合

github:https://github.com/HelloMX/SSH-/tree/master/project/myWeb

  1. 簡介

  2. 環境搭建

    • 匯入相關jar包

      參考:框架回顧和介紹參考

      紅色以及mysql為需要手動新增的,其餘為idea自動下載的。

      在這裡插入圖片描述

    • 配置web.xml

      <web-app>
      
      <!--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> <!--Struts2框架的核心過濾器的配置--> <filter> <filter-name>struts</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name
      >
      struts</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
  3. Struts2整合Spring


    專案結構

    編寫各層程式碼

    配置(兩種整合方式)


    • 專案結構

      在這裡插入圖片描述

    • 編寫 實體類 與 addProduct.jsp

      • addProduct.jsp

        <%@ page contentType="text/html;charset=UTF-8" language="java" %>
        <%@ taglib uri="/struts-tags" prefix="s"%>
        <html>
        <head>
            <title>addProduct</title>
        </head>
        <body>
        <h1>儲存商品的頁面</h1>
        <s:form action="product_save" 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>
        </body>
        
      • Product.java

        public class Product {
            private int pid;
            private String pname;
            private Double price;
        	//getter and setter
        }
        
    • 編寫Action,Service,DAO

      • ProductAction

        public class ProductAction extends ActionSupport implements ModelDriven<Product> {
            //模型驅動使用的類
            private Product product=new Product();
            @Override
            public Product getModel() {
                return product;
            }
        
            //Struts和Spring整合過程中按照名稱自動注入的業務層的類
            //!!!!!!!!!!!!!這裡用到了struts和spring整合的自動裝配!!!!!!!!
            //如果是使用的由struts管理action 沒有struts2-spring-plugin.jar就不會成功!
            private ProductService productService;
            public void setProductService(ProductService productService) {
                this.productService = productService;
            }
        
            //儲存商品的執行的方法
            public  String save(){
                System.out.println("Action 中的save 執行了");
                productService.save(product);
                return NONE;
            }
        
        }
        
      • ProductService

        public class ProductService {
        
            //業務層注入DAO的類 這裡使用了Spring的配置檔案 詳見applicationContext.xml
            private ProductDao productDao;
        
            public void setProductDao(ProductDao productDao) {
                this.productDao = productDao;
            }
           //業務層儲存商品的方法
            public void save(Product product) {
                System.out.println("service 中的save執行了");
                productDao.save(product);
         
            }
        }
        
      • ProductDao

        public class ProductDao {
            //dao中儲存商品的方法
            public void save(Product product) {
                System.out.println("dao 中的save方法執行了");
            }
        }
        
    • 配置Action,Service,DAO的類

      • 通用配置

        applicationContext.xml中配置業務層與DAO層

        <!--配置業務層的類-->
        <bean id="productService" class="learn.ssh.service.ProductService">
            <property name="productDao" ref="productDao"/>
        </bean>
        
        <!--配置DAO的類-->
        <bean id="productDao" class="learn.ssh.dao.ProductDao">
        
        </bean>
        
      • Action類由Struts2自身去建立

        applicationContext.xml中不需要新增關於productAction的Bean
        需要struts2-spring-plugin.jar
        此時struts.xml的配置

        <struts>
            <package name="ssh" extends="struts-default" namespace="/">
               <!--當action由struts管理時,此處要寫全路徑,且spring的配置中不需要寫其他內容-->
               <action name="product_*" class="learn.ssh.action.ProductAction" method="{1}">
            </package>
        </struts>
        
      • Action類交給Spring框架建立

        applicationContext.xml

        <!--配置action類-->
        <!--struts是多例的 而spring預設是單例的 所以一定要記得該prototype-->
        <bean id="productAction" class="learn.ssh.action.ProductAction" scope="prototype">
            <!--手動注入service-->
            <property name="productService" ref="productService"/>
        </bean>
        
        <!--配置業務層的類-->
        ...
        <!--配置DAO的類-->
        ...
        

        此時struts.xml的配置

        <struts>
            <package name="ssh" extends="struts-default" namespace="/">        
                <!--當action由spring管理時,此處class只需要寫 spring中配置的bean的id-->
                
                <action name="product_*" class="productAction" method="{1}">
                </action>
            </package>
        </struts>
        
  4. Spring 整合Hibernate

    • 建立資料庫

      CREATE DATABASE ssh;
      
    • 建立對映檔案

      src/learn/ssh/domain/Product.hbm.xml(與Product同目錄)

      <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
      <hibernate-mapping>
          <class name="learn.ssh.domain.Product" table="product">
              <id name="pid" column="pid">
                  <generator class="native"/>
              </id>
      
              <property name="pname" column="pname" length="20"/>
              <property name="price" column="price" />
          </class>
      </hibernate-mapping>
      
    • Spring 整合Hibernate

      原先會有hibernate的配置檔案,此處全交給spring管理

      • src目錄下建立jdbc.properties

        jdbc.driverClass=com.mysql.cj.jdbc.Driver
        jdbc.url=jdbc:mysql://localhost:3306/ssh
        jdbc.username=root
        jdbc.password=123
        
      • applicationContext.xml

        引入外部配置檔案

        <!--引入外部屬性檔案-->
        <context:property-placeholder location="classpath:jdbc.properties"/>
        

        配置連線池

        tips:報錯

        org.springframework.beans.factory.BeanCreationException:
        Error creating bean with name 'dataSource' defined in class path resource [bean-properties.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.mchange.v2.c3p0.ComboPooledDataSource]: No default constructor found; nested exception is java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector
        

        mchange-commons-java和c3p0都需要匯入!

        <!--配置連線池 c3p0包和mchange-commons-java包記得匯入-->
        <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>
        

        配置hibernate的相關屬性

        <!--配置Hibernate的相關屬性-->
        <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
            <!--注入連線池-->
            <property name="dataSource" ref="dataSource"/>
            <!--配置Hibernate屬性-->
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</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>learn/ssh/domain/Product.hbm.xml</value>
                </list>
            </property>
        </bean>
        
      • 此時啟動會發現,hibernate自動建立了Product表

        Hibernate: 
            
            create table product (
               pid integer not null auto_increment,
                pname varchar(20),
                price double precision,
                primary key (pid)
            ) engine=MyISAM
        
    • 編寫DAO程式碼

      • 在DAO類上繼承HibernateDaoSupport

        public class ProductDao extends HibernateDaoSupport
        
      • 在配置DAO的時候,在DAO中注入SessionFactory:

        applicationContext.xml

        <!--配置DAO的類-->
        <bean id="productDao" class="learn.ssh.dao.ProductDao">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
        
      • 在DAO中呼叫模板完成儲存操作

        public class ProductDao extends HibernateDaoSupport{
            //dao中儲存商品的方法
            public void save(Product product) {
                System.out.println("dao 中的save方法執行了");
                System.out.println(product.getPname()+" "+product.getPrice());
                this.getHibernateTemplate().save(product);
            }
        }
        
    • 事務管理

      • 配置事務管理器

        applicationContext.xml

        <!--配置事務管理器-->
        <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
        
      • 開啟註解事務

        <!--開啟註解事務-->
        <tx:annotation-driven transaction-manager="transactionManager"/>
        
      • 業務層類上添加註解

        import org.springframework.transaction.annotation.Transactional;
        @Transactional
        public class ProductService {...}
        
  5. 結果展示

    在這裡插入圖片描述