SSH框架整合

来源:http://www.cnblogs.com/wsydxw/archive/2016/10/01/5926146.html
-Advertisement-
Play Games

SSH框架整合 一、原理圖 action:(struts2) 1、獲取表單的數據 2、表單的驗證,例如非空驗證,email驗證等 3、調用service,並把數據傳遞給service Service:業務層 增刪改查,比如:登錄,調用dao的query方法進行查詢,返回結果,進行用戶名密碼的比對,將 ...


SSH框架整合
一、原理圖

action:(struts2)
1、獲取表單的數據
2、表單的驗證,例如非空驗證,email驗證等
3、調用service,並把數據傳遞給service
Service:業務層
增刪改查,比如:登錄,調用dao的query方法進行查詢,返回結果,進行用戶名密碼的比對,將結果返回給action
Dao(hibernate)save、delete、update、query
Spring
1、ioc,由spring管理創建、銷毀action、service、dao
Java本身(實現介面),cglib(第三方的jar包)
2、aop,管理service的事務
二、整體結構
src根目錄
1、com.jsoft.action包
2、com.jsoft.hbm.dao包:連接資料庫的dao
3、com.jsoft.hbm.orm包:hibernate實體類和關係映射文件
4、com.jsoft.services.impl包:service的具體實現
5、applicationContext.xml:spring配置文件
1.配置.xsd

2.配置資料庫連接池,與hibernate無關
舉例子:網線
上課需要網線,來一個同學上課需要拉一根網線,陸陸續續來二十多個同學就要陸陸續續拉二十跟網線,效率低,想要提高效率就要估計要來的學生數假定為23,那麼就直接事先拉30根網線,留出7根網線作備用

提出:假如沒有資料庫連接池,有一個用戶需要做查詢就需要跟資料庫做一個連接,當又有一個用戶做查詢還要建立連接,這樣做耗時長,而且非常耗費資源

當有資料庫連接池時: 啟動服務時就建立若幹個連接,沒有用戶用也先放著,當有一個用戶需要訪問的時候就在連接池中挑一個空閑的連接給用戶做增刪改查的操作,以此類推,併發執行。併發執行操作時不需要和資料庫建立連接,效率高。用戶1完成操作後就釋放連接到連接池中已備其他用戶使用,用來迴圈使用。如果若幹連接都被使用就繼續建立若幹個連接以供備用。
該ssh框架用的是c3p0資料庫連接池,是hibernate推薦是用的。
3.配置hibernate的session工廠

Hibernate本身就有一個session工廠,而在這裡我們用的是spring配
置的session工廠,為了hibernate和spring更好的集成。
第一、註入dataSource

Property中的ref屬性的意思是把id=dataSource的對象1註入到2這個類的name為dataSource的成員變數3中,其中1與4對應。Ref表示註入的是對象類型,基本數據類型用value
第二、採用通配符的方式配置載入.hbm.xml的映射文件,.配置方言、顯示sql、格式化sql。

4.配置事務管理器
第一、註入(同上)

第二、定義事務通知,定義方法的過濾規則,save*等表示當方法名滿足save等為首碼的時候會自動加上事務。也就是說具體的service層和action層代碼增刪改查方法名必須以這幾個為首碼,否則報錯。
意思是session沒有綁定事務。

第三、定義aop,表示的是事務具體加在了哪裡,與過濾規則相互配合管理事務

5.啟用cglib

6.把sessionFactory註入到BaseHibernateDAO的成員變數sessionFactory中

7.這裡寫其他的bean
=================這是一條分割=========================
6、struts.properties:struts2常量配置
創建.properties文件的方法是新建file,尾碼為.properties
註意:struts.objectFactory=spring指的是把對象工廠指向spring,表示由spring創建對象。(與三、6相對應)

7、struts.xml:struts配置文件

//這裡寫**.jsp

