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

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

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

    BloveSaga

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

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      34 隨筆 :: 12 文章 :: 122 評論 :: 0 Trackbacks

    動作映射

    這個時候,你可能會問自己:“當控制器接受到一個請求的時候,它如何知道調用哪個Action實例?”控制器要通過查看請求消息并使用一組動作映射(action mapping)來做出決定。動作映射是Struts配置信息(配置一個特殊的XML文件中)的一部分。這個配置信息會在啟動時加載到內存中,讓Struts框架得以在運行時加以利用。每個action元素在內存中都被表示為org.apache.struts.action.ActionMapping類的實例。ActionMapping對象包含一個path屬性,用來與外部請求的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>
    這里的登錄動作映射把路徑"/login"映射到了com.oreilly.struts.banking.LoginAction這個Action類。無論何時,當控制器接受到一個URI路徑中包含"/login"字符串的請求時,就會調用LoginAction實例的execute()方法。Struts框架還會使用映射來指出“動作"完成后要讓用戶轉向哪個資源。

    ?

    使用Struts ActionForm

    Struts框架的ActionForm對象可用來在用戶和業務層之間傳輸客戶的輸入數據。Struts框架會自動從請求中收集輸入數據,再將這些數據交給一個使用表單bean(form bean)的Action對象,接著表單再交給業務層。為了把表示層和業務層分離開來,你不應該直接把ActionForm對象交給業務層,而是應該使用由ActionForm對象得到的數據創建適當的DTO。下面的步驟說明了Struts框架如何處理每個請求相應的ActionForm對象:
    ?
    ? 1.檢查該項動作的相應設置,查看是否已經有某個ActionForm得到配置。
    ? 2.如果對應這個動作配置了某個ActionForm,則使用action元素中的name屬性來查找表單bean的配置信息。
    ? 3.查看是否已經創建了一個ActionForm的一個實例。
    ? 4.如果在適當的作用域內已經存在一個ActionForm實例,而且這個實例的類型正是這個請求所需要的類型,則重用這個實例。
    ? 5.否則,創建所需ActionForm的一個新實例,并存儲在適當的作用域中(由action元素的scope屬性設置)。
    ? 6.調用ActionForm實例的reset()方法。
    ? 7.反復處理請求參數,如果參數名在ActionForm實例中具有對應的設置方法(setter method),就為它填上該請求參數的值。
    ? 8.最后,如果validate屬性的值設置為true,則調用ActionForm實例的validate()方法,并返回所出現的任何誤。

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

    ?<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>
    每個表單bean的name屬性必須都是獨一無二的,而且其type屬性必須定義一個Java類(擴展了Struts ActionForm類)的完全限定名。下一步是在一個或多個action元素中使用在form-benas段里的某個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>
    注意:登錄動作映射的name正好和前面form-beans段里某個name屬性相匹配。

    ?


    ?

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

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 午夜理伦剧场免费| 午夜视频在线免费观看| 日本xxwwxxww在线视频免费| 亚洲AV无码一区二区三区在线| 2021在线观看视频精品免费| 亚洲天堂一区二区三区| 免费视频专区一国产盗摄| 亚洲国产精品久久网午夜| 最近免费中文字幕视频高清在线看| 激情综合亚洲色婷婷五月| 在线播放免费播放av片 | 亚洲最大视频网站| 久久经典免费视频| 国产精品亚洲专区一区| 国产偷窥女洗浴在线观看亚洲| 97在线免费观看视频| 中文字幕亚洲精品| 最近免费中文字幕大全| 亚洲国产成人久久综合| 国产亚洲精品不卡在线| 精品熟女少妇av免费久久| 亚洲乱码av中文一区二区| 亚洲性日韩精品国产一区二区| 久久青青草原国产精品免费| 亚洲毛片基地4455ww| 亚洲精品高清一二区久久| 久久国产精品一区免费下载| 亚洲天堂2017无码中文| 亚洲成?Ⅴ人在线观看无码| a级毛片免费全部播放无码| 亚洲日产2021三区| 亚洲国产V高清在线观看| 最近最好最新2019中文字幕免费| 亚洲精品二三区伊人久久| 亚洲精品国精品久久99热| 99视频免费观看| 黄色三级三级三级免费看| 久久精品亚洲一区二区三区浴池 | 99久久免费国产精品热| 亚洲成a人片在线不卡| 国产亚洲人成网站在线观看|