<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 70,comments - 408,trackbacks - 0

    今天主要是研究一個(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)  編輯  收藏

    FeedBack:
    # re: Struts的Hellpapp應(yīng)用分析(原創(chuàng))
    2005-10-25 13:03 | unicode
    希望以后能把相關(guān)技術(shù)的代碼發(fā)布上來,我們可以參考學(xué)習(xí).例如Struts分頁算法的應(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)來一看,那個(gè)失望啊
    相信樓主都沒認(rèn)真看過你的東西
    估計(jì)直接從哪里down下來的
    有什么意思呢
    和我的書上一摸一樣的文字
    空格還懶得加
    哎。。。。
    幾年前高中老師說過的話
    天下文章一大抄  回復(fù)  更多評(píng)論
      
    # re: Struts的Hellpapp應(yīng)用分析(原創(chuàng))[未登錄]
    2007-07-24 15:51 | 我心依舊
    @wq
    你失望是你的問題.那么簡(jiǎn)單的東西看不懂還用上Google?不錯(cuò)我當(dāng)時(shí)也看那本書了.不過文章的字是我一個(gè)字一個(gè)字打上去的,所以我會(huì)了.Struts就那么點(diǎn)東西,非常簡(jiǎn)單易用.
    與其在網(wǎng)上亂搜想投機(jī)取巧,不如把書上的東西也自己打出來,沒準(zhǔn)就會(huì)了.何況這天下誰抄誰啊?孫偉琴的書也是抄的.知識(shí)都是一樣的誰寫都是這么寫.
    無知,挖我2年前的東西.  回復(fù)  更多評(píng)論
      

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 成人精品视频99在线观看免费| 18成禁人视频免费网站| 亚洲2022国产成人精品无码区 | 一级毛片免费视频| 亚洲а∨天堂久久精品9966 | 亚洲人成电影亚洲人成9999网| ww在线观视频免费观看| 青青青亚洲精品国产| 亚洲AV无码乱码在线观看富二代 | 成年18网站免费视频网站| 国产高潮久久免费观看| 亚洲fuli在线观看| 亚洲区小说区图片区QVOD| 久久久www成人免费毛片| 中出五十路免费视频| 亚洲欧美国产日韩av野草社区| 狠狠色伊人亚洲综合成人| 毛片基地免费观看| 久久综合国产乱子伦精品免费 | 一级成人a毛片免费播放| 国产亚洲高清在线精品不卡| 久久精品国产亚洲AV无码娇色 | 亚洲激情视频在线观看| 国产午夜免费福利红片| 亚洲成人在线免费观看| 99久久婷婷免费国产综合精品| 亚洲av无码日韩av无码网站冲| 久久亚洲AV无码精品色午夜| 亚洲AV网站在线观看| A级毛片内射免费视频| 一级毛片免费观看| 国产精品美女免费视频观看 | 国产免费不卡视频| 黄网站免费在线观看| yellow视频免费看| 日本系列1页亚洲系列| 亚洲国产激情在线一区| 亚洲av日韩av天堂影片精品| 亚洲片一区二区三区| 国产又大又粗又硬又长免费 | 亚洲乱码一二三四区麻豆|