亚洲av色香蕉一区二区三区,十四以下岁毛片带血a级,亚洲 校园 欧美 国产 另类,亚洲av日韩av一区谷露,色欲av无码一区二区三区

  • 相關(guān)軟件
    >Struts控制器組件 創(chuàng)建者:webmaster 更新時(shí)間:2005-05-16 21:58

    Struts控制器組件負(fù)責(zé)接受用戶請(qǐng)求、更新模型,以及選擇合適的視圖組件返回給用戶??刂破鹘M件有助于將模型層和視圖層分離,有了這種分離,就可以在同一個(gè)模型的基礎(chǔ)上得心應(yīng)手地開發(fā)多種類型的視圖。Struts控制器組建主要包括:



    ·ActionServlet組件:充當(dāng)Struts框架的中央控制器。

    ·RequestProcessor組件:充當(dāng)每個(gè)子應(yīng)用模塊的請(qǐng)求處理器。

    ·Action組件:負(fù)責(zé)處理一項(xiàng)具體的業(yè)務(wù)。



    Struts框架采用控制器組件來預(yù)處理所有的客戶請(qǐng)求,這種集中控制方式可以滿足MVC設(shè)計(jì)模式的兩大需求:



    ·首先,控制器在用戶輸入數(shù)據(jù)和模型之間充當(dāng)媒介 / 翻譯者的角色,提供一些通用功能,如安全、登入和其他針對(duì)具體用戶請(qǐng)求的重要服務(wù),當(dāng)系統(tǒng)的這些通用功能出現(xiàn)需求變更時(shí),部需要修改整個(gè)應(yīng)用,只需要修改局部的控制器組件即可。

    ·其次,由于所有的請(qǐng)求都經(jīng)過控制器過濾,因此可以降低視圖組件之間,以及視圖組件和模型組件之間的相互依賴關(guān)系,提高每個(gè)組件的相對(duì)獨(dú)立性。由控制器組件來決定把合適的視圖組件返回給用用戶,這可以減少視圖組件之間直接的,錯(cuò)綜復(fù)雜的連接關(guān)系,使應(yīng)用更加靈活,便于維護(hù)。



    Struts框架采用ActionServlet和RequestProcessor組件進(jìn)行集中控制,并采用Action組件來處理單項(xiàng)業(yè)務(wù)。





    一 控制器組件的控制機(jī)制



    Struts的控制器組件主要完成以下任務(wù):

    ·接受用戶請(qǐng)求

    ·根據(jù)用戶請(qǐng)求,調(diào)用合適的模型組件來執(zhí)行相應(yīng)的業(yè)務(wù)邏輯。

    ·獲取業(yè)務(wù)邏輯執(zhí)行結(jié)果。

    ·根據(jù)當(dāng)前狀態(tài)以及業(yè)務(wù)邏輯執(zhí)行結(jié)果,選擇合適的視圖組件返回給用戶。



    1 Action類



    org.apache.struts.action.ActionServlet類是Struts框架的核心控制器組件,所有的用戶請(qǐng)求都先有ActionServlet來處理,然后再由ActionServlet把請(qǐng)求轉(zhuǎn)發(fā)給其他組件。Struts框架只允許在一個(gè)應(yīng)用中配置一個(gè)ActionServlet類,在應(yīng)用的生命周期中,僅創(chuàng)建ActionServlet類的一個(gè)實(shí)例,這個(gè)ActionServlet實(shí)例可以同時(shí)響應(yīng)多個(gè)用戶請(qǐng)求。



    (a)   Struts框架初始化過程

    (1)   調(diào)用initInternal()方法,初始化Struts框架內(nèi)在的消息資源,如與系統(tǒng)日志相關(guān)的同志、警告和錯(cuò)誤消息。

    (2)   調(diào)用initOther()方法,從web.xml文件中加載ActionServlet的初始化參數(shù),如config參數(shù)。

    (3)   調(diào)用initServlet()方法,從web.xml文件中加載ActionServlet的URL映射信息。此外還會(huì)注冊(cè)web.xml和Struts配置文件所使用的DTD文件,這些DTD文件用來驗(yàn)證web.xml和Struts配置文件的語法。

    (4)   調(diào)用initModuleConfig()方法,加載并解析子應(yīng)用模塊的Struts配置文件;創(chuàng)建ModuleConfig對(duì)象,把它存儲(chǔ)在ServletContext中。

    (5)   調(diào)用initModuleMessageResources()方法,加載并初始化默認(rèn)子應(yīng)用模塊的消息資源:創(chuàng)建MessageResources對(duì)象,把它存儲(chǔ)在ServletContext中。

    (6)   調(diào)用initModuleDataSources()方法,加載并初始化默認(rèn)子應(yīng)用模塊的數(shù)據(jù)源。如果在Struts配置文件中沒有定義元素,就忽略這一流程。

    (7)   調(diào)用InitModulePlugins()方法,加載并初始化默認(rèn)子應(yīng)用模塊的所有插件。

    (8)   當(dāng)默認(rèn)子應(yīng)用模塊被成功地初始化后,如果還包括其他子應(yīng)用模塊,將重復(fù)流程(4)~(7),分別對(duì)其他子應(yīng)用模塊進(jìn)行初始化。



    (b)   ActionServlet的process()方法

    當(dāng)ActionServlet實(shí)例接受到HTTP請(qǐng)求之后,在doGet()或doPost()方法都會(huì)調(diào)用process()方法來處理請(qǐng)求。一下是ActionServlet的process()方法的源代碼:



    protected void process (HttpServletRequest request, HttpServletResponse response)

    throw IOException, ServletException {



    ModuleUtils.getInstance().selectModule(request, getServletContext());

    getRequestProcessor(getModuleConfig(request)).process(request, response);

    }



    在process()方法中,首先調(diào)用org.apache.struts.util.ModuleUtils類的selectModule()方法,這個(gè)方法選擇負(fù)責(zé)處理當(dāng)前請(qǐng)求的子應(yīng)用模塊,然后把與子應(yīng)用模塊相關(guān)的ModuleConfig和MessageResources對(duì)象存儲(chǔ)倒request范圍中,這使得框架的其余組件可以方便地從request范圍中讀取這些對(duì)象,從而獲取應(yīng)用配置信息和消息資源。

    process()方法的第二步操作為獲得RequestProcessor類的實(shí)例,然后調(diào)用RequestProcessor類的process()方法,來完成十幾的預(yù)處理請(qǐng)求操作。





    (c)   擴(kuò)展ActionServlet類

    在Sturts 1.1 之前的版本中,ActionServlet類本身包含了很多處理請(qǐng)求的代碼。從Struts 1.1 開始,多數(shù)功能被移到 org.apache.struts.action.RequestProcessor 類中,以便減輕ActionServlet類的控制負(fù)擔(dān)。



    盡管新版本的Struts框架允許在應(yīng)用中創(chuàng)建礦展ActionServlet類的子類,但是這在多數(shù)情況下沒有必要,因?yàn)榭刂破鞯亩鄶?shù)控制功能位于RequestProcessor類中。



    如果實(shí)際應(yīng)用確實(shí)需要?jiǎng)?chuàng)建自己的ActionServlet類,則可以創(chuàng)建一個(gè)ActionServlet的子類,然后在web.xml文件中配置這個(gè)客戶化ActionServlet類。



    如果覆蓋了init()方法,應(yīng)該確保首先調(diào)用super.init(),它保證ActionServlet的默認(rèn)初始化操作被執(zhí)行。除了覆蓋init()方法外,事實(shí)上,還可以根據(jù)十幾需要覆蓋ActionServlet的任何其他方法。





    2 RequestProcessor類



    對(duì)于多應(yīng)用模塊的Struts應(yīng)用,每個(gè)子應(yīng)用模塊都有各自的RequestProcessor實(shí)例。在ActionServlet的process()方法中,一旦選擇了正確的子應(yīng)用模塊,就會(huì)調(diào)用子應(yīng)用模塊的RequestProcessor實(shí)例的process()方法來處理請(qǐng)求。在ActionServlet調(diào)用這個(gè)方法時(shí),會(huì)把當(dāng)前的request和response對(duì)象傳給它。

    Struts框架只允許應(yīng)用中存在一個(gè)ActionServlet類,但是可以存在多個(gè)客戶化的RequestProcessor類,每個(gè)子應(yīng)用模塊都可以擁有單獨(dú)的RequestProcessor類。如果想修改RequestProcessor類的一些默認(rèn)功能,可以覆蓋RequestProcessor基類中的相關(guān)方法。



    (a)   RequestProcessor類的process()方法

    RequestProcessor類的process()方法負(fù)責(zé)實(shí)際的預(yù)處理請(qǐng)求操作。

    RequestProcessor類的process()方法一次執(zhí)行一下流程:

    (1) 調(diào)用processMultipart()方法。如果HTTP請(qǐng)求方式為POST,并且請(qǐng)求的contentType屬性以“multipart/form-data”開頭,標(biāo)準(zhǔn)的HttpServletRequest對(duì)象將被重新包裝,以方便處理“multipart”類型的HTTP請(qǐng)求。如果請(qǐng)求方式為GET,或者contentType屬性不是“multipart”,就直接返回原始的HttpServletRequest對(duì)象。

    (2) 調(diào)用processPath()方法,獲得請(qǐng)求URI的路徑,這一信息可用于選擇合適的Struts Action組件。

    (3) 調(diào)用processLocale()方法,當(dāng)ControllerConfig對(duì)象的locale屬性為true,將讀取用戶請(qǐng)求中包含的Locale信息,然后把Locale實(shí)例保存在session范圍內(nèi)。

    (4) 調(diào)用processContent()方法,讀取ControllerConfig對(duì)象的contentType屬性,然后調(diào)用response.setContentType(contentType)方法,設(shè)置響應(yīng)結(jié)果的文檔類型和字符編碼。

    (5) 調(diào)用processNoCache()方法,讀取ControllerConfig對(duì)象的nocache屬性,如果nocache屬性為true,在響應(yīng)結(jié)果中將加入特定的頭參數(shù):Pragma、Cache-Control和Expires,防止頁面被存儲(chǔ)在客戶瀏覽器的緩存中。

    (6) 調(diào)用processPreprocess()方法。該方法不執(zhí)行任何操作,直接返回true。子類可以覆蓋這個(gè)方法,執(zhí)行客戶化的預(yù)處理請(qǐng)求操作。

    (7) 調(diào)用processMapping()方法,尋找和用戶請(qǐng)求的URI匹配的ActionMapping。如果不存在這樣的ActionMapping,則向用戶返回恰當(dāng)?shù)腻e(cuò)誤消息。

    (8) 調(diào)用processRoles()方法,先判斷是否為Action配置了安全角色,如果配置了安全角色,就調(diào)用isUserRole()方法判斷當(dāng)前用戶是否具備必需的角色;如果不具備,就結(jié)束請(qǐng)求處理流程,向用戶返回恰當(dāng)?shù)腻e(cuò)誤消息。

    (9) 調(diào)用processActionForm()方法,先判斷是否為ActionMapping配置了ActionForm,如果配置了ActionForm,就先從ActionForm的存在范圍內(nèi)尋找該ActionForm實(shí)例;如果不存在,就創(chuàng)建一個(gè)實(shí)例。接下來把它保存在合適的范圍中,保存時(shí)使用的屬性key為ActionMapping的name屬性。

    (10) 調(diào)用processActionForm()方法。如果為ActionMapping配置了ActionForm,就先調(diào)用ActionForm的reset()方法,再把請(qǐng)求中的表單數(shù)據(jù)組裝到ActionForm中。

    (11) 調(diào)用processValidate()方法,如果為ActionMapping配置了ActionForm,并且ActionMapping的validate屬性為true,就調(diào)用ActionForm的validate()方法。如果validate()方法返回的ActionErrors對(duì)象中包含ActionMessage對(duì)象,說明表單驗(yàn)證失敗,就把ActionErrors對(duì)象存儲(chǔ)在request范圍內(nèi),再把請(qǐng)求轉(zhuǎn)發(fā)到ActionMapping的input屬性指定的Web組件。如果ActionForm的validate()方法執(zhí)行表單驗(yàn)證成功,就繼續(xù)執(zhí)行下一步請(qǐng)求處理流程。

    (12) 調(diào)用processForward()方法,判斷是否在ActionMapping中配置了forward屬性。如果配置了這個(gè)屬性,就調(diào)用RequestDispatcher的forward()方法,請(qǐng)求處理流程結(jié)束,否則繼續(xù)下一步。

    (13) 調(diào)用processInclude()方法,判斷是否在ActionMapping中配置了include屬性。如果配置了這個(gè)屬性,就調(diào)用RequestDispatcher的include()方法,請(qǐng)求處理流程結(jié)束,否則繼續(xù)下一步。

    (14) 調(diào)用processActionCreate()方法,先判斷是否在Action緩存中存在這個(gè)Action實(shí)例,如果不存在,就創(chuàng)建一個(gè)Action實(shí)例,把它保存在Action緩存中。

    (15) 調(diào)用processActionPerform()方法,該方法再調(diào)用Action實(shí)例的execute()方法。execute()方法位于try/catch代碼中,以便捕獲異常。

    (16) 調(diào)用processActionForward()方法,把Action的execute()方法返回的ActionForward對(duì)象作為參數(shù)傳給它。processActionForward()根據(jù)ActionForward對(duì)象包含的請(qǐng)求轉(zhuǎn)發(fā)信息來執(zhí)行請(qǐng)求轉(zhuǎn)發(fā)或重定向。



    (b)   擴(kuò)展RequestProcessor類

    開發(fā)人員可以很方便地創(chuàng)建客戶化的RequestProcessor類。

    在Struts配置文件中,元素的processorClass屬性RequestProcessor類。





    3 Action類

    Action類是用戶請(qǐng)求和業(yè)務(wù)邏輯之間的橋梁。每個(gè)Action充當(dāng)客戶的一項(xiàng)業(yè)務(wù)代理。在RequestProcessor類預(yù)處理請(qǐng)求時(shí),在創(chuàng)建了Action的實(shí)例后,就調(diào)用自身的processActionPerform()方法,該方法再調(diào)用Action類的execute()方法。

    Action的execute()方法調(diào)用模型的業(yè)務(wù)方法,完成用戶請(qǐng)求的業(yè)務(wù)邏輯,然后根據(jù)執(zhí)行結(jié)果把請(qǐng)求轉(zhuǎn)發(fā)給其他合適的Web組件。



    (a)   Action類緩存

    為了確保線程安全(thread-safe),在一個(gè)應(yīng)用的生命周期中,Struts框架只會(huì)為每個(gè)Action類創(chuàng)建一個(gè)Action實(shí)例。所有的客戶請(qǐng)求共享一個(gè)Action實(shí)例,并且所有請(qǐng)求線程可以同時(shí)執(zhí)行它的execute()方法。

    RequestProcessor類包含一個(gè)HashMap,作為存放所有Action實(shí)例的緩存,每個(gè)Action實(shí)例在緩存中存放的屬性key為Action類名。在RequestProcessor類的processActionCreate()方法中,首先檢查在HashMap中是否存在Action實(shí)例,如果存在,就返回這個(gè)實(shí)例;否則,就創(chuàng)建一個(gè)新的Action實(shí)例。創(chuàng)建Action實(shí)例的代碼位于同步代碼塊中,以保證只有一個(gè)線程創(chuàng)建Action實(shí)例。一旦線程創(chuàng)建了Action實(shí)例并把它存放到HashMap中,以后所有的線程就會(huì)直接使用這個(gè)緩存中的實(shí)例。



    (b)   ActionForward類

    Action類的execute()方法返回一個(gè)ActionForward對(duì)象。ActionForward對(duì)象代表了Web資源的邏輯抽象,這里的Web資源可以是JSP頁、Java Servlet或Action。從execute()方法中返回ActionForward對(duì)象有兩種方法:

    · 在execute()方法中動(dòng)態(tài)創(chuàng)建一個(gè)ActionForward實(shí)例

    · 在Struts配置文件中配置元素。

        配置了元素后,在Struts框架初始化時(shí)就會(huì)創(chuàng)建存放元素;

      在execute()方法中只需調(diào)用ActionMapping實(shí)例的findForward()方法,來獲取特定的ActionForward實(shí)例。findForward()方法先調(diào)用findForwardConfig()方法,在Action級(jí)別(即元素內(nèi)的子元素)尋找匹配的ActionForward對(duì)象。如果沒有,再在全局級(jí)別(即元素內(nèi)的子元素)中尋找匹配的ActionForward對(duì)象。如果找到,就返回該ActionForward對(duì)象。如果findForward()方法沒有找到匹配的ActionForward對(duì)象,它不會(huì)拋出異常,而是返回null。在瀏覽器端,用戶將收到一個(gè)空白頁。

    采用第二種方式,無需在程序中硬編碼來指定轉(zhuǎn)發(fā)資源的無力路徑,而是在配置文件中配置轉(zhuǎn)發(fā)資源,程序中秩序引用轉(zhuǎn)發(fā)資源的邏輯名即可,這提高了應(yīng)用的靈活性和可維護(hù)性。



    (c)   創(chuàng)建支持多線程的Action類

    在Struts應(yīng)用的生命周期中,只會(huì)為每個(gè)Action類創(chuàng)建一個(gè)實(shí)例,所有的客戶請(qǐng)求共享這個(gè)實(shí)例。因此,必需保證在多線程環(huán)境中,Action也能正常工作。保證線程安全的重要元素是在Action類中僅僅使用局部變量,謹(jǐn)慎地使用實(shí)例變量。

    如果在Action的execute()方法中定義了局部變量,對(duì)于每個(gè)調(diào)用execute()方法的線程,Java虛擬機(jī)會(huì)在每個(gè)線程的堆棧中創(chuàng)建局部變量,因此每個(gè)線程擁有獨(dú)立的局部變量,不會(huì)被其他線程共享。當(dāng)線程執(zhí)行完execute()方法時(shí),它的局部變量就會(huì)被銷毀。

    如果在Action類中定義了實(shí)例變量,那么在Action實(shí)例的整個(gè)生命周期中,這個(gè)實(shí)例變量被所有的請(qǐng)求線程共享。因此不能在Action類中定義代表特定客戶狀態(tài)的實(shí)例變量。

    在Action類中定義的實(shí)例變量代表了可以被所有請(qǐng)求線程訪問的共享資源。為了避免共享資源的競(jìng)爭(zhēng),在必要的情況下,需要采用Java同步機(jī)制對(duì)訪問共享資源的代碼塊進(jìn)行同步。



    (d) Action類的安全

    在某些情況下,如果Action類執(zhí)行的功能非常重要,則只允許具有特定權(quán)限的用戶才能訪問該Action。為了防止未授權(quán)的用戶來訪問Action,可以在配置Action時(shí)指定安全角色。

    元素的roles屬性指定訪問這個(gè)Action的用戶必須具備的安全角色,多個(gè)角色之間以逗號(hào)隔開。

    RequestProcessor類在預(yù)處理請(qǐng)求時(shí)會(huì)調(diào)用自身的processRoles()方法,該方法先檢查在配置文件中是否未Action配置了安全角色,如果配置了安全角色,就調(diào)用HttpServletRequest的isUserInRole()方法,來判斷用戶是否具備了必要的安全角色。如果不具備,就直接向客戶端返回錯(cuò)誤。







    二 使用內(nèi)置的Struts Action類



    Struts提供了一些現(xiàn)成的Action類,在Struts應(yīng)用中直接使用這些Action類可以大大節(jié)省開發(fā)時(shí)間。



    1 org.apache.struts.actions.ForwardAction類

    在JSP網(wǎng)頁中,盡管可以直接通過標(biāo)簽把請(qǐng)求轉(zhuǎn)發(fā)給其他Web組件,但是Struts框架提倡先把請(qǐng)求轉(zhuǎn)發(fā)給控制器,再由控制器來負(fù)責(zé)請(qǐng)求轉(zhuǎn)發(fā)。



    有控制器來負(fù)責(zé)請(qǐng)求轉(zhuǎn)發(fā)有以下一些優(yōu)點(diǎn):

    ·控制器具有預(yù)處理請(qǐng)求功能,它能夠選擇正確的子應(yīng)用模塊來處理請(qǐng)求,并且把子應(yīng)用模塊的ModuleConfig和MessageResources對(duì)象存放在request范圍內(nèi)。這樣,請(qǐng)求轉(zhuǎn)發(fā)的目標(biāo)Web組件就可以正常地訪問ModuleConfig和MessageResources對(duì)象。

    ·如果JSP頁面中包含HTML表單,那么控制器能夠創(chuàng)建和這個(gè)表單對(duì)應(yīng)的ActionForm對(duì)象,把用戶輸入表單數(shù)據(jù)組裝到ActionForm中。如果元素的validate屬性為true,那么還會(huì)調(diào)用ActionForm的表單驗(yàn)證方法??刂破靼袮ctionForm對(duì)象存放在request或session范圍內(nèi),這樣請(qǐng)求轉(zhuǎn)發(fā)的目標(biāo)Web組件也可以訪問ActionForm。

    ·JSP網(wǎng)頁之間直接相互轉(zhuǎn)發(fā)違背了MVC的分層原則,按照MVC設(shè)計(jì)思想,控制器負(fù)責(zé)處理所有請(qǐng)求,然后選擇適當(dāng)?shù)囊晥D組件返回給用戶,如果直接讓JSP相互調(diào)用,控制器就失去了流程控制作用。



    對(duì)于用戶自定義的Action類,既可以負(fù)責(zé)請(qǐng)求轉(zhuǎn)發(fā),還可以充當(dāng)客戶端的業(yè)務(wù)代理,如果僅僅需要Action類提供請(qǐng)求轉(zhuǎn)發(fā)功能,則可以使用org.apache.struts.actions.ForwardAction類。ForwardAction類專門用于轉(zhuǎn)發(fā)請(qǐng)求,不執(zhí)行任何其他業(yè)務(wù)操作。

    ActionServlet把請(qǐng)求轉(zhuǎn)發(fā)給ForwardAction,F(xiàn)orwardAction再把請(qǐng)求轉(zhuǎn)發(fā)給元素中parameter屬性指定的Web組件。總之,在Web組件之間通過ForwardAction類來進(jìn)行請(qǐng)求轉(zhuǎn)發(fā),可以充分利用Struts控制器的預(yù)處理請(qǐng)求功能。此外,也可以通過元素的forward屬性來實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)。



    2 org.apache.struts.actions.IncludeAction類

    在JSP網(wǎng)頁中,盡管可以直接通過指令包含另一個(gè)Web組件,但是Struts框架提倡先把請(qǐng)求轉(zhuǎn)發(fā)給控制器,再由控制器來負(fù)責(zé)包含其他Web組件。IncludeAction類提供了包含其他Web組件的功能。與ForwardAction一樣,Web組件通過IncludeAction類來包含另一個(gè)Web組件,可以充分利用Struts控制器的預(yù)處理功能。

    的paramter屬性指定需要包含的Web組件。此外,也可以通過元素的include屬性來包含Web組件。



    3 org.apache.struts.actions.DispatchAction類

    通常,在一個(gè)Action類中,只能完成一種業(yè)務(wù)操作,如果希望在同一個(gè)Action類中完成一組相關(guān)的業(yè)務(wù)操作,可以使用DispatchAction類。

    創(chuàng)建一個(gè)擴(kuò)展DispatchAction類的子類,不必覆蓋execute()方法,而是創(chuàng)建一些實(shí)現(xiàn)實(shí)際業(yè)務(wù)操作的方法,這些業(yè)務(wù)方法都應(yīng)該和execute()方法具有同樣的方法簽名,即他們的參數(shù)和返回類型都應(yīng)該相同,此外也應(yīng)該聲明拋出Exception。

    在配置DispatchAction類時(shí),需要把parameter屬性設(shè)置為“method”。設(shè)置之后,當(dāng)用戶請(qǐng)求訪問DispatchAction時(shí),應(yīng)該提供method請(qǐng)求參數(shù)。



    4 org.apache.struts.actions.LookupDispatchAction類

    LookupDispatchAction類是DispatchAction的子類,在LookupDispatchAction類中也可以定義多個(gè)業(yè)務(wù)方法。通常LookupDispatchAction主要應(yīng)用于在一個(gè)表單中有多個(gè)提交按鈕,而這些按鈕又有一個(gè)共同的名字的場(chǎng)合,這些按鈕的名字和具體的ActionMapping的parameter屬性值相對(duì)應(yīng)。

    在Struts配置文件中配置LookUpDispatchAction:

    元素中,設(shè)置parameter屬性時(shí),需要使它和標(biāo)簽的property屬性保持一致。



    5 org.apache.struts.actions.SwitchAction類

    SwitchAction類用于子應(yīng)用模塊之間的切換。對(duì)于請(qǐng)求訪問SwitchAction的URL,需要提供兩個(gè)參數(shù):

    ·prefix:指定子應(yīng)用模塊的前綴,以“/”開頭,默認(rèn)子應(yīng)用模塊的前綴為空字符串“”。

    ·page:指定被請(qǐng)求Web組件的URI,只需指定相對(duì)于被切換后的子應(yīng)用模塊的相對(duì)路徑。





    三 利用Token解決重復(fù)提交



    在某些情況下,如果用戶對(duì)同一個(gè)HTML表單多次提交,Web應(yīng)用必需能夠判斷用戶的重復(fù)提交行為,以作出相應(yīng)的處理。

    可以利用同步令牌(Token)機(jī)制來解決Web應(yīng)用中重復(fù)提交的問題,Struts也給出了一個(gè)參考實(shí)現(xiàn)。org.apache.struuts.action.Action類中提供了一系列和Token相關(guān)的方法:

    ·protected boolean isTokenValid(javax.servlet.http.HttpServletRequest request)

    判斷存儲(chǔ)在當(dāng)前用戶會(huì)話中的令牌值和請(qǐng)求參數(shù)中的令牌值是否匹配。如果匹配,就返回true,否則返回false。只要符合一下情況之一,就返回false:

    ·不能存在HttpSession對(duì)象。

    ·在session范圍內(nèi)沒有保存令牌值。

    ·在請(qǐng)求參數(shù)中沒有令牌值

    ·存儲(chǔ)在當(dāng)前用戶session范圍內(nèi)的令牌值和請(qǐng)求參數(shù)中的令牌值不匹配。

    ·protected void resetToken(javax.servlet.http.HttpServletRequest request)

    從當(dāng)前session范圍內(nèi)刪除令牌屬性。

    ·protected void saveToken(javax.servlet.http.HttpServletRequest request)

    創(chuàng)建一個(gè)新的令牌,并把它保存在當(dāng)前session范圍內(nèi)。如果HttpSession對(duì)象不存在,就首先創(chuàng)建一個(gè)HttpSession對(duì)象。



    具體的Token處理邏輯由org.apache.struts.util.TokenProcessor類來完成,它的generateToken(request)方法根據(jù)用戶會(huì)話ID和當(dāng)前系統(tǒng)時(shí)間來生成一個(gè)唯一的令牌。





    四 實(shí)用類



    在創(chuàng)建Web應(yīng)用時(shí),有許多檢索和處理HTTP請(qǐng)求的操作時(shí)重復(fù)的。為了提高應(yīng)用代碼的可重用性,減少冗余,Struts框架提供了一組提供這些通用功能的實(shí)用類,它們可以被所有的Struts應(yīng)用共享。



    1 RequestUtils類

    org.apache.struts.util.RequestUtils為Struts控制框架提供了一些處理請(qǐng)求的通用方法。RequestUtils類中的所有方法都是線程安全的,在這個(gè)類中沒有定義任何實(shí)例變量,所有的方法都被聲明為static類型。因此,不必創(chuàng)建RequestUtils類的實(shí)例,可以直接通過類名來訪問這些方法。

    RequestUtils類的常用方法

    方法
    描述

    absoluteURL(HttpServletRequest request,String utl)
    創(chuàng)建并返回絕對(duì)URL路徑,參數(shù)path指定相對(duì)于上下文(context-relative)的相對(duì)路徑

    createActionForm(HttpServletRequest request, ActionMapping mapping, ModuleConfig moduleConfig, ActionServlet servlet)
    先從request或session范圍內(nèi)查找該ActionForm,如果存在,就直接將它返回,否則先創(chuàng)建它的實(shí)例,把它保存在request或session范圍內(nèi),再把它返回。mapping參數(shù)包含了元素的配置信息,例如它的scope屬性指定ActionForm的范圍

    populate(Object bean, HttpServletRequest request)
    把HTTP請(qǐng)求中的參數(shù)值組裝到指定的JavaBean中,請(qǐng)求的參數(shù)名和JavaBean的屬性名匹配。當(dāng)ActionServlet把用戶輸入的表單數(shù)據(jù)組裝到ActionForm中時(shí),就調(diào)用此方法




    2 TagUtils類

    org.apache.struts.taglib.TagUtil類為JSP標(biāo)簽處理類提供了許多實(shí)例方法,如果要使用TagUtils類,首先應(yīng)調(diào)用TagUtils.getInstance()方法,獲得TagUtils類的實(shí)例,getInstance()方法為靜態(tài)方法。

    TagUtils類的常用方法

    方法
    描述

    getInstance()
    返回一個(gè)TagUtils的實(shí)例。該方法為靜態(tài)的,如果要在程序中獲得TagUtils的實(shí)例,可以調(diào)用TagUtils.getInstance()方法

    getActionMessages(PageContext pageContext, String paramName)
    調(diào)用pageContext.findAttribute(paramName)方法,從page, request, session和application范圍內(nèi)減縮并返回ActionMessages對(duì)象,參數(shù)paramName指定檢索ActionMessages對(duì)象的屬性key

    getModuleConfig(PageContext pageContext)
    返回ModuleConfig對(duì)象,如果不存在,就返回null

    lookup(PageContext pageContext, String name, String scope)
    返回特定范圍內(nèi)的JavaBean。參數(shù)scope指定JavaBean的所在范圍,name參數(shù)指定JavaBean在特定范圍內(nèi)的名字

    message(PageContext pageContext, String bundle, String locale, String key)
    從指定的Resource Bundle中返回一條消息文本,參數(shù)locale指定Locale,參數(shù)key指定消息key

    write(PageContext pageContext, String text)
    向網(wǎng)頁上輸入特定的文本,參數(shù)text用于指定文本內(nèi)容




    3 ModuleUtils類

    org.apache.struts.taglib.ModuleUtils類提供了處理子應(yīng)用模塊的實(shí)用方法,如果要使用ModuleUtils類,首先應(yīng)該調(diào)用ModuleUtils.getInstance()方法,獲得ModuleUtils類的實(shí)例,getInstance()方法為靜態(tài)方法。

    ModuleUtils類的常用方法

    方法
    描述

    getInstance()
    返回一個(gè)ModuleUtils的實(shí)例。該方法為靜態(tài)的,如果要在程序中獲得ModuleUtils的實(shí)例,可以調(diào)用ModuleUtils.getInstance()方法。

    getModuleConfig(javax.servlet.http.HttpervletRequest request)
    從request范圍內(nèi)檢索并返回ModuleConfig對(duì)象

    getModuleConfig(java.lang.String prefix, javax.servlet.ServletContext context)
    從application范圍內(nèi)檢索并返回ModuleConfig對(duì)象,參數(shù)prefix指定子應(yīng)用模塊名的前綴

    getModuleName(javax.servlet.http.HttpServletRequest request, javax.servlet.ServletContext context)
    返回請(qǐng)求訪問的子應(yīng)用模塊的名字

    selectModule(javax.servlet.http.HttpServletRequest request, javax.servlet.ServletContext context)
    選擇請(qǐng)求訪問的子應(yīng)用模塊,把和子應(yīng)用模塊相關(guān)的ModuleConfig和MessageResources對(duì)象存儲(chǔ)到request范圍中




    4 Globals類

    org.apache.struts.Globals類提供一組公共類型的靜態(tài)常量,被用作在特定范圍內(nèi)存放JavaBean的屬性key。

    Globals類中定義的常量

    方法
    描述

    ACTION_SERVLET_KEY
    代表在application范圍內(nèi)存放ActionServlet實(shí)例的屬性key

    DATA_SOURCE_KEY
    代表在application范圍內(nèi)存放默認(rèn)的DataSource實(shí)例的屬性key

    ERROR_KEY
    代表在request范圍內(nèi)存放ActionErrors實(shí)例的屬性key

    LOCALE_KEY
    代表在session范圍內(nèi)存放Locale實(shí)例的屬性key

    MAPPING_KEY
    代表在request范圍內(nèi)存放ActionMapping實(shí)例的屬性key

    MESSAGE_KEY
    代表在request范圍內(nèi)存放ActionMessages實(shí)例的屬性key

    MESSAGES_KEY
    代表在application范圍內(nèi)存放各個(gè)子應(yīng)用模塊的MessageResources實(shí)例的屬性key的前綴

    MODULE_KEY
    代表在application范圍內(nèi)存放各個(gè)子應(yīng)用模塊的ModuleConfig實(shí)例的屬性key的前綴

    REQUEST_PROCESSOR_KEY
    代表在application范圍內(nèi)存放各個(gè)子應(yīng)用模塊的RequestProcessor實(shí)例的屬性key的前綴



    閱讀材料:《精通Struts:基于MVC的Java Web設(shè)計(jì)與開發(fā)》
    相關(guān)文章
    本頁查看次數(shù):