劉 潔
武漢軟件工程職業(yè)學(xué)院,湖北 武漢 430033
Struts是Apache軟件基金會(huì)(ASF)贊助的一個(gè)開源項(xiàng)目。它最初是Jakarta項(xiàng)目中的一個(gè)子項(xiàng)目,并在2004年3月成為ASF的頂級項(xiàng)目。它通過采用Java Servlet/JSP技術(shù),實(shí)現(xiàn)基于JavaEE Web應(yīng)用的MVC設(shè)計(jì)模式的應(yīng)用框架,是MVC經(jīng)典設(shè)計(jì)模式中的一個(gè)經(jīng)典產(chǎn)品。
但隨著Struts設(shè)計(jì)上的缺陷,使它越來越無法滿足開發(fā)人員要求高效、靈活的開發(fā)需求,于是WebWork框架進(jìn)入了Struts開發(fā)團(tuán)隊(duì)的視線。
2006年,WebWork與Struts這兩個(gè)優(yōu)秀的JavaEE Web框架的團(tuán)體,決定合作共同開發(fā)一個(gè)新的框架,整合WebWork與Struts 優(yōu)點(diǎn),并且更加優(yōu)雅、擴(kuò)展性更強(qiáng)的框架,命名為“Struts 2”,原Struts的1.x 版本產(chǎn)品稱為“Struts 1”。
至此,Struts項(xiàng)目并行提供與維護(hù)兩個(gè)主要版本的框架產(chǎn)品——Struts 1 與 Struts 2。
在Struts2中,根據(jù)描述模型、視圖、控制器對應(yīng)關(guān)系的struts.xml 的配置文件轉(zhuǎn)發(fā)視圖的請求,并由一個(gè)名為 Action的Java類對視圖請求進(jìn)行處理,調(diào)用響應(yīng)數(shù)據(jù)模型。
其中,Struts2的一個(gè)關(guān)鍵特性就是它可以對Action攜帶的數(shù)據(jù)進(jìn)行讀寫訪問,這是通過表達(dá)式語言(Expression Language,EL)來實(shí)現(xiàn)的。EL通常是用來簡化數(shù)據(jù)的訪問操作,取代Java腳本代碼,提供更清晰的視圖層實(shí)現(xiàn)。對于Struts 2而言,它支持以下幾種表達(dá)式語言:
1)OGNL:可以方便地操作對象屬性的開源表達(dá)式語言;2)JSTL:JSP 2.0集成的標(biāo)準(zhǔn)的表達(dá)式語言;3)Groovy:基于Java平臺的動(dòng)態(tài)語言;4)Velocity:嚴(yán)格來說不是表達(dá)式語言,它是一種基于Java的模板匹配引擎。
其中OGNL是Object-Graph Navigation Language的縮寫,既對象圖導(dǎo)航語言。Struts 2默認(rèn)的表達(dá)式語言,它是一種功能強(qiáng)大的表達(dá)式語言,通過它簡單一致的表達(dá)式語法可以存取對象的任何屬性,調(diào)用對象的方法,遍歷整個(gè)對象的結(jié)構(gòu)圖,實(shí)現(xiàn)字段類型轉(zhuǎn)化等功能。
這里以基于Java Web的選課系統(tǒng)中的“選課模塊”為例剖析OGNL語言,運(yùn)行效果如圖1所示:
圖1 “選課模塊”運(yùn)行效果
首先完成的是數(shù)據(jù)庫設(shè)計(jì),選擇合適的數(shù)據(jù)庫產(chǎn)品,根據(jù)面向?qū)ο蠓治鲈O(shè)計(jì)出數(shù)據(jù)庫,數(shù)據(jù)庫中的表如下:
基于MVC模式及數(shù)據(jù)庫設(shè)計(jì),構(gòu)建出“選課模塊”的組件圖,如圖2所示:
圖2 “選課模塊”組件圖
“選課模塊”中獲取數(shù)據(jù)庫中course表信息顯示在頁面上這個(gè)事件流如下圖3所示,其中SelectcourseAction通過調(diào)用CourseDAO對象的SelectCourse()方法獲取Course的List列表,并將其存入值棧中。
在Struts2中值棧就相當(dāng)于一個(gè)“倉庫”,數(shù)據(jù)信息到來時(shí)裝入“倉庫”,需要時(shí)可以從“倉庫”中取出這些數(shù)據(jù)信息。
圖3 “選課模塊”順序圖
以此類推畫出address表、teacher表被讀入到頁面的順序圖及課表數(shù)據(jù)被存入到數(shù)據(jù)庫的順序圖。
在SelectcourseAction.java中,利用Struts2的action特性,address、courses、teachers三個(gè)List對象被存儲(chǔ)在值棧中,代碼如下所示:
在 main.jsp中,利用OGNL語言將 address、courses、teachers三個(gè)List對象中的name屬性值的集合取出,并利用Struts2的UI標(biāo)簽將其顯示在下拉列表中,下拉列表中的name屬性分別定義為curriculum.courseName、curriculum.courseAddress、curriculum.courseTeacher、curriculum.courseTime,代表Curriculum對象(curriculum)的四個(gè)屬性值。
在InsertcurriculumAction.java中利用Struts2的Domain Model方法將main.jsp傳遞過來的參數(shù)值保存在curriculum對象中,以便調(diào)用CurriculumDAO對象的courseInsert(curriculum)方法將其選課數(shù)據(jù)存入數(shù)據(jù)庫中。
在Struts 2框架中,任何Action所涉及到的數(shù)據(jù)都要被存入Action上下文,同時(shí)也會(huì)在值棧中創(chuàng)建一個(gè)這些數(shù)據(jù)信息的副本。因此有效利用OGNL語言從值?!皞}庫”中存取數(shù)據(jù)顯得尤為重要。
[1]孫衛(wèi)琴.Tomcat與Java Web開發(fā)技術(shù)詳解.電子工業(yè)出版社,2005,8.
[2]孫鑫.Struts2深入詳解.電子工業(yè)出版社,2008,7.
[3]陳沉.研磨Struts2.清華大學(xué)出版社,2011,10.