WebContent根目錄
8、META-INF文件夾
9、WEB-INF文件夾
1、lib文件夾:
引入的是ssh框架的jar包
【struts2版本2.3.24】【spring版本3.2.0】【hibernate版本4.2.4】
2、web.xml:
啟動web容器時,spring容器也跟著啟動,接著讀取applicationContext里的配置文件,裡面包含:指定spring配置文件的路徑和名稱,其中的classpath指的是src根目錄下、struts2過濾器、通過監聽器的方式啟動spring
3、各種jsp頁面
三、登錄功能具體代碼【web工程】
1、對於com.jsoft.hbm.orm包
創建資料庫表對應的實體類Student,編寫映射文件,在編寫好的映射文件中修改主鍵生成方式為uuid.hex,以及資料庫中有下劃線的數據要添加下劃線

2、編寫視圖層登錄頁面login.jsp
表單提交時傳遞的參數name屬性值為username和password。記得修改兩個地方編碼集為utf-8和刪除pageEncoding="ISO-8859-1"。如果jsp文件中第一行的<%報錯,就右鍵WebContent選中build path的configure build path,在右側選第四個add library,選中server runtime選next,選中tomcat點擊finish。
2、在com.jsoft.services.impl包中創建LoginService類
①創建BaseHibernateDAO類的成員變數dao,並獲取set方法
②編寫querylogin方法
註意返回的是一個Map,因此新建一個Map對象returnMap用來存放數據和當做返回值。然後還要有表單提交來的name值為username和password的數據。然後用成員變數dao調用query方法編寫hql語句並用List變數接收,判斷如果不空就創建學生類對象s並獲取password與表單傳遞過來的password值作比較,並用put方法加入到returnMap中,如果相等就設置code值為1表示登陸成功;如果不相等就設置code值為-1表示密碼錯誤。如果list為空就設置code值為-1表示用戶名密碼不匹配。

3、在com.jsoft.action包中編寫LoginAction類
①繼承ActionSupport類
②定義成員變數username,password,還有LoginService類的成員變數loginService並獲取他們的set方法
③重寫excute方法
定義Map變數map,用put方法放入表單提交來的數據username,password,註意表單、aaction、sevice中的username和password要一一對應相等。用LoginService類的成員變數loginService調用querylogin方法參數為map,定義Map變數resultMap接收,判斷傳遞過來的code值,如果是1則跳轉成功頁面,否則跳轉登錄頁面。

4、配置service
在spring的配置文件applicationContext.xml中新建標簽,用到id屬性和類同名為LoginService,class屬性寫的是LoginService的路徑名com.jsoft.services.impl.LoginService(建議用粘貼複製,寫好之後點擊檢查)。在bean標簽裡面寫標簽編寫註入代碼,屬性值為name裡面寫要註入的成員變數名dao,屬性值ref寫的是要註入id值為BaseHibernateDAO的對象。
5、配置action
同樣在之後新建標簽,用到id屬性和類同名為LoginAction,class屬性寫的是LoginAction的包名加類名。在所有action配置中添加scope="prototype",表示多實例模式,一般情況,action有成員變數,採用單例模式會發生緩存上一次的紀錄,所以要採用多實例模式。也就是說有成員變數就用多實例模式。
6、在struts.xml中配置action
新建標簽,用到name屬性和class屬性,name屬性寫的是表單裡面的action屬性名login;其中class屬性不能寫類的全路徑,而應該是spring配置文件中的的id屬性值LoginAction,原因是由spring管理對象,(與二、6相對應)如果寫的是類的全路徑,那麼在struts2中會根據全路徑自己創建對象,但採用這種方式不會在這個類裡面註入LoginService這個成員變數,會報的是空指針。
然後在action標簽里編寫標簽表示結果,如果成功name屬性值為success,跳轉到loginSuccess.jsp;如果失敗name屬性值為login,跳轉類型type屬性值為redirect方式,跳轉到login.jsp。
四、登錄功能ssh框架具體執行流程
當點擊提交按鈕時,將請求發送給login.action,被過濾器所攔截,過濾器就知道當前訪問資源是login.action,根據action這個名稱會到struts.xml配置中找與之相匹配的name屬性值為login的action,然後找class屬性,又因為在常亮配置中有struts.objectFactory=spring這句話,知道class裡面不是類的名稱而是spring的id,然後會到spring容器applicationContext.xml中找id為LoginAction的bean,之後spring會自行實例化class屬性裡面的類,然後還會檢測到要往這個類的成員變數中註入loginService這個對象,然後還會找到id為LoginService的bean,接下來還會實例化class裡面的類,還會檢測到要往這個類的成員變數dao中註入BaseHibernateDAO這個類,然後找到id為BaseHibernateDAO的bean,實例化class裡面的類,還會檢測到要往這個類的成員變數sessionFactory里註入sessionFactory。接下來會把實例化好的BaseHibernateDAO這個類的對象傳遞給dao這個成員變數中,接下來在把LoginService註入到loginService這個成員變數中。然後在struts.xml配置文件中才可以用LoginAction這個對象,然後把請求轉交給LoginAction這個對象,然跳到LoginAction這個類。然後把相應的從表單傳遞過來的值放到Map中,然後調用LoginService,在裡面調用dao的query方法,然後返回code值給LoginAction類,根據判斷跳轉到相應的頁面。
如果該org.jsoft.hbn...要改下麵對應的地方

