Spring-Struts2-Hibernate (SSH)

許銘仁
7 min readApr 21, 2020

--

最近在找工作,看到很多工作都有提到 Struts,所以就去了解一下,順便學習。

目錄

  1. 架構圖
  2. XML 配置
  3. Java Code
  4. Demo Video
  5. GitHub
  6. 參考資料

學習項目

  • Spring

剛學習框架時,首先是接觸 Spring Boot,基本上網路資料很多,而且本身不太需要使用 xml 進行配置,基本上靠 annotation 幾乎都能解決,所以這次嘗試用 xml 進行配置。

  • Hibernate

先前主要都是使用 JPA,所以也沒有使用過純 xml 配置的 Hibernate。

  • Struts

之前沒有聽過,是一種開發 Java Web 的 MVC 框架。

我使用的 IDE 是 Intellij,要開發 Spring,首先我們必須開啟 maven 專案來幫助我們進行專案管理。

不像 spring boot 一樣幫你做好好,專案開起來就給你一個配置好的 pom.xml 這麼爽!

建立完的 maven 專案,如下:

開始配置,首先將之後會用到的依賴項加入到 pom.xml 中。

先來說明架構圖,比較好理解 (如果說的不對,也請各位大神糾正與提點)

這次主要是簡單做一個透過 JSP 儲存與查詢車子的教學。

Struts2:主要是提供相關接口(路由 or 請求),並根據不同接口提供相對應的 處理方法 (Action),並根據處理方法的回傳結果,呈現相對應的 JSP Page。

Spring:根據呼叫的處理方法 (Action),提供相對應的操作 (DAO)。

Hibernate:根據所呼叫的操作,對資料庫進行儲存 or 查詢 etc...。

其相關的 xml 文件創建可以透過在 Intellij 中的 project structure 進行創建(struts、hibernate、spring-config),其餘的可以透過手動創建。

XML 配置

Struts2

首先進行 Struts2 的相關文件進行配置,首先是 struts.xml,配置如下:

package namespace :指定 path 相關路徑,該 package 底下的 action name 會根據其 package namespace path,再去設定相關路徑。

action class & method:該 action 被訪問時,會根據所指定的 class 底下的 method 進行相關操作。

Spring

接著是 Spring 配置,主要是將相關的 class 進行管理。

Spring & Struts2 共同配置

共同配置 web.xml,配置 Spring 監聽器與 Struts2 的攔截器。

Spring 配置:

簡單來說就是 ContextLoaderListener (有實作 ServletContextListener) 來啟動 Web Application ,然後根據 contextConfigLocation 載入相關的 spring config 配置,最後用 Tomcat or other 將 Web Application 載入到 Web Container。

https://stackoverflow.com/questions/11815339/role-purpose-of-contextloaderlistener-in-spring

Struts2 配置:

讓 Struts2 跟著 Web Application 一起啟動,並將 url-pattern 設定為 "/*",這會讓 Struts2 接收所有呼叫該 Web Application 的 url。

Hibernate

ORM,目的是將 Java 物件映射到資料庫中,增加操作便利性。

所以我們需要定義 *.hbm.xml (這邊是要儲存 car 物件,所以是 car.hbm.xml),將 class 映射到相對應的資料表中,如下:

class name:model.Car (車子物件)。

table:映射到資料庫的表格名稱。

id:指定主鍵

property:其他屬性

(name:物件屬性的名稱,column:資料表欄位的名稱)

下一步,定義資料庫的連線、規範與剛剛所編寫好的 car.hbm.xml 也加入到裡面。

到這邊所有配置皆完成了~~~,真的有很多東西要配置,很麻煩 !!!,還沒開始 coding 要快被配置搞死...。

Java Code

Spring + Hibernate

接下來先搞定 Spring +Hibernate 這一段,先處理 Hibernate 與資料庫溝通。

先要取得 Session,透過 Session 才能對資料庫進行操作,如下:

https://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/Session.html

之後再來撰寫儲存物件、相關介面與實作,來達成儲存與查詢,如下:

car 物件

存取物件介面 (DAO)

存取物件介面實作

就完成了(可以自行嘗試去寫個 main function,測試玩玩看)。

Spring + Struts2

最後是將 Struts2 所攔截到的 url request,分配給 Spring 對應的 class,前面配置 struts.xml 知道我們有配置兩個 path:carAction 與 carSaveAction,所以這邊我們要寫兩個相對應的 class 來進行操作,如下:

CarAction 主要是用來查詢車輛編號,然後顯示車輛型號在頁面上。

透過抓取 JSP 上的 <s:textfield key=”number”></s:textfield> 執行相對應的 action 操作。

CarSaveAction 是讓使用者進行儲存,儲存成功則會跳轉至 index.jsp。

抓取 JSP 上的 name 與 number,送出後進行儲存。

終於完成了!!!!!!!!!!!!!!!!!!!!!,來看看 Demo 影片吧~~~~~

展示影片

GitHub

遇到的難題

  • struts.xml 有時候抓不到 <result>所設置的 JSP 位置,是因為 project structure -> Facets -> Web -> Web Resource Directories 目錄位置沒有設定好。

尚未解決

  • 網路上有人提到說 struct.xml 的 action class 應該可以呼叫 spring-config 相對應的 bean id ,可是好像不行,所以我直接寫成完整的 class 路徑。

參考資料

若有不方便引用之處,再麻煩通知我。

--

--