SSH 框架為 Struts + Spring + Hibernate 的一個集成框架,是目前較流行的一種 web 應用程序開源框架。
集成SSH框架的系統從職責上分為四層:表示層、業務邏輯層、數據持久層和域模塊層,以幫助開發人員在短期內搭建結構清晰、可復用性好、維護方便的Web應用程序。其中使用Struts作為系統的整體基礎架構,負責MVC的分離,在Struts框架的模型部分,控制業務跳轉,利用Hibernate框架對持久層提供支持,Spring做管理,管理struts和hibernate。具體做法是:用面向對象的分析方法根據需求提出一些模型,將這些模型實現為基本的Java對象,然后編寫基本的DAO(Data Access Objects)接口,並給出Hibernate的DAO實現,采用Hibernate架構實現的DAO類來實現Java類與數據庫之間的轉換和訪問,最后由Spring做管理,管理struts和hibernate。SSH框架分析圖如下:
|——————— 注意:本文使用的版本為 Struts2 + Spring4 + Hibernate5 —————————|
運行環境為:JDK1.8、Tomcat v8.0、eclipse4.6.0
一、Struts
1)本質:過濾器(就像一條看門狗,一旦有請求訪問就要經過它)
2)功能:對用戶發送的請求,按照不同的業務要求,跳轉到不同的頁面,把部分信息作為參數傳遞
3)在 eclipse 中使用 Struts2 :
①、導入相應的 jar 包(小技巧):
從官網(http://struts.apache.org)下載文件 struts-2.3.30-all.zip ==解壓打開==> apps 目錄下 ====> struts2-blank.war ==解壓打開==> WEB-INF 目錄下 ====> lib 目錄下所有 jar 包
②、配置 web.xml 文件添加 Filter
<!-- 配置 Struts --> <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>
③、編寫顯示頁面
我們需要一個 jsp 頁面來呈現信息,根據不同需求,編寫不同的 jsp 頁面
④、編寫 Action 類
新建一個 class 文件繼承父類 ActionSupport , class 文件中至少需要有一個返回字符串類型的方法,根據業務邏輯返回不同的值,同時 Struts 接收到不同的返回值跳轉到不同的頁面
⑤、編寫 struts.xml 文件
我們需要在 struts.xml 中進行相應配置來將 Action 類和 Struts 聯系起來。
在 src 目錄下新建 struts.xml 文件,該文件內容如下:
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 定義包名,方便管理、閱讀和避免重名 --> <package name="packageName" extends="struts-default"> <!-- 配置action類的對應配置 --> <action name="actionName" class="actionClassName" method="action類中返回 String 類型的方法名(默認為execute)"> <!-- 根據結果跳轉到對應的url地址 --> <result name="對應Action類中返回值,默認為success">url地址</result> </action> </package> </struts>
二、Spring
1)本質:監聽器(就像一只鷹,盤旋在空中,監視着程序運行,在程序運行過程中負責注入實例)
【注入:替代代碼中 new ClassName(); 語句,這樣子程序員就不用考慮具體的實現類是什么,只要修改一下配置文件即可。
步驟:定義私有化變量用來保存需要的實現類→→→定義 set() 方法
】
2)功能:管理所用到的實現類。
3)在 eclipse 中使用 Spring4(配置好 Struts 的基礎上):
①、導入相應的 jar 包( spring 官方包里,lib 目錄里除了帶 resource 和 javadoc 后綴的jar包):
除了以上 spring 核心庫外還要導入 commons-logging.jar 和 struts2-spring-plugin.jar(該包在 Struts2 中)
②、配置 web.xml 文件添加 Listener
<!-- spring的監聽器配置開始 --> <!-- 配置上下文參數,保存 applicationContext.xml 文件的路徑,該文件一般直接寫在 src 目錄下 --> <context-param> <!-- 參數名稱(固定不變) --> <param-name>contextConfigLocation</param-name> <!-- classpath(既 src 目錄)":"等價於"/",多個配置文件之間用","隔開 --> <param-value>classpath:applicationContext.xml,classpath:xxx.xml,……</param-value> </context-param> <!-- 監聽器配置 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
③、編寫 applicationContext.xml 文件
<?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"> <!-- 類似於財務部門一樣,類就是錢,所有需要類的實例都由srping去管理 --> <!-- 給 Struts 注入相應的實現類 --> <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">
<!-- 加入 hibernate 的配置信息,這里先不用管 --> <property name="sf" ref="sessionFactory"></property> </bean> </beans>
三、Hibernate
1)本質:服務器和數據庫交互的媒介
2)功能:負責對數據庫的一些操作(如:建表、增、刪、查、改等)
3)在 eclipse 中使用 Hibernate5(在配置好 Struts2 和 Spring4 的基礎上)【注意:本文使用的數據庫是 mysql 還需要導入相應的驅動包】
①、導入相應的 jar 包
從官網下載好官方包==解壓打開==> lib 目錄下 ====> required 目錄下所有的 jar 包 和 optional 目錄下 c3p0 目錄下所有的 jar 包
【 c3p0 :本文使用的數據庫連接池,根據不同的連接池需要導不同的包。】
required 目錄下:
c3p0 目錄下:
②、編寫映射文件
命名規則:JavaBeanName.hbm.xml 【注意:該文件必須和實體類在同一個目錄(包)】
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2016-8-30 14:25:36 by Hibernate Tools 3.5.0.Final --> <hibernate-mapping> <!-- name="實體類的包名.類名" table="表名" --> <class name="ssh.entity.BookCard" table="BOOKCARD"> <!-- id元素表內主鍵字段對應實體類字段 --> <id name="cid" type="int"> <column name="CID" /> <generator class="assigned" /><!-- 標識符生成器,主鍵生成規則 --> </id> <!-- 將實體類字段和表內字段一一對應 --> <property name="name" type="java.lang.String"> <column name="NAME" /> </property> <property name="sex" type="java.lang.String"> <column name="SEX" /> </property> <property name="cardDate" type="java.util.Date"> <column name="CARDDATE" /> </property> <property name="deposit" type="java.math.BigDecimal"> <column name="DEPOSIT" /> </property> </class> </hibernate-mapping>
③、編寫 applicationContext.xml
將 hibernate.cfg.xml 文件內的信息寫入到該文件中:<bean id="sessionFactory" 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> <!-- 顯示sql語句 --> <prop key="hibernate.show_sql">true</prop> <!-- 格式化sql語句 --> <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> <!-- c3p0 --> <bean name="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 配置數據庫連接信息 -->
<!-- 從 jdbc.properties 文件中讀取 --> <property name="driverClass" value="${driverClass}" /> <property name="jdbcUrl" value="${jdbcUrl}" /> <property name="user" value="${user}" /> <property name="password" value="${password}" /> <!-- 每300秒檢查所有連接池中的空閑連接 --> <property name="idleConnectionTestPeriod" value="300"></property> <!-- 最大空閑時間,900秒內未使用則連接被丟棄。若為0則永不丟棄 --> <property name="maxIdleTime" value="900"></property> <!-- 最大連接數 --> <property name="maxPoolSize" value="20"></property> </bean>
④、編寫 jdbc.properties 文件
driverClass=com.mysql.jdbc.Driver 數據庫驅動
jdbcUrl=jdbc\:mysql\://localhost\:3306/CardDB 數據庫連接url
user=root 用戶名
password=980317 密碼
|———————————————————————————————————————————————|
以上,就是關於SSH框架整合的總結。
獻上本文所用到的工具包:Struts2 所用 jar 包、Spring4 所用 jar 包、hibernate5 所用 jar 包