SSH框架的整合
SSH框架的整合
github:https://github.com/HelloMX/SSH-/tree/master/project/myWeb
-
簡介
-
環境搭建
-
匯入相關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</
-
-
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>
-
-
-
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 {...}
-
-
-
結果展示