了解一下 - struts2

  • Apache Struts 2是一種流行的 Java模型 - 視圖 - 控制器(MVC)框架疾棵,成功地結(jié)合了 WebWork和Struts1.x 兩種 web 框架。

struts2與struts1區(qū)別 (經(jīng)常聽搞java的同事嗶嗶這個面試題)

  • Struts 2是Struts的下一代產(chǎn)品坦袍,是在 struts 1和WebWork的技術(shù)基礎(chǔ)上進(jìn)行了合并的全新的Struts 2框架份名。其全新的Struts 2的體系結(jié)構(gòu)與Struts 1的體系結(jié)構(gòu)差別巨大。Struts 2以WebWork為核心芥驳,采用攔截器的機(jī)制來處理用戶的請求舟茶,這樣的設(shè)計(jì)也使得業(yè)務(wù)邏輯控制器能夠與ServletAPI完全脫離開谭期,所以Struts 2可以理解為WebWork的更新產(chǎn)品。雖然從Struts 1到Struts 2有著太大的變化吧凉,但是相對于WebWork隧出,Struts 2的變化很小。從某種程度上來看阀捅,Struts 2是WebWork的升級胀瞪,而不是Struts 1的升級,甚至在Apache的Struts 2的官方文檔都提到:WebWork到Struts 2是一次平滑的過渡也搓。實(shí)際上赏廓,Struts 2.0其實(shí)是WebWork 2.3而已。在很多方面傍妒,Struts 2僅僅是改變了WebWork下的名稱幔摸,Struts 2也刪除了WebWork中少量特性。

  • Struts實(shí)現(xiàn)MVC的原理


    Struts實(shí)現(xiàn)MVC的原理
  • 控制:通過圖可以看到有一個XML文件Struts-config.xml颤练,與之相關(guān)聯(lián)的是Controller既忆,它可以稱作為Struts神經(jīng)中樞。承擔(dān)MVC中Controller角色的是一個Servlet嗦玖,叫ActionServlet患雇。ActionServlet是一個通用的控制組件。這個控制組件提供了處理所有發(fā)送到Struts的HTTP請求的入口點(diǎn)宇挫。它截取和分發(fā)這些請求到相應(yīng)的動作類(這些動作類都是Action類的子類)苛吱。另外控制組件也負(fù)責(zé)用相應(yīng)的請求參數(shù)填充 Action From(通常稱之為FromBean),并傳給動作類(通常稱之為ActionBean)。
  • 流程:在Struts中器瘪,用戶的請求一般以.do作為請求服務(wù)名翠储,所有的.do請求均被指向ActionSevlet绘雁,ActionSevlet根據(jù)Struts-config.xml中的配置信息,將用戶請求封裝成一個指定名稱的FormBean援所,并將此FormBean傳至指定名稱的ActionBean庐舟,由ActionBean完成相應(yīng)的業(yè)務(wù)操作,如文件操作住拭,數(shù)據(jù)庫操作等挪略。每一個*.do均有對應(yīng)的FormBean名稱和ActionBean名稱,這些在Struts-config.xml中配置滔岳。動作類實(shí)現(xiàn)核心商業(yè)邏輯杠娱,它可以訪問java bean 或調(diào)用EJB。最后動作類把控制權(quán)傳給后續(xù)的JSP 文件澈蟆,后者生成視圖墨辛。所有這些控制邏輯利用Struts-config.xml文件來配置卓研。表現(xiàn)邏輯和程序邏輯趴俘。
  • 視圖:主要由JSP生成頁面完成視圖。
  • 模型:模型以一個或多個java bean的形式存在奏赘。這些bean分為三類:Action Form寥闪、Action、JavaBean or EJB磨淌。Action Form通常稱之為FormBean疲憋,封裝了來自于Client的用戶請求信息,如表單信息梁只。Action通常稱之為ActionBean缚柳,獲取從ActionSevlet傳來的FormBean,取出FormBean中的相關(guān)信息搪锣,并做出相關(guān)的處理秋忙,一般是調(diào)用Java Bean或EJB等。
  • 核心:Struts的核心是ActionSevlet构舟,ActionSevlet的核心是Struts-config.xml灰追。
    20130904161742156.jpg
  • 客戶端(Client)向Action發(fā)用一個請求(Request)
  • Container通過web.xml映射請求,并獲得控制器(Controller)的名字
  • 容器(Container)調(diào)用控制器(StrutsPrepareAndExecuteFilter或FilterDispatcher)狗超。在Struts2.1以前調(diào)用FilterDispatcher弹澎,Struts2.1以后調(diào)用StrutsPrepareAndExecuteFilter
  • 控制器(Controller)通過ActionMapper獲得Action的信息
  • 控制器(Controller)調(diào)用ActionProxy
  • ActionProxy讀取struts.xml文件獲取action和interceptor stack的信息。
  • ActionProxy把request請求傳遞給ActionInvocation
  • ActionInvocation依次調(diào)用action和interceptor
  • 根據(jù)action的配置信息努咐,產(chǎn)生result
  • Result信息返回給ActionInvocation
  • 產(chǎn)生一個HttpServletResponse響應(yīng)
  • 產(chǎn)生的響應(yīng)行為發(fā)送給客服端苦蒿。

