Struts2框架的基本使用(二)

?????上一篇 Struts2框架的基本使用 我們限于篇幅证鸥,最后簡(jiǎn)單介紹了Action的配置問題失息,本篇接著介紹有關(guān)框架的一些其他基本用法,主要內(nèi)容如下:

  • Action的基本配置
  • result的基本配置
  • Struts的異常處理機(jī)制
  • Convention插件于“約定”的支持

一、Action的基本配置
?????上篇文章我們簡(jiǎn)單的看了Struts.xml中的package包元素的一些屬性的使用情況杂数,接下來我們看看Action的元素的一些屬性及其使用情況。依然是上篇的Struts.xml文件瘸洛。

<?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>
    <package name="walker" extends="struts-default">
        <action name="login" class="MyPackage.LoginAction">
            <result name="error">/error.jsp</result>
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>

我們這里的action元素就對(duì)應(yīng)于一個(gè)xxxAction揍移,它的name屬性指定了他所處理的URL,也就是我們請(qǐng)求/login的時(shí)候核心攔截器會(huì)匹配到此Action反肋。class屬性指定了該Action對(duì)應(yīng)的物理路徑那伐。此外action元素還可以有method屬性,該屬性的默認(rèn)值是execute石蔗,也就是當(dāng)核心攔截器匹配到一個(gè)xxxAction的時(shí)候罕邀,會(huì)默認(rèn)調(diào)用它的execute方法,當(dāng)然我們也是可以使用method屬性來顯式指定某個(gè)方法作為默認(rèn)方法調(diào)用养距。

<struts>
    <package name="walker" extends="struts-default">
        <action name="login" class="MyPackage.LoginAction" method="myMehod">
            <result name="error">/error.jsp</result>
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>
public class LoginAction extends ActionSupport {
    private String username;
    private String password;
    public String getUsername(){
        return this.username;
    }
    public void setUsername(String s){
        this.username = s;
    }
    public String getPassword(){
        return this.password;
    }
    public void setPassword(String s){
        this.password = s;
    }
    public String execute() throws Exception{
        if(getUsername().equals("walker")&&getPassword().equals("yam")){
            ActionContext ac = ActionContext.getContext();
            ac.put("login","hello 123");
            return SUCCESS;
        }
        return ERROR;
    }

    public String myMehod(){
        ActionContext ac = ActionContext.getContext();
        ac.put("login","hello walker");
        return SUCCESS;
    }
}
這里寫圖片描述

我們?cè)赟truts.xml中指定了默認(rèn)調(diào)用的方法是myMethod诉探,從結(jié)果圖中我們可以看出來,框架執(zhí)行了我們的myMethod方法而不是默認(rèn)的execute方法棍厌。

?????在配置action元素的時(shí)候肾胯,Struts框架允許我們?cè)趎ame屬性字段使用通配符。即使用 * 代表一個(gè)或多個(gè)字符耘纱,然后我們可以在class屬性或者子元素中使用{n}來獲取 * 所代表的內(nèi)容敬肚。例如:

<struts>
    <package name="walker" extends="struts-default">
        <action name="*" class="MyPackage.LoginAction" method="{1}">
            <result name="error">/error.jsp</result>
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>

當(dāng)我們請(qǐng)求login這個(gè)URL時(shí)候,核心攔截器獲取到這個(gè)URL束析,然后在struts.xml中查找艳馒,哪個(gè)Action能匹配這個(gè)URL呢?當(dāng)它看到一個(gè)action的name值為 * 的時(shí)候畸陡,就決定用此action來響應(yīng)此次請(qǐng)求鹰溜,此時(shí) * 的值為login虽填,{1}表示name中的第一個(gè) * 的值,此處自然也是login曹动,于是顯式調(diào)用LoginAction中的login方法斋日。這就是統(tǒng)配符的簡(jiǎn)單使用情況,其實(shí)子元素result中也是可以通過{n}來獲取 * 的值的墓陈,具體的等到介紹result的時(shí)候在詳解恶守。

