Action搜尋順序及動態方法呼叫

2021-07-25 16:24:41 字數 2827 閱讀 4233

新建乙個struts2專案,命名為struts2。按照如下xml檔案配置乙個action:

/hello.jsp

將應用部署,訪問如下路徑:http://localhost:8080/struts2/test/sdf/dsf/32/d/helloworld.action 依然可以訪問到action。

這主要是因為struts2對action名稱的搜尋是按照一定順序進行的。以上面的情況為例:

1.struts2首先搜尋命名空間為/test/sdf/dsf/32/d的包是否存在,存在的情況下,是否有helloworld這個action;

2.搜尋命名空間為/test/sdf/dsf/32的包是否存在,存在的情況下,是否有helloworld這個action;

3.搜尋命名空間為/test/sdf/dsf的包是否存在,存在的情況下,是否有helloworld這個action;

4.搜尋命名空間為/test/sdf的包是否存在,存在的情況下,是否有helloworld這個action;

5.搜尋命名空間為/test的包是否存在。在這種情況下能夠搜尋到,因此,可以訪問到helloworld這個action。

此外,如果按照這種搜尋順序搜尋,發現所有的包均不存在,那麼struts2則會到命名空間為」」(預設命名空間)的包下面去找helloworld這個action。

action類:

package com.demo;

import org.apache.logging.log4j.logmanager;

import org.apache.logging.log4j.logger;

import com.opensymphony.xwork2.actionsupport;

public class strutsdemo

extends actionsupport

public string update()

}

user

" namespace="/" extends="struts-default">

strutsdemo

add" class="com.demo.strutsdemo.

strutsdemo

" method="add">

/add_student.jsp

strutsdemo

update" class=

"com.demo.strutsdemo.

strutsdemo

" method="update">

/update_student.jsp

訪問新增方法執行如下路徑:http://localhost:8080/struts2/strutsdemoadd.action

訪問修改方法執行如下路徑http://localhost:8080/struts2/strutsdemoupdate.action

在上述使用method屬性的方式來實現動態方法有乙個不好的地方在於:如果只有幾個方法需要被呼叫,我們只需要在struts.xml檔案中,寫幾個類似上面的**段。如果有幾百個方法需要被動態呼叫,那麼用這種方法可能就不適合了,這樣**冗餘太大,也不便於管理。因此就有了!、萬用字元的使用的兩種方法。

首先使用!、萬用字元的

方法。必須先新增以下兩段**

regex:.*

將上述事例

struts.xml

改為:

regex:.*

/sucess.jsp

/add_user.jsp

/update_user.jsp

在訪問時,用!加方法名呼叫如:

訪問新增方法執行如下路徑:http://localhost:8080/struts2/strutsdemo!add.action

訪問修改方法執行如下路徑http://localhost:8080/struts2/strutsdemo!update.action

萬用字元方式是使用最為廣泛的方式。當然,在使用之前也需要和!方式一樣需要struts支援動態調配及適配萬用字元

將上述事例的

struts.xml

改為:

regex:.*

/sucess.jsp

/add_user.jsp

/update_user.jsp

說明:上述**中標籤中的name屬性的下劃線「_「 作用為分開類名和方法名,這是一種習慣寫法,可以省略。

method="中的1表示第乙個*。

在訪問時,用!加方法名呼叫如:

訪問新增方法執行如下路徑:http://localhost:8080/struts2/strutsdemo_add.action

訪問修改方法執行如下路徑http://localhost:8080/struts2/strutsdemo_update.action

如上文所述,method="中的1表示第乙個*。那麼萬用字元是可以有多個的,將上述事例修改,

可以用第乙個*表示類名,第二個*號表示方法名。**如下:

regex:.*

/sucess.jsp

/add_user.jsp

/update_user.jsp

Action名稱的搜尋順序

1 首先尋找namespace為 path1 path2 path3的package,如果存在這個package,則在這個package中尋找名字為test的action,如果不存在這個package則轉步驟3 2 尋找namespace為 path1 path2的package,如果存在這個pac...

Action的動態呼叫方法

action執行的時候並不一定要執行execute方法,我們可以指定action執行哪個方法 1 方法一 通過methed屬性指定執行方法 可以在配置檔案中配置action的時候用method 來指定執行哪個方法 useradd class com.bjsxt.struts2.user.action...

使用Action 的動態方法呼叫

actionname指定提交到那個action,而methodname指定提交到指定的方法。例如 對用js為 function register 獲取頁面的第乙個表單 targetform document.forms 0 targetform.action login register 提交到lo...