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