Struts 2 各種文件詳解:

  • Struts 2 體系結(jié)構(gòu) :
      1、Web瀏覽器請求一個資源渗稍。
      2佩迟、過濾器Dispatcher查找方法溃肪,確定適當(dāng)?shù)腁ction。
      3音五、攔截器自動對請求應(yīng)用通用功能惫撰,如驗(yàn)證和文件上傳操作。
      4躺涝、Action的execute方法通常用來存儲和重新獲得信息厨钻。
      5、結(jié)果被返回到瀏覽器坚嗜。
  • 開發(fā)Struts 2 最少用到的jar文件:
    • Struts-core-2.x.x.jar : Struts 2 框架的核心類庫
    • xwork-2.x.x.jar : XWork類庫夯膀,Struts 2 在其上構(gòu)建,由于struts2很多事基于webwork的苍蔬,因此也需要這個的核心包
    • ognl-2.6.x.jar : Object Graph Navigation Language 诱建,Struts 2 框架通過其讀寫對象的屬性,提供了OGNL表達(dá)式碟绑。
    • freemarker-2.3.x.jar : Struts 2 的UI標(biāo)簽的模版使用 Freemarker編寫俺猿,提供了另一種展現(xiàn)方式。
    • commons-logging-1.1.x.jar : ASF出品的日志包格仲,apache commons的jar包押袍。
    • commons-fileupload-1.2.1.jar : 文件上傳組件,apache commons的jar包凯肋。
  • struts.xml文件
    • Struts.xml是 Struts 2 的核心配置文件谊惭,主要用于配置開發(fā)人員編寫的action。
    • struts.xml需要存放在WEB-INF/classes下侮东,模板如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
</struts>
  • web.xml文件
    • 在Struts 2中圈盔,Struts框架是通過Filter啟動的,他在web.xml中的配置如下:
<!-- 配置Struts2 核心 Filter -->
  <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
          org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
      </filter-class>
  </filter>
  <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
  • 在StrutsPrepareAndExecuteFilter的init()方法中將會讀取類路徑下默認(rèn)的配置文件struts.xml完成初始化操作悄雅。
  • 注意:struts 2 讀取到 struts.xml的內(nèi)容后驱敲,以javabean形式存放在內(nèi)存中,以后Struts 2對用戶的每一次請求處理將使用內(nèi)存中的數(shù)據(jù)煤伟。
  • Filter 過濾器是用戶請求和處理程序之間的一層處理程序癌佩。它可以對用戶請求和處理程序響應(yīng)的類容進(jìn)行處理,通常用于權(quán)限便锨、編碼轉(zhuǎn)換等場合围辙。
  • ActionSupport 類
    • ActionSupport 類為 Action 提供了一些默認(rèn)實(shí)現(xiàn),主要包括預(yù)定義常量放案、從資源文件中取文本資源姚建、接收驗(yàn)證錯誤信息和驗(yàn)證的默認(rèn)實(shí)現(xiàn)。
    • 數(shù)據(jù)校驗(yàn)
      • Action 繼承了 ActionSupport 類 吱殉,而該類實(shí)現(xiàn)了 Action 掸冤、Validateable 厘托、 ValidationAware 、TextProvider稿湿、LocaleProvider铅匹、Serializable 接口。
      • 在Validateable 接口定義了一個 validate() 方法 饺藤, 在用戶自定義 Action 類中重寫該方法就可以實(shí)現(xiàn)驗(yàn)證功能包斑。
