Struts框架筆記04_攔截器_標(biāo)簽庫(kù)

結(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)用ActionInvocationinvoke方法匹舞。在這個(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)境搭建成功。

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)信息如下:
    自定義攔截器

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ù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末陨簇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子迹淌,更是在濱河造成了極大的恐慌河绽,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巍沙,死亡現(xiàn)場(chǎng)離奇詭異葵姥,居然都是意外死亡荷鼠,警方通過(guò)查閱死者的電腦和手機(jī)句携,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)允乐,“玉大人矮嫉,你說(shuō)我怎么就攤上這事‰故瑁” “怎么了蠢笋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鳞陨。 經(jīng)常有香客問(wèn)我昨寞,道長(zhǎng),這世上最難降的妖魔是什么厦滤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任援岩,我火速辦了婚禮,結(jié)果婚禮上掏导,老公的妹妹穿的比我還像新娘享怀。我一直安慰自己,他們只是感情好趟咆,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布添瓷。 她就那樣靜靜地躺著,像睡著了一般值纱。 火紅的嫁衣襯著肌膚如雪鳞贷。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天虐唠,我揣著相機(jī)與錄音搀愧,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛妈橄,可吹牛的內(nèi)容都是我干的庶近。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼眷蚓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鼻种!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起沙热,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叉钥,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后篙贸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體投队,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年爵川,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敷鸦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寝贡,死狀恐怖扒披,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情圃泡,我是刑警寧澤碟案,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站颇蜡,受9級(jí)特大地震影響价说,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜风秤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一鳖目、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唁情,春花似錦疑苔、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至抢韭,卻和暖如春薪贫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刻恭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工瞧省, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扯夭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓鞍匾,卻偏偏與公主長(zhǎng)得像交洗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子橡淑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容