Struts2------攔截器和標籤庫和註解開發

1、解析Struts2源碼中攔截器的執行

  客戶端請求Action,執行前端控制器,在前端控制器內部建立了Action的代理類,調用代理類的execute方法,在execute方法內部執行ActionInvocation的invoke方法。css

  在invoke方法內部遞歸調用攔截器的攔截的方法。若是沒有下一個攔截器執行目標Action,Action執行結束後根據Result進行頁面跳轉,最後由response對象生成響應。html

  • 流程圖

 

2、自定義攔截器

  • 方式一:實現Interceptor接口
  • 方式二:繼承AbstractInterceptor
  • 方式三:繼承MethodFilterInterceptor

  步驟(方式三:)前端

  1)建立一個類,繼承MethodFilterInterceptor,複寫doInterceptor方法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>

  備註:MethodFilterInterceptor是AbstractInterceptor的一個子類,能夠精確控制攔截或者不攔截哪個方法jsp

3、關於自定義攔截器的一些操做

  • 攔截器處理結果

    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>

4、標籤庫

  • 介紹

  Struts2的標籤庫一個字歸納,多。它功能比較完善,另外還提供了主題和模板的支持。這些標籤都在 docs/docs/tag-reference.html 裏面能夠找到

  如下爲標籤庫分類圖:

  • 使用步驟

  先導庫<%@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>
  • Struts2的模板和主題

  

主題就是一種風格化標籤,可以讓全部UI標籤可以產生一樣的視覺效果而歸集到一塊兒的一組模板,即風格相近的模板被打包爲一個主題. struts2提供了四種主題simple、xhtml、css_xhtml、ajax。

​ 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">

5、Struts2裏的註解開發

    • 步驟;  1)先導入Jar包:struts2-convention-plugin-x.x.x.jar    2)在action類中配置註解標籤

     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>

  對應的註解

  • Namespace 註解

    ​ 用來模擬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標籤的內部param標籤

相關文章
相關標籤/搜索