public class LoginAction extends ActionSupport{
    private String username ;  
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    } 
    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        if ( ! username.equals("HelloWorld"))
        {
            Map request = (Map) ActionContext.getContext().get("request") ; 
            request.put("name", getUsername()) ; 
            return SUCCESS;
        }
        else return ERROR ; 
    } 
  //重寫的validate方法
    public void validate()
    {  
        //如果名字為空,則把錯誤信息天驕的Action類的fileError
        if (this.getUsername() == null || this.getUsername().trim().equals(""))
        {
            addFieldError("username" , "名字不能為空") ; 
        }
    } 
}
- 在類中定義了校驗(yàn)方法后涕俗,該方法會在執(zhí)行系統(tǒng)的execute() 方法之前執(zhí)行罗丰。如果執(zhí)行該方法后,Action類的fieldError中已經(jīng)包含了數(shù)據(jù)校驗(yàn)錯誤信息再姑,將把請求轉(zhuǎn)發(fā)到input邏輯視圖處萌抵,所以在 Action配置中也要配置一下。
<action name = "LoginAction" class = "com.cnblogs.jbelial.login.LoginAction" >
            <!-- 定義3個邏輯視圖和物理資源之間的映射  -->
            <result name = "input">/login.jsp</result>
            <result name = "error">/error.jsp</result>
            <result name = "success">/main.jsp</result>
        </action>

result中name屬性有下:
  1元镀、success :表示請求處理成功后跳轉(zhuǎn)的目標(biāo)頁绍填,該值也是默認(rèn)值;
  2凹联、error :表示請求處理失敗后跳轉(zhuǎn)的目標(biāo)頁沐兰;
  3哆档、none :表示請求處理完成后不跳轉(zhuǎn)到任何頁面蔽挠;
  4、input :表示輸入時如果驗(yàn)證失敗應(yīng)該跳轉(zhuǎn)到什么地方瓜浸;
  5澳淑、login :表示登錄失敗后跳轉(zhuǎn)的目標(biāo)。

  • Struts 2 驗(yàn)證框架的應(yīng)用
  • Struts 2 提供了大量的數(shù)據(jù)校驗(yàn)器插佛,包括表單域校驗(yàn)器和非表單域校驗(yàn)器杠巡。
  • 必填字符串校驗(yàn)器:
    該校驗(yàn)器的名字是 requiredstring 其校驗(yàn)規(guī)則定義文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" 
"http://struts.apache.org/dtds/struts-2.1.dtd">
<validators>
    <field name = "username">
        <!-- 需要驗(yàn)證的字段的字段名 -->
        <field-validators type = "requiredstring">
            <!-- 去空格 -->
            <param name = "trim">true</param>
            <!-- 錯誤提示信息 -->
            <message>請輸入用戶名</message>
        </field-validators>
    </field>
</validators>

文件命名:ActionName-validation.xml:其中ActionName 就是需要校驗(yàn)的用戶自定義的Action 類的名字。而且該文件應(yīng)該與Action 類文件放置在同一路徑下雇寇。
- 必填校驗(yàn)器
該校驗(yàn)器的名字就是 required 氢拥。該校驗(yàn)器與requiredstring 的差別就是 可以有空字符串。配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" 
"http://struts.apache.org/dtds/struts-2.1.dtd">
<validators> 
        <!-- 需要驗(yàn)證的字段的字段名 -->  
    <field name = "username">
        <field-validators type = "required"> 
            <!-- 錯誤提示信息 -->
            <message>請輸入用戶名</message>
        </field-validators>
    </field>
