Struts2框架之struts.xml詳解
阿新 • • 發佈:2018-12-01
Struts2框架之struts.xml詳解
文章目錄
一個struts.xml的配置示例
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 宣告常量 -->
<constant name="struts.i18n.encoding" value="UTF-8"></constant> <!-- 可以幫助我們解決post請求亂碼問題 -->
<!-- <constant name="struts.action.extension" value="action"></constant> --><!-- 指定訪問strtsu2框架路徑的副檔名 -->
<constant name="struts.devMode" value="true"></constant>
<!-- 配置這項後,它會提供更加詳細報錯資訊,以及在struts.xml檔案修改後不在需要重啟伺服器 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant><!--
開啟動態方法呼叫 -->
<package name="default" namespace="/" extends="struts-default">
<global-results >
<result name="" type=""></result>
</global-results>
<action name="struts2" class="cn.thc.web.action.Struts2Action"></action>
<action name="login" class="cn.thc.web.action.LoginAction"
method="login">
<result name="success" type="redirect">/success.jsp</result>
<result name="failer">/failer.jsp</result>
</action>
<action name="login1" class="cn.thc.web.action.LoginAction1"
method="login">
<result name="success" type="redirect">/success.jsp</result>
<result name="failer">/failer.jsp</result>
</action>
<action name="login2" class="cn.thc.web.action.LoginAction2"
method="login">
<result name="success" type="redirect">/success.jsp</result>
<result name="failer">/failer.jsp</result>
</action>
<action name="test">
<result>/success.jsp</result>
</action>
<!-- <action name="bookadd" class="cn.thc.web.action.BookAction" method="addBook"></action>
<action name="bookupdate" class="cn.thc.web.action.BookAction" method="updateBook"></action>
<action name="bookdel" class="cn.thc.web.action.BookAction" method="delBook"></action>
<action name="bookfind" class="cn.thc.web.action.BookAction" method="findBook"></action> -->
<!-- 以上操作可以簡化,使用*通配置來操作 -->
<!-- <action name="*_*" class="cn.thc.web.action.{1}Action" method="{2}"></action> -->
</package>
</struts>
package標籤的配置
- name屬性,作用是定義一個包的名稱,它必須唯一.即在struts.xml中可以配置多個package,但這些package的name不可以重複. package是用來管理action的.
- namespace屬性, 作用是與action標籤的name屬性聯合使用來確定一個action的訪問路徑.
例如在jsp中的form表單的action如下
action="${pageContext.request.contextPath}/login.action"
那麼在package標籤的namespace配置了"/"
在action標籤中的name屬性配置了"login". 那麼該form表單即可對這個action進行訪問了. - extends屬性, 作用是指定繼承哪個包. 可以把struts的package類比為java中的一個類,那麼java中的類是可以繼承父類的屬性和方法的. 類似的,繼承了某個包,那麼就代表繼承的包的配置也就生效了.
一般是繼承struts-default.
struts-default包是在struts-default.xml中宣告的.
struts-default.xml是在struts2-core的jar包中的
- abstract屬性, 可以在上面的截圖中看到struts-default包有abstract屬性, 並且為true, 代表這個包是抽象的.
類似於java中的抽象類, 是不能建立物件的,必須有其子類繼承了抽象類才能呼叫抽象類中的成員變數和方法.
那麼在包中寫abstract為true,代表當前的包是抽象的, 主要是用於被其他包繼承的.
action標籤的配置
- name屬性, 作用是與package的namespace聯合使用來確定一個action的訪問路徑
- class屬性, 作用是指示當前訪問的action類.
- method屬性, 用於指示當前的action類中的哪個方法執行.
result標籤的配置
主要作用是指示結果檢視的.
- name屬性, 作用是與action類的method方法返回值進行匹配, 來確定跳轉的路徑的. name中的值為方法的返回值, result的標籤體為跳轉的jsp
- type屬性, 作用是指定該方法的跳轉方式, 預設的是請求轉發.
如果值為type="redirect"
代表重定向到某個jsp.
如果值為redirectAction
代表重定向到某個action中.
關於請求轉發與重定向的區別,可以看下面這篇博文
https://blog.csdn.net/qq_33229669/article/details/83446189
關於action標籤配置的預設值
先來做一個實驗, 在struts.xml中編寫如下的action訪問對映
<action name="test">
<result>/success.jsp</result>
</action>
- 可以看到在上面的action標籤的配置中,是沒有寫class和method屬性的.
標籤也沒有寫name屬性的值. - 這個時候,啟動專案,在瀏覽器上訪問
http://localhost:8080/專案名/test
發現是可以跳轉到success.jsp頁面的. - 原因首先是該包繼承了
extends="struts-default"
struts-default包是在struts-default.xml檔案中的,有定義一個預設的class
<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
會執行ActionSupport類的如下的execute方法
public String execute() throws Exception {
return SUCCESS;
}
/**
* The action execution was successful. Show result
* view to the end user.
*/
public static final String SUCCESS = "success";
從該方法中可以看到,不執行任何的業務邏輯程式碼,返回success常量.
也就說明了,class的預設值是com.opensymphony.xwork2.ActionSupport
method的預設值是execute, 即預設訪問的是excuse方法.
預設的跳轉方式是dispatcher請求轉發.
如果在action標籤中,有配置了自己寫的類,但是這個類沒有寫execute方法,在配置action標籤的時候,也沒有寫method屬性,那麼會報如下的異常
NoSuchMethodException
表示你當前的的類中沒有寫execute方法. 寫上方法,就不會報異常了.