學習項目
- 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 路徑。
參考資料
若有不方便引用之處,再麻煩通知我。