劉 潔
武漢軟件工程職業學院,湖北 武漢 430033
Struts是Apache軟件基金會(ASF)贊助的一個開源項目。它最初是Jakarta項目中的一個子項目,并在2004年3月成為ASF的頂級項目。它通過采用Java Servlet/JSP技術,實現基于JavaEE Web應用的MVC設計模式的應用框架,是MVC經典設計模式中的一個經典產品。
但隨著Struts設計上的缺陷,使它越來越無法滿足開發人員要求高效、靈活的開發需求,于是WebWork框架進入了Struts開發團隊的視線。
2006年,WebWork與Struts這兩個優秀的JavaEE Web框架的團體,決定合作共同開發一個新的框架,整合WebWork與Struts 優點,并且更加優雅、擴展性更強的框架,命名為“Struts 2”,原Struts的1.x 版本產品稱為“Struts 1”。
至此,Struts項目并行提供與維護兩個主要版本的框架產品——Struts 1 與 Struts 2。
在Struts2中,根據描述模型、視圖、控制器對應關系的struts.xml 的配置文件轉發視圖的請求,并由一個名為 Action的Java類對視圖請求進行處理,調用響應數據模型。
其中,Struts2的一個關鍵特性就是它可以對Action攜帶的數據進行讀寫訪問,這是通過表達式語言(Expression Language,EL)來實現的。EL通常是用來簡化數據的訪問操作,取代Java腳本代碼,提供更清晰的視圖層實現。對于Struts 2而言,它支持以下幾種表達式語言:
1)OGNL:可以方便地操作對象屬性的開源表達式語言;2)JSTL:JSP 2.0集成的標準的表達式語言;3)Groovy:基于Java平臺的動態語言;4)Velocity:嚴格來說不是表達式語言,它是一種基于Java的模板匹配引擎。
其中OGNL是Object-Graph Navigation Language的縮寫,既對象圖導航語言。Struts 2默認的表達式語言,它是一種功能強大的表達式語言,通過它簡單一致的表達式語法可以存取對象的任何屬性,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉化等功能。
這里以基于Java Web的選課系統中的“選課模塊”為例剖析OGNL語言,運行效果如圖1所示:

圖1 “選課模塊”運行效果
首先完成的是數據庫設計,選擇合適的數據庫產品,根據面向對象分析設計出數據庫,數據庫中的表如下:

基于MVC模式及數據庫設計,構建出“選課模塊”的組件圖,如圖2所示:

圖2 “選課模塊”組件圖
“選課模塊”中獲取數據庫中course表信息顯示在頁面上這個事件流如下圖3所示,其中SelectcourseAction通過調用CourseDAO對象的SelectCourse()方法獲取Course的List列表,并將其存入值棧中。
在Struts2中值棧就相當于一個“倉庫”,數據信息到來時裝入“倉庫”,需要時可以從“倉庫”中取出這些數據信息。

圖3 “選課模塊”順序圖
以此類推畫出address表、teacher表被讀入到頁面的順序圖及課表數據被存入到數據庫的順序圖。
在SelectcourseAction.java中,利用Struts2的action特性,address、courses、teachers三個List對象被存儲在值棧中,代碼如下所示:

在 main.jsp中,利用OGNL語言將 address、courses、teachers三個List對象中的name屬性值的集合取出,并利用Struts2的UI標簽將其顯示在下拉列表中,下拉列表中的name屬性分別定義為curriculum.courseName、curriculum.courseAddress、curriculum.courseTeacher、curriculum.courseTime,代表Curriculum對象(curriculum)的四個屬性值。


在InsertcurriculumAction.java中利用Struts2的Domain Model方法將main.jsp傳遞過來的參數值保存在curriculum對象中,以便調用CurriculumDAO對象的courseInsert(curriculum)方法將其選課數據存入數據庫中。

在Struts 2框架中,任何Action所涉及到的數據都要被存入Action上下文,同時也會在值棧中創建一個這些數據信息的副本。因此有效利用OGNL語言從值?!皞}庫”中存取數據顯得尤為重要。
[1]孫衛琴.Tomcat與Java Web開發技術詳解.電子工業出版社,2005,8.
[2]孫鑫.Struts2深入詳解.電子工業出版社,2008,7.
[3]陳沉.研磨Struts2.清華大學出版社,2011,10.