1. 程式人生 > >Struts2知識復習之四

Struts2知識復習之四

sele stack ajax nts protect per cte 表單標簽 tld

Struts2的攔截器

1 需求概述

        在CRM系統中,有用戶登錄功能,如果訪問者知道後臺的訪問頁面路徑,
        可以沒有登錄直接進入CRM系統,所以要對沒有登錄的用戶要進行攔截。

2 攔截器

(1)概述
    * 在AOP(aspect-oriented progaramming)面向切面編程中
      用於在訪問某個方法和字段之前 進行攔截操作。
     * 攔截是AOP的一種實現策略。
     * 在Struts2的WebWork的中文文檔解釋攔截器為 動態攔截Action調用的對象。
(2)攔截器在strust2的作用
    * 執行Action前進行攔截處理操作
    * 執行Action前阻止其執行
    * Action縱向重復代碼橫向抽取
(3)攔截器鏈(Interceptor Chain)
    它在Struts2稱為攔截器棧(Interceptor Stack)。
    攔截器鏈就是將攔截器按一定順序結成一條鏈,攔截器鏈中的攔截器按順序逐個被調用。
(4)攔截器的實現原理
    大部分,攔截器方法都是通過代理方式調用的,Struts2攔截器的實現過程為:
    當請求到達Struts2的ServletDispatcher時,Struts2根據Strut2.xml配置文件中的攔截器配置,
    實例化成一個個攔截器對象,串成一個列表,最後一個個調用列表中的攔截器。
    攔截器是AOP的一種實現,它可插拔。Struts2的攔截器棧將攔截器按順序連成鏈,按順序被調用。
(5)自定義攔截器類
    (攔截器的生命周期:隨項目的啟動而創建,隨項目的關閉而銷毀)
    <1>方式一:實現接口Interceptor,需實現相應的方法
        public class MyInterceptor implements Interceptor{
            //銷毀
            @Override
            public void destroy() {
                System.out.println("myInterceptor銷毀");

            }
            //創建
            @Override
            public void init() {
                System.out.println("myInterceptor初始化");
            }
            //攔截方法
            @Override
            public String intercept(ActionInvocation arg0) throws Exception {
                System.out.println("myInterceptor攔截處理代碼.....");
                return null;
            }
        }
    <2>方式二:通過繼承一個抽象類AbstractInterceptor
             * 其內部源碼幫我們實現了 Intercepter接口,並實現了inint()和destroy()方法
             * 使我們不需要實現這兩個方法就可以使用 intercept()方法
            public class MyInterceptor2 extends AbstractInterceptor{
                @Override
                public String intercept(ActionInvocation arg0) throws Exception {
                    System.out.println("interceptor2攔截處理");
                    return null;
                }
            }
    <3>方式三:繼承  MethoFilterInterceptor類
           主要功能為:定制攔截器的攔截方法 --定制哪些方法需要攔截和不需要攔截
            public class MyInterceptor3 extends MethodFilterInterceptor{
                @Override
                protected String doIntercept(ActionInvocation invocation) throws Exception {
                    //過濾器的前處理代碼
                    System.out.println("MyInterceptor3的前處理代碼");

                    /*放行--如果執行 此  放行方法    則代表要一直把所有的攔截器都遞歸完然後
                     *才返回到 Action中的 result結果,如果不執行此 方法,則直接返回到Action中的result結果(進行結果處理)
                     */
                    invocation.invoke();

                    //過濾器的後處理代碼
                    System.out.println("MyInterceptor3的後處理代碼");
                    return null;
                }
            }
(6)配置過濾器
        <1>精簡版示例
            步驟一:自定義操作
                <interceptors>
                            <!--自定義攔截器  -->
                            <interceptor name="myInterceptor" class=""></interceptor>

                            <!--創建自定義攔截器棧和 將自定義攔截器放進棧中 -->
                            <interceptor-stack name="myInterceptorStack">

                                <interceptor-ref name="myInterceptor">
                                    <param name="includeMethods"></param>
                                    <param name="excludeMethods"></param>
                                </interceptor-ref>

                                <!--引用默認攔截器棧的20個攔截器-->
                                <interceptor-ref name="defaultStack"></interceptor-ref>

                            </interceptor-stack>
                </interceptors>
            步驟二:為struts.xml的<package>指定  自定義攔截器棧  作為默認攔截器棧
                    <default-interceptor-ref name="myStack"></default-interceptor-ref>
            步驟三:為action指定 自定義攔截器棧
                    <action>
                        <interceptor-ref name="myStack"></interceptor-ref>
                    </action>
    <2>詳細版示例
        <!--自定義攔截器的配置-->
        <interceptors>
            <!--1 註冊攔截器-->
            <interceptor name="myinterceptor3" class="cnxxxa.interceptor.MyInterceptor3"></interceptor>
            <!--2 註冊攔截器棧和將自定義攔截器放進該棧中-->
            <interceptor-stack name="myStack">
                <!--自定義攔截器的攔截器棧的引入建議放在默認20攔截器棧的前面
                    因為如果自定義攔截器存在錯誤信息,後面的攔截器會幫忙處理-->
                <interceptor-ref name="myinterceptor3">
                    <!--指定哪些方法不攔截-->
                     <!-- <param name="excludeMethods">add,delete</param> -->
                     <!--指定哪些方法需要攔截,兩者只能取其一進行配置-->
                     <param name="includeMethods">add,delete</param>
                </interceptor-ref>
                <!--引用默認的20個攔截器棧-->
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>

        <!--3 指定包中默認攔截器棧為自定義過的攔截器棧 -->
        <default-interceptor-ref name="myStack"></default-interceptor-ref>

        <!--4 為action單獨指定哪個攔截器(棧),此攔截器只作用於此 action中
                此刻action中擁有21個攔截器。(自定義1個+默認的20個)    -->
        <action name="Demo1Action_*" class="cn.ixxx.interceptor.Demo1Action" method="{1}">
            <interceptor-ref name="myStack"></interceptor-ref>
            <result name="success">/show.jsp</result>
        </action>

