這個是根據之前寫的 Java之SSH框架的Struts 來分析的
一、Struts的執行順序
注意:後面的會覆蓋前面的,如配置web.xml會覆蓋struts.properties
二、package元素
package元素: 是定義一個struts的包,它是把配置文件按照面向對象的思想來管理,分模塊開發。
name屬性: 指向包的名稱。注意:包的名稱在配置文件中唯一。
extends屬性: 指定當前包的父包,它是按照面向對象的思想管理的體現。
abstract屬性: 把包聲明爲一個抽象包,抽象包就是用來被繼承的,只有沒有action元素的包,才能被定義爲抽象包
namespace屬性: 名稱空間,當指定了名稱空間之後,訪問路徑就變成了: 訪問路徑=名稱空間+動作名稱,當不指定名稱空間時,該屬性有默認值,默認值時“”,注意,不是“/”。
<struts>
<!-- 設置開發模式 ,struts.devMode特點改了配置文件,不需要重啓。0輸出更多的錯誤,建議開發文件的常量值爲true
修改struts中的properties定義的常量值-->
<constant name="struts.devMode" value="true"/>
<!-- 修改struts中默認的後綴名 -->
<constant name="struts.action.extension" value="do"></constant>
<!-- 這個包名這個隨便取-->
<package name="show" extends="struts-default">
<action name="hello" class="test.HelloWorldAction" method="sayHello">
<result name="success">/showhelloworld.jsp</result>
</action>
</package>
</struts>
namespace屬性:命名空間 如:namespace="/user"
<package name="show" extends="struts-default" namespace="/user">
改了後綴名爲.abc
發現就會報錯:
此時需要改爲:
而這樣也是對的:
下面是分析圖:
名稱空間的搜索順序:
第一步:先去找對應的名稱空間
在指定的名稱空間下找到了,就執行第二步
在指定的名稱空間下沒找到,按照名稱空間追溯,一直到根名稱空間,只要在任何一級找到了,執行第二步
第二步:找動作名稱
先在指定的名稱空間下,搜索對應的動作名稱,找到了就執行動作類的動作方法
在指定的名稱空間下沒找到對應的動作名稱,前往默認的名稱空間下找動作名稱,注意:它只找動作名稱
三、action屬性
**action 元素:**用來定義動作名稱,動作類和動作方法的映射,以及當出現不同情況時前往指定的結果視圖
name元素: 動作的名稱,和jsp頁面上的請求url中的名稱對於起來,注意不能寫.action
class元素: 指定動作類
method元素: 指定方法類
1)創建動作類的第一種方式
/**
* 創建動作類的第一種方式:
* 創建一個普通的java類。
* 它就是一個POJO,原始的老的java對象
* Plain Old Java Object
* @author xinbai
*/
2)創建動作類的第二種方式
/**
* 創建動作類的第二種方式:
* 創建一個普通類,實現Action接口,實現接口中的方法
* @author xinbai
*
*/
/**
* Action接口中的常量:
* SUCCESS "success" 當執行成功後,前往指定位置
* NONE "none" 不返回任何結果視圖,和return null是一樣的
* ERROR "error" 當執行動作方法時,出現異常後,前往指定的位置
* INPUT "input" 數據回顯
* LOGIN "login" 一般用於返回登錄頁面
*/
3)創建動作類的第三種方式
import com.opensymphony.xwork2.ActionSupport;
/**
* 第三種方式:
* 創建一個類,繼承ActionSupport
* 我們在開發中採取這種方式來創建我們的動作類
* @author xinbai
* 2020年4月8日,上午10:56:26
*/
public class Demo3Action extends ActionSupport{
//當我們在類中什麼都不寫,一個動作方法都不提供時,有一個默認的動作方法:execute()
}
<!-- 訪問默認的動作類 和動作方法的配置
默認的動作類是ActionSupport的類,它是在struts-default.xml的配置文件中定義的
修改默認動作類,我們一般不改
<default-class-ref class="你自己的動作類"></default-class-ref>-->
<action name="defaultAction">
<result name="success">/showhelloworld.jsp</result></action>
參考視頻:Struts框架