Struts快速入門

一惭载、概述

Struts是Apache基于Model2模型(MVC設(shè)計(jì)模式)開發(fā)的一個(gè)開源的Web應(yīng)用框架泳猬,由一組相互協(xié)作的類或組件制轰、Servlet以及jsp標(biāo)簽庫(kù)組成灯谣。

Struts采用攔截器的機(jī)制來(lái)處理用戶的請(qǐng)求,也使得業(yè)務(wù)邏輯控制器能夠與Servlet完全脫離曲掰,大大縮減了使用MVC模式開發(fā)web應(yīng)用的時(shí)間疾捍,降低了程序的復(fù)雜度,提高了開發(fā)效率栏妖。

Struts具有如下一些特點(diǎn):

  • 提供了攔截器乱豆,利用攔截器可以進(jìn)行AOP(面向方面)編程,實(shí)現(xiàn)如權(quán)限攔截等功能
  • 提供了類型轉(zhuǎn)換器吊趾,可以把特殊的請(qǐng)求參數(shù)轉(zhuǎn)化成需要的類型
  • 提供支持多種表現(xiàn)層技術(shù)宛裕,如:JSP、FreeMarker等
  • 輸入校驗(yàn)可以對(duì)指定的方法進(jìn)行校驗(yàn)
  • 提供了全局范圍论泛、包范圍和Action范圍的國(guó)際化資源文件管理實(shí)現(xiàn)

官網(wǎng)地址

二揩尸、原理

1、核心控制器FilterDispatcher

FilterDispatcher是Struts框架的核心和基礎(chǔ)屁奏,包含了框架內(nèi)部的控制流程和處理機(jī)制岩榆。該控制器作為一個(gè)Filter運(yùn)行在Web應(yīng)用中,負(fù)責(zé)攔截web.xml文件中<url-pattern>指定的用戶請(qǐng)求坟瓢。如果請(qǐng)求以action結(jié)尾勇边,該請(qǐng)求將被轉(zhuǎn)入Struts框架處理,否則將略過(guò)該請(qǐng)求折联。Struts框架獲得請(qǐng)求后粥诫,將根據(jù)請(qǐng)求的前面部分決定調(diào)用哪個(gè)業(yè)務(wù)邏輯組件。

2崭庸、業(yè)務(wù)控制器Action

Struts應(yīng)用中的Action都被定義在struts.xml文件中,在該文件中定義了Action的name屬性和class屬性。其中name屬性決定了該Action處理哪個(gè)請(qǐng)求怕享,class屬性決定了該Action的實(shí)現(xiàn)類执赡。Struts用于處理用戶請(qǐng)求的Action實(shí)例,并不是用戶所實(shí)現(xiàn)的業(yè)務(wù)控制器函筋,而是Action代理沙合。Struts框架提供了攔截器,負(fù)責(zé)將HttpServletRequest請(qǐng)求中的參數(shù)解析出來(lái)跌帐,傳入到Action中首懈,并回調(diào)Action的execute方法來(lái)處理用戶請(qǐng)求。

3谨敛、業(yè)務(wù)邏輯組件

用于實(shí)現(xiàn)具體的業(yè)務(wù)邏輯究履。

三、配置

  1. 從Struts官網(wǎng)下載相應(yīng)版本的壓縮文件脸狸,解壓縮
  2. 將需要的jar包拷貝到工程WEB-INF/lib目錄下
  3. 配置struts.xml文件最仑,添加Action的相關(guān)配置
  4. 配置web.xml文件,添加啟動(dòng)Struts的過(guò)濾器

四炊甲、工作流程

  1. 客戶端瀏覽器發(fā)送HTTP請(qǐng)求
  2. Servlet容器通過(guò)web.xml映射請(qǐng)求泥彤,獲得控制器的名字,并調(diào)用控制器FilterDispatcher(2.1版本以前)或StrutsPrepareAndExecuteFilter(2.1版本以后)
  3. 控制器通過(guò)ActionMapper獲得Action的信息卿啡,并調(diào)用ActionProxy
  4. ActionProxy通過(guò)ConfigurationManager讀取struts.xml文件獲取action和interceptor信息吟吝,并把請(qǐng)求傳遞給ActionInvocation
  5. ActionInvocation依次調(diào)用action和interceptor,根據(jù)action的配置信息颈娜,產(chǎn)生result
  6. 將Result信息返回給ActionInvocation
  7. 生成HttpServletResponse響應(yīng)剑逃,并將其發(fā)送給客戶端

五、攔截器

Struts2框架的絕大部分功能是通過(guò)攔截器來(lái)完成的揭鳞。當(dāng)FilterDispatcher攔截到用戶請(qǐng)求后炕贵,對(duì)用戶請(qǐng)求進(jìn)行處理,然后調(diào)用用戶自定義的Action類中的方法來(lái)處理請(qǐng)求野崇。

在struts.xml文件中称开,使用<interceptor>元素來(lái)進(jìn)行定義:

