Struts2【配置】知識要點

前言

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

通配符

爲何要學習通配符

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

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

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

        return "success";
    }

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

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

<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的...有了通配符,咱們是這樣作的:spa

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

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

複製代碼

解釋一下:code

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

咱們來看一下效果:cdn

這裏寫圖片描述

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

這裏寫圖片描述


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>
複製代碼

若是文章有錯的地方歡迎指正,你們互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同窗,能夠關注微信公衆號:Java3y

相關文章
相關標籤/搜索