下面說一下,有關(guān)使用通配符而產(chǎn)生的匹配順序問題贡必。

<struts>
    <package name="walker" extends="struts-default">
        <action name="loginABC" class="MyPackage.LoginAction" method="login">
            <result name="error">/error.jsp</result>
            <result name="success">/index.jsp</result>
        </action>
        <action name="*ABC" class="MyPackage.LoginAction" method="{1}">
            <result name="error">/error.jsp</result>
            <result name="success">/index.jsp</result>
        </action>
        <action name="*" class="MyPackage.LoginAction" method="{1}">
            <result name="error">/error.jsp</result>
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>

試想一下兔港,如果我們請(qǐng)求 loginABC,框架會(huì)調(diào)用哪個(gè)action來響應(yīng)呢仔拟?這三者都能匹配當(dāng)前請(qǐng)求的URL衫樊。在Struts框架中l(wèi)oginABC原URL優(yōu)先級(jí)最高,后面兩種優(yōu)先級(jí)相同利花,具體選擇按照先后順序科侈。在此例中優(yōu)先級(jí)為:

loginABC > *ABC > *

最后一個(gè)有關(guān)Action配置的是,為Action配置默認(rèn)值炒事,也就是在URL無法匹配到具體的某個(gè)Action的時(shí)候臀栈,默認(rèn)的Action會(huì)去響應(yīng)此URL。

<struts>
    <package name="walker" extends="struts-default">
        //為默認(rèn)Action指定name
        <default-action-ref name="err" />
        //為默認(rèn)Action指定class和處理結(jié)果
        <action name="err" class="MyPackage.DefaultAction">
            <result name="error">/error.jsp</result>
        </action>

        <action name="login" class="MyPackage.LoginAction" method="login">
            <result name="error">/error.jsp</result>
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>
public class DefaultAction extends ActionSupport {

    public String execute() throws Exception{
        return ERROR;
    }
}
這里寫圖片描述
這里寫圖片描述

這樣一旦用戶輸入了不合法的URL挠乳,我們一律跳轉(zhuǎn)到錯(cuò)誤頁面权薯。這一點(diǎn)在安全性方面還是很重要的。

二睡扬、配置處理結(jié)果
?????之前我們一直都在介紹有關(guān)Action的一些配置操作盟蚣,但是始終沒有說明Action返回的一個(gè)字符串是如何對(duì)應(yīng)于物理視圖資源的。其實(shí)從Action返回的字符串要想能夠被核心攔截器識(shí)別是對(duì)應(yīng)于哪個(gè)物理視圖威蕉,是需要在Struts.xml中進(jìn)行配置的刁俭。本小節(jié)就來學(xué)習(xí)下對(duì)處理結(jié)果的配置橄仍。

/*這是之前的Struts.xml配置文件*/
<struts>
    <package name="walker" extends="struts-default">
        <action name="login" class="MyPackage.LoginAction" method="login">
            <result name="error">/error.jsp</result>
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>

我么可以看出來韧涨,配置邏輯視圖和物理視圖之間的映射是使用 result 元素來實(shí)現(xiàn)的。配置result元素時(shí)候通常是需要指定兩個(gè)屬性:

  • name:對(duì)應(yīng)于Action返回的字符串的值
  • type:指定結(jié)果類型侮繁,默認(rèn)值是dispatcher虑粥,可以省略

對(duì)于上面的兩個(gè)屬性,name屬性中指定了一個(gè)字符串宪哩,如果該Action返回的是對(duì)應(yīng)的字符串娩贷,那么核心攔截器就會(huì)知道該視圖的物理位置。至于type屬性锁孟,我們打開sturts-default.xml文件:

<result-types>
      <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
      //默認(rèn)類型
       <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
            
       <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
            
      <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
            
       <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>

       <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
            
       <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
            
       <result-type name="postback" class="org.apache.struts2.dispatcher.PostbackResult" />
</result-types>

