1. 程式人生 > >struts2中struts.xml和web.xml檔案解析及工作原理

struts2中struts.xml和web.xml檔案解析及工作原理

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

    <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.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

<!-- consant 常量,struts.devMode表示開發者模式,當為true時如果改變了其中的一些程式碼,可以不用重新啟動tomcat-->
<constant name="struts.devMode" value="true" />

<!--package可以有多個解決重名的情況, namespace 可以不寫,預設是如何路徑都可以,也可以寫成/xx/yy ,必須是/開頭-->
    <package name="default" namespace="/" extends="struts-default">

       <default-action-ref name="index" />

       <global-results>
           <result name="error">/error.jsp</result>
       </global-results>

       <global-exception-mappings>
           <exception-mapping exception="java.lang.Exception" result="error"/>
       </global-exception-mappings>

<!-- action裡面那個name屬性值得是URL輸入的路徑名 ,如“http://localhost:8080/Struts2Demo/hello”,則會根據result反饋Hello.jsp-->


       <action name="hello" class="com.styspace.struts2.action.action2">
           <result>
/Hello.jsp</result>
       </action>

<!-- action裡面class屬性值,會有對應的這個類,執行該類裡面的execute()方法-->

       <action name="action" class="com.styspace.struts2.action.action2">
           <result name="success">
/Action.jsp</result>
       </action>

<!-- action裡面method屬性值,會有對應class這個類中的add方法,然後執行該方法-->

<action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
            <result>/user_add_success.jsp</result>
        </action>

<!-- 一般action裡面不用method屬性值,而是用DMI(動態方法呼叫)可以通過http://localhost:8080/Struts2Demo/user!addURL呼叫,其中user指的是action中的name值-->
        
        <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
            <result>/user_add_success.jsp</result>
        </action>

<!-- 更簡單的方法,萬用字元,name=“student*”會匹配URL中所有Studentxx,而method=“{1}”指的是name中第一個“*”匹配的值 同理,result中{1}也是一樣的-->

        <action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">

            <result>/Student{1}_success.jsp</result>
        </action>
<!-- 甚至可以有多個萬用字元,class屬性中也可以用{1}來匹配,最簡化-->
        <action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
            <result>/{1}_{2}_success.jsp</result>
            <!-- {0}_success.jsp -->
        </action>


    </package>
    <!-- Add packages here -->

</struts>

工作原理:

1、在瀏覽器中輸入http://localhost:8080/Struts2Demo/hello,就會向伺服器端(tomcat)傳送一個請求 2、tomcat會解析URL,從中找到一個webApplication(可理解為即專案名)為Struts2Demo,然後就會在這個專案裡面找到web.xml檔案 3、在web.xml中找到filter標籤,然後在filter中定義的filter-class處理URL中的hello(這其中其實還包含一個步驟,就是web.xml中<url-pattern>/*</url-pattern>會過濾掉所有地址,這樣地址才會被filter-class中定義的類接收到) 4、StrutsPrepareAndExecuteFilter接收到地址之後,首先查詢namespace(在struts.xml中的package標籤中的namespace中得到它的值),然後將URL中namespace值(這裡是/)後面的路徑讀取到(這裡是hello) 5、繼續在struts的action標籤中查詢是否有hello這個值的,如果有且發現action中有class屬性,則會new一個class中宣告的類,執行裡面的一個execute()方法,該方法返回一個String字串,返回該字串之後才能得到result中的值,如果action中沒有class屬性,則預設有一個ActionSupport類,該類中也有一個execute方法,返回一個String值 6、上一步中講到execute()方法,但是不一定非要執行execute()方法,當action標籤中有method屬性時,就會執行該屬性定義的方法名稱,然後同樣會返回一個String字串 7、根據返回的String字串(success),在result中找到name屬性值為返回的String字串的標籤(這裡就是Action.jsp),如果沒有找到,則會返回error頁面;如果action中沒有class則直接找到該action下面的result中的值(這裡是/Hello.jsp),然後將請求forword到Action.jsp/Hello.jsp 8、最後jsp反饋到客戶端。