JAVAweb之SSH框架
SSH框架( struts+spring+hibernate)
開發環境 myeclipes2015 sqlserver2012 Java
簡述
SSH是 struts+spring+hibernate的一個集成框架,是06年之前較為流行的一種Web應用程序開源框架.。集成SSH框架的系統從職責上分為四層:表示層、業務邏輯層、數據持久層和域模塊層,以幫助開發人員在短期內搭建結構清晰、可復用性好、維護方便的Web應用程序。其中使用Struts作為系統的整體基礎架構,負責MVC的分離,在Struts框架的模型部分,控制業務跳轉,利用Hibernate框架對持久層提供支持,Spring做管理,管理struts和hibernate。
SSH框架優點
優秀的解耦性,很少有軟件產品的需求從一開始就完全是固定的??蛻魧浖枨?#xff0c;是隨著軟件開發過程的深入,不斷明晰起來的。因此,常常遇到軟件開發到一定程度時,由于客戶對軟件需求發生了變化,使得軟件的實現不得不隨之改變。ssh三層構架,控制層依賴于業務邏輯層,但絕不與任何具體的業務邏輯組件耦合,只與接口耦合;同樣,業務邏輯層依賴于DAO層,也不會與任何具體的DAO組件耦合,而是面向接口編程。采用這種方式的軟件實現,即使軟件的部分發生改變,其他部分也不會改變。
框架解析
Struts
(一般開發選用的是Struts2【Struts的升級版】})
Struts2是一個基于MVC設計模式的Web應用框架,它本質上相當于一個servlet,在MVC設計模式中,Struts2作為控制器(Controller)來建立模型與視圖的數據交互。Struts 2是Struts的下一代產品,是在 struts 1和WebWork的技術基礎上進行了合并的全新的Struts 2框架。其全新的Struts 2的體系結構與Struts 1的體系結構差別巨大。Struts 2以WebWork為核心,采用攔截器的機制來處理用戶的請求,這樣的設計也使得業務邏輯控制器能夠與ServletAPI完全脫離開,所以Struts 2可以理解為WebWork的更新產品。
spring
Spring就像是整個項目中裝配bean的大工廠,在配置文件中可以指定使用特定的參數去調用實體類的構造方法來實例化對象。Spring,使用基本的實體JavaBean來完成以前只能用EJB完成的事情。而其核心則是控制反轉(IOC)和面向切面編程(AOP)。使用Spring,意味著一個對象的創建再也不是自己new出來的,而是全權交給了IOC容器去實例化。與此同時,Spring通過采用依賴注入(DI)的方式,通過屬性的Setter和Getter方法來注入這個對象的屬性,這樣的好處就是不完全依賴于容器的API,且查詢依賴與代碼實現了解耦。而AOP,則是將應用的業務邏輯和系統級服務(例如事務)分離開來,進行內聚性的開發,應用對象只負責完成業務邏輯而不關心日志或者事務的處理。
spring優勢
spring提高了一種對象管理方法,有效的組織系統中間層對象。是框架的完美“粘合劑”。有利于面向接口編程習慣的養成,使代碼結構清晰。
hibernate
Hibernate,是負責了跟數據庫的交接。通過持久化數據對象,進行對象關系的映射,并以對象的角度來訪問數據庫。通過封裝JDBC,使得開發人員可以以面向對象編程的思想來操控數據庫,從而擺脫了以往使用JDBC編程時的“死板”操作。通過hibernate.cfg.xml文件來取代以往的JDBC連接數據庫的一大串代碼,通過XXX(實體Bean的類名).hbm.xml文件來與數據庫的具體表進行映射。并且Hibernate有自己的HQL語句,與數據庫的SQL語句相似,但不同的是HQL語句在面向對象編程的角度上,通過Session的createQuery方法創建戶一個query對象,由這個對象來完成對數據庫的增刪改查等操作。通過Struts2中Action的返回值,來調用Dao層中的業務處理。
hibernate優勢
hibernate是JDBC輕量級的封裝,占用內存較少,性能比較高。與JDBC相比,如果開發JDBC的人員技術能力非常強,hibernate執行效率會比JDBC弱一些,但是大部分情況是程序員在使用JDBC時是不可能做到最高效率,hibernate可以幫大部分開發人員提高運行效率。可以引入第三方二級緩存,提高系統查詢效率,減少系統里存在大量單例類(singleton),大量的單例類,會降低系統的可測試性和面向對象程度。Hibernate兼容JDBC。理論上可以應用在任何使用JDBC的場景。
可以逆向工程,簡化了手寫model實體類的繁瑣。
整體設計
| 業務邏輯層 | (Iplm,DAO,接口及接口實現,action,Servlet包)業務規則的制定、業務流程的實現等與業務需求有關的系統設計,對于數據訪問層而言,它是調用者;對于表示層而言,它卻是被調用者。UserDAO.java/ UserDAOImpl.java,AddcardAction.java/ FileUploadServlet.java |
| 模塊層 | (hibernate逆向工程)實體層model包),以幫助開發人員在短期內搭建結構清晰、可復用性好、維護方便的Web應用程序。TUser.java/TUser.hbm.xml |
| 數據持久層 | (SQL server,基類實現,hql)主要是負責數據庫的訪問,可以訪問數據庫系統、二進制文件、文本文檔或是XML文檔。iHibBaseDAOImpl.java/ iHibBaseDAO.java |
DAO接口模式為了減少業務邏輯和數據訪問邏輯之間的耦合,當一個持久層框架被應用時,該模式將會減少業務對象和該框架之間的耦合,這樣我們可以不修改業務對象而選擇不同的持久層框架的實現。
業務邏輯層:包含了系統所需要的所有功能上的算法和計算過程,并與數據訪問層和表現層交互。服務端返回數據的處理以及相應頁面的改變。
設計原則:
業務層接口的設計原則:一個實體類一個接口,一次提交一個業務方法。業務方法的參數來自表現層。
持久層接口的設計原則:一個實體類一個接口,一次數據庫操作一個持久方法。
實例手把手教學搭建
開發工具:myeclipes2015 sqlserver2012
新建一個SSHtest的web project項目
輸入項目名稱,根據需要選擇各項版本(一般默認即可),點擊下一步
點擊下一步
勾選后點擊下一步
點擊Finish,項目就建好了。
搭建框架
●創建hibernate
為了更好的與spring匹配我們這里選擇3.3版本的hibernate,選好后點擊下一步
根據上圖操作就建立好了hibernate的session工廠。
接下來我們看一下建好的hibernate配置文件
在hibernate配置文件里配置與數據庫的連接,獲得數據持久化(相關配置會在后面步驟中介紹)
●創建spring
Spring整合Hibernate(一般先建hibernate再建spring,因為后建spring的話,就會自動把一些相關配置整合到spring里,減少了手動操作的麻煩)
spring一般選4.1版本,切合hibernate3.3,(記得選擇版本的時候,兩個版本要相對應,否則會因為缺失相應的架包而報錯)點擊下一步
你不用管,直接下一步
到此步,點擊Finish,現在spring就創建好了
接下來我們來看創建好的spring配置文件
●創建Struts2
選擇2.1版本,點擊下一步
到此步點擊Finish,Struts2就創建好。
接下來我們來看Struts2的配置文件
現在我們已經完成了基本SSH框架的搭建。
我們的框架布局基本就搭建完成了,我們先來運行測試一下(一般運行沒錯,就說明搭建沒問題)
將項目部署到Tomcat上:
運行
因為要連接數據庫,所以我們要新建一個數據庫
●以sqlserver2012為例,新建一個名為SSHtest的數據庫
創建數據庫
點擊確定,數據庫就創好了。
我們在這了以用戶登錄為例,建一張用戶表T_User
填寫數據
3. 創建所需包
4 . 配置框架
●hibernate連接數據庫,獲得持久化數據
新建數據池database
操作完以上點擊下一步
點擊Finish,數據庫連接池就做好了
hibernate配置
操作完以上記得ctrl+s保存,這樣hibernate就配置好了。
接下來我們看一下hibernate的配置文件
hibernate逆向工程(獲得model實體類)
點擊ok,
下一步
直接下一步
點擊后會出現如下
選擇yes
到此步逆向工程就完成了。
接下來可以寫一些類
business.basic包(放置基類及幫助類)
business.dao包(放置業務接口供給調用)
創建一個用戶業務接口
選擇interface,下一步
點擊finish,接口類就創建好了。
UserDAO代碼如下(一般書寫登錄及增刪查改接口)
business.impl包(放置接口實現類)
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-XTSG4bfP-1574340786841)(https://img-blog.c sdnimg.cn/20191121192641243.png)]
代碼如下
business.factory包(放置工廠類)
工廠里整合了接口和接口實現類,在action里直接調用工廠類,就不用再分開調用接口和接口實現,不用再下實例化對象在調用。
代碼如下
動態工廠
動態工廠
package business.factory; import business.dao.UserDAO; import business.impl.UserDAOImpl; public class StaticDAOFactory {/*** (靜態方法)返回一個用于對用戶信息操作的UserDAO對象* @return UserDAO*/public static UserDAO getUserDAO(){return new UserDAOImpl();}}一般選用動態。
spring配置
可創建bean來管理接口及接口實現(將接口及接口實現、工廠注冊給bean,配置好后交給spring統一管理)也可直接在session工廠利配置
平常的java開發中,程序員在某個類中需要依賴其它類的方法,則通常是new一個依賴類再調用類實例的方法,這種開發存在的問題是new的類實例不好統一管理,spring提出了依賴注入的思想,即依賴類不由程序員實例化,而是通過spring容器幫我們new指定實例并且將實例注入到需要該對象的類中。依賴注入的另一種說法是“控制反轉”,通俗的理解是:平常我們new一個實例,這個實例的控制權是我們程序員,而控制反轉是指new實例工作不由我們程序員來做而是交給spring容器來做。
創建一個新springbean來注冊管理,我們命名為bean1
選擇other
下一步
選擇sping鏈接(根據所需配置加載)
勾選如上復選框,點擊Finish,springbean就創建好了。
接下來配置bean
這里講一下靜態工廠的方法注入
靜態工廠顧名思義,就是通過調用靜態工廠的方法來獲取自己需要的對象,為了讓spring管理所有對象,我們不能直接通過"工程類.靜態方法()"來獲取對象,而是依然通過spring注入的形式獲取:
工程項目下的web.xml的配置
到此步springbean就配置成功了。
struts.xml配置
為了更好的進行配置,我們選擇視圖界面配置
建好后的視圖界面
首先我們先創建如下幾個jsp和css文件
接下來添加action
配置失敗返回參數
如果跳轉到網頁可以使用dispatcher,頁面跟共用響應對象
redirect簡單的重定位,不共用響應對象
redirectAction action跳轉action,不共用響應對象
建立好的包視圖
看看他的配置文件
它的參數要在action里定義才會生效
接下來就可以書寫action了
打開新建好的LoginAction類
公共封裝方法命名為BaseAction如下
當struts接受這個action請求時,struts調用 username的get方法把前臺的值傳到action中的username,當action處理完成,要返回到頁面時。在生成jsp的過程中,你可以在頁面中使用EL表達式,${username}進行綁值,這時調用username的set方法。
在jsp頁面頂部導入el表達式標簽連接
LoginAction類
success.jsp代碼
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"><title>SSH</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="SSH"></head><body> <h2>當前的登錄用戶為:<span style="color:yellow; font:bold">${loginuser.username} </span></h2>添加user,如果姓名沒有沖突,那么就添加到數據庫,如果姓名沖突了就不能添加,返回失敗頁面<form action="add.action" method="get">UserName:<input type="text" name="user.username"><br />UserPassword:<input type="password" name="user.userpassword"><br />UserMessage:<input type="text" name="user.usermessage"><br /><input type="submit" value="提交"> <input type="reset"value="重置"></form>根據姓名查詢,若不輸入,則查詢全部<form action="query.action" method="post">UserName: <input type="text" name="queryText" value="${searchText }" /><input type="submit" value="查詢" /></form><table width="70%" border="1px" align="center" cellpadding="0"cellspacing="0"><thead><tr bgcolor="#ff0"><th width="25%">編號</th><th width="25%">姓名</th><th width="25%">信息</th><th width="25%">操作</th></tr></thead><tbody><c:forEach var="user" items="${users }"><tr><td>${user.id}</td><td>${user.username}</td><td>${user.usermessage}</td><td><a href="edit.action?param=0&id=${user.id}">編輯</a> <ahref="delete.action?id=${user.id}">刪除</a></td></tr></c:forEach></tbody></table></body> </html>fail.jsp代碼
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%String path = request.getContextPath();String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ path + "/"; %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"><title>fail</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="fail"></head><body><div style="color:red;">fail</div><br/><center><p><h2>${errorsText}</h2></p></center><div id = "foot"><a href="${backurl}">返回上一頁面</a></div><!-- <a href="query.action?queryText=">返回主頁</a> --> </body> </html>建立好如上,運行測試
輸入為空測試
輸入賬號密碼測試
輸入后會報如上錯誤
經過一番上網查詢測試,發現:
主要 是里面的Structs 1.3 (structs 2)和Hibernate 3.2(或更高版本)中的JAR包里antlr2.7.2 與 antlr2.7.6 沖突,只要刪除Structs 1.3中的低版本的antlr2.7.2就可以了。具體操作如下:在MyEclipse 下,windows–>preferences–>在文本框中搜索struts2–>選擇 antlr2.7.2–>remove
現在重啟Tomcat再次測試:
現在登陸成功了,并且獲取到了用戶名。
在測試查詢時,利用<c:forEach items>查詢多條記錄可以正常使用,但存在的單條記錄會報錯。如下
經過小編多放查證,終于發現:
在訪問某個頁面出現了上標題所示的異常。一開始我也不知道什么原因,因為后臺已經返回了數據,而且前端的el/jstl表達式都寫的沒毛病。
后來無意中想到,我這個數據是確定的只有一條,但是我還是用的<c:forEach>來寫。然后我把數據包裝了一下,雖然只有一條數據,但是我返回的還是一個list集合就沒問題啦(重新寫了一個接口)
改變后的action
測試通過
項目完整演示:
注意
本項目的SSH框架中spring是以單spring框架搭建(單純的整合hibernate數據庫連接,其間的接口及其注入配置貌似沒有什么作用,其實實配置不配置程序都能運行。)而在實際項目開發中多是spring與其他技術架構結合的,比如springMVC、springBoot等等。這些項目框架會在后續博文中給大家呈現。
項目中有什么錯誤之處,希望有心之人在評論中指出或私發消息討論。
此項目用SSH框架搭建,實現了用戶的登錄、查詢、刪除、添加。
項目(源碼+數據庫)我已上傳至gitee碼云上,有需要的可以進行下載:
GITEE碼云地址:https://gitee.com/zhangyant/SSHtest
記得更改hibernate數據庫連接(導入sql文件夾中sql語句)。
另一種ssh架構可參考:https://www.cnblogs.com/acm-bingzi/p/ssh.html
本人覺得此方法有點難以理解(–^^–)。
總結
以上是生活随笔為你收集整理的JAVAweb之SSH框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: node2vec 包安装
- 下一篇: Linux中vdbench的安装与使用