1. 程式人生 > >Struts2框架之struts.xml詳解

Struts2框架之struts.xml詳解

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標籤的配置

  1. name屬性,作用是定義一個包的名稱,它必須唯一.即在struts.xml中可以配置多個package,但這些package的name不可以重複. package是用來管理action的.
  2. namespace屬性, 作用是與action標籤的name屬性聯合使用來確定一個action的訪問路徑.
    例如在jsp中的form表單的action如下
    action="${pageContext.request.contextPath}/login.action"
    那麼在package標籤的namespace配置了"/"
    在action標籤中的name屬性配置了"login". 那麼該form表單即可對這個action進行訪問了.
  3. extends屬性, 作用是指定繼承哪個包. 可以把struts的package類比為java中的一個類,那麼java中的類是可以繼承父類的屬性和方法的. 類似的,繼承了某個包,那麼就代表繼承的包的配置也就生效了.
    一般是繼承struts-default.
    struts-default包是在struts-default.xml中宣告的.
    struts-default.xml是在struts2-core的jar包中的
  4. abstract屬性, 可以在上面的截圖中看到struts-default包有abstract屬性, 並且為true, 代表這個包是抽象的.
    類似於java中的抽象類, 是不能建立物件的,必須有其子類繼承了抽象類才能呼叫抽象類中的成員變數和方法.
    那麼在包中寫abstract為true,代表當前的包是抽象的, 主要是用於被其他包繼承的.

action標籤的配置

  1. name屬性, 作用是與package的namespace聯合使用來確定一個action的訪問路徑
  2. class屬性, 作用是指示當前訪問的action類.
  3. method屬性, 用於指示當前的action類中的哪個方法執行.

result標籤的配置

主要作用是指示結果檢視的.

  1. name屬性, 作用是與action類的method方法返回值進行匹配, 來確定跳轉的路徑的. name中的值為方法的返回值, result的標籤體為跳轉的jsp
  2. 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方法. 寫上方法,就不會報異常了.