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

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

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

    隨筆-126  評論-247  文章-5  trackbacks-0

    package 節點

    <package name="user" namespace="/user" extends="struts-default" abstract="false">
      
    </package>
    屬性名稱 是否必須 屬性描述
    name 指定 package 的名字,這個名字在工程內必須是唯一的
    extends 指明要擴展的包的名字。如 extends="struts-default"
    abstract 指明 package 是否是抽象的。默認是 false。
    抽象的 package 不能擁有任何的 action,只能作為父包被繼承
    namespace 命名空間。默認值是 ""。
    若指定了該屬性的值,那么,訪問該 package 下的所有 Action 都需要帶上這個命名空間

    action 節點

    <action name="domain" class="fan.tutorial.action.DomainAction" method="launch">
      <result>/domain.jsp</result>
    </action>
    屬性名稱 是否必須 屬性描述
    name 指定 Action 的名字
    class 指定 Action 的完整類路徑。
    默認是 class = "com.opensymphony.xwork2.ActionSupport"
    method 指定 Action 執行時調用的方法。默認是 method = "execute"

    result 節點

    <result name="success" type="dispatcher">/success.jsp</result>
    屬性名稱 是否必須 屬性描述
    name 指定視圖結果的名稱,用于根據不同的邏輯名稱匹配不同的視圖結果頁面。
    默認值 name = "success"
    type 指定視圖結果類型,用于根據不同的類型 ( 例如轉發或重定向等 ) 跳轉到指定的視圖頁面
    默認值 type = "dispatcher"

    result 節點的結果類型

    結果類型名稱 結果類型描述
    chain 用于將多個 Action 鏈接起來執行,來共同完成一次請求 ( 數據可以在多個 Action 中共享 )
    dispatcher 轉發。這是默認的結果類型。
    本質是通過 Servlet API 的 RequestDispatcher.forward() 來完成
    redirect 重定向。
    本質是通過 Servlet API 的 HttpServletResponse.sendRedirect() 來完成。
    重定向是服務器向客戶端瀏覽器發回302狀態碼以及重定向地址 Location,瀏覽器接收后將重新發起一次新的 HTTP 請求。前一次 HTTP 請求所包含的數據是不能被后一次 HTTP 請求所共享的。
    redirectAction 與 redirect 結果類型相似,只是它專門用來映射到另外的一個 Action 動作
    stream 向客戶端瀏覽器發送 InputStream 流對象,通常可以用來作為文件下載的一種手段

    配置全局結果

    <package name="basic" extends="struts-default">
      <global-results>
        <result name="error">/pages/global/error.jsp</result>
        <result name="success">/pages/global/success.jsp</result>
      </global-results>
    </package>
    全局結果是在 package 中定義的,全局結果定義完成后,該 package 下的所有 action 都能來使用它們。
    其余 package 如果也想來使用這些結果,那么需要通過 extends 來繼承該 package 才能使用。

    配置默認 action

    <package name="default" extends="struts-default">
      <default-action-ref name="invalidAction" />
      <action name="invalidAction">
        <result type="redirect">/index.jsp</result>
      </action>
    </package>
    在沒有配置默認 action 之前,若訪問一個不存在的 action,那么服務器端將報出錯誤,客戶端瀏覽器得到的是 HTTP ERROR: 404 的錯誤提示頁面。
    在配置好默認的 action 之后,若訪問一個不存在的 action,那么這個默認的 action 將被執行并將執行完成的結果視圖發回給客戶端。
    另外,<default-action-ref> 節點需要在 <action> 節點之前聲明,否則在啟動時將報出錯誤。

    package 的運用

    <struts>
      
      <package name="first" namespace="/first" extends="struts-default">
        <action name="access">
          <result>/pages/package/first.jsp</result>
        </action>
      </package>
      
      <package name="second" extends="struts-default">
        <action name="access">
          <result>/pages/package/second.jsp</result>
        </action>
      </package>
      
      <package name="third" extends="struts-default" abstract="true">
        <global-results>
          <result>/pages/package/third.jsp</result>
        </global-results>
      </package>

      <package name="fourth" namespace="/fourth" extends="third">
        <action name="access" />
      </package>
      
    </struts>
    這里總共配置了4個 package,其中一個是抽象的,其余3個 package 中分別定義了一個 action,action 節點的 class 和 method 屬性不指定 ( 使用默認 ),并且 action 的 name 屬性都指定為 access ( 極端示例,切勿效仿 ☺ )。
    訪問 first package 下的 action 的方式為:/first/access.action
    訪問 second package 下的 action 的方式為:/access.action 或 /xxx/access.action 或 /xxx/yyy/access.action ( xxx、yyy 代表任意串 )
    訪問 fourth package 下的 action 的方式為:/fourth/access.action
    不知道你注意了沒有,這里的 second package 的命名空間是沒有指定的,也就是說它能捕獲所有的命名空間串。那好,現在問題來了,當訪問 /first/access.action 的時候,得到的視圖為什么是 first.jsp 而不是 second.jsp 呢?這是不是跟 package 節點在配置文件中出現的先后順序有關系呢?( 有過 WEB 開發的都知道,配置文件中節點的先后順序有時候是很重要的 )。這個很明顯,當訪問 /fourth/access.action 的時候,得到的是 third.jsp 而不是 second.jsp。事實上,Struts2 是首先根據 URL 中的命名空間去相對應的 package 下查找 action,如果查找不到,才到默認的命名空間的 package 中去查找 action,如果有多個 package 都使用了默認的命名空間,這個時候才是根據 package 出現的先后順序來查找 action 的。

    action 的運用

    package fan.tutorial.action;

    import com.opensymphony.xwork2.Action;

    public class ExampleAction implements Action {

        public String execute() {
            System.out.println("--- ExampleAction[execute] ---");
            return SUCCESS;
        }

        public String launch() {
            System.out.println("--- ExampleAction[launch] ---");
            return "launch";
        }

        public String load() {
            System.out.println("--- ExampleAction[load] ---");
            return "load";
        }

    }
    <struts>
      
      <package name="simple" namespace="/simple" extends="struts-default">
        <action name="example" class="fan.tutorial.action.ExampleAction">
          <result name="load">/pages/example/load.jsp</result>
          <result name="launch">/pages/example/launch.jsp</result>
          <result name="success">/pages/example/success.jsp</result>
        </action>
        <action name="example2" class="fan.tutorial.action.ExampleAction" method="load">
          <result name="load">/pages/example/load.jsp</result>
          <result name="launch">/pages/example/launch.jsp</result>
          <result name="success">/pages/example/success.jsp</result>
        </action>
      </package>
      
    </struts>
    這里配置了2個 action,不同的是,第2個 action 使用了 method 屬性,那么當訪問 /simple/example2.action 的時候,由 method 指定的方法將被執行。
    而第1個 action 沒有指定 method 屬性,那么當訪問 /simple/example.action 的時候,默認執行的是 execute 方法。

    action 動態方法的調用

    Struts2 Action 動態方法調用非常簡單,就是在 action 名稱后面使用 "!" 來鏈接需要執行的方法的名稱就可以了。以上面的配置為例,如想調用 ExampleAction 的 launch 方法,只需要訪問 /simple/example!launch.action 就可以了。

    使用通配符映射 action

    <struts>
      
      <package name="wildcard" namespace="/wildcard" extends="struts-default">
        <action name="*_*" class="fan.tutorial.action.{1}Action" method="{2}">
          <result name="{2}">/pages/example/{2}.jsp</result>
        </action>
      </package>
      
    </struts>
    通配符 "*" 匹配的值用符號 {n} 來訪問得到。第1個 "*" 用 {1} 來訪問,其余的以此類推。
    使用通配符后,如果想執行 ExampleAction 的 launch 方法,訪問 /wildcat/Example_launch.action 即可。
    需要注意的是,這里的 Example 必須是要大寫字母開頭的,因為它是用來定位我們的 Action 類路徑的,它必須與你的類名稱保持高度一致。

    dispatcher 結果類型的運用

    package fan.tutorial.action;

    import com.opensymphony.xwork2.Action;

    public class LoginAction implements Action {

        private String username;
        private String password;
        
        public String execute() {
            System.out.println("**************************");
            System.out.println("LoginAction: ");
            System.out.println("username = " + username + ", password = " + password);
            System.out.println("**************************");
            return SUCCESS;
        }

        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public String getPassword() {
            return password;
        }

        public void setPassword(String password) {
            this.password = password;
        }

    }
    package fan.tutorial.action;

    import com.opensymphony.xwork2.Action;

    public class ManagerAction implements Action {

        private String username;
        private String password;
        
        public String execute() {
            System.out.println("**************************");
            System.out.println("ManagerAction: ");
            System.out.println("username = " + username + ", password = " + password);
            System.out.println("**************************");
            return SUCCESS;
        }

        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public String getPassword() {
            return password;
        }

        public void setPassword(String password) {
            this.password = password;
        }

    }
    <struts>
      
      <package name="result" namespace="/result" extends="struts-default">
        <action name="login" class="fan.tutorial.action.LoginAction">
          <result type="dispatcher">/pages/result/login.jsp</result>
        </action>
        <action name="manager" class="fan.tutorial.action.ManagerAction">
          <result type="dispatcher">/pages/result/manager.jsp</result>
        </action>
      </package>
      
    </struts>
    <html>
      <h1>${username}, ${password}</h1>
    </html>
    dispatcher 是默認的結果類型,也是最常用的結果類型。
    當訪問 /result/login.action?username=u&password=p 的時候,在 login.jsp 中輸出相應的信息,這個比較簡單,就不多說了。

    chain 結果類型的運用

    <struts>
      
      <package name="result" namespace="/result" extends="struts-default">
        <action name="login" class="fan.tutorial.action.LoginAction">
          <result type="chain">manager</result>
        </action>
        <action name="manager" class="fan.tutorial.action.ManagerAction">
          <result type="dispatcher">/pages/result/manager.jsp</result>
        </action>
      </package>
      
    </struts>
    訪問 /result/login.action?username=u&password=p,在控制臺可以看到,LoginAction 和 ManagerAction 的 execute 方法依次被執行并打印出相應的信息,請求中攜帶的數據在兩個 Action 中被共享,最終在 manager.jsp 中顯示相應的信息。
    需要注意的是,在 chain 中不能為 action 指定擴展名,如 manager.action 等是不正確的。

    redirect 結果類型的運用

    <struts>
      
      <package name="result" namespace="/result" extends="struts-default">
        <action name="login" class="fan.tutorial.action.LoginAction">
          <result type="redirect">/pages/result/login.jsp</result>
        </action>
        <action name="manager" class="fan.tutorial.action.ManagerAction">
          <result type="redirect">
            /pages/result/manager.jsp?username=${username}&amp;password=${password}
          </result>
        </action>
      </package>
      
    </struts>
    當訪問 /result/login.action?username=u&password=p 的時候,控制臺打印出了接收到的參數的信息,但是 login.jsp 頁面中不會顯示參數信息,這是由于重定向引起的,上面已經有提及到,這里就不再贅述。
    若想使用 redirect 又不想丟失一些你感興趣的數據,那么,可以采用像第2個 action 的配置方式,在重定向的時候,重新把一些必要的信息傳回去就可以了。
    需要注意的是,若有多個參數,不能像平常那樣使用 "&" 來連接,而是需要使用它的實體名稱 ( &amp; ) 來連接。否則,工程在啟動的時候是會報出錯誤的。

    redirectAction 結果類型的運用

    <struts>
      
      <package name="result" namespace="/result" extends="struts-default">
        <action name="login" class="fan.tutorial.action.LoginAction">
          <result type="redirectAction">manager</result>
        </action>
        <action name="login_alias" class="fan.tutorial.action.LoginAction">
          <result type="redirectAction">
            manager?username=${username}&amp;password=${password}
          </result>
        </action>
        <action name="manager" class="fan.tutorial.action.ManagerAction">
          <result type="dispatcher">/pages/result/manager.jsp</result>
        </action>
      </package>
      
    </struts>
    當訪問 /result/login.action?username=u&password=p 的時候,在控制臺,LoginAction 的 execute 方法執行并將接收得到的參數信息打印了出來,
    而 ManagerAction 的 execute 方法執行打印出來的參數信息是 null,說明執行到 ManagerAction 的時候,之前的 HTTP 請求參數已經丟失了,同樣的,這是由于重定向造成的。
    如果不想丟失數據,可以參考 login_alias 的配置方式。需要注意的問題和上面 redirect 提到的是一樣的。實際上,這里的 redirectAction 也可以換成 redirect 的,它們達到的效果是一樣的。

    stream 結果類型的運用

    考慮到文章篇幅過長,這個將留到下一篇文章中來專門介紹。這里暫且略過。

    配置動態結果

    package fan.tutorial.action;

    import java.util.Random;
    import com.opensymphony.xwork2.Action;

    public class DynamicResultAction implements Action {

        private String resultView;
        
        public String execute() {
            if(new Random().nextInt(100) % 2 == 0){
                resultView = "even";
            }else{
                resultView = "odd";
            }
            return SUCCESS;
        }

        public String getResultView() {
            return resultView;
        }

    }
    <struts>
      
      <package name="result" namespace="/result" extends="struts-default">
        <action name="dynamic" class="fan.tutorial.action.DynamicResultAction">
          <result>/pages/result/${resultView}.jsp</result>
        </action>
      </package>
      
    </struts>
    這里使用了 ${resultView} 表達式,這要求 Action 類中必須有一個 public String getResultView() 方法。

    文章示例源碼下載

    struts-xml.zip


      
    posted on 2014-03-12 19:58 fancydeepin 閱讀(1968) 評論(2)  編輯  收藏

    評論:
    # re: Struts2 配置文件 struts.xml 2014-03-13 09:57 | 魏五鎖業
    支持博主分享  回復  更多評論
      
    # re: Struts2 配置文件 struts.xml 2014-03-13 11:00 | 萬利鎖業
    支持博主更新   回復  更多評論
      

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


    網站導航:
     
    主站蜘蛛池模板: 国产亚洲成av片在线观看| 免费在线观看毛片| 亚洲成人中文字幕| 国产精品免费福利久久| 亚洲人成精品久久久久| 野花香高清在线观看视频播放免费 | 免费观看国产精品| 性色av极品无码专区亚洲| 白白国产永久免费视频| 亚洲av成人无码网站…| 午夜国产大片免费观看| 深夜免费在线视频| 亚洲人成色77777在线观看大| 一区二区三区在线免费观看视频 | 亚洲精品无码你懂的网站| 免费看美女午夜大片| 精品国产亚洲一区二区在线观看| a级毛片免费高清视频| 亚洲热线99精品视频| 免费国产黄网站在线观看可以下载 | 亚洲精品在线网站| 99精品在线免费观看| 97亚洲熟妇自偷自拍另类图片| 57pao一国产成永久免费| 亚洲一级片在线播放| 日韩免费视频在线观看| 精品一区二区三区无码免费直播 | 亚洲国产综合专区在线电影| 2015日韩永久免费视频播放 | 亚洲精品视频在线观看视频| 在线观看无码AV网站永久免费| 亚洲人成色77777在线观看| 亚洲精品无码AV中文字幕电影网站| 中文字幕乱理片免费完整的| 91嫩草私人成人亚洲影院| 毛片大全免费观看| 岛国岛国免费V片在线观看| 亚洲美免无码中文字幕在线| 浮力影院第一页小视频国产在线观看免费 | 国产高清对白在线观看免费91| 亚洲另类激情综合偷自拍|