上篇Struts博文已經講解了Struts的開發步驟以及執行流程了…..對Struts的配置文件有了瞭解…..本博文繼續講解Struts在配置的時候一些值得要學習的細節…java
在第一次咱們寫開發步驟的時候,咱們寫的Action是繼承着ActionSupport類的…爲啥咱們繼承了ActionSupport類呢?下面我就會講解到markdown
咱們來看一下ActionSupport幹了什麼:app
也就是說,若是咱們在Action類中須要用到Struts爲咱們提供的數據校驗等Struts已經幫咱們實現的功能,咱們就繼承着ActionSupport類..jsp
咱們再來看看Action接口乾了什麼:ide
固然啦,ActionSuppot也繼承着Action接口,因此ActionSuppot擁有Action接口的所有功能….所以,這種開發方式咱們是比較少用的…學習
開發此類的Action,它是不繼承任何類、不實現任何接口的…也就是說,它就是一個普通的Java類….編碼
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的方法
有的時候,咱們可能會在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>