以上是Struts框架為我們提供的默認(rèn)的type類型彬祖,至于這些type具有什么作用茁瘦,馬上介紹。此處我們還應(yīng)該知道储笑,如果想要自定義一個(gè)結(jié)果類型的話甜熔,首先需要手寫一個(gè)繼承自com.opensymphony.xwork2.Result,然后在struts.xml文件中使用上述的元素配置定義突倍。最后我們就可以在result元素中使用了腔稀。

?????首先我們我們看第一個(gè)type類型:plainText,它沒什么實(shí)際的意義羽历,主要用于顯示視圖的源代碼焊虏。例如:

<struts>
    <package name="walker" extends="struts-default">
        <action name="login" class="MyPackage.LoginAction" method="login">
            <result name="error">/error.jsp</result>
            //此處指定了type類型為plainText
            <result name="success" type="plainText">/index.jsp</result>
        </action>
    </package>
</struts>
這里寫圖片描述

可以看到,返回的是index的源代碼秕磷。從此例我們可以看出诵闭,type的作用類似于告訴核心攔截器,對(duì)于剛剛拿到的物理視圖澎嚣,該以怎樣的形式響應(yīng)用戶涂圆,默認(rèn)的是dispather,就是轉(zhuǎn)發(fā)的意思币叹,也就是forward請(qǐng)求該頁面润歉,而對(duì)于我們剛剛指定的typeplainText,就是響應(yīng)用戶以源代碼颈抚。雖然例子沒什么實(shí)際價(jià)值踩衩,但是我們從中推測(cè)出type究竟在對(duì)應(yīng)物理視圖的過程中扮演了怎樣的角色。

?????第二個(gè)type類型是:redirect贩汉。它和dispather很是類似驱富,只不過dispather是同一次請(qǐng)求的轉(zhuǎn)發(fā)操作,而redirect則是重新的一次request匹舞,會(huì)丟失上次請(qǐng)求中的所有參數(shù)值褐鸥。由于和dispather很是類似,此處不再贅述赐稽。

第三個(gè)type類型是:redirectAction叫榕。它和redirect又很相似,只不過redirect一般用于請(qǐng)求具體的資源姊舵,而redirectAction主要用于請(qǐng)求Action晰绎,形成Action處理鏈。

<struts>
    <package name="walker" extends="struts-default">
        <default-action-ref name="err"/>
        <action name="err" class="MyPackage.DefaultAction">
            <result name="error">/error.jsp</result>
        </action>

        <action name="login" class="MyPackage.LoginAction" method="login">
            <result name="error">/error.jsp</result>
            <result name="success" type="redirectAction">err</result>
        </action>
    </package>
</struts>

如上述代碼所示括丁,我們loginAction處理完成之后荞下,通過result元素的type屬性指定了下一個(gè)action為err。對(duì)于同package下的Action可以使用相對(duì)路勁,如果非相同的package尖昏,則需要使用Parma元素添加命名空間仰税。

<struts>
    <package name="walker" extends="struts-default" namespace="/aaa">
        <default-action-ref name="err"/>
        <action name="err" class="MyPackage.DefaultAction">
            <result name="error">/error.jsp</result>
        </action>
    </package>

    <package name="walker2" extends="struts-default">
        <action name="login" class="MyPackage.LoginAction" method="login">
            <result name="error">/error.jsp</result>
            <result name="success" type="redirectAction">
                <param name="actionName">err</param>
                <param name="namespace">/aaa</param>
            </result>
        </action>
    </package>

</struts>
這里寫圖片描述

代碼比較簡(jiǎn)單,這里就不在贅述了抽诉。

最后介紹一點(diǎn)有關(guān)result配置的內(nèi)容肖卧,我們可以使用全局結(jié)果來使得某些結(jié)果可以被所有的Action使用。我們看個(gè)例子:

<struts>
    <package name="walker2" extends="struts-default">
        <global-results>
            <result name="error">/error.jsp</result>
        </global-results>

        <action name="login" class="MyPackage.LoginAction">
            <result name="success" type="redirectAction">
                <param name="actionName">err</param>
                <param name="namespace">/aaa</param>
            </result>
        </action>
    </package>

