1. 程式人生 > >Struts2配置流程及處理請求過程

Struts2配置流程及處理請求過程

struts2的配置步驟:

1、建立web專案
2、新增struts2框架所需的jar
3、配置web.xml檔案(FilterDispatcher)
4、建立Action.java檔案
5、配置strut.xml檔案(Action)
6、建立welcome.jsp檔案
7、部署執行專案

Web.xml:

<?xml version="1.0" encoding="UTF-8"?>  
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Struts Blank</display-name> <filter> <!-- 配置Struts2核心Filter的名字 --> <filter-name>struts2</filter-name> <!-- 配置Struts2核心Filter的實現類 -->
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> <init-param> <!-- 配置Struts2框架預設載入的Action包結構,可以沒有。 --> <param-name>actionPackages</param-name> <param-value>org.apache.struts2.showcase.person</param-value
>
</init-param> <!-- 配置Struts2框架的配置提供者類 --> <init-param> <param-name>configProviders</param-name> <param-value>lee.MyConfigurationProvider</param-value> </init-param> </filter> <!-- 配置Filter攔截的URL --> <filter-mapping> <!-- 配置Struts2的核心FilterDispatcher攔截所有使用者請求 --> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>

Struts.xml:

<?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>

    <!-- include節點是struts2中元件化的方式 可以將每個功能模組獨立到一個xml配置檔案中 然後用include節點引用 -->
    <include file="struts-default.xml"></include>


    <!-- package提供了將多個Action組織為一個模組的方式
        package的名字必須是唯一的 package可以擴充套件 當一個package擴充套件自
        另一個package時該package會在本身配置的基礎上加入擴充套件的package
        的配置 父package必須在子package前配置 
        name:package名稱
        extends:繼承的父package名稱
        abstract:設定package的屬性為抽象的 抽象的package不能定義action 值true:false
        namespace:定義package名稱空間 該名稱空間影響到url的地址,例如此名稱空間為/test那麼訪問是的地址為http://localhost:8080/struts2/test/XX.action
     -->
    <package name="com.kay.struts2" extends="struts-default" namespace="/test">
        <interceptors>
            <!-- 定義攔截器 
                name:攔截器名稱
                class:攔截器類路徑
             -->
            <interceptor name="timer" class="com.kay.timer"></interceptor>
            <interceptor name="logger" class="com.kay.logger"></interceptor>
            <!-- 定義攔截器棧 -->
            <interceptor-stack name="mystack">
                <interceptor-ref name="timer"></interceptor-ref>
                <interceptor-ref name="logger"></interceptor-ref>
            </interceptor-stack>
        </interceptors>

        <!-- 定義預設的攔截器 每個Action都會自動引用
         如果Action中引用了其它的攔截器 預設的攔截器將無效 -->
        <default-interceptor-ref name="mystack"></default-interceptor-ref>


        <!-- 全域性results配置 -->
        <global-results>
            <result name="input">/error.jsp</result>
        </global-results>

        <!-- Action配置 一個Action可以被多次對映(只要action配置中的name不同)
             name:action名稱
             class: 對應的類的路徑
             method: 呼叫Action中的方法名
        -->
        <action name="hello" class="com.kay.struts2.Action.LoginAction">
            <!-- 引用攔截器
                name:攔截器名稱或攔截器棧名稱
             -->
            <interceptor-ref name="timer"></interceptor-ref>

            <!-- 節點配置
                name : result名稱 和Action中返回的值相同
                type : result型別 不寫則選用superpackage的type struts-default.xml中的預設為dispatcher
             -->
         <result name="success" type="dispatcher">/talk.jsp</result>
         <!-- 引數設定 
             name:對應Action中的get/set方法 
         -->
         <param name="url">http://www.sina.com</param>
        </action>
    </package>
</struts>

Struts2處理請求過程:
先是清空值棧(ValueStack),同時留下相應的session,然後經過Filter,由FilterDispatcher捕獲,經過ActionMapping 將請求發至對應的Action,期間是FilterDispatcher把請求的處理交給ActionProxy,並載入Structs.xml檔案查詢對應的action。Action 反射例項進行處理,回撥execute()方法。並返回result字串傳給FilterDispacher,根據對映配置跳轉頁面。