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

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

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

    BloveSaga

    在希臘帕爾納斯山南坡上,有一個(gè)馳名世界的戴爾波伊神托所,在它的入口處的巨石上赫然銹刻著這樣幾個(gè)大字: 認(rèn)識(shí)你自己!

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      34 隨筆 :: 12 文章 :: 122 評(píng)論 :: 0 Trackbacks

    動(dòng)作映射

    這個(gè)時(shí)候,你可能會(huì)問(wèn)自己:“當(dāng)控制器接受到一個(gè)請(qǐng)求的時(shí)候,它如何知道調(diào)用哪個(gè)Action實(shí)例?”控制器要通過(guò)查看請(qǐng)求消息并使用一組動(dòng)作映射(action mapping)來(lái)做出決定。動(dòng)作映射是Struts配置信息(配置一個(gè)特殊的XML文件中)的一部分。這個(gè)配置信息會(huì)在啟動(dòng)時(shí)加載到內(nèi)存中,讓Struts框架得以在運(yùn)行時(shí)加以利用。每個(gè)action元素在內(nèi)存中都被表示為org.apache.struts.action.ActionMapping類的實(shí)例。ActionMapping對(duì)象包含一個(gè)path屬性,用來(lái)與外部請(qǐng)求的URI部分匹配。如下:
    <action
    ??? path="/login"
    ??? type="com.oreilly.struts.banking.action.LoginAction"
    ??? scope="request"
    ??? name="loginForm"
    ??? validate="true"
    ??? input="/login.jsp"
    ??? <forward name="Success" path="/action/getaccountinformation" redirect="true"/>
    ??? <forward name="Failure" path="/login.jsp" redirect="true"/>
    </action>
    這里的登錄動(dòng)作映射把路徑"/login"映射到了com.oreilly.struts.banking.LoginAction這個(gè)Action類。無(wú)論何時(shí),當(dāng)控制器接受到一個(gè)URI路徑中包含"/login"字符串的請(qǐng)求時(shí),就會(huì)調(diào)用LoginAction實(shí)例的execute()方法。Struts框架還會(huì)使用映射來(lái)指出“動(dòng)作"完成后要讓用戶轉(zhuǎn)向哪個(gè)資源。

    ?

    使用Struts ActionForm

    Struts框架的ActionForm對(duì)象可用來(lái)在用戶和業(yè)務(wù)層之間傳輸客戶的輸入數(shù)據(jù)。Struts框架會(huì)自動(dòng)從請(qǐng)求中收集輸入數(shù)據(jù),再將這些數(shù)據(jù)交給一個(gè)使用表單bean(form bean)的Action對(duì)象,接著表單再交給業(yè)務(wù)層。為了把表示層和業(yè)務(wù)層分離開來(lái),你不應(yīng)該直接把ActionForm對(duì)象交給業(yè)務(wù)層,而是應(yīng)該使用由ActionForm對(duì)象得到的數(shù)據(jù)創(chuàng)建適當(dāng)?shù)腄TO。下面的步驟說(shuō)明了Struts框架如何處理每個(gè)請(qǐng)求相應(yīng)的ActionForm對(duì)象:
    ?
    ? 1.檢查該項(xiàng)動(dòng)作的相應(yīng)設(shè)置,查看是否已經(jīng)有某個(gè)ActionForm得到配置。
    ? 2.如果對(duì)應(yīng)這個(gè)動(dòng)作配置了某個(gè)ActionForm,則使用action元素中的name屬性來(lái)查找表單bean的配置信息。
    ? 3.查看是否已經(jīng)創(chuàng)建了一個(gè)ActionForm的一個(gè)實(shí)例。
    ? 4.如果在適當(dāng)?shù)淖饔糜騼?nèi)已經(jīng)存在一個(gè)ActionForm實(shí)例,而且這個(gè)實(shí)例的類型正是這個(gè)請(qǐng)求所需要的類型,則重用這個(gè)實(shí)例。
    ? 5.否則,創(chuàng)建所需ActionForm的一個(gè)新實(shí)例,并存儲(chǔ)在適當(dāng)?shù)淖饔糜蛑校ㄓ蒩ction元素的scope屬性設(shè)置)。
    ? 6.調(diào)用ActionForm實(shí)例的reset()方法。
    ? 7.反復(fù)處理請(qǐng)求參數(shù),如果參數(shù)名在ActionForm實(shí)例中具有對(duì)應(yīng)的設(shè)置方法(setter method),就為它填上該請(qǐng)求參數(shù)的值。
    ? 8.最后,如果validate屬性的值設(shè)置為true,則調(diào)用ActionForm實(shí)例的validate()方法,并返回所出現(xiàn)的任何誤。

    對(duì)任何HTML頁(yè)面而言,如果表單數(shù)據(jù)是以POST方法傳輸?shù)模蛻?yīng)該使用ActionForm。必要時(shí),相同的ActionForm可以同時(shí)給多個(gè)頁(yè)面使用,只要HTML字段能和ActionForm對(duì)象的屬性(property)匹配就可以了。
    Struts框架所提供的ActionForm類實(shí)現(xiàn)了多個(gè)方法,但到目前為止,最重要的兩個(gè)方法就是reset()和validate():
    ?? ?public void reset(ActionMapping mapping,HttpServletRequest request);
    ??? public ActionErrors validate(ActionMapping mapping,HttpServletRequest request);
    在Struts ActionForm類中,這兩個(gè)方法的默認(rèn)實(shí)現(xiàn)是不完成任何的邏輯。你必須在自己的ActionForm類中覆蓋這兩個(gè)方法。控制器以請(qǐng)求中的值來(lái)填寫ActionForm實(shí)例之前,會(huì)先調(diào)用reset()方法。reset()方法給了ActionForm一個(gè)機(jī)會(huì),可將其屬性設(shè)置為原來(lái)默認(rèn)的狀態(tài)。這一點(diǎn)非常重要,因?yàn)楸韱蝏ean實(shí)例可能會(huì)由多個(gè)請(qǐng)求共享或者由好幾個(gè)不同的線程所存取。不過(guò),如果你是讓好幾頁(yè)共享一個(gè)ActionForm實(shí)例,可能
    不會(huì)去想去實(shí)現(xiàn)reset()方法,這樣一來(lái)只要這個(gè)實(shí)例還在,屬性的值就不會(huì)被重新設(shè)置。另一種做法就是實(shí)現(xiàn)你自己的resetFields()方法,在成功更新業(yè)務(wù)之后,就從這個(gè)Action類來(lái)調(diào)用此方法。當(dāng)請(qǐng)求中所攜帶的值已經(jīng)插入到ActionFrom實(shí)例之后,控制器就回調(diào)用validate()方法。ActionForm應(yīng)該對(duì)輸入數(shù)據(jù)完成必要的驗(yàn)證工作,然后向控制器返回所檢測(cè)到的任何錯(cuò)誤。業(yè)務(wù)邏輯驗(yàn)證應(yīng)該在業(yè)務(wù)對(duì)象中而不是在ActionForm中來(lái)完成。在ActionForm中所進(jìn)行的驗(yàn)證工作,只是表示的驗(yàn)證而已。一旦寫好ActionForm類后,你必須通知Struts應(yīng)用程序有這些ActionForm存在,告訴Struts應(yīng)用程序哪個(gè)動(dòng)作映射應(yīng)該使用哪個(gè)ActionForm。這是在配置文件中設(shè)置的。第一步是為你的應(yīng)用程序在配置文件中的form-beans段里配置所有的ActionForm。看下面的一個(gè)例子:

    ?<form-beans>
    ??? <form-bean
    ?????? name="loginForm"
    ?????? type="com.oreilly.struts.banking.form.LoginForm"/>
    ??? <form-bean
    ?????? name="accountInformationForm"
    ?????? type="org.apache.struts.action.DynaActionForm">
    ?????? <form-property name="accounts" type="java.util.ArrayList"/>
    ??? </form-bean>
    ?</form-beans>
    每個(gè)表單bean的name屬性必須都是獨(dú)一無(wú)二的,而且其type屬性必須定義一個(gè)Java類(擴(kuò)展了Struts ActionForm類)的完全限定名。下一步是在一個(gè)或多個(gè)action元素中使用在form-benas段里的某個(gè)form-bean名。如下:

    ? <action
    ??? path="/login"
    ??? type='com.oreilly.struts.banking.action.LoginAction"
    ??? scope="request"
    ??? name="loginForm"
    ??? validate="true"
    ??? input="/login.jsp">
    ??? <forward name="Success" path="/action/getaccountinformation" redirect="ture>
    ??? <forward name="Failure" path="/login.jsp" redirect="true"/>
    ? </action>
    注意:登錄動(dòng)作映射的name正好和前面form-beans段里某個(gè)name屬性相匹配。

    ?


    ?

    posted on 2006-06-26 11:01 藍(lán)色Saga 閱讀(175) 評(píng)論(0)  編輯  收藏 所屬分類: STRUTS

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: jlzzjlzz亚洲乱熟在线播放| 四虎在线视频免费观看视频| 成人免费视频软件网站| 亚洲1234区乱码| 亚洲人成网亚洲欧洲无码久久| 中文字幕久精品免费视频| 日木av无码专区亚洲av毛片| 亚洲日本在线观看网址| 国产男女猛烈无遮挡免费视频网站| 草久免费在线观看网站| 久久精品国产亚洲77777| 国产美女精品视频免费观看| 久久精品成人免费看| 亚洲成a人片在线不卡一二三区| 亚洲欧洲无码AV电影在线观看| 台湾一级毛片永久免费| 好吊色永久免费视频大全| 亚洲码一区二区三区| 亚洲无码日韩精品第一页| 免费三级毛片电影片| 国产裸体美女永久免费无遮挡| 亚洲一卡2卡4卡5卡6卡在线99 | 精品国产污污免费网站| 亚洲码欧美码一区二区三区| 国产亚洲综合色就色| 国产成人免费永久播放视频平台| 日日麻批免费40分钟无码| 精品国产亚洲AV麻豆 | www免费插插视频| 中国亚洲呦女专区| 亚洲一区二区三区夜色| 国产日产亚洲系列最新| 日韩激情淫片免费看| 国产成人精品免费视| 久久美女网站免费| 一级黄色免费大片| 亚洲熟妇丰满xxxxx| 亚洲精品中文字幕乱码| 国产亚洲一区二区精品| 中文字幕人成人乱码亚洲电影 | 亚洲国产精品成人午夜在线观看|