客戶端請求Action,執行前端控制器,在前端控制器內部建立了Action的代理類,調用代理類的execute方法,在execute方法內部執行ActionInvocation的invoke方法。css
在invoke方法內部遞歸調用攔截器的攔截的方法。若是沒有下一個攔截器執行目標Action,Action執行結束後根據Result進行頁面跳轉,最後由response對象生成響應。html
前端
web
public class Interceptor03 extends MethodFilterInterceptor { @Override protected String doIntercept(ActionInvocation invocation) throws Exception { System.out.println("Interceptor03 執行了..."); //放行 invocation.invoke(); return null; } }
2) 在struts.xml配置攔截器(聲明和使用)ajax
<package name="test" extends="struts-default" namespace="/"> <!-- 聲明攔截器 --> <interceptors> <interceptor name="interceptor03" class="com.itheima.web.interceptor.Interceptor03"> </interceptor> </interceptors> </package> <action name="demo_*" class="com.itheima.web.action.ActionDemo" method="{1}"> <interceptor-ref name="interceptor03"> <!--不攔截fun02()方法 --> <param name="excludeMethods">fun02</param> </interceptor-ref> </action>
備註:jsp
1)放行:這裏放行的意思是是否放行通道給下一個攔截器,語句:xx.invoke()。這時候,CPU執行完這個攔截器後,將會執行下一個攔截器ide
2)攔截:這裏攔截的意思是,是說不執行下一個攔截器。這時候會執行return 的內容,也須要返回到一個具體的頁面。所以須要在struts.xml配置result標籤。例如該攔截器return "success",則在struts.xml中配置<result name="success">/success.jsp</result>,這時候會跳轉到success.jsp頁面佈局
一旦定義了本身的攔截器,struts2默認的那一套攔截器就不會執行,能夠參考有參構造和無參構造方法來理解。post
所以defaultStack的這個攔截器包的功能會失效,但在action裏從新引用便可啓動這些功能ui
<action name="actionDemo_*" class="com.itheima.action.ActionDemo" method="{1}"> <!-- 執行這個action,就必然要走名字叫作myInterceptor02的攔截器 --> <!-- 使用默認的攔截器 --> <interceptor-ref name="defaultStack"></interceptor-ref> <!-- 使用自定義的攔截器 --> <interceptor-ref name="myInterceptor"></interceptor-ref> <result name="login">/index.jsp</result> </action>
Struts2的標籤庫一個字歸納,多。它功能比較完善,另外還提供了主題和模板的支持。
如下爲標籤庫分類圖:
先導庫<%@taglib uri="/struts-tags" prefix="s" %>,而後根據語法書寫
取值:
if else標籤 <s:property value="#request.a"/><br/> <s:if test="#request.a > 10"> a 大於10 </s:if> <s:else> a 小於或者等於10 </s:else>
<s:iterator value="list" var="u"> <s:property value="username"/> <s:property value="password"/> </s:iterator>
和HTML標籤對比例子
<h1>一,HTML的表單標籤</h1> <form action="${pageContext.request.contextPath }/demo03_fun03" method="post"> 用戶名:<input type="text" name="username"/><br/> 密碼: <input type="password" name="password"/><br/> 性別:<input type="radio" name="sex" value="1"/>男<input type="radio" name="sex" value="0"/>女<br/> 愛好: <input type="checkbox" name="hobby" value="lq"/>籃球 <input type="checkbox" name="hobby" value="zq"/>足球 <input type="checkbox" name="hobby" value="ppq"/>乒乓球 <input type="checkbox" name="hobby" value="qdm"/>敲代碼<br/> 籍貫:<select name="address"> <option value="-1">-請選擇-</option> <option value="0">北京</option> <option value="1">上海</option> <option value="2">深圳</option> </select><br/> 自我介紹:<textarea rows="2" cols="8" name="introduce">哈哈哈</textarea><br/> <input type="submit" /> </form> <h1>二,Struts2的表單標籤</h1> <!--默認請求方式就是post,action不用寫項目路徑 --> <s:form action="/demo03_fun03"> <s:textfield name="username" label="用戶名" /> <s:password name="password" label="密碼"/> <%-- <s:radio list="{'男','女'}" name="sex" label="性別"/> --%> <s:radio list="#{'1':'男','0':'女' }" name="sex" label="性別" value="1"></s:radio> <s:checkboxlist list="{'籃球','足球','乒乓球','敲代碼'}" label="愛好" name="hobby"/> <s:select list="#{'0':'北京','1':'上海','2':'深圳' }" label="籍貫" name="address" headerKey="-1" headerValue="請選擇" value="1"></s:select> <s:textarea cols="8" rows="2" name="introduce" label="籍貫" value="哈哈"></s:textarea> <s:submit value="註冊" align="left"/> </s:form>
simple:把UI標籤翻譯成最簡單的HTML對應元素,並且會忽視行標屬性
xhtml:默認的主題。這個主題的模板經過使用一個佈局表格提供了一種自動化的排版機制(默認)
css_xhtml:這個主題裏的模板與xhtml主題裏的模板很類似,但他們將使用css來進行佈局和排版
ajax:這個主題裏的模板以xhtml主題裏的模板爲基礎,但增長了一些ajax功能。
作法:經過配置struts.xml的constant屬性:struts.ui.theme
<constant name="struts.ui.theme" value="simple"></constant>
或者經過UI標籤的theme屬性修改
<s:form action="..." theme="simple">
struts.xml
<package name="test" extends="struts-default" namespace="/"> <action name="demo_fun01" class="com.itheima.web.action.ActionDemo01" method="fun01"> <result name="success">/demo01.jsp</result> </action> </package>
對應的註解
用來模擬package標籤的namespace屬性
的。
須要在Action的類上配置。
ParentPackage 註解
用來模擬package標籤的extends屬性
的。
須要在Action的類上配置。
Action註解
用來模擬action標籤
的。須要在action類中的action方法上配置。
value屬性用來模擬 action標籤
中的name屬性
results屬性用來模擬 action標籤
內的result標籤
Result註解
用來模擬result標籤的。能夠在action類上配置或者在action方法上配置。 action類上配置就是全局的。action方法上的配置是局部的。
name屬性用來模擬result標籤
的name屬性
type屬性用來模擬result標籤
的type屬性
locaction屬性用來模擬result標籤
的標籤內容
params屬性用來模擬result標籤
的內部