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

 <!-- 這裏是打開structs的開發模式,默認是true -->
    <constant name="struts.devMode" value="true" />
    <!-- 方法感嘆號動態調用,必須把這個打開 -->
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <!--structs2 國際化,編碼問題 -->
    <constant name="struts.i18n.encoding" value="utf-8" /><!-- internationalization
        18個字母 -->
    <include file="/com/jaovo/struts2/ognl/ognl.xml"/><!--包含,把指定文件的xml,包含到當前xml文件中-->
    <!--========================================================================= -->

    <package name="front" namespace="/front" extends="struts-default"><!--(1)模塊名字,(2)在地址欄寫的那個包名(並非寫前面的包名,是這裏的,通常都和前面的包名(name)一致),(3)繼承於底層的"struts-default"-->
        <!--name是包名,可是目錄要打namespace裏面的值(建議是包名前面加個/)-->
        <action name="index"><!--action名字-->
            <result><--這裏不寫 後面默認是result name="success"-->
                /Hello.jsp<!--要跳轉的頁面-->
            </result>
        </action>
    </package>
    <!--===============默認主頁=======================================-->
        <package name="default" namespace="/" extends="struts-default">
            <default-action-ref name="index" /><!--默認自動跳轉到name爲index的action中,指定的頁面-->
        <!--  沒有上面這一句,url中就必須加index,要否則訪問不到,默認就用這個
        在web.xml中,經過
        <welcome-file-list>
          </welcome-file-list>
          來指定默認主頁
          可是也能夠去調用,經過struts2指定
        -->
        <action name="index">
            <result>/default.jsp</result>
        </action>
    </package>
    <!--========================================================================= -->
     <!--  這裏是默認是匹配不到的就匹配這裏,可是和配置相關
    F:\Step06_JavaEE\_01_Strust2\struts-2.3.24-all\struts-2.3.24\src\core\src\main\java\org\apache\struts2\dispatcher\mapper
    這個類裏面有相關源碼
    -->
    <!-- 若是namespace爲空的話,就是全部匹配不上的,都匹配到這裏來
        我這裏只管namespace,無論的別的,和action無關
     -->
    <package name="fron" namespace="" extends="struts-default"><!--前面怎麼錯都行,後面的index對應上,就行,別的都匹配不上的時候,就匹配到這個-->
        <action name="index">
            <result>
                   /404.jsp
            </result>
        </action>
    </package>
    <!--========================================================================= -->
    <package name="front" namespace="/" extends="struts-default">
        <action name="index" class="com.jaovo.structs2.front.action.IndexAction3"><!--action跳轉到指定類,在從類中的方法的返回值中,得到一個字符串,去匹配下面這個result name=success-->
            <!-- 這裏的返回值是success,而後回去匹配result爲success的result -->
            <!--類返回這個字符串有三種方法,看./Struts2.java裏面的execute :-->
            <result name="success">
                /404.jsp
            </result>
        </action>
    </package>
