結(jié)構(gòu)圖
1. Struts2的攔截器
1.1 攔截器概述
- 攔截器虑粥,在AOP中用于在某個(gè)方法或某個(gè)字段被訪問(wèn)之前,進(jìn)行攔截然后再之前或之后加入某些操作宪哩。攔截是AOP的一種實(shí)現(xiàn)策略娩贷。
- 攔截器是動(dòng)態(tài)攔截Action調(diào)用對(duì)象。它提供了一種機(jī)制可以使開(kāi)發(fā)者定義一個(gè)action執(zhí)行的前后的代碼锁孟,也可以在一個(gè)action執(zhí)行前阻止其執(zhí)行彬祖。同時(shí)也是提供了一種可以提取action中可重用的部分的方式茁瘦。
- 攔截器和過(guò)濾器的區(qū)別
- 攔截器:
Interceptor
,攔截客戶(hù)端對(duì)Action的訪問(wèn)储笑。是一種更加細(xì)粒度化的攔截甜熔,可以攔截Action中具體的方法。 - 過(guò)濾器:
Filter
突倍,用于過(guò)濾客戶(hù)端向服務(wù)器端發(fā)送的請(qǐng)求腔稀。
- 攔截器:
- Struts2框架核心的功能都是依賴(lài)攔截器實(shí)現(xiàn)的。
1.2 攔截器的實(shí)現(xiàn)原理
- 不部分的時(shí)候羽历,攔截器方法都是通過(guò)代理的方式來(lái)調(diào)用的焊虏。Struts2的攔截器實(shí)現(xiàn)相對(duì)簡(jiǎn)單。當(dāng)請(qǐng)求到達(dá)Struts2的ServletDispathce時(shí)秕磷,Struts2會(huì)查找配置文件诵闭,并根據(jù)其配置實(shí)例化相對(duì)的攔截器對(duì)象,然后串成一個(gè)列表澎嚣,最后一個(gè)一個(gè)地調(diào)用列表中地?cái)r截器疏尿。
- Struts2攔截器時(shí)可插拔地,攔截器時(shí)AOP地以一種實(shí)現(xiàn)易桃。Struts2攔截器棧就是將攔截器按一定地順序聯(lián)結(jié)成一條鏈褥琐。在訪問(wèn)被攔截地方法或字段時(shí),Struts2攔截器鏈中的攔截器就會(huì)按其之前定義的順序被調(diào)用颈抚。
1.3 Struts的執(zhí)行流程
- 客戶(hù)端向服務(wù)器發(fā)送一個(gè)
Action
的請(qǐng)求踩衩,執(zhí)行核心過(guò)濾器(doFilter
)方法。在這個(gè)方法中贩汉,調(diào)用executeAction()
方法驱富,在這個(gè)方法內(nèi)部調(diào)用dispatcher.serviceAction();
在這個(gè)方法內(nèi)部創(chuàng)建一個(gè)Action
代理,最終執(zhí)行的是Action
代理中的execute()
,在代理中執(zhí)行的execute
方法中調(diào)用ActionInvocation
的invoke
方法匹舞。在這個(gè)方法內(nèi)部遞歸執(zhí)行一組攔截器(完成部分功能)褐鸥,如果沒(méi)有下一個(gè)攔截器,就會(huì)執(zhí)行目標(biāo)Action
赐稽,根據(jù)Action
的返回的結(jié)果進(jìn)行頁(yè)面跳轉(zhuǎn)叫榕。
Struts2的執(zhí)行流程
1.4 攔截器入門(mén)
1.4.1 環(huán)境搭建
新建工程,導(dǎo)入需要的
jar
包姊舵。在
web.xml
中配置配置核心過(guò)濾器晰绎。-
新建
Action
類(lèi)com.itzhouq.web.action.ActionDemo1
package com.itzhouq.web.action; import com.opensymphony.xwork2.ActionSupport; public class ActionDemo1 extends ActionSupport { @Override public String execute() throws Exception { System.out.println("ActionDemo1執(zhí)行了......"); return super.execute(); } }
-
在主配置文件
struts.xml
中配置Action
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 開(kāi)啟靜態(tài)方法 --> <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> <package name="demo1" extends="struts-default" namespace="/"> <action name="actionDemo1" class="com.itzhouq.web.action.ActionDemo1"> <result>/demo1/test.jsp</result> </action> </package> </struts>
-
編寫(xiě)跳轉(zhuǎn)頁(yè)面
../WebContent/demo1/test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>test.jsp</h1> <% System.out.println("test.jsp執(zhí)行了......."); %> </body> </html>
-
測(cè)試
- 在瀏覽器訪問(wèn)工程下的
../actionDemo1.action
- 頁(yè)面打印了
test.jsp
- 后臺(tái)控制臺(tái)打印了
ActionDemo1執(zhí)行了......
和test.jsp執(zhí)行了.......
- 環(huán)境搭建成功。
- 在瀏覽器訪問(wèn)工程下的
1.4.2 編寫(xiě)攔截器
-
在
com.itzhouq.web.interceptor
下編寫(xiě)兩個(gè)攔截器package com.itzhouq.web.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; /** * 自定義攔截器一: * @author itzhouq * */ public class InterceptorDemo1 extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { System.out.println("InterceptorDemo1執(zhí)行了......"); String str = invocation.invoke(); System.out.println("InterceptorDemo1執(zhí)行結(jié)束了......"); return str; } }
1.4.3 配置攔截器
方式一:定義攔截器進(jìn)行配置
注意:一旦引入自定義攔截器括丁,默認(rèn)攔截器棧的攔截器就不執(zhí)行了荞下。所以,需要手動(dòng)引入默認(rèn)攔截器。
-
在主配置文件做如下配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 開(kāi)啟靜態(tài)方法 --> <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> <package name="demo1" extends="struts-default" namespace="/"> <!-- 定義攔截器 --> <interceptors> <interceptor name="interceptorDemo1" class="com.itzhouq.web.interceptor.InterceptorDemo1"/> <interceptor name="interceptorDemo2" class="com.itzhouq.web.interceptor.InterceptorDemo2"/> </interceptors> <action name="actionDemo1" class="com.itzhouq.web.action.ActionDemo1"> <result>/demo1/test.jsp</result> <!-- 引入攔截器(一旦引入自定義攔截器尖昏,默認(rèn)攔截器棧的攔截器就不執(zhí)行了) --> <interceptor-ref name="defaultStack"/> <interceptor-ref name="interceptorDemo1"/> <interceptor-ref name="interceptorDemo2"/> </action> </package> </struts>
-
方式二:定義攔截器棧的方式
<struts> <!-- 開(kāi)啟靜態(tài)方法 --> <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> <package name="demo1" extends="struts-default" namespace="/"> <!-- 定義攔截器 --> <interceptors> <interceptor name="interceptorDemo1" class="com.itzhouq.web.interceptor.InterceptorDemo1"/> <interceptor name="interceptorDemo2" class="com.itzhouq.web.interceptor.InterceptorDemo2"/> <!-- 定義攔截器棧 --> <interceptor-stack name="myStack"> <interceptor-ref name="defaultStack"/> <interceptor-ref name="interceptorDemo1"/> <interceptor-ref name="interceptorDemo2"/> </interceptor-stack> </interceptors> <action name="actionDemo1" class="com.itzhouq.web.action.ActionDemo1"> <result>/demo1/test.jsp</result> <!-- 引入攔截器(一旦引入自定義攔截器仰税,默認(rèn)攔截器棧的攔截器就不執(zhí)行了) --> <interceptor-ref name="myStack"/> </action> </package> </struts>
-
測(cè)試:
- 在瀏覽器訪問(wèn)工程下的
../actionDemo1.action
. - 頁(yè)面打印了
test.jsp
. - 后臺(tái)信息如下:
自定義攔截器 - 在瀏覽器訪問(wèn)工程下的
2. Struts2的標(biāo)簽庫(kù)
2.1 通用標(biāo)簽庫(kù)
通用標(biāo)簽庫(kù)
判斷標(biāo)簽:
<s:if>
、<s:elseif>
抽诉、<s:else>
迭代標(biāo)簽:
<s:iterator>
-
其他標(biāo)簽:
<s:property/>
<s:debug>
-
<s:date>
----在頁(yè)面上進(jìn)行日期格式化
-
舉例:編寫(xiě)
../WebContent/demo2/test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <s:set var="i" value="5" scope="request"/> <s:if test="#request.i > 3"> i 大于 3 </s:if> <s:elseif test="#request.i < 3"> i 小于 3 </s:elseif> <s:else> i 等于 3 </s:else> <s:iterator var="i" value="{'aa','bb','cc'}"> <s:property value="#i"/> </s:iterator> <hr> <s:iterator var="entry" value="#{'aaa':'111', 'bbb':'222','ccc':'333' }"> <s:property value="#entry.key"/>--<s:property value="#entry.value"/><br> </s:iterator> <hr> <s:iterator var="i" begin="100" end="150" step="5" status="status"> <s:if test="#status.count % 3 == 0"> <font color="red"><s:property value="#i"/></font> </s:if> <s:else> <s:property value="#i"/> </s:else> </s:iterator> </body> </html>
-
測(cè)試:訪問(wèn)工程下
../demo2/test.jsp
頁(yè)面效果
2.2 UI標(biāo)簽庫(kù):方便數(shù)據(jù)回顯
UI標(biāo)簽庫(kù)