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>
示例一:簡單的集合元素迭代
aaaa 示例三:添加status屬性的迭代當前遍歷的元素個數 : <2>數據標籤(用來輸出後臺數據和完成其他數據訪問。)
集合最後一個元素:
集合第一個元素: ============================================
當前索引值:
元素索引爲奇數:
元素索引爲偶數
- <s:property >用於輸出指定的值
該標籤具有的屬性:- id (可選) 指定元素的標識
- default(可選) 輸出值爲null時,顯示default的屬性值
- escape(可選) 指定是否忽略html代碼
- value(可選) 指定輸出屬性值,若沒有指定,則默認輸出ValueStack棧頂的值
示例:- value屬性不寫,則默認輸出值棧頂的值:
<s:iterator value="#list" >
<s:property />
</s:iterator> - default屬性,輸入默認值: <s:property value="" default="這裏是flower默認值"/>
- 忽略html代碼: <s:property value="'<h3>www.flower.com</h3>'" escape="true"/>
- 不忽略html代碼: <s:property value="'<h3>www.flower.com</h3>'" escape="false"/>
- value屬性不寫,則默認輸出值棧頂的值:
- <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表單標籤好處