五、增加功能具體代碼
1、編寫視圖層增加頁面addStudent.jsp
表單提交時傳遞的參數name屬性值為student.name和student.age。其他同上。
2、com.jsoft.services.impl包,創建StudentService類
①創建BaseHibernateDAO類的成員變數dao,並獲取set方法
②編寫增加方法save【註意方法名要遵守事務規則】
註意形參類型為Student,然後用dao調用BaseHibernateDAO類中的save方法傳遞參數為剛纔的形參student,返回的是一個Serializable【序列化的介面,基本數據類型,字元串等等一些類都實現這個介面,一會返回的時候可以把它強轉為字元串這個字元串就是主鍵】,也就是id,【因為之前設置的主鍵生成方式為uuid,返回的不知道是什麼,hibernate為了讓我們知道,做保存時返回一個字元串的對象】,強轉並輸出id。

3、在com.jsoft.action包中編寫AddStudentAction類
①繼承ActionSupport類
②創建Student類對象student【因為表單傳遞過來的是對象類型,所以要有get方法】,定義StudentService類的成員變數studentService並獲取他們的set方法
③重寫excute方法
用studentService調用save方法傳遞參數為student
4、配置service
5、配置action
6、在struts.xml中配置action
六、查詢功能具體代碼
1、在com.jsoft.services.impl包中的StudentService類中添加查詢方法query【註意方法名要遵守事務規則】
註意返回的是一個Map,因此新建一個Map對象returnMap用來存放數據和當做返回值。用dao調用query方法,第一個參數是編寫hql語句,此處為from Student,第二個參數是查詢條件,此處做簡單查詢返回null,返回值是List類型,定義list變數接收。然後把結果放到returnMap中,最後返回returnMap。
2、在com.jsoft.action包中編寫ShowStudentAction類
①繼承ActionSupport類
②定義StudentService成員變數studentService並獲得set方法
③重寫excute方法
在裡面用studentService這個成員變數調用query方法傳遞參數為null,定義Map類型的變數resultMap用來接收,再用resultMap調用get方法,裡面的字元串類型的k值必須和上面put的k值一樣是list,然後用List類型的變數list接收,強轉list。接下來把list穿傳回到結果頁面中,定義List類型的成員變數list,並且要有get方法,把之前定義的List局部變數刪除。
3、配置service【用上面配置的就可以】
4、配置action
5、在struts.xml中配置action
6、創建顯示結果jsp:showStudentList.jsp【用到jstl和el表達式】
引入jstl標簽庫:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
Table標簽裡面首先寫一個tr若幹個td,分別表示編號姓名年齡,之後調用c標簽的forEach方法,裡面添加items屬性獲取到list,添加var屬性裡面寫item,添加varStatus屬性定義變數名vs,在後面調用時用vs.count顯示對應序號。
之後複製之前寫的trtd到forEach裡面,用item分別點出相應的屬性
七、查詢功能運行流程:
首先訪問showStudentList這個action,才能到達列表頁面,然後將這個請求發送到ShowStudentAction這個action中然後調用StudentService的query方法,在裡面執行查詢,結果返回到action中,在action中在吧這個成員變數取出來放到list中,又因為有get方法所以將這個數據傳遞到jsp里,然後顯示頁面。註意直接訪問jsp沒有用,因為沒有進入到action,也就沒調用service進行查詢,就不會有相應的結果。
八、刪除功能具體代碼
1、在com.jsoft.services.impl的StudentService類中編寫通過id刪除的方法deleteById
返回值類型是int,形參為String,String變數名為id,用dao調用update方法,裡面的第一個屬性寫hql語句,第二個屬性為String類型的id,將整個結果返回。
2、com.jsoft.action包,寫DeleteStudentByIdAction類
①繼承ActionSupport類
②定義StudentService成員變數studentService和Student類成員變數id並獲得相應的set方法
③重寫excute方法
用studentService調用deleteById這個方法,參數傳遞id
3、在applicationContext.xml中配置service【因為之前已經配置好了,所以不用配置】和action【註意把action配置成多實例模式scope="prototype"】
4、配置struts.xml
6、在showStudentList.jsp頁面里編寫
首先添加一個td,寫操作,然後在c標簽里用a標簽寫修改和刪除
刪除 然後寫script標簽,用function定義方法deleteById,參數傳遞為id,用if添加一個判斷條件為confirm,裡面內容寫的是:location.href = "deleteStudentById.action?id=" + id