</struts>

我們?cè)趌ogin這個(gè)Action中并沒有配置error對(duì)應(yīng)的result元素掸鹅,但是使用global-results元素配置了一個(gè)全局的結(jié)果塞帐,也就是如果某個(gè)Action返回error,但是在自己的result子元素中沒有找到該結(jié)果對(duì)應(yīng)的物理視圖巍沙,就會(huì)跑到全局下搜索葵姥,如果找到立即使用。此例中我們故意輸錯(cuò)密碼句携,看到的結(jié)果如下:

這里寫圖片描述
這里寫圖片描述

雖然我們沒有配置error結(jié)果對(duì)應(yīng)的物理視圖榔幸,但是通過查找全局的結(jié)果,框架還是找到error.jsp并forward結(jié)果返回矮嫉。需要注意的是削咆,局部結(jié)果的優(yōu)先級(jí)是高于全局的,也就是如果某個(gè)Action返回的結(jié)果可以在自己的result元素中找到,就不會(huì)搜索全局下的結(jié)果。因?yàn)槭侨值拿2埃褂玫臅r(shí)候還是慎重茸习。

篇幅限制践付,未完待續(xù)。。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末歼狼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子享怀,更是在濱河造成了極大的恐慌羽峰,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件添瓷,死亡現(xiàn)場(chǎng)離奇詭異梅屉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)仰坦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門履植,熙熙樓的掌柜王于貴愁眉苦臉地迎上來计雌,“玉大人悄晃,你說我怎么就攤上這事。” “怎么了妈橄?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵庶近,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我眷蚓,道長(zhǎng)鼻种,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任沙热,我火速辦了婚禮叉钥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘篙贸。我一直安慰自己投队,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布爵川。 她就那樣靜靜地躺著敷鸦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寝贡。 梳的紋絲不亂的頭發(fā)上扒披,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音圃泡,去河邊找鬼碟案。 笑死,一個(gè)胖子當(dāng)著我的面吹牛颇蜡,可吹牛的內(nèi)容都是我干的蟆淀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼澡匪,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼熔任!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起唁情,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤疑苔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后甸鸟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惦费,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年抢韭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了薪贫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡刻恭,死狀恐怖瞧省,靈堂內(nèi)的尸體忽然破棺而出扯夭,到底是詐尸還是另有隱情,我是刑警寧澤鞍匾,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布交洗,位于F島的核電站,受9級(jí)特大地震影響橡淑,放射性物質(zhì)發(fā)生泄漏构拳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一梁棠、第九天 我趴在偏房一處隱蔽的房頂上張望置森。 院中可真熱鬧,春花似錦符糊、人聲如沸暇藏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盐碱。三九已至,卻和暖如春沪伙,著一層夾襖步出監(jiān)牢的瞬間瓮顽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工围橡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留暖混,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓翁授,卻偏偏與公主長(zhǎng)得像拣播,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子收擦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理贮配,服務(wù)發(fā)現(xiàn),斷路器塞赂,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 上篇 Struts2框架的基本使用(二)介紹了Action和result的相關(guān)配置操作泪勒,本篇接著介紹剩下的異常處理...
    Single_YAM閱讀 320評(píng)論 0 1
  • 概述 什么是Struts2的框架Struts2是Struts1的下一代產(chǎn)品,是在 struts1和WebWork的...
    inke閱讀 2,256評(píng)論 0 50
  • action中如何接受頁面?zhèn)鬟^來的參數(shù) 第一種情況:(同名參數(shù)) 例如:通過頁面要把id=1 name=tom a...
    清楓_小天閱讀 2,958評(píng)論 1 22
  • 1.什么是框架 什么是框架,框架從何而來,為什么使用框架? 1).框架(framework)——半成品: 1.是一...
    賈里閱讀 2,891評(píng)論 0 0