上篇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
有的時候,咱們可能會在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
:
privilege_login
。/user/a/a
這個名稱空間;若是有,就返回結果/user/a
這個名稱空間;若是有,就返回結果/user
這個名稱空間;若是有,就返回結果看完這個例子,咱們就能夠知道爲啥在名稱空間和資源路徑的中間可添加任意的路徑,而不能在名稱空間以前加入不存在的路徑....這就是Struts的路徑匹配原則..
Struts2默認的訪問後綴是.action......
有的時候,可能根據項目的須要...我想後綴名默認並非.action,那我該怎麼辦呢??
咱們在jar包上找到它的配置文件...
咱們發現它的默認值是**action,,
**
值得注意的是:兩個逗號並非多餘的
咱們不多是直接修改jar包中的配置文件的,在struts.xml文件中提供了constant節點供咱們修改struts的常量...
前面已經說了,兩個逗號並非多餘的。那麼直接在配置文件中配置action時,會怎麼樣:
<constant name="struts.action.extension" value="action"/>
複製代碼
也就是說,「,」號可以匹配空格鍵
舉例子說明:
action
。那麼後綴必定要寫actionaction,do,
。那麼後綴能夠是action,能夠是do,也能夠不寫action,,
。那麼後綴能夠是action,能夠不寫<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
public class PrivilegeAction extends ActionSupport {
public String login() {
System.out.println("我是登錄");
return "success";
}
public String register() {
System.out.println("我是註冊");
return "success";
}
}
複製代碼
public class CategoryAction extends ActionSupport {
public String add() {
System.out.println("我是添加");
return "success";
}
public String find() {
System.out.println("我是查找");
return "success";
}
}
複製代碼
<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 name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
</action>
複製代碼
若是咱們不寫method的話,默認執行的是execute()方法,execute()方法默認返回值是SUCCESS
public class BBAtion extends ActionSupport {
@Override
public String execute() throws Exception {
System.out.println("我是execute()");
return SUCCESS;
}
}
複製代碼
若是不寫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