Struts2第三篇【Action開發方式、通配符、Struts常量、跳轉全局視圖、action節點默認配置】

前言

上篇Struts博文已經講解了Struts的開發步驟以及執行流程了…..對Struts的配置文件有了瞭解…..本博文繼續講解Struts在配置的時候一些值得要學習的細節java

Action開發的三種方式

在第一次咱們寫開發步驟的時候,咱們寫的Action是繼承着ActionSupport類的…爲啥咱們繼承了ActionSupport類呢?下面我就會講解到markdown

繼承ActionSupport類

咱們來看一下ActionSupport幹了什麼:app

這裏寫圖片描述

也就是說,若是咱們在Action類中須要用到Struts爲咱們提供的數據校驗等Struts已經幫咱們實現的功能,咱們就繼承着ActionSupport類..jsp


實現Action接口

咱們再來看看Action接口乾了什麼:ide

這裏寫圖片描述

固然啦,ActionSuppot也繼承着Action接口,因此ActionSuppot擁有Action接口的所有功能….所以,這種開發方式咱們是比較少用的…學習


不繼承任何類、不實現任何接口

開發此類的Action,它是不繼承任何類、不實現任何接口的…也就是說,它就是一個普通的Java類….編碼

  • Action類
public class PrivilegeAction  {


    public String login() {
        System.out.println("我是普通的javaAction,不繼承任何的類、不實現任何的接口");

        return "success";
    }
}
  • 在配置文件中配置:
<struts>
<package name="privilige" extends="struts-default">
    <action name="login" class="privilegeaction.PrivilegeAction" method="login">
        <result name="success">/index.jsp</result>
    </action>
</package>
</struts>
  • 效果:

這裏寫圖片描述


小總結

通常咱們開發Action都是直接繼承着ActionSupport類的…….spa


通配符

爲何要學習通配符

在講解通配符以前,咱們來看一下需求…..code

如今個人Action中有兩個方法,處理登錄和處理註冊:server

public class PrivilegeAction extends ActionSupport {

    public String login() {
        System.out.println("我是登錄");

        return "success";
    }

    public String register() {
        System.out.println("我是註冊");
        return "success";
    }
}

所以,咱們就須要在struts.xml文件中配置兩個action節點

 <action name="login" class="privilegeaction.PrivilegeAction" method="login"> <result name="success">/index.jsp</result> </action> <action name="register" class="privilegeaction.PrivilegeAction" method="register"> <result name="success">/index.jsp</result> </action> 

如今咱們發現:它們僅僅只有訪問路徑和方法的名稱是不同的….可是這卻要多配置一個action節點,會形成浪費!

因而乎通配符就應運而生了…


使用通配符改造

沒有通配符以前,咱們是須要配置兩個action的…有了通配符,咱們是這樣作的:

<package name="privilige" extends="struts-default">

    <action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
        <result name="success">/index.jsp</result>
    </action>

</package>

解釋一下:

  • name=privilege_*,咱們用了_做爲分隔符。*就是咱們的通配符
  • {1},就是表明着第一個通配符

咱們來看一下效果:

這裏寫圖片描述

同理可得,當咱們在地址欄訪問login的時候,就會執行login的方法

這裏寫圖片描述


Struts中路徑的匹配原則

有的時候,咱們可能會在package節點中指定namespace名稱空間,咱們在訪問對應的資源名稱的時候,就須要在前面加入相對應名稱空間的值

好比:

名稱空間的值爲「/user」

<package name="privilige" extends="struts-default" namespace="/user">
    <action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
        <result name="success">/index.jsp</result>
    </action>

</package>

那麼在訪問資源的時候,就須要在項目名稱後邊加上名稱空間的值:

這裏寫圖片描述

如今就有一個很奇怪妙的事情發生了:在名稱空間和資源路徑的中間可添加任意的路徑

這裏寫圖片描述

可是呢,不能在名稱空間以前加入不存在的路徑

這裏寫圖片描述


其實這就涉及到了Struts中路徑的匹配原則,我就拿隨便拿個路徑來舉例子http://localhost:8080/user/a/a/privilege_login

  • 首先,Struts會把請求的資源路徑拿到,也就是privilege_login
  • 而後在看看有沒有/user/a/a這個名稱空間;若是有,就返回結果
  • 若是沒有,就看看有沒有/user/a這個名稱空間;若是有,就返回結果
  • 若是沒有,再看看有沒有/user這個名稱空間;若是有,就返回結果
  • 直到最後,若是都沒有找到,就報錯!

