聲明:java
本文是我的對ssh框架的學習、理解而編輯出來的,可能有不足之處,請你們諒解,但但願能幫助到你們,一塊兒探討,一塊兒學習!mysql
Struts + Spring + Hibernate三者各自的特色都是什麼?web
Struts 的MVC設計模式可使咱們的邏輯變得很清晰,主要負責表示層的顯示。spring
Spring 的IOC和AOP可使咱們的項目在最大限度上解藕。sql
hibernate的就是實體對象的持久化了, 數據庫的封裝。數據庫
表現層、中間層(業務邏輯層)和數據服務層。三層體系將業務規則、數據訪問及合法性校驗等工做放在中間層處理。客戶端不直接與數據庫交互,而是經過組件與中間層創建鏈接,再由中間層與數據庫交互。apache
表現層是傳統的JSP技術。設計模式
中間層採用的是流行的Spring+Hibernate,爲了將控制層與業務邏輯層分離,又細分爲如下幾種。session
Web層,就是MVC模式裏面的「C」(controller),負責控制業務邏輯層與表現層的交互,調用業務邏輯層,並將業務數據返回給表現層做組織表現,該系統的MVC框架採用Struts。app
Service層(就是業務邏輯層),負責實現業務邏輯。業務邏輯層以DAO層爲基礎,經過對DAO組件的正面模式包裝,完成系統所要求的業務邏輯。
DAO層,負責與持久化對象交互。該層封裝了數據的增、刪、查、改的操做。
PO,持久化對象。經過實體關係映射工具將關係型數據庫的數據映射成對象,很方便地實現以面向對象方式操做數據庫。
Spring的做用貫穿了整個中間層,將Web層、Service層、DAO層及PO無縫整合,其數據服務層用來存放數據。
一個良好的框架可讓開發人員減輕從新創建解決複雜問題方案的負擔和精力;它能夠被擴展以進行內部的定製化;而且有強大的用戶社區來支持它。框架一般能很好的解決一個問題。然而,你的應用是分層的,可能每個層都須要各自的框架。
開始搭建SSH:
第一步:
用eclipse(開發工具)裏建立web項目,注意勾選生產web.xml文件。
第二步:
導入項目須要的jar包
struts2:http://struts.apache.org/
由於這是個國外網站,因此訪問的時候會慢,下載的時候也慢
Spring:spring-framework-4.3.2.RELEASE 這個官網不提供下載,你們能夠百度下載,有不少網上的朋友都封裝好了。
hibernate:https://sourceforge.net/projects/hibernate/files/latest/download?source=files 訪問就提示下載
Struts2的jar包:
從下載的解壓打開,apps 目錄下解壓打開,
WEB-INF 目錄下,lib 目錄下全部 jar 包導入項目。
Spring 的jar包:
從下載的解壓打開,在從解壓打開,把
,以"javadoc.jar"、"sources.jar"結尾的jar包不導入,其餘的所有導入項目。由於是SSH框架,因此還要從剛剛Struts2中(剛剛下載的
中的lib裏面)導入 commons-logging.jar 和 struts2-spring-plugin.jar
Hibernate的jar包:
從剛剛給的網址中下載解壓打開,lib 目錄下中的required 目錄下全部的 jar 包 和 optional 目錄下 c3p0 目錄下全部的 jar 包。
注意:c3p0 :本文使用的數據庫鏈接池,根據不一樣的鏈接池須要導不一樣的包
若是是dbcp,那麼你能夠去網上下載
第三步:
在配置文件web.xml中配置一個struts2的過濾器和spring監聽器。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>ssh_001</display-name> <welcome-file-list> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 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> <!-- spring監聽器配置開始 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>
第四步:
在Java Resources下的src目錄下建立一個struts.xml文件
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
上面的頭,注意版本,從樣例裏複製過來 showcase.war\WEB-INF\src\java\struts.xml
告知Struts2運行時使用Spring來建立對象就要加入一句:<constant name="struts.objectFactory" value="spring" />
固然也能夠包括多個xml文件,讓項目分工明確,減小各我的的代碼衝突
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <!-- 上面的頭,注意版本,從樣例裏複製過來 showcase.war\WEB-INF\src\java\struts.xml --> <struts> <!-- 第1步:先定義一個包 --> <package name="mypck001" extends="struts-default"> <!-- 第2步:定義一個action,配置跳轉信息 name 相似於Servlet @WebServlet("/IndexServlet") http://xxxx/xxx/Index.action http://xxxx/xxx/Index class 對應於本身寫的Action類 當不寫method屬性時,默認調用的是execute class="ssh.action.IndexAction" ** new ssh.action.IndexAction() 設計思想:關心了具體的實現類 必須改成不要關注那個實現類 加入spring後,struts的action節點的class屬性意義發生變化, 直接引用spring幫忙建立的實例 --> <action name="Index" class="myIndexAction" method="execute1"> <!-- 跳轉是forward /WEB-INF/是防止jsp不通過action就能夠訪問 --> <result name="success">/WEB-INF/jsp/index2.jsp</result> <result name="error">/WEB-INF/jsp/s_tag.jsp</result> </action> </package> </struts>
若是你是隻是用stutrs,沒有用spring,那麼在action的class裏本身寫的Action類路徑,
而這裏用了spring
,就要去到appliCation.xml配置文件
而method屬性裏的方法名則是Action裏的方法,當不寫method屬性時,默認調用的是execute。
result name="success"裏的name就是action裏對應方法的返回值進行請求轉發跳轉。
第五步:
在Java Resources下的src目錄下建立四個包進行分層。
在ssh.action裏建立一個IndexAction 繼承ActionSupport
package ssh.action; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import ssh.dao.IndexDao; import ssh.dao.IndexDaoImpl; import ssh.entity.BookCard; import ssh.service.IndexService; import ssh.service.IndexServiceImpl; import ssh.util.MyConnection; public class IndexAction extends ActionSupport { //聲明service,但不給它建立具體的實現類的實例, private IndexService is = null; public void setIs(IndexService is) { this.is = is; } public String execute1() { List<BookCard> myBookCardList = is.getAllBookCard(); System.out.println("結果集:"+myBookCardList.size()); ActionContext ac = ActionContext.getContext(); ac.put("myBookCardList", myBookCardList); return "success"; } public String formatDouble(double s){ DecimalFormat fmat=new DecimalFormat("\u00A4##.0"); return fmat.format(s); } }
這就是spring注入:
爲了解藕。
return "success" ActionContext ac = ActionContext.getContext(); ac.put("myBookCardList", myBookCardList); → → (跳轉)<result name="success">/WEB-INF/jsp/index2.jsp</result>
第六步:
hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 數據庫鏈接配置 -->
<property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
<property name="connection.url">jdbc:sqlserver://localhost:1433;DatabaseName=CardDB</property>
<property name="connection.username">sa</property>
<property name="connection.password">123456</property>
<!-- 每一個數據庫都有1個,針對特定的關係型數據庫生成優化的SQL -->
<property name="dialect">org.hibernate.dialect.SQLServer2008Dialect</property>
<!-- 設置默認的數據庫鏈接池 -->
<property name="connection.pool_size">5</property>
<!-- 顯示SQL -->
<property name="show_sql">true</property>
<!-- 格式化SQL -->
<property name="format_sql">true</property>
<!-- 根據schema更新數據表的工具 -->
<property name="hbm2ddl.auto">update</property>
<!-- 數據表映射配置文件 -->
<mapping resource="ssh/entity/BookCard.hbm.xml"/>
</session-factory>
</hibernate-configuration>
第七步:
appliCation.xml配置文件
將 hibernate.cfg.xml 文件內的信息寫入到該文件中:<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd"> <!-- 引入外部屬性文件 --> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 相似於財務部門同樣,類就是錢,全部須要類的實例都由srping去管理 --> <bean id="myIndexAction" class="ssh.action.IndexAction" scope="prototype"> <!-- setIs(myIndexService) --> <property name="is" ref="myIndexService"/> </bean> <!-- myIndexService = new ssh.service.IndexServiceImpl() --> <bean id="myIndexService" class="ssh.service.IndexServiceImpl" scope="prototype"> <property name="id" ref="myIndexDao"/> </bean> <bean id="myIndexDao" class="ssh.dao.IndexDaoImpl" scope="prototype"> <!-- 晚點再注入能用的seesionFactory --> <property name="sessionFactory" ref="mySessionFactory"></property> </bean> <!-- 錯誤的作法,new org.hibernate.internal.SessionFactoryImpl() 不能夠,須要configuration來建立 bean id="mySessionFactory" class="org.hibernate.internal.SessionFactoryImpl"></bean --> <bean id="mySessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <!-- 注入鏈接池,包含了數據庫用戶名,密碼等等信息 --> <property name="dataSource" ref="myDataSource"/> <!-- 配置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.connection.autocommit">false</prop> <!-- 開機自動生成表 --> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> <property name="mappingResources"> <list> <value>ssh/entity/BookCard.hbm.xml</value> </list> </property> </bean> <bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driver}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.user}"/> <property name="password" value="${jdbc.password}"/> <!-- 每300秒檢查全部鏈接池中的空閒鏈接 --> <property name="idleConnectionTestPeriod" value="300"></property> <!-- 最大空閒時間,900秒內未使用則鏈接被丟棄。若爲0則永不丟棄 --> <property name="maxIdleTime" value="900"></property> <!-- 最大鏈接數 --> <property name="maxPoolSize" value="2"></property> </bean> </beans>
<bean id="myIndexAction" class="ssh.action.IndexAction" scope="prototype"> <!-- setIs(myIndexService) --> <property name="is" ref="myIndexService"/> </bean>
id="myIndexAction" 實例化對象的名字
class="ssh.action.IndexAction" 實例化對象的路徑(包名類名)
scope="prototype" 非單例
name="is" 實例化對象裏面屬性的名字
ref="myIndexService" 引用
jdbc.properties:
jdbc.driver=com.mysql.jdbc.Driver 數據庫驅動
jdbc.url=jdbc:mysql://localhost:3306/CardDB 鏈接數據庫url
jdbc.user=root 用戶名
jdbc.password=123456 密碼
左邊這些是鏈接數據庫的信息
以上就是SSH框架的所有內容,若是有遺漏或不足,歡迎指出,謝謝。