熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

用ActionMapping構建漂亮的Struts應用程序

2013-11-23 20:03:55  來源: Java開源技術 

  邱吉爾曾經說過他喜歡學習新東西但他覺得沒有必要讓別人教他不管你是否喜歡學習新知識也不管有人教你還是你自學學習Java通常意味著仔細研究許多特殊的類學習Struts也是如此
  
  這就是我寫本系列第四部分的初衷在本文中我將詳述orgapachestrutsactionActionMapping類它是從onfigActionConfig派生的ActionMapping將一個請求路徑映射到一個action類它是Struts應用程序中最常用的類之一在你深入學習這個類時你會重新用到在該系列第部分創建的兩個login應用程序從而了解如何運用ActionMapping來重寫應用程序
  
  當然你可能不記得以前用過任何ActionMapping實例了這是因為控制器servlet實際上為你創建了它們你只需要配置在Struts配置文件(strutsconfigxml)中創建的每個ActionMapping實例就行了(通過給它的屬性賦值)了解這些屬性對正確運用ActionMapping類很重要因此我將講述這些屬性以及如何定義它們
  
  首先讓我們回想一下Struts配置文件的根元素是<strutsconfig><strutsconfig>元素可以包含一個可選的<actionmappings>元素 同樣<actionmappings>元素可以包含<action>元素例如下面就是本系列第三部分的login應用程序配置文件中的<strutsconfig>元素及其子元素<strutsconfig>
   <actionmappings>
    <action path=/login
      type=comjavaprostrutsLoginAction/>
    <action path=/logout
      type=comjavaprostrutsLogoutAction/>
    <action path=/viewSecret
      type=comjavaprostrutsViewSecretAction/>
   </actionmappings>
  </strutsconfig>
  
  <actionmapping>中的每個<action>都代表控制器servlet創建的一個ActionMapping實例一個<action>元素可以包含多個特性每個特性都和ActionMapping實例中的一個屬性相應
  
  作為例子我們來看前面的Struts配置文件中的這個<action>元素<action path=/login
     type=comjavaprostrutsLoginAction/>
  
  這個<action>將路徑/login映射到action類comjavaprostrutsLoginAction換句話說一個以/logindo結尾的用戶請求將被傳遞到LoginAction類然而ActionMapping也有其它的用途你(Struts程序員)可以通過給它的屬性賦值來給ActionMapping實例下達action指令(有些屬性與action forms相關我將在本系列的第五部分講述
  
  ActionMapping類的屬性
  ActionMapping有許多屬性首先它從ActionConfig類繼承了一些屬性——如typeforwardinclude和unknown它們與action forms是無關的前三個屬性是ActionMapping類最重要的屬性你只能指定其中的一個所以如果一個<action>元素已經定義了一個type屬性它就不能有forward屬性或include屬性了
  
  type屬性的值是路徑所映射的Action類的完全限定的Java類的名稱(你曾在前面的login應用程序中的Struts配置文件中用過這個屬性)如果運用了type屬性那麼控制器servlet就可以調用action實現類的execute方法傳遞恰當的ActionMapping實例注意orgapachestrutsactionActionclass類的execute方法有如下的定義(第一個參數是一個ActionMapping實例)public ActionForward execute(ActionMapping mapping
   ActionForm form HttpServletRequest request
   HttpServletResponse response)
   throws IOException ServletException
  
  forward屬性代表的是滿足該請求的contextrelative資源(通過調用RequestDispatcherforward())而不是實例化type屬性指定的Action類(更多關於如何運用這個屬性的信息參見後面的修改login應用程序部分
  
  我們給include屬性賦的值是滿足該請求的contextrelative資源路徑(通過調用RequestDispatcherinclude())而不是實例化type屬性指定的Action類
  
  注意<action>元素包含的forward屬性與可能出現在<action>元素下的<forward>元素是不同的這就是說一個<action>元素可以有一個type屬性以及一個或多個<forward>子元素如下面這個<action>元素所示(我馬上會講述<forward>元素)  <action path=/login
  type=comjavaprostrutsLoginAction>
     <forward name=success
  path=/mainMenujsp/>
     <forward name=failure
  path=/loginjsp/>
    </action>
  
  我們用<path>屬性來指定這個ActionMapping將處理的請求路徑最後用unknown屬性來處理未知的路徑在一個action元素中將這個屬性設置為true使這個action成為該應用程序缺省的action換句話說它處理所有其它的action不能處理的請求在一個單獨的應用程序中只有一個action可以被定義成是缺省的
  
  例如下面這個<action>元素將unknown屬性設置為true使該action成為缺省的<action path=/login
  type=comjavaprostrutsLoginAction
  unknown=true/>
  
  <forward>元素
  <forward>元素描述了一個邏輯名稱與一個contextrelative URI路徑識別的資源之間的映射它有以下這些屬性 · className 這是你想運用的ActionForward實現類的完全限定的Java類的名稱缺省情況下它的值是作為forward初始化參數給Struts控制器servlet配置的
   · contextRelative 在一個模塊化應用程序中如果路徑屬性是以一個斜線(/)開頭的並且是相對於整個Web應用程序的而不是相對於該模塊的我們就將這個屬性設置為true缺省情況下是false
   · name 這是forward的唯一標識符用來在應用程序的action類中引用它
   · path 被映射資源的contextrelative路徑
   · redirect 設置成true運用sendRedirect()引導到該資源或者設置成false運用RequestDispatcherforward()作為替代
  
  運用<action>下的<forward>元素意味著你不必在你的ActionForward對象中寫死路徑名例如我們來看前面的login應用程序中LoginAction類的execute方法中的代碼public ActionForward execute(ActionMapping mapping
   ActionForm form HttpServletRequest request
   HttpServletResponse response)
   throws IOException ServletException {
  
   String userName =
  requestgetParameter(userName);
   String password =
  requestgetParameter(password);
   if (userName!=null && password!=null &&
    userNameequals(john) &&
  passwordequals()) {
    HttpSession session = requestgetSession();
    sessionsetAttribute(loggedIn ); 
    return (new ActionForward(/mainMenujsp));
   }
   else { 
   return (new ActionForward(/loginjsp));
    }
  }
  
  注意最後的兩個return語句寫死了mainMenujsp和loginjsp頁面如果任意一個文件名發生改變你都必須重新編譯LoginAction類但是如果你用<forward>元素你可以用一個名稱映射mainMenujsp頁面用另一個名稱映射loginjsp頁面現在如果你需要改變文件名你就可以在配置文件中進行改變而不需要重新編譯了要這麼做你需要在strutsconfigxml文件中聲明這個<action>元素 <action path=/login
       type=comjavaprostrutsLoginAction>
     <forward name=success path=/mainMenujsp/>
     <forward name=failure path=/loginjsp/>
    </action>
  
  現在mainMenujsp就與success這個名稱聯系在一起了loginjsp與failure聯系在一起了你可以通過調用ActionMapping類的findForward方法傳入相關的名稱從一個action實現類的內部得到ActionForward實例mappingfindForward(name);
  
  例如要得到包含路徑/mainMenujsp的ActionForward對象我們可以用下面的方法mappingfindForward(success);
  
  同樣要得到包含路徑/loginjsp的ActionForward對象可以用writemappingfindForward(failure);
  
  接下來我們該用<forward>方法重寫login應用程序了
  
  修改Login應用程序
  注意你在第三部分創建的login應用程序發生了怎樣的變化首先我們來看原應用程序中ViewSecretAction類的execute方法 public ActionForward execute(ActionMapping mapping
    ActionForm form HttpServletRequest request
    HttpServletResponse response)
    throws IOException ServletException {
  
    return (new ActionForward(/viewSecretjsp));
  
   }
  
  除了返回一個路徑是/viewSecretjsp的ActionForward對象外該execute方法沒有做任何的處理通過運用strutsconfigxml文件中<action>元素的forward屬性我們就不需要ViewSecretAction類了要實現這一點我們可以將下面的<action>代碼<action path=/viewSecret
  type=comjavaprostr
From:http://tw.wingwit.com/Article/program/Java/ky/201311/27894.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.