九、修改功能具體代碼
1、在org.jsoft.services.impl中的StudentService類中添加通過傳過來的id查詢的方法queryById
返回值類型是Student,形參為String,String變數名為id,用dao調用getById方法,裡面的第一個屬性寫Student.class,第二個屬性為id,【註意這個id不用加雙引號】將整個結果返回。
2、org.jsoft.actions包中創建ShowStudentByIdAction類
①繼承ActionSupport類
②創建私有的成員變數並獲取相應的get和set方法:String類型的變數id,Student類型的s,StudentService類型的studentService
③重寫excute方法
用studentService調用queryById方法,傳入參數為id【註意:此處的id也不是字元串類型的】,用Student對象s接收
3、在applicationContext.xml中配置service【上面配置過了所以不用配置】和action【註意把action配置成多實例模式scope="prototype"】
4、配置struts.xml中配置ShowStudentByIdAction
成功之後跳轉到回顯頁面showStudentById.jsp
5、在showStudentList.jsp中的修改部分添加超鏈接:
修改
【意思是點擊修改時跳轉到action名為showStudentById的struts.xml中】
6、編寫回顯頁面showStudentById.jsp
和添加頁面相似,複製粘貼,在form表單中添加屬性method以post方式提交,在input標簽中添加傳入的id,然後分別在後面添加value屬性,裡面寫EL表達式用在ShowStudentByIdAction類中創建的Student成員變數s調用student的具體屬性,註意在這個類中必須用s接收,即s=XXX,然後把添加按鈕改成修改,最後把表單提交到updateStudent.action。
【現在已經通過id查詢到要修改的欄位了,接下來要真正執行修改操作了】
7、在org.jsoft.services.impl中的StudentService類中添加通過傳過來的id查詢的方法update
返回值類型為void,參數類型為Student參數為student,用dao調用update方法,參數為剛創建的student。
8、在org.jsoft.actions包中創建UpdateStudentAction類
①繼承ActionSupport類
②創建私有的成員變數:Student類實例對象student【new】,StudentService類的對象studentService
③重寫excute方法
用studentService調用update方法,參數為剛創建的student
9、在applicationContext.xml中配置service【上面配置過了所以不用配置】和action【註意把action配置成多實例模式scope="prototype"】
10、配置struts.xml中配置UpdateStudentAction
成功之後跳轉到之前的展示頁面showStudentList.jsp
註意在result標簽中修改跳轉類型為type="redirect"
十、修改功能運行流程:
【大概流程是先查詢到要修改一列對應的id,跳轉到回顯頁面進行修改,修改之後再跳回到之前的展示頁面】具體如下:
在展示頁面的對應行中點擊修改按鈕後,獲取到id值,並訪問showStudentById.action,也就是在struts.xml配置中找到action名為showStudentById的部分,運行到class屬性時找到id名為ShowStudentByIdAction的applicationContext.xml配置中的bean標簽對應部分,進入到class路徑下的org.jsoft.actions.ShowStudentByIdAction中,在這個類中定義String類型的變數id存剛纔從鏈接傳入的id,將查詢出來的結果封裝到Student類型變數s中,編寫回顯頁面showStudentById.jsp,用EL表達式調用剛纔封裝到s中的各種要修改的屬性併進行相應的修改【註意還要傳遞一個id,因為是根據id修改,如果不傳遞id報錯如下:】