<!--==================================方法調用============================================-->
        <!--========第一種,指定名字調用userAdd,一個方法,要對應一個action====-->
        <package name="user" namespace="/user" extends="struts-default">
        <!--兩個a超連接是在jsp裏面要跳轉時候寫的-->
        <a href="user/userAdd">action調用add方法添加用戶</a><br /> 調用第一種action方法
        <action name="userAdd" class="com.jaovo.structs2.user.action.UserAction"
                method="add"><!--method 是調用方法,後面是方法名-->
            <result name="success">
                /user_add_success.jsp
            </result>
        </action>
            <!--==========第二種 !感嘆號調用============-->
         <!--a超連接是在jsp裏面要跳轉時候寫的-->
        <a href="user/user!add">URL動態傳參調用相關的方法執行</a><br /> 調用第二種action方法,user定位到類,!後面跟方法名
        <action name="user" class="com.jaovo.structs2.user.action.UserAction">
            <result>
                /user_add_success.jsp
            </result>
        </action>
    </package>
    <!--=========================第三種,推薦,通配符===================-->
    <package name="actions" namespace="/actions" extends="struts-default">

        <!-- 記得sql語句中的?通配符嗎,嘿嘿,同樣的,{1},第一個星,{2}第二個星 -->
          <!--jsp文件,a連接寫法-->
    <a href="actions/Studentadd">添加學生</a>
    <a href="actions/Studentdelete">刪除學生</a>
    <br /> 不過,必定要遵照"約定優於配置"的原則

        <action name="Student*" class="com.jaovo.structs2.action.StudentAction"
                method="{1}"><!--如上面,是否是類名後面跟着是方法名,這個是方法名我用*代替,別管你輸入什麼方法,只要我有,*號就代替什麼方法,而後再去匹配,就不用好多action了吧,method後面跟方法名,要換成{1},就是第一個星號的意思-->
            <result name="success">
                /Student{1}_success.jsp<!--而後找到對應的jsp(注意:jsp命名,必定要和這個一致,名字加方法名,要麼找不到對應的jsp文件),就好了,-->
            </result>
        </action>
                    兩個**號匹配一切,------------------------------
        <!--jsp文件,a連接寫法-->
    <br /> 不過,必定要遵照"約定優於配置"的原則
    <a href="actions/Teacher_add">添加老師</a>
    <a href="actions/Teacher_delete">刪除老師</a>
    <a href="actions/Course_add">添加課程</a>
    <a href="actions/Course_delete">刪除課程</a>
        <!-- 兩個星號,匹配規則的一切,前面截胡一切uri的類名和方法名的請求 -->
        <action name="*_*" class="com.jaovo.structs2.action.{1}Action"
                method="{2}"><!--第一個*號是類名把,第二個*號是方法名,注意細節,這個是類後面加_再加方法名,必定要和本身的跳轉a連接對應上-->
            <result>
                /{1}_{2}_success.jsp
            </result>
        </action>
    </package>
    <!--========================方法調用和傳參====================================-->
                <!--jsp文件傳參寫法-->
                <a href="user/User_add?name=a&age=8">添加用戶</a>
                <!-- 領域傳值模型,本質才uri中,加上具體的對象 -->
                ModelDriven傳值.默認是實現ModelDriven接口,實現getModel方法,
                而後在uri傳值中,就能夠不用在封裝數據,會自動封裝到實體類中,這個要在類中實例化實體類對象
                <a href="user/User_add?user.name=dongrege&user.age=18">添加用戶</a>//封裝到對象裏面了,對象是誰new的?底層.....
                --------------------------
                <package name="actions" namespace="/user" extends="struts-default"><!--name是包名,可是目錄要打/user-->
        <!-- 兩個星號,匹配規則的一切 -->
        <action name="*_*" class="com.jaovo.structs2.user.action.{1}Action"
            method="{2}">
            <result name="success">
                /{1}_{2}_success.jsp
            </result>
        </action>
    </package>
    <!--=============================四種方式跳轉==========================================-->
    <!--=============================dispatcher=========================================-->
            地址欄不顯示要跳轉的**.jsp   是同一個棧,是同一個線程內局部變量
     <package name="resultTypes" namespace="/r" extends="struts-default">
        <!-- 這一個的跳轉,就是同一個棧,也就是同一個ThreadLocal,線程內局部變量,傳過來的那個參數,保存request,在整個請求過程當中都能用-->
        <action name="r1">
            <!--這裏的result,並非咱們傳統意義上,方法的那個返回值(是方法的返回值,只不過是預約義的),而是,經過預約義返回值的方式,進行不一樣頁面間的跳轉控制-->
            <!-- 不指定,默認就是這個 : 運用服務器跳轉, forward(),用服務器跳轉到結果頁面,不能是action-->
            <result type="dispatcher">/r1.jsp</result>
        </action>
        <!--=============================redirect=========================================-->
                地址欄顯示**.jsp  就是跳轉頁面,沒有通過action  
        <!-- 這個,就是跳轉到一個簡單的jsp頁面,沒有通過action -->
        <action name="r2">
        <!-- 不能是action 就是底層那個redirect,至關於我要發送到客戶端瀏覽器,這是瀏覽器跳轉
        瀏覽器端的jsp
        -->
            <result type="redirect">/r2.jsp</result>
        </action>
        <!--=============================chain=========================================-->
                鏈式跳轉,chain指定的是r1  意思是跳轉到另外一個action的name爲r1的那個跳轉頁面,再由r1action 跳轉到指定頁面,地址欄不會顯示**,jsp   能夠跳轉到action中,也能夠直接跳轉到一個jsp頁面,可是action能夠傳參,可是jsp頁面不能夠傳參   action的內容保存在valuestack中  jsp中屬性在actioncontext中保存
        
        <!-- 下面這一個,是跳轉到一個不一樣的action中,也就是否是同一個ThreadLocal,因此須要傳遞參數 -->
        <action name="r3">
            <!-- 能夠跳轉到action 至關於forward到另一個action,跳轉到r1 action,而後由r1action 跳轉到r1.jsp-->
            <result type="chain">r1</result>
            <!--
            <param name="actionName">/方法名</param>
            <param name="namespace">/包名</param>
             -->
        </action>
    <!--=============================redirectAction=========================================-->
    先跳轉到action的name爲r2的,再有那個action跳轉到指定頁面,地址欄顯示**.jsp
    能夠跳轉到action中,也能夠直接跳轉到一個jsp頁面,可是action能夠傳參,可是jsp頁面不能夠傳參   action的內容保存在valuestack中  jsp中屬性在actioncontext中保存
        <!-- 這個是在服務器端先跳轉到一個action,而後在在那個action決定跳轉到那個jsp頁面 -->
        <action name="r4">
        <!-- 客戶端跳轉 跳轉到對應的action-->
            <result type="redirectAction">r2</result>
        </action>
        
    </package>
    <!--==========================跨包訪問=======================================-->
      <!-- 如何訪問到另一個package中的,跨包訪問 -->
    <!--  <package name="admin" namespace="/admin" extends="struts-default"> -->
    <package name="admin" namespace="/admin" extends="user"><!--默認繼承struts-default  這裏能夠改成咱們的包(本身的user包)-->
        <action name="admin" class="com.jaovo.struts2.user.action.AdminAction"><!--這裏若是方法返回回來的不是success ,就會報錯,繼承於user 返回值返回回來的,就能夠去繼承的那個包裏面找result對應的name爲,返回回來的那個值,再匹配不到纔會報錯-->
            <result>/admin.jsp</result>
        </action>
    </package>
    <!--===================封裝形式 ${值}-->
     <package name="user" namespace="/user" extends="struts-default">
        
          <!--
          實體類中這樣寫
              @Override
    public String execute() throws Exception {
        if(type == 1) r="/user_success.jsp";
        else if (type == 2) r="/user_error.jsp";
        return "success";
    }
      
      -->
        <action name="user" class="com.jaovo.struts2.user.action.UserAction">
            <!-- 動態的去讀valueStack裏面的內容 r裏面的值,r的值根據默認常量值,動態賦予的jsp頁面,當這裏去讀的時候,就能讀出相應的內容-->
            <!-- 只要是成員變量,都會在值棧中,保存相應的值 -->
            <result>${r}</result><!--解析r的值,是一個地址,是在實體類中賦值的,這裏解析出來,上面是實體類寫法-->
        </action>        
    </package>
    <!--跳轉傳參-->
    <package name="user" namespace="/user" extends="struts-default">
        
        <action name="user" class="com.jaovo.struts2.user.action.UserAction">
            <!-- 這裏是不能傳遞參數的,爲何? 接受方不是一個action,沒有一個action,就沒有成員變量這一說,因此沒有 -->
            <result type="redirect">/user_success.jsp?t=${type}</result>
        </action>
        jsp中寫法 :
        <s:property value="t"/>//訪問action(valuestack值棧)中的t屬性,(訪問不到)由於上面跳轉的是jsp,沒有action,就沒有t屬性
        <s:property value="#parameters.t"/>//訪問jsp中(actioncontext(頁面全部信息,至關於堆內存))的t屬性,就能訪問到
    </package>
</struts>

java

相關文章
相關標籤/搜索