</validators>
- 整數(shù)校驗(yàn)器

該校驗(yàn)器的名字為 int 锨侯,該校驗(yàn)器要求字段的整數(shù)值必須在一定范圍內(nèi)嫩海。配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" 
"http://struts.apache.org/dtds/struts-2.1.dtd">
<validators>
    <!-- 需要驗(yàn)證的字段的字段名 -->
    <field name = "number">
        <field-validators type = "int"> 
            <!-- 數(shù)值的最小值 -->
            <param name = "min">50</param>
            <!-- 數(shù)值的最大值 -->
            <param name = "max">100</param>
            <!-- 錯誤提示信息 -->
            <message>大小必須在50至100之間</message>
        </field-validators>
    </field>
</validators>
  • Struts 2 攔截器:
    • Struts 2 框架的絕大部分功能是通過攔截器來完成的,當(dāng)F ilterDispatcher攔截到用戶請求后囚痴,大量攔截器將會對用戶請求進(jìn)行處理叁怪,然后調(diào)用用戶自定義的Action 類中的方法來處理請求。
    • 攔截器的配置:
      在struts.xml文件中來定義的深滚,使用<interceptor.../>元素奕谭,格式如下:
<interceptor name = "攔截器名" class = "攔截器實(shí)現(xiàn)的類">
    <param name = "參數(shù)名">參數(shù)值</param>
</interceptor>

其中<param.../>可以省略涣觉,但在有的時候就需要為其傳入攔截器參數(shù)。
- 有時候一個Action要配置不只一個攔截器血柳,往往多個攔截器一起使用來進(jìn)行過濾官册。這時候就要配置幾個攔截器組成的攔截器棧。定義攔截器棧用
<interceptor-stack.../>难捌,格式如下:

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

注意:在配置攔截器棧時攀隔,用到的攔截器必須是已經(jīng)存在的攔截器。攔截器棧也可以引用攔截器棧栖榨。
- 攔截器實(shí)現(xiàn)類:
- Struts 2 提供了一些接口或類供程序員自定義攔截器昆汹。如:com.opensymphony.xwork2.interceptor.Interceptor 接口。
- 該接口中有三個方法:
  void init () :用于初始化資源婴栽。
  String intercept (ActionInvocation invocation) :用于實(shí)現(xiàn)攔截的動作满粗。
  destroy () :用于銷毀在init()方法中打開的資源。


兩個簡單struts2入門示例


兩個簡單的struts1入門示例


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末愚争,一起剝皮案震驚了整個濱河市映皆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌轰枝,老刑警劉巖捅彻,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鞍陨,居然都是意外死亡步淹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門诚撵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缭裆,“玉大人,你說我怎么就攤上這事寿烟〕和眨” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵筛武,是天一觀的道長缝其。 經(jīng)常有香客問我,道長徘六,這世上最難降的妖魔是什么内边? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮硕噩,結(jié)果婚禮上假残,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好辉懒,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布阳惹。 她就那樣靜靜地躺著,像睡著了一般眶俩。 火紅的嫁衣襯著肌膚如雪莹汤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天颠印,我揣著相機(jī)與錄音纲岭,去河邊找鬼。 笑死线罕,一個胖子當(dāng)著我的面吹牛止潮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钞楼,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼喇闸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了询件?” 一聲冷哼從身側(cè)響起燃乍,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宛琅,沒想到半個月后刻蟹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘿辟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年舆瘪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仓洼。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡介陶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出色建,到底是詐尸還是另有隱情,我是刑警寧澤舌缤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布箕戳,位于F島的核電站,受9級特大地震影響国撵,放射性物質(zhì)發(fā)生泄漏陵吸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一介牙、第九天 我趴在偏房一處隱蔽的房頂上張望壮虫。 院中可真熱鬧,春花似錦、人聲如沸囚似。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饶唤。三九已至徐伐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間募狂,已是汗流浹背办素。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祸穷,地道東北人性穿。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像雷滚,于是被迫代替她去往敵國和親季二。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

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