<interceptor name="攔截器名" class="攔截器實(shí)現(xiàn)的類">
    <param name="參數(shù)名">參數(shù)值</param>
</interceptor>

有時(shí)一個(gè)Action要配置不止一個(gè)攔截器,這時(shí)就要配置多個(gè)攔截器組成的攔截器棧:

<interceptor-stack name="攔截器棧名">
    <interceptor-ref name="攔截器一"></interceptor-ref>
    <interceptor-ref name="攔截器二"></interceptor-ref>
    <interceptor-ref name="攔截器三"></interceptor-ref>
</interceptor-stack>

Tips:每個(gè)包中只能有一個(gè)默認(rèn)的攔截器乓梨,一旦為包中的某個(gè)action指定了攔截器鳖轰,則默認(rèn)的攔截器將不起作用。

Struts提供了攔截器接口Interceptor扶镀,其中包含三個(gè)方法:

  • init()蕴侣,初始化要使用的資源
  • intercept(ActionInvocation invocation),實(shí)現(xiàn)攔截的動(dòng)作
  • destroy()臭觉,銷毀在init方法中打開的資源

六昆雀、校驗(yàn)

可以通過(guò)兩種方式進(jìn)行校驗(yàn):實(shí)現(xiàn)validate方法和通過(guò)validation配置文件辱志。

1、實(shí)現(xiàn)validate方法

在Validateable接口中定義了一個(gè)validate()方法狞膘,在用戶自定義的Action類中重寫該方法就可以實(shí)現(xiàn)校驗(yàn)功能揩懒。當(dāng)數(shù)據(jù)校驗(yàn)發(fā)生錯(cuò)誤時(shí),調(diào)用addFieldError()方法向相同的fieldErrors添加校驗(yàn)錯(cuò)誤信息挽封。