看完這個例子,咱們就能夠知道爲啥在名稱空間和資源路徑的中間可添加任意的路徑,而不能在名稱空間以前加入不存在的路徑….這就是Struts的路徑匹配原則..


Struts常量

Struts2默認的訪問後綴是.action……

這裏寫圖片描述

修改默認訪問路徑

有的時候,可能根據項目的須要…我想後綴名默認並非.action,那我該怎麼辦呢??

咱們在jar包上找到它的配置文件…

這裏寫圖片描述

咱們發現它的默認值是action,,

值得注意的是:兩個逗號並非多餘的

咱們不多是直接修改jar包中的配置文件的,在struts.xml文件中提供了constant節點供咱們修改struts的常量

這裏寫圖片描述

前面已經說了,兩個逗號並非多餘的。那麼直接在配置文件中配置action時,會怎麼樣:

<constant name="struts.action.extension" value="action"/>

這裏寫圖片描述

也就是說,「,」號可以匹配空格鍵

舉例子說明:

  • 若是配置後綴爲action。那麼後綴必定要寫action
  • 若是配置後綴爲action,do,。那麼後綴能夠是action,能夠是do,也能夠不寫
  • 若是配置後綴爲action,,。那麼後綴能夠是action,能夠不寫

Struts經常使用的常量

這裏寫圖片描述

<struts>

    <!-- 0. 請求數據編碼 -->
     <constant name="struts.i18n.encoding" value="UTF-8"/>
    <!-- 1. 修改Struts默認的訪問後綴 -->
    <constant name="struts.action.extension" value="action,do,"></constant>
    <!-- 2. 修改xml自動從新加載 -->
    <constant name="struts.configuration.xml.reload" value="true"/>
    <!-- 3. 開啓動態方法調用 (默認不開啓)-->
    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
    <!-- 4. 修改上傳文件的最大大小爲30M -->
    <constant name="struts.multipart.maxSize" value="31457280"/>


</struts>

上面的感受須要講解的就只有動態方法調用了……

那動態方法調用是怎麼回事呢???這是樣的:在action節點不配置method屬性,在地址欄使用資源名稱!方法名的方式去調用業務方法

這裏寫圖片描述


跳轉全局視圖

爲何須要跳轉全局視圖?

首先,咱們仍是來看一個需求:如今我有兩個Action,PrivilegeAction和CategoryAction

  • PrivilegeAction
public class PrivilegeAction extends ActionSupport {

    public String login() {
        System.out.println("我是登錄");

        return "success";
    }

    public String register() {
        System.out.println("我是註冊");
        return "success";
    }
}
  • CategoryAction
public class CategoryAction extends ActionSupport { public String add() { System.out.println("我是添加"); return "success"; } public String find() { System.out.println("我是查找"); return "success"; } } 
  • 在struts.xml文件中配置
<action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
        <result name="success">/index.jsp</result>
    </action>

    <action name="category_*" class="privilegeaction.CategoryAction" method="{1}">
        <result name="success">/index.jsp</result>
    </action>

咱們發現一個問題,只要是方法返回值是success,那麼就跳轉到首頁….若是有大量Action方法返回的都是success,那麼就要寫不少不少個result節點了..

使用跳轉全局視圖

  • 代碼就能夠變成是這樣子了,注意:global-results節點須要在action節點的上面
<package name="privilige" extends="struts-default" >

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

    <action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
    </action>

    <action name="category_*" class="privilegeaction.CategoryAction" method="{1}">
    </action>


</package>
  • 效果:

這裏寫圖片描述


Action節點中的默認配置

一份相對完整的action節點是這樣子的:

<action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
        </action>

method

若是咱們不寫method的話,默認執行的是execute()方法,execute()方法默認返回值是SUCCESS

public class BBAtion extends ActionSupport {

    @Override
    public String execute() throws Exception {
        System.out.println("我是execute()");

        return SUCCESS;
    }
}

這裏寫圖片描述


class

若是不寫class,class默認執行的action在struts-default有配置<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />

何時會不寫class?就是須要跳轉到WEB-INF目錄下的資源的時候…..這就相似與Servlet須要跳轉到WEB-INF下的資源。【Tomcat不容許直接訪問WEB-INF資源】

<!-- 什麼狀況不配置class? 即處理的aciton -->
        <!-- 答案: 當只是須要跳轉到WEB-INF下資源的時候。 -->
         <action name="test2">
            <result name="success" >/WEB-INF/index.jsp</result>
         </action>
相關文章
相關標籤/搜索