Struts2的標簽庫

1 概述

    <1>早期的jsp開發嵌入大量的java腳本,不利於維護和閱讀,struts2標簽庫語言應運而生。
    <2>Strust2標簽庫定義在struts2-core-2.3.24.jar/META-INF/struts-tags.tld的文件中。
    <3>使用struts2標簽庫,需在jsp使用taglib指令導入:
            <%@ taglib uri="/struts-tags" prefix="s" %>

2 Struts2標簽庫分類(普通標簽和UI標簽)

(1)普通標簽又包括 控制標簽(Control Tags)和數據標簽(Data Tags)

<1>控制標簽用來完成條件邏輯,循環邏輯的控制,以及集合的操作。

  • 條件邏輯 <s:if test=""></s:if> <s:elseif test=""></s:elseif> <s:else></s:else>
    示例:
    <s:if test="#list.size()==2">
    list的長度為2
    </s:if>
    <s:elseif test="#list.size()==1">
    list的長度為1
    </s:elseif>
    <s:else>
    lsit的長度不一不二
    </s:else>
  • 循環邏輯 <s:iterator></s:iterator>
    示例一:簡單的集合元素叠代
    示例二:添加 step屬性 後的叠代 aaaa 示例三:添加status屬性的叠代 當前遍歷的元素個數 :
    集合最後一個元素:
    集合第一個元素:
    ============================================
    當前索引值:
    元素索引為奇數:
    元素索引為偶數
    <2>數據標簽(用來輸出後臺數據和完成其他數據訪問。)
  • <s:property >用於輸出指定的值
    該標簽具有的屬性:
    • id (可選) 指定元素的標識
    • default(可選) 輸出值為null時,顯示default的屬性值
    • escape(可選) 指定是否忽略html代碼
    • value(可選) 指定輸出屬性值,若沒有指定,則默認輸出ValueStack棧頂的值
      示例:
      1. value屬性不寫,則默認輸出值棧頂的值:
        <s:iterator value="#list" >
        <s:property />
        </s:iterator>
      2. default屬性,輸入默認值: <s:property value="" default="這裏是flower默認值"/>
      3. 忽略html代碼: <s:property value="‘<h3>www.flower.com</h3>‘" escape="true"/>
      4. 不忽略html代碼: <s:property value="‘<h3>www.flower.com</h3>‘" escape="false"/>
  • <s:a>用於構造html頁面的超鏈接,與html的<a>相似
    具有以下屬性:
    • id 指定其id
    • href 指定超鏈接地址
    • action 指定跳轉Action名
    • namespace 指定跳轉Action的命名空間
    • method 指定跳轉Action中的哪個方法
      示例:
      <s:a href="xxx.com">xxx.com</s:a>
      <s:a action="flowerAction" namespace="/" method="list"></s:a>
  • <s:debug>用於調試,主要輸入ValueStack和StackContext中的信息。
  • <s:include>
  • <s:param>

    (2)UI標簽又包括 表單標簽(Form Tags),非表單標簽(None-Form Tags),Ajax標簽
    <1>表單標簽用來生成html的表單元素

    • struts2表單標簽好處
      好處1:內置了一套樣式
      好處2:它會根據棧中的值,自動回顯標簽的值,不需要像之前那樣 value="${user.name}
    • theme屬性:指定表單的主題
      xhtml:默認
      simple:沒有主題
    • 示例:
      <s:form action="DemoTag2Action" namespace="/" theme="xhtml">
      <s:textfield name="name" label="用戶名"></s:textfield>
      <s:password name="password" label="密碼"></s:password>
      <s:radio list="{‘男‘,‘女‘}" name="gender" label="性別"></s:radio>
      <s:radio list="#{1:‘男‘,0:‘女‘}" name="gendar" label="性別"></s:radio>
      <s:radio list="#{0:‘打籃球‘,1:‘遊泳‘,2:‘踢足球‘}" name="habits" label="愛好"></s:radio>
      <s:select list="#{0:‘大專‘,1:‘本科‘,2:‘碩士‘}" headerKey="" headerValue="--請選擇--" name="edu" label="學歷"></s:select>
      <s:file name="photo" label="近照"></s:file>
      <s:textarea name="desc" label="個人簡歷"></s:textarea>
      <s:submit value="提交"></s:submit>
      </s:form> <2>非表單標簽用來生成html的標簽以及輸出Action中封裝的信息。 <3>Ajax標簽提供ajax技術支持。

struts2知識點補漏

在struts.xml文件中配置 全局異常結果集處理

示例:
        <global-exception-mappings>
                <!--result="error"  關聯 action中error的結果處理
                       exception=""  關聯相應的異常類
                -->
                <exception-mapping result="error" exception="java.lang.RuntimeException"></exception-mapping>
        </global-exception-mappings>

        <action name="" class=""  method="">
            <result name="error" >xxx.jsp</result>
        </action>

        //jsp頁面回顯  錯誤提示信息
        <s:property value="exception.message"/>

Struts2知識復習之四