今天主要是研究一個(gè)基本的Struts應(yīng)用,helloapp的例子,這個(gè)應(yīng)用基本的東東就是:接受用戶輸入的姓名,然后輸出Hello+姓名,開發(fā)應(yīng)用涉及以下的步驟:
1) 分析應(yīng)用需求.
2) 把基于MVC設(shè)計(jì)模式的Struts框架運(yùn)用到應(yīng)用中.
3) 創(chuàng)建視圖組件,包括HTML表單(hello.jsp)和ActionForm(HelloForm.java).
4) 創(chuàng)建application,properties本地資源文件.
5) 數(shù)據(jù)驗(yàn)證,包括表單驗(yàn)證和業(yè)務(wù)邏輯驗(yàn)證.
6) 創(chuàng)建控制器組件,HelloAction.java.
7) 創(chuàng)建包含被各個(gè)模塊共享的常量數(shù)據(jù)的JAVA文件,Constants.java.
8) 創(chuàng)建配置文件.Web.xml和struts-config.xml.
9) 編譯,發(fā)布和運(yùn)行helloapp應(yīng)用.
在開發(fā)應(yīng)用時(shí),首先從分析需求入手,列舉該應(yīng)用的具體功能,以及限制條件.這個(gè)應(yīng)用
具體需求:
1) 接受用戶輸入的姓名,然后返回Hello+姓名.
2) 如果用于沒有輸入姓名久提交表單,將返回出錯(cuò)信息,提示用戶輸入姓名.
3) 如果用戶輸入姓名為Monster將返回出錯(cuò)信息.拒絕訪問.
4) 為了演示模塊組件的功能,應(yīng)用使用模型組件來保存用戶輸入的姓名.
Struts框架的應(yīng)用的各個(gè)模塊構(gòu)成主要有:
1) 模型包括一個(gè)JavaBean它有一個(gè)username屬性,代表用戶輸入的名字,提供了get/set方法.還有一個(gè)save方法負(fù)責(zé)把屬性保存到持久化存儲(chǔ)系統(tǒng)中.
2) 視圖包括一個(gè)JSP文件hello.jsp它提供用戶界面,接受用戶輸入的姓名,視圖還包括一個(gè)ActionForm,保存數(shù)據(jù),并且進(jìn)行驗(yàn)證.
3) 控制器包括一個(gè)Action類HelloAction,它完成三個(gè)任務(wù),一是進(jìn)行業(yè)務(wù)邏輯驗(yàn)證,二是調(diào)用模型組件的save方法保存輸入的姓名,三是決定將合適的視圖組件返回給用戶.除了創(chuàng)建模型,視圖和控制器組件,還需要?jiǎng)?chuàng)建Struts的struts-config.xml文件它可以把這些組件組裝起來,使它們協(xié)調(diào)工作.此外還需要?jiǎng)?chuàng)建一個(gè)整個(gè)Web應(yīng)用的配置文件web.xml.好了前面的一些理解的話題說到這里,我感覺原理我已經(jīng)懂了.下面言歸正傳開始研究整個(gè)Web應(yīng)用的創(chuàng)建,我逐步來研究.
創(chuàng)建視圖組件:視圖組件主要包括一個(gè)JSP文件和一個(gè)ActionForm,首先創(chuàng)建一個(gè)JSP文件提供用戶界面,能夠接受用戶輸入的姓名,此外本應(yīng)用所有的輸出結(jié)果也都是用這個(gè)hello.jsp顯示給用戶.hello.jsp中使用來自Struts的標(biāo)簽庫(kù).至于引入標(biāo)簽庫(kù)我就不多說了感覺沒什么難度在以前學(xué)JSP的時(shí)候已經(jīng)完全理解了.<html:errors>用于顯示Struts框架中其他組件產(chǎn)生的錯(cuò)誤信息.<html:form>用于創(chuàng)建HTML表單.它能夠把表單的字段和ActionForm的屬性關(guān)聯(lián)起來.<html:text>該標(biāo)簽是<html:form>的子標(biāo)簽,用于創(chuàng)建HTML表單的文本框.<bean:message>用于輸入本地化的文本內(nèi)容,它的key屬性指定消息key,與消息key匹配的文本內(nèi)容來自于專門的本地資源文本文件.<bean:write>用于輸入Bean的屬性.name指定bean的名字,property指定要輸出的屬性.<logic:present>用于判斷Bean在特定的范圍內(nèi)是否存在,只有存在才會(huì)執(zhí)行標(biāo)簽主體中的內(nèi)容.用name指定要判斷的Bean然后用scope來指定范圍.JSP創(chuàng)建完成了下面創(chuàng)建本地資源文件,使用<bean:message>標(biāo)簽輸出內(nèi)容.這個(gè)文件就是一個(gè)application.properties文件,就是一個(gè)類似hashtalbe一個(gè)key一個(gè)value.就是消息key/消息文本的格式.用<bean:message key=”key”>使用.下面說說創(chuàng)建ActionForm,當(dāng)用戶提交了HTML表單后,Struts框架將自動(dòng)把表單數(shù)據(jù)組裝到ActionForm中,ActionForm和HTML表單的字段一一對(duì)應(yīng),validate()方法用于表單驗(yàn)證,reset()方法用于把屬性重新設(shè)置為默認(rèn)值.數(shù)據(jù)驗(yàn)證幾乎所有的用戶交互的數(shù)據(jù)都需要驗(yàn)證,Struts的數(shù)據(jù)驗(yàn)證是現(xiàn)成的,主要分兩種類型表單驗(yàn)證和邏輯驗(yàn)證.當(dāng)用戶提交了HTML表單后,Strust自動(dòng)把數(shù)據(jù)組裝到ActionForm,接下來自動(dòng)調(diào)用validate方法進(jìn)行驗(yàn)證.如果validate方法返回ActionErrors對(duì)象為null,或者不包括任何ActionMessage對(duì)象,就表示沒錯(cuò)誤數(shù)據(jù)驗(yàn)證通過.如果有就把ActionErrors對(duì)象保存在request范圍內(nèi)的ActionErrors對(duì)象中包含的錯(cuò)誤信息顯示出來,提示用戶修改錯(cuò)誤.
創(chuàng)建控制器組件:控制器組件包括ActionServlet和Action類,ActionServlet類是Struts自帶的,它是整個(gè)框架的控制靈魂,通常不需要擴(kuò)展,Struts提供了可擴(kuò)展的Action,使用來處理特定的HTTP請(qǐng)求的.Action類的工作機(jī)制是所有的Action都是org.apache. struts.action.Action的子類.Action子類應(yīng)該覆蓋父類的execute()方法.四個(gè)參數(shù)分別是:ActionMapping包含了這個(gè)Action的配置信息,和struts-config.xml文件中的action元素對(duì)應(yīng).ActionForm包含了用戶的表單數(shù)據(jù),當(dāng)Struts框架調(diào)用execute()方法的時(shí)候ActionForm中的數(shù)據(jù)已經(jīng)通過了表單驗(yàn)證.還有請(qǐng)求和應(yīng)答對(duì)象參數(shù).Action類的execute方法返回一個(gè)ActionForward對(duì)象,它包含了請(qǐng)求轉(zhuǎn)發(fā)路徑信息.至于訪問本地化文本在Aciont類中首先通過execute()方法獲得MessageResources對(duì)象.通過getResources方法參數(shù)是一個(gè)request.該方法返回當(dāng)前默認(rèn)的MessageResources對(duì)象,它封裝了Resource Bundle的文本內(nèi)容.可以這樣獲取屬性對(duì)象Struts tltie=message.getMessage(“key”).業(yè)務(wù)邏輯驗(yàn)證主要是用Action的execute()方法如果用戶輸入的姓名是Monster,將創(chuàng)建包含錯(cuò)誤信息的ActionMessage對(duì)象,然后調(diào)用Action基類定義的saveErrors()方法,它負(fù)責(zé)把ActionMessage對(duì)象保存在request范圍內(nèi).最后返回ActionForward對(duì)象,Struts會(huì)根據(jù)ActionForward對(duì)象包含的轉(zhuǎn)發(fā)信息把請(qǐng)求轉(zhuǎn)發(fā)給適當(dāng)?shù)囊晥D組件,視圖組件通過標(biāo)簽<html:errors>標(biāo)簽把request范圍內(nèi)的ActionMessages對(duì)象中包含錯(cuò)誤信息顯示出來.提示用戶修改錯(cuò)誤.一個(gè)ActionMessages對(duì)象包含多個(gè)ActionMessage對(duì)象,ActionErrors繼承于ActionMessages,ActionError繼承于ActionMessage對(duì)象.接下來說說訪問模型組件的方法.HelloAction類創(chuàng)建了一個(gè)模型組件PresonBean對(duì)象,并且調(diào)用它的saveToPrsistent
Store()方法來保存userName屬性.把屬性保存到本地資源文本文件中!保存之后就要向視圖組件傳遞數(shù)據(jù)了Action類把數(shù)據(jù)保存在request或者session范圍內(nèi),以便向視圖組件傳遞信息request.setAttribute(Constants.PERSON_KEY,pd)把PersonBean對(duì)象保存到一個(gè)request對(duì)象范圍內(nèi).request.removeAttribute(mapping,getAttribute())從request范圍內(nèi)刪除ActionForm,由于后續(xù)的請(qǐng)求轉(zhuǎn)發(fā)目標(biāo)組件不再需要HelloForm,所以可以刪除.最后通過Action類把流程轉(zhuǎn)發(fā)給合適的視圖組件.return (mapping.findForward(“Action映射配置名稱”));好了控制器的創(chuàng)建已經(jīng)搞定了.
創(chuàng)建模型組件:本例的模型是一個(gè)PersonBean是一個(gè)非常簡(jiǎn)單的JavaBean,它包括一個(gè)userName屬性,以及相關(guān)的get/set方法.還有一個(gè)業(yè)務(wù)方法saveToPresistentStore().本例中并沒有真正實(shí)現(xiàn)這個(gè)方法,在實(shí)際應(yīng)用中這個(gè)方法可以把JavaBean屬性保存在持久化存儲(chǔ)系統(tǒng)中,如數(shù)據(jù)庫(kù)或文件系統(tǒng).
創(chuàng)建存放常量的JAVA文件:HelloAction按照request.setAttirbute(類名.常量,對(duì)象)的方法設(shè)置request共享的值,把一些常量定義在.java文件種可以提高Action類的獨(dú)立性.當(dāng)屬性key常量的值發(fā)生改變的時(shí)候,只需要修改.java文件,不需要該Action.
創(chuàng)建配置文件:對(duì)于Struts應(yīng)用它的配置文件web.xml應(yīng)該對(duì)ActionServlet類進(jìn)行配置,此外,還應(yīng)該生命Web應(yīng)用所使用的Struts標(biāo)簽庫(kù).感覺沒什么就是配置標(biāo)簽庫(kù)和配置action映射ActionServlet地址.配置confgi映射struts-config.xml地址.在加上一個(gè)servlet-mapping的*.do請(qǐng)求轉(zhuǎn)給action就OK了!然后重點(diǎn)研究的是創(chuàng)建Struts框架配置文件.Struts框架允許把應(yīng)用劃分多個(gè)組件,提高開發(fā)速度.而Struts框架的配置文件可以把這些組件組裝起來,決定如何使用它們.<form-bean>元素配置一個(gè)ActionForm,name屬性是名稱,type是它對(duì)應(yīng)的類.<action>元素是path屬性指定請(qǐng)求訪問的Action路徑,type屬性指定Action的完整類名,name屬性指定需要傳遞給Action的ActionForm.scope指定ActionForm的存放范圍,validate屬性指定是否執(zhí)行表單驗(yàn)證也就是是否實(shí)行ActionForm中的validate()方法.input屬性指定當(dāng)表單驗(yàn)證失敗的時(shí)候轉(zhuǎn)發(fā)的路徑.<cation>元素還包含一個(gè)子元素<forward>它定義了一個(gè)請(qǐng)求轉(zhuǎn)發(fā)的路徑也就是Action處理結(jié)果要轉(zhuǎn)發(fā)給的路徑在這里設(shè)置.Action的execute方法返回值是一個(gè)ActionForward方法這個(gè)方法返回的參數(shù)是一個(gè)<forward>元素映射的JSP文件.<message-resources>元素定義了一個(gè)本地資源文本文件.parameter屬性指定一個(gè)properties文件.記住路徑不用加擴(kuò)展名.
發(fā)布和運(yùn)行helloapp應(yīng)用:這個(gè)簡(jiǎn)單就是在Tomcat中發(fā)布和一般的Web應(yīng)用類似,記住把Struts包和tld標(biāo)簽庫(kù)包都copy進(jìn)去就OK了.有一個(gè)重點(diǎn)的東東就是可以把一個(gè)Web工程打包成一個(gè)war包文件,在DOS下轉(zhuǎn)到helloapp的根目錄輸入jar cvf helloapp.war *.*即可,這樣也是一樣可以發(fā)布的.
服務(wù)器端裝載hello.jsp的流程:
1)<bean:message>標(biāo)簽從本地資源文件中讀取文本輸出到網(wǎng)頁上.
2)<html:form>標(biāo)簽在request范圍中查找HelloForm,如果存在這樣的實(shí)例就把HelloForm對(duì)象中的userName屬性復(fù)制給HTML表單的userName文本框,由于此時(shí)還不存在HelloForm對(duì)象,所以忽略這項(xiàng)操作.
3)把hello.jsp視圖呈現(xiàn)給客戶.
表單驗(yàn)證流程:
1) Servlet容器在web.xml中尋找<url-pattern>屬性為” *.do “的<servlet-mapping>元素.
2) 根據(jù)以上<servlet-mapping>元素的<servlet-name>屬性,也就是action在web.xml文件中尋找到匹配的<servlet>元素.
3) 把請(qǐng)求轉(zhuǎn)發(fā)給以上<servlet>元素指定的ActionServlet,ActionServlet依據(jù)用戶的請(qǐng)求路徑,在Struts配置文件中檢查path屬性一樣的元素沒有.do.
4) ActionServlet根據(jù)<action>元素的name屬性創(chuàng)建一個(gè)ActionForm對(duì)象,把客戶端的提交的數(shù)據(jù)傳給它,在把ActionForm保存在<action>元素的scope屬性設(shè)置的范圍內(nèi).
5) <cation>元素的validate設(shè)置為true所以調(diào)用ActionForm的validate()方法驗(yàn)證表單.
6) validate()方法返回一個(gè)ActionErrors對(duì)象里面包含一個(gè)ActionMessage對(duì)象,這個(gè)ActionMessage封裝了錯(cuò)誤信息.
7) ActionServlet把ActionForm的validate()方法返回的ActionErrors對(duì)象保存在request范圍內(nèi),然后根據(jù)<cation>的input屬性把對(duì)象發(fā)送給相應(yīng)的JSP.
8) hello.jsp的<html:errors>標(biāo)簽從request范圍內(nèi)讀取ActionErrors對(duì)象,在從ActionErrors對(duì)象中讀取ActionMessage對(duì)象,把包含的錯(cuò)誤信息顯示在網(wǎng)頁上.
以上是我根據(jù)自己的理解闡述了這個(gè)簡(jiǎn)單的應(yīng)用,至于具體的應(yīng)用因?yàn)楸綛log沒提供下載空間所以不能發(fā)布上來.希望通過上面的闡述能讓大家對(duì)一個(gè)Struts應(yīng)用有一個(gè)初步的了解,如果不懂也沒關(guān)系,接下來的幾天我會(huì)繼續(xù)深入的把Struts的具體的組件介紹出來,如果感覺我寫的來爛別給我丟雞蛋哦HOHO! (網(wǎng)友們的支持,是我繼續(xù)寫技術(shù)文章的動(dòng)力!)
posted on 2005-10-22 15:02
我心依舊 閱讀(2219)
評(píng)論(4) 編輯 收藏