最後以post方式提交到updateStudent.action,,也就是在struts.xml配置中找到action名為updateStudent的部分,運行到class屬性時找到id名為UpdateStudentAction的applicationContext.xml配置中的bean標簽對應部分,進入到class路徑下的org.jsoft.actions.UpdateStudentAction中,在這個類中創建Student實例對象student,將修改好的數據封裝到裡面,用studentService對象調用編寫的update方法把修改的數據寫入資料庫,之後回到applicationContext.xml中,將studentService註入到StudentService中,最後回到struts.xml中通過重定向的方式type="redirect"跳轉到結果展示頁面showStudentList.action展示出修改的結果。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • atitit.日期,星期,時候的顯示方法ISO 8601標準 1. ISO 86011 2. DAte日期的顯示1 2.1. Normal1 2.2. 順序日期表示法(可以將一年內的天數直接表示)1 2.3. 星期顯示法(可以用2位數表示年內第幾個日曆星期,再加上一位數表示日曆星期內第幾天)2 3. ...
  • 一、目的 我們制定分支規範,意在實現以下目標: 二、主分支: master 主分支(master)用於存放最新的穩定版本。 正式發佈時:在主分支上創建標簽(tag)。如果發佈非常頻繁可以不加。 標簽的命名規範為:release-v版本號-日期(如 release-v0.0.1-20161010)。業 ...
  • 小時和分鐘具有相同屬性(值,上限),可以用一個類Display來定義這兩個對象; 但是兩者之間又具有聯繫(當分鐘達到上限時,小時要加1),但兩者同屬於一個類里,不能產生直接聯繫,這時我們用另外一個類Clock來對它們進行管理; 首先用Clock類來定義一個clock的對象,用它來管理兩個Displ... ...
  • Atitit.log日誌技術的最佳實踐attilax總結 1. 日誌的意義與作用1 1.1. 日誌系統是一種不可或缺的單元測試,跟蹤調試工具1 2. 倆種實現[1]日誌系統作為一種服務進程存在 [2]日誌系統作為系統調用存在2 3. 上下文(手動或者aop模式,記錄參數)MDC2 3.1. 2 4. ...
  • Karaf是Apache旗下的一個開源項目.Karaf同時也是一個基於OSGi的運行環境,Karaf提供了一個輕量級的OSGi容器,可以用於部署各種組件,應用程式.Karaf提供了很多特性用於幫助開發者和用戶更加靈活的部署應用,例如:熱部署,動態配置,幾種日誌處理系統,本地系統集 成,可編程擴展控制... ...
  • Atitit.兼具相容性和擴展性的配置方案attilax總結 文件配置法1 Jdbc多數據源文件配置發1 Bat文件配置法1 改進的文件配置法(採用類似i18n技術) 推薦1 使用自動化pc_id的方法來自適應配置 推薦1 文件配置法 換了機子又要設置 Jdbc多數據源文件配置發 使用一個tag來標 ...
  • Atitit.非同步編程技術原理與實踐attilax總結 1. 倆種實現模式 類庫方式,以及語言方式,java futuretask ,c# await1 2. 事件(中斷)機制1 3. Await 模式(推薦)1 4. Java的實現模式futuretask 對於c#的task類庫(推薦)1 4.1 ...
  • 1. 定義:動態的將責任附加到對象上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。 2. 類結構圖: 3. 代碼實現 // // 以下是測試類 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...