posts - 70,comments - 408,trackbacks - 0

          今天主要是研究一個(gè)基本的Struts應(yīng)用,helloapp的例子,這個(gè)應(yīng)用基本的東東就是:接受用戶(hù)輸入的姓名,然后輸出Hello+姓名,開(kāi)發(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)用.

          在開(kāi)發(fā)應(yīng)用時(shí),首先從分析需求入手,列舉該應(yīng)用的具體功能,以及限制條件.這個(gè)應(yīng)用

          具體需求:

          1)     接受用戶(hù)輸入的姓名,然后返回Hello+姓名.

          2)     如果用于沒(méi)有輸入姓名久提交表單,將返回出錯(cuò)信息,提示用戶(hù)輸入姓名.

          3)     如果用戶(hù)輸入姓名為Monster將返回出錯(cuò)信息.拒絕訪問(wèn).

          4)     為了演示模塊組件的功能,應(yīng)用使用模型組件來(lái)保存用戶(hù)輸入的姓名.

          Struts框架的應(yīng)用的各個(gè)模塊構(gòu)成主要有:

          1)               模型包括一個(gè)JavaBean它有一個(gè)username屬性,代表用戶(hù)輸入的名字,提供了get/set方法.還有一個(gè)save方法負(fù)責(zé)把屬性保存到持久化存儲(chǔ)系統(tǒng)中.

          2)               視圖包括一個(gè)JSP文件hello.jsp它提供用戶(hù)界面,接受用戶(hù)輸入的姓名,視圖還包括一個(gè)ActionForm,保存數(shù)據(jù),并且進(jìn)行驗(yàn)證.

          3)               控制器包括一個(gè)Action類(lèi)HelloAction,它完成三個(gè)任務(wù),一是進(jìn)行業(yè)務(wù)邏輯驗(yàn)證,二是調(diào)用模型組件的save方法保存輸入的姓名,三是決定將合適的視圖組件返回給用戶(hù).除了創(chuàng)建模型,視圖和控制器組件,還需要?jiǎng)?chuàng)建Struts的struts-config.xml文件它可以把這些組件組裝起來(lái),使它們協(xié)調(diào)工作.此外還需要?jiǎng)?chuàng)建一個(gè)整個(gè)Web應(yīng)用的配置文件web.xml.好了前面的一些理解的話題說(shuō)到這里,我感覺(jué)原理我已經(jīng)懂了.下面言歸正傳開(kāi)始研究整個(gè)Web應(yīng)用的創(chuàng)建,我逐步來(lái)研究.

          創(chuàng)建視圖組件:視圖組件主要包括一個(gè)JSP文件和一個(gè)ActionForm,首先創(chuàng)建一個(gè)JSP文件提供用戶(hù)界面,能夠接受用戶(hù)輸入的姓名,此外本應(yīng)用所有的輸出結(jié)果也都是用這個(gè)hello.jsp顯示給用戶(hù).hello.jsp中使用來(lái)自Struts的標(biāo)簽庫(kù).至于引入標(biāo)簽庫(kù)我就不多說(shuō)了感覺(jué)沒(méi)什么難度在以前學(xué)JSP的時(shí)候已經(jīng)完全理解了.<html:errors>用于顯示Struts框架中其他組件產(chǎn)生的錯(cuò)誤信息.<html:form>用于創(chuàng)建HTML表單.它能夠把表單的字段和ActionForm的屬性關(guān)聯(lián)起來(lái).<html:text>該標(biāo)簽是<html:form>的子標(biāo)簽,用于創(chuàng)建HTML表單的文本框.<bean:message>用于輸入本地化的文本內(nèi)容,它的key屬性指定消息key,與消息key匹配的文本內(nèi)容來(lái)自于專(zhuān)門(mén)的本地資源文本文件.<bean:write>用于輸入Bean的屬性.name指定bean的名字,property指定要輸出的屬性.<logic:present>用于判斷Bean在特定的范圍內(nèi)是否存在,只有存在才會(huì)執(zhí)行標(biāo)簽主體中的內(nèi)容.用name指定要判斷的Bean然后用scope來(lái)指定范圍.JSP創(chuàng)建完成了下面創(chuàng)建本地資源文件,使用<bean:message>標(biāo)簽輸出內(nèi)容.這個(gè)文件就是一個(gè)application.properties文件,就是一個(gè)類(lèi)似hashtalbe一個(gè)key一個(gè)value.就是消息key/消息文本的格式.用<bean:message key=”key”>使用.下面說(shuō)說(shuō)創(chuàng)建ActionForm,當(dāng)用戶(hù)提交了HTML表單后,Struts框架將自動(dòng)把表單數(shù)據(jù)組裝到ActionForm中,ActionForm和HTML表單的字段一一對(duì)應(yīng),validate()方法用于表單驗(yàn)證,reset()方法用于把屬性重新設(shè)置為默認(rèn)值.數(shù)據(jù)驗(yàn)證幾乎所有的用戶(hù)交互的數(shù)據(jù)都需要驗(yàn)證,Struts的數(shù)據(jù)驗(yàn)證是現(xiàn)成的,主要分兩種類(lèi)型表單驗(yàn)證和邏輯驗(yàn)證.當(dāng)用戶(hù)提交了HTML表單后,Strust自動(dòng)把數(shù)據(jù)組裝到ActionForm,接下來(lái)自動(dòng)調(diào)用validate方法進(jìn)行驗(yàn)證.如果validate方法返回ActionErrors對(duì)象為null,或者不包括任何ActionMessage對(duì)象,就表示沒(méi)錯(cuò)誤數(shù)據(jù)驗(yàn)證通過(guò).如果有就把ActionErrors對(duì)象保存在request范圍內(nèi)的ActionErrors對(duì)象中包含的錯(cuò)誤信息顯示出來(lái),提示用戶(hù)修改錯(cuò)誤.

          創(chuàng)建控制器組件:控制器組件包括ActionServlet和Action類(lèi),ActionServlet類(lèi)是Struts自帶的,它是整個(gè)框架的控制靈魂,通常不需要擴(kuò)展,Struts提供了可擴(kuò)展的Action,使用來(lái)處理特定的HTTP請(qǐng)求的.Action類(lèi)的工作機(jī)制是所有的Action都是org.apache. struts.action.Action的子類(lèi).Action子類(lèi)應(yīng)該覆蓋父類(lèi)的execute()方法.四個(gè)參數(shù)分別是:ActionMapping包含了這個(gè)Action的配置信息,和struts-config.xml文件中的action元素對(duì)應(yīng).ActionForm包含了用戶(hù)的表單數(shù)據(jù),當(dāng)Struts框架調(diào)用execute()方法的時(shí)候ActionForm中的數(shù)據(jù)已經(jīng)通過(guò)了表單驗(yàn)證.還有請(qǐng)求和應(yīng)答對(duì)象參數(shù).Action類(lèi)的execute方法返回一個(gè)ActionForward對(duì)象,它包含了請(qǐng)求轉(zhuǎn)發(fā)路徑信息.至于訪問(wèn)本地化文本在Aciont類(lèi)中首先通過(guò)execute()方法獲得MessageResources對(duì)象.通過(guò)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()方法如果用戶(hù)輸入的姓名是Monster,將創(chuàng)建包含錯(cuò)誤信息的ActionMessage對(duì)象,然后調(diào)用Action基類(lèi)定義的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組件,視圖組件通過(guò)標(biāo)簽<html:errors>標(biāo)簽把request范圍內(nèi)的ActionMessages對(duì)象中包含錯(cuò)誤信息顯示出來(lái).提示用戶(hù)修改錯(cuò)誤.一個(gè)ActionMessages對(duì)象包含多個(gè)ActionMessage對(duì)象,ActionErrors繼承于ActionMessages,ActionError繼承于ActionMessage對(duì)象.接下來(lái)說(shuō)說(shuō)訪問(wèn)模型組件的方法.HelloAction類(lèi)創(chuàng)建了一個(gè)模型組件PresonBean對(duì)象,并且調(diào)用它的saveToPrsistent

          Store()方法來(lái)保存userName屬性.把屬性保存到本地資源文本文件中!保存之后就要向視圖組件傳遞數(shù)據(jù)了Action類(lèi)把數(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,所以可以刪除.最后通過(guò)Action類(lèi)把流程轉(zhuǎn)發(fā)給合適的視圖組件.return (mapping.findForward(“Action映射配置名稱(chēng)”));好了控制器的創(chuàng)建已經(jīng)搞定了.

          創(chuàng)建模型組件:本例的模型是一個(gè)PersonBean是一個(gè)非常簡(jiǎn)單的JavaBean,它包括一個(gè)userName屬性,以及相關(guān)的get/set方法.還有一個(gè)業(yè)務(wù)方法saveToPresistentStore().本例中并沒(méi)有真正實(shí)現(xiàn)這個(gè)方法,在實(shí)際應(yīng)用中這個(gè)方法可以把JavaBean屬性保存在持久化存儲(chǔ)系統(tǒng)中,如數(shù)據(jù)庫(kù)或文件系統(tǒng).

          創(chuàng)建存放常量的JAVA文件:HelloAction按照request.setAttirbute(類(lèi)名.常量,對(duì)象)的方法設(shè)置request共享的值,把一些常量定義在.java文件種可以提高Action類(lèi)的獨(dú)立性.當(dāng)屬性key常量的值發(fā)生改變的時(shí)候,只需要修改.java文件,不需要該Action.

          創(chuàng)建配置文件:對(duì)于Struts應(yīng)用它的配置文件web.xml應(yīng)該對(duì)ActionServlet類(lèi)進(jìn)行配置,此外,還應(yīng)該生命Web應(yīng)用所使用的Struts標(biāo)簽庫(kù).感覺(jué)沒(méi)什么就是配置標(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è)組件,提高開(kāi)發(fā)速度.而Struts框架的配置文件可以把這些組件組裝起來(lái),決定如何使用它們.<form-bean>元素配置一個(gè)ActionForm,name屬性是名稱(chēng),type是它對(duì)應(yīng)的類(lèi).<action>元素是path屬性指定請(qǐng)求訪問(wèn)的Action路徑,type屬性指定Action的完整類(lèi)名,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)用類(lèi)似,記住把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)頁(yè)上.

          2)<html:form>標(biāo)簽在request范圍中查找HelloForm,如果存在這樣的實(shí)例就把HelloForm對(duì)象中的userName屬性復(fù)制給HTML表單的userName文本框,由于此時(shí)還不存在HelloForm對(duì)象,所以忽略這項(xiàng)操作.

          3)把hello.jsp視圖呈現(xiàn)給客戶(hù).

          表單驗(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ù)用戶(hù)的請(qǐng)求路徑,在Struts配置文件中檢查path屬性一樣的元素沒(méi)有.do.

          4)              ActionServlet根據(jù)<action>元素的name屬性創(chuàng)建一個(gè)ActionForm對(duì)象,把客戶(hù)端的提交的數(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)頁(yè)上.

          以上是我根據(jù)自己的理解闡述了這個(gè)簡(jiǎn)單的應(yīng)用,至于具體的應(yīng)用因?yàn)楸綛log沒(méi)提供下載空間所以不能發(fā)布上來(lái).希望通過(guò)上面的闡述能讓大家對(duì)一個(gè)Struts應(yīng)用有一個(gè)初步的了解,如果不懂也沒(méi)關(guān)系,接下來(lái)的幾天我會(huì)繼續(xù)深入的把Struts的具體的組件介紹出來(lái),如果感覺(jué)我寫(xiě)的來(lái)爛別給我丟雞蛋哦HOHO! (網(wǎng)友們的支持,是我繼續(xù)寫(xiě)技術(shù)文章的動(dòng)力!)

          posted on 2005-10-22 15:02 我心依舊 閱讀(2224) 評(píng)論(4)  編輯  收藏

          FeedBack:
          # re: Struts的Hellpapp應(yīng)用分析(原創(chuàng))
          2005-10-25 13:03 | unicode
          希望以后能把相關(guān)技術(shù)的代碼發(fā)布上來(lái),我們可以參考學(xué)習(xí).例如Struts分頁(yè)算法的應(yīng)用,期待ing  回復(fù)  更多評(píng)論
            
          # re: Struts的Hellpapp應(yīng)用分析(原創(chuàng))
          2006-03-28 10:18 | wjb
          期待原代碼!  回復(fù)  更多評(píng)論
            
          # re: Struts的Hellpapp應(yīng)用分析(原創(chuàng))
          2007-07-24 10:58 | wq
          正在學(xué)習(xí)孫衛(wèi)琴老師的《精通Struts:...》第一個(gè)程序就是helloapp,看了很久,正在查找Validate()方法返回的Actionerrors對(duì)象何時(shí)為null,怎么算不包含actionMessage對(duì)象,google看到了樓主的文章,那個(gè)高興啊
          進(jìn)來(lái)一看,那個(gè)失望啊
          相信樓主都沒(méi)認(rèn)真看過(guò)你的東西
          估計(jì)直接從哪里down下來(lái)的
          有什么意思呢
          和我的書(shū)上一摸一樣的文字
          空格還懶得加
          哎。。。。
          幾年前高中老師說(shuō)過(guò)的話
          天下文章一大抄  回復(fù)  更多評(píng)論
            
          # re: Struts的Hellpapp應(yīng)用分析(原創(chuàng))[未登錄](méi)
          2007-07-24 15:51 | 我心依舊
          @wq
          你失望是你的問(wèn)題.那么簡(jiǎn)單的東西看不懂還用上Google?不錯(cuò)我當(dāng)時(shí)也看那本書(shū)了.不過(guò)文章的字是我一個(gè)字一個(gè)字打上去的,所以我會(huì)了.Struts就那么點(diǎn)東西,非常簡(jiǎn)單易用.
          與其在網(wǎng)上亂搜想投機(jī)取巧,不如把書(shū)上的東西也自己打出來(lái),沒(méi)準(zhǔn)就會(huì)了.何況這天下誰(shuí)抄誰(shuí)啊?孫偉琴的書(shū)也是抄的.知識(shí)都是一樣的誰(shuí)寫(xiě)都是這么寫(xiě).
          無(wú)知,挖我2年前的東西.  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 嵊泗县| 宜都市| 海宁市| 宝坻区| 惠州市| 霍山县| 曲阳县| 高要市| 嘉兴市| 河南省| 甘孜| 鸡东县| 顺昌县| 廉江市| 裕民县| 黄大仙区| 柳河县| 朝阳市| 三明市| 农安县| 临潭县| 汉源县| 邹城市| 广昌县| 密山市| 绿春县| 新田县| 博罗县| 浮梁县| 乃东县| 栖霞市| 房产| 巴马| 监利县| 乌苏市| 大宁县| 田林县| 麦盖提县| 衡南县| 三江| 图片|