天天看點

如何在JSP頁面中直接調用Action

頭段時間在做項目過程中,需要在JSP頁面中直接調用一個已有的Action,進而達到Action複用的目的,而無需重複

寫相同的代碼段。但在網上找了很多資料,折騰了很久都沒解決問題,後來還是查找了我的那本紅書(李剛寫的《輕

量級Java EE企業應用實戰》),終于解決了問題。原來,實作這個需求很簡單,隻需在jsp頁面中使用struts2的

action标簽。action标簽允許在JSP頁面中直接調用Action,并指定需要被調用Action的name和namespace。且如

果指定了executeResult 參數的屬性值為true,該标簽還會把Action的處理結果(視圖資源)包含到本頁面中來。

action标簽有如下幾個屬性:

q var:這是一個可選屬性,一旦定義了該屬性,該Action将被放入ValueStack中,該屬性可用id代替,但推薦使用var。

q name:這是一個必填屬性,通過該屬性指定該标簽調用哪個Action。

q namespace:這是一個可選屬性,該屬性指定該标簽調用的Action所在的namespace。

q executeResult:這是一個可選屬性,該屬性指定是否要将Action的處理結果頁面包含到本頁面。該屬性值預設值

是false,即不包含。

q ignoreContextParams:這是一個可選參數,它指定該頁面中的請求參數是否需要傳入調用的Action。該參數的默

認值是false,即将本頁面的請求參數傳入被調用的Action。

下面是本示例應用中的Action類,這個Action類裡包含了兩個處理邏輯。看下面的Action類代碼。

public class TagAction extends ActionSupport

{

//封裝使用者請求參數的author屬性

private String author;

//省略author屬性的setter和getter方法

...

//定義第一個處理邏輯

public String execute() throws Exception

{

return "done";

}

//定義第二個處理邏輯

public String login() throws Exception

{

ActionContext.getContext().

put("author", getAuthor());

return "done";

}

}

上面的Action類包含了兩個處理邏輯,可以在struts.xml檔案中通過指定method屬性來将該Action類映射成兩個邏

輯Action。下面是在struts.xml檔案中配置該Action的配置代碼片段。

<!-- 定義第一個Action,使用TagAction的

execute方法作為控制處理邏輯 -->

<action name="tag1" class="org.crazyit.app.action.TagAction">

<result name="done">succ.jsp</result>

</action>

<!-- 定義第二個Action,使用TagAction的

login方法作為控制處理邏輯 -->

<action name="tag2" class="org.crazyit.app.action.TagAction"

method="login">

<result name="done">loginSucc.jsp</result>

</action>

上面配置檔案将一個Action類定義成兩個邏輯Action,可以在JSP頁面中通過<s:action .../>标簽來調用這兩個邏輯Action。

下面是JSP頁面中使用<s:action标簽來調用這兩個邏輯Action的代碼片段。

下面調用第一個Action,并将結果包含到本頁面中。<br/>

<s:action name="tag1" executeResult="true"/>

<hr/>

下面調用第二個Action,并将結果包含到本頁面中。<br/>

但阻止本頁面請求參數傳入Action。<br/>

<s:action name="tag2" executeResult="true"

ignoreContextParams="true"/>

<hr/>

下面調用第三個Action,且并不将結果包含到本頁面中。<br/>

<s:action name="tag2" executeResult="false"/>

本頁面是否可通路?<s:property value="author"/>

在上面頁面中的粗體字代碼三次調用了目标Action,通過指定executeResult屬性來控制是否将處理結果包含到本頁

面中,還通過指定ignoreContextParams屬性來決定是否将本頁面的請求參數傳入Action。除此之外,上面頁面代

碼中代碼試圖在本頁面通路所調用Action對應Context裡的author屬性。但由于設定了executeResult="false",因而

頁面中無法通路該屬性。

繼續閱讀