public void validate() {//會(huì)對(duì)action中的所有方法進(jìn)行校驗(yàn)

    if(this.username == null || this.username.trim().equals("")) {
        this.addFieldError("username", "用戶名不能為空已球!");
    }

    if(this.mobile == null || this.mobile.trim().equals("")) {
        this.addFieldError("mobile", "手機(jī)號(hào)不能為空!");
    } else {
        if(!Pattern.compile("^1[358]\\d{9}{1}quot;).matcher(this.mobile).matches()) {
            this.addFieldError("mobile", "手機(jī)號(hào)格式不正確辅愿!");
        }
    }
}

如果系統(tǒng)的fieldErrors包含錯(cuò)誤信息智亮,Struts會(huì)將請(qǐng)求結(jié)果發(fā)送到名為input的result。在Action的配置中添加對(duì)input的響應(yīng)并指定要跳轉(zhuǎn)的頁(yè)面:

<action name="LoginAction" class="com.login.LoginAction">
    <!-- 定義邏輯視圖和物理資源之間的映射 -->
    <result name="input">/login.jsp</result>
    <result name="error">/error.jsp</result>
    <result name="success">/main.jsp</result>
</action>

result的name屬性有如下幾種方式:

  • success:表示請(qǐng)求處理成功点待,默認(rèn)值
  • error:表示請(qǐng)求處理失敗
  • none:表示請(qǐng)求處理完成后不跳轉(zhuǎn)
  • input:表示輸入時(shí)如果驗(yàn)證失敗應(yīng)跳轉(zhuǎn)何處
  • login:表示登錄失敗后跳轉(zhuǎn)何處

在input映射的頁(yè)面中通過(guò)<s:fielderror/>顯示錯(cuò)誤信息:

<s:fielderror></s:fielderror>
<form method="post" action="<%=basePath%>person/save.action">
    用戶名:<input type="text" name="username"/>不能為空<br/>
    手機(jī)號(hào):<input type="text" name="mobile"/>不能為空阔蛉,并且要符合手機(jī)號(hào)的格式<br/>
    <input type="submit" value="提交"/>
</form>

2、通過(guò)validation配置

另一種方式是提供校驗(yàn)文件亦鳞,校驗(yàn)文件和action類在同一個(gè)包下馍忽,文件命名規(guī)則是ActionClassName-validation.xml。在校驗(yàn)文件中燕差,使用數(shù)據(jù)校驗(yàn)器來(lái)對(duì)表單進(jìn)行校驗(yàn)遭笋。

<validators>
    <field name="username">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>用戶名不能為空!</message>
        </field-validator>
    </field>
    <field name="mobile">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>手機(jī)號(hào)不能為空徒探!</message>
        </field-validator>
        <field-validator type="regex">
            <param name="expression"><![CDATA[^1[358]\d{9}$]]></param>
            <message>手機(jī)格式不正確瓦呼!</message>
        </field-validator>
    </field>
</validators>

Struts提供了大量的數(shù)據(jù)校驗(yàn)器,包括表單校驗(yàn)器和非表單校驗(yàn)器:

  • 必填校驗(yàn)器测暗,類型為required
  • 整數(shù)校驗(yàn)器央串,類型為int
  • 日期校驗(yàn)器,類型為date
  • 郵件地址校驗(yàn)器碗啄,類型為email
  • 網(wǎng)址校驗(yàn)器质和,類型為url
  • 必填字符串校驗(yàn)器,類型為requiredstring
  • 字符串長(zhǎng)度校驗(yàn)器稚字,類型為stringlength
  • 正則表達(dá)式校驗(yàn)器饲宿,類型為regex

七、標(biāo)簽

按照標(biāo)簽的功能大致可以分為兩類:UI標(biāo)簽和非UI標(biāo)簽胆描。要想使用Struts標(biāo)簽瘫想,需要在使用標(biāo)簽的jsp頁(yè)面引入標(biāo)簽庫(kù)。

<%@ taglib uri="/struts-tags" prefix="s" %>

1昌讲、UI標(biāo)簽

主要用于生成HTML元素吠架,可分為表單標(biāo)簽和非表單標(biāo)簽荧库。

表單標(biāo)簽在語(yǔ)法上與普通的HTML元素標(biāo)簽類似,在HTML元素前加上“s:”前綴即可。在用法上也基本與普通元素相同菠劝。通常情況下,會(huì)使用與UI有關(guān)的框架來(lái)代替這部分標(biāo)簽。

  • <s:form>表單標(biāo)簽,通常會(huì)使用action屬性指定Action類
  • <s:submit>饶碘、<s:reset>用來(lái)提交/重置表單
  • <s:hidden>用來(lái)表示表單的隱藏域

非表單標(biāo)簽主要用于生成非表單的可視化元素,如:Tab頁(yè)馒吴、樹形結(jié)構(gòu)等,也可以用于自定義的組件瑟曲。還可以用來(lái)顯示Action的信息饮戳。

  • <s:component>用來(lái)表示自定義組件
  • <s:fielderror>用來(lái)輸出表單域的錯(cuò)誤信息
  • <s:actionerror>用來(lái)輸出getActionErrors()方法返回的非空信息
  • <s:actionmessage>用來(lái)輸出getActionMessage()方法返回的信息

2、非UI標(biāo)簽

主要用于邏輯控制洞拨、數(shù)據(jù)訪問(wèn)等扯罐,可分為控制標(biāo)簽和數(shù)據(jù)訪問(wèn)標(biāo)簽。

控制標(biāo)簽包括:

  • <s:if>烦衣、<s:elseif>歹河、<s:else>用于控制選擇輸出
  • <s:append>用于將多個(gè)集合拼成一個(gè)新的集合,按照集合的排列順序拼接
  • <s:generator>用于將一個(gè)字符串解析成一個(gè)集合
  • <s:iterator>用于將集合中的元素迭代輸出
  • <s:merge>用于將多個(gè)集合拼成一個(gè)新的集合花吟,按照各集合中元素的順序拼接
  • <s:sort>用于對(duì)集合進(jìn)行排序
  • <s:subset>用于截取集合生成新的子集合

數(shù)據(jù)訪問(wèn)標(biāo)簽包括:

  • <s:action>允許在jsp頁(yè)面中直接使用Action
  • <s:bean>用來(lái)實(shí)例化一個(gè)JavaBean
  • <s:date>用來(lái)格式化輸出日期
  • <s:property>用來(lái)輸出對(duì)象的屬性值
  • <s:url>用來(lái)創(chuàng)建一個(gè)URL地址
  • <s:param>用來(lái)為其他標(biāo)簽提供參數(shù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末秸歧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子衅澈,更是在濱河造成了極大的恐慌键菱,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件今布,死亡現(xiàn)場(chǎng)離奇詭異经备,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)部默,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門侵蒙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人傅蹂,你說(shuō)我怎么就攤上這事纷闺。” “怎么了贬派?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵急但,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我搞乏,道長(zhǎng)波桩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任请敦,我火速辦了婚禮镐躲,結(jié)果婚禮上储玫,老公的妹妹穿的比我還像新娘。我一直安慰自己萤皂,他們只是感情好撒穷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著裆熙,像睡著了一般端礼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上入录,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天蛤奥,我揣著相機(jī)與錄音,去河邊找鬼僚稿。 笑死凡桥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蚀同。 我是一名探鬼主播缅刽,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蠢络!你這毒婦竟也來(lái)了衰猛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谢肾,失蹤者是張志新(化名)和其女友劉穎腕侄,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芦疏,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冕杠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酸茴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片分预。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖薪捍,靈堂內(nèi)的尸體忽然破棺而出笼痹,到底是詐尸還是另有隱情,我是刑警寧澤酪穿,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布凳干,位于F島的核電站,受9級(jí)特大地震影響被济,放射性物質(zhì)發(fā)生泄漏救赐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一只磷、第九天 我趴在偏房一處隱蔽的房頂上張望经磅。 院中可真熱鬧泌绣,春花似錦、人聲如沸预厌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)轧叽。三九已至苗沧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炭晒,已是汗流浹背崎页。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腰埂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓蜈膨,卻偏偏與公主長(zhǎng)得像屿笼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子翁巍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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