struts2框架(一) 初探

Struts2 是一個用來開發(fā) MVC應用程序的框架. 它提供了 Web 應用程序開發(fā)過程中的一些常見問題的解決方案:
Struts2 = Struts1 + WebWork 1和2沒有本質的關系

1.Struts2開發(fā)流程

1.1 引入jar文件

commons-fileupload-1.2.2.jar 【文件上傳相關包】
commons-io-2.0.1.jar 【io操作相關的包】
struts2-core-2.3.4.1.jar 【struts2核心功能包】
xwork-core-2.3.4.1.jar 【Xwork核心包】
ognl-3.0.5.jar 【Ognl表達式功能支持表】
commons-lang3-3.1.jar 【struts對java.lang包的擴展】
freemarker-2.3.19.jar 【struts的標簽模板庫jar文件】
javassist-3.11.0.GA.jar 【struts對字節(jié)碼的處理相關jar】

1.2 配置web.xml

tomcat服務器在啟動時怨喘,首先會加載自身的web.xml,然后加載所有項目的web.xml。struts2通過在web.xml中引入過濾器來作為入口酬荞,在學習過濾器的時候我們知道過濾器的init方法會在tomcat服務器啟動時調用铸题。

   <!-- 引入struts核心過濾器 -->
    <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>

1.3 編寫Action類

action類耘拇,也叫做動作類; 一般繼承ActionSupport類,即處理請求的類 (struts中的action類取代之前的servlet).
注意: action中的業(yè)務方法不能有參數睦尽,且必須返回String

import com.opensymphony.xwork2.ActionSupport;

// 開發(fā)action: 處理請求
public class HelloAction extends ActionSupport {    
    // 處理請求
    public String execute() throws Exception {
        System.out.println("訪問到了action缺狠,正在處理請求");
        return "success";
    }
}

1.4 配置struts.xml

該配置文件的頭部可以參照struts2-core-2.3.4.1.jar包下面的struts-default.xml來寫问慎。該配置文件的主要作用是將提供action的訪問名稱,并且和action類進行關聯挤茄。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
          "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <package name="xxxx" extends="struts-default">
        <action name="hello" class="cn.acamy.action.HelloAction" method="execute">
            <result name="success">/success.jsp</result>
        </action>
    </package> 
</struts>

2.Struts2執(zhí)行流程

2.1 服務器啟動

  1. 加載項目web.xml
  2. 創(chuàng)建Struts核心過濾器對象如叼, 執(zhí)行filter的init()
struts-default.xml,    核心功能的初始化
struts-plugin.xml,     struts相關插件
struts.xml             用戶編寫的配置文件

2.2 用戶訪問

3.用戶訪問Action, 服務器根據訪問路徑名稱,找對應的aciton配置, 創(chuàng)建action對象
4.執(zhí)行默認攔截器棧中定義的18個攔截器
5.執(zhí)行action的業(yè)務處理方法
6.根據action返回的Result來跳轉到相應的頁面

3. 三大配置文件的加載

從上面可以知道核心過濾器是Struts的入口穷劈,tomcat服務器在啟動時會執(zhí)行過濾器的init()方法笼恰,現在通過源碼展示三大配置文件是如何加載的。

3.1 首先是執(zhí)行web.xml引入的StrutsPrepareAndExecuteFilter初始化方法

  public void init(FilterConfig filterConfig) throws ServletException {
        InitOperations init = new InitOperations();
        try {
            FilterHostConfig config = new FilterHostConfig(filterConfig);
            init.initLogging(config);
            Dispatcher dispatcher = init.initDispatcher(config);// 在這里跳轉
            init.initStaticContentLoader(config, dispatcher);

            prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher);
            execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher);
            this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);

            postInit(dispatcher, filterConfig);
        } finally {
            init.cleanup();
        }

    }

3.2 然后執(zhí)行InitOperations的initDispatcher方法

public Dispatcher initDispatcher( HostConfig filterConfig ) {
        Dispatcher dispatcher = createDispatcher(filterConfig);
        dispatcher.init();
        return dispatcher;
    }

3.3 最后執(zhí)行Dispatcher的init方法


/**
     * Load configurations, including both XML and zero-configuration strategies,
     * and update optional settings, including whether to reload configurations and resource files.
     */
    public void init() {

        if (configurationManager == null) {
            configurationManager = createConfigurationManager(BeanSelectionProvider.DEFAULT_BEAN_NAME);
        }

        try {
            init_DefaultProperties(); // [1]
            init_TraditionalXmlConfigurations(); // [2]跳轉到三大配置文件的相關方法
            init_LegacyStrutsProperties(); // [3]
            init_CustomConfigurationProviders(); // [5]
            init_FilterInitParameters() ; // [6]
            init_AliasStandardObjects() ; // [7]

            Container container = init_PreloadConfiguration();
            container.inject(this);
            init_CheckConfigurationReloading(container);
            init_CheckWebLogicWorkaround(container);

            if (!dispatcherListeners.isEmpty()) {
                for (DispatcherListener l : dispatcherListeners) {
                    l.dispatcherInitialized(this);
                }
            }
        } catch (Exception ex) {
            if (LOG.isErrorEnabled())
                LOG.error("Dispatcher initialization failed", ex);
            throw new StrutsException(ex);
        }
    }

//三大配置文件
private static final String DEFAULT_CONFIGURATION_PATHS = "struts-default.xml,struts-plugin.xml,struts.xml";

private void init_TraditionalXmlConfigurations() {
        String configPaths = initParams.get("config");
        if (configPaths == null) {
            configPaths = DEFAULT_CONFIGURATION_PATHS;
        }
        String[] files = configPaths.split("\\s*[,]\\s*");
       //驟個初始化
        for (String file : files) {
            if (file.endsWith(".xml")) {
                if ("xwork.xml".equals(file)) {
                    configurationManager.addContainerProvider(createXmlConfigurationProvider(file, false));
                } else {
                    configurationManager.addContainerProvider(createStrutsXmlConfigurationProvider(file, false, servletContext));
                }
            } else {
                throw new IllegalArgumentException("Invalid configuration file name");
            }
        }
    }

4.struts-default.xml, 詳解

位置:struts2-core-2.3.4.1.jar/ struts-default.xml
內容:

1. bean節(jié)點指定struts在運行的時候創(chuàng)建的對象類型
2.指定struts-default包  【用戶寫的package(struts.xml)一樣要繼承此包 】
    package  struts-default  包中定義了:
        a.  跳轉的結果類型
            dispatcher    轉發(fā)歇终,不指定默認為轉發(fā)
            redirect       重定向
            redirectAction  重定向到action資源
            stream        (文件下載的時候用)
        b. 定義了所有的攔截器
              定義了32個攔截器社证!
              為了攔截器引用方便,可以通過定義棧的方式引用攔截器评凝,
            此時如果引用了棧猴仑,棧中的攔截器都會被引用!
            
            defaultStack
                默認的棧,其中定義默認要執(zhí)行的18個攔截器肥哎!


        c. 默認執(zhí)行的攔截器棧、默認執(zhí)行的action
            <default-interceptor-ref name="defaultStack"/>
           <default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
<interceptor name="prepare" 
class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>
<interceptor name="params" 
class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>

注意:攔截器功能與過濾器功能類似疾渣,都攔截資源篡诽,但它是struts的概念,只能在struts中用榴捡,只攔截action請求;而過濾器是servlet的概念杈女,可以在struts項目、servlet項目用吊圾,可以攔截所有的web資源(/index.jsp/servlet/action/img/css/js)达椰。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市项乒,隨后出現的幾起案子啰劲,更是在濱河造成了極大的恐慌,老刑警劉巖檀何,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝇裤,死亡現場離奇詭異廷支,居然都是意外死亡,警方通過查閱死者的電腦和手機栓辜,發(fā)現死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門恋拍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人藕甩,你說我怎么就攤上這事施敢。” “怎么了狭莱?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵僵娃,是天一觀的道長。 經常有香客問我贩毕,道長悯许,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮力麸,結果婚禮上琢歇,老公的妹妹穿的比我還像新娘。我一直安慰自己垃僚,他們只是感情好,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布规辱。 她就那樣靜靜地躺著谆棺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪罕袋。 梳的紋絲不亂的頭發(fā)上改淑,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音浴讯,去河邊找鬼朵夏。 笑死,一個胖子當著我的面吹牛榆纽,可吹牛的內容都是我干的仰猖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼奈籽,長吁一口氣:“原來是場噩夢啊……” “哼饥侵!你這毒婦竟也來了?” 一聲冷哼從身側響起衣屏,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤躏升,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后狼忱,有當地人在樹林里發(fā)現了一具尸體煮甥,經...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡盗温,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了成肘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卖局。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖双霍,靈堂內的尸體忽然破棺而出砚偶,到底是詐尸還是另有隱情,我是刑警寧澤洒闸,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布染坯,位于F島的核電站,受9級特大地震影響丘逸,放射性物質發(fā)生泄漏单鹿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一深纲、第九天 我趴在偏房一處隱蔽的房頂上張望仲锄。 院中可真熱鬧,春花似錦湃鹊、人聲如沸儒喊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怀愧。三九已至,卻和暖如春余赢,著一層夾襖步出監(jiān)牢的瞬間芯义,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工妻柒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扛拨,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓蛤奢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親陶贼。 傳聞我的和親對象是個殘疾皇子啤贩,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內容

  • 概述 什么是Struts2的框架Struts2是Struts1的下一代產品,是在 struts1和WebWork的...
    inke閱讀 2,242評論 0 50
  • 概述 Struts就是基于mvc模式的框架拜秧!(struts其實也是servlet封裝痹屹,提高開發(fā)效率!) Strut...
    奮斗的老王閱讀 2,924評論 0 51
  • spring mvc 工作機制(原理): DispatcherServlet主要用作職責調度工作枉氮,本身主要用于控制...
    java大濕兄閱讀 1,887評論 5 24
  • action中如何接受頁面?zhèn)鬟^來的參數 第一種情況:(同名參數) 例如:通過頁面要把id=1 name=tom a...
    清楓_小天閱讀 2,936評論 1 22
  • 本文包括: 1志衍、Struts 2 概述2暖庄、Struts 2 快速入門3、Struts 2 的執(zhí)行流程4楼肪、配置 st...
    廖少少閱讀 2,949評論 3 13