Struts2 繼承ActionSupport的主要用途

Action 跟 Actionsupport 的區別
當我們在寫action的時候,可以實現Action接口,也可以繼承Actionsupport這個類.到底這兩個有什麼區別呢?

Action接口有:
public static final java.lang.String SUCCESS = "success";
public static final java.lang.String NONE = "none";
public static final java.lang.String ERROR = "error";
public static final java.lang.String INPUT = "input";
public static final java.lang.String LOGIN = "login";

public abstract java.lang.String execute() throws java.lang.Exception;

而Actionsupport這個工具類在實現了Action接口的基礎上還定義了一個validate()方法,重寫該方法,它會在execute()方法之前執行,如校驗失敗,會轉入input處,必須在配置該Action時配置input屬性。

另外,Actionsupport還提供了一個getText(String key)方法還實現國際化,該方法從資源文件上獲取國際化信息.

這樣在自定義標籤時可以定義一個變量爲new actionsupport對象實現國際化。


ActionSupport類的作用
struts2不要求我們自己設計的action類繼承任何的struts基類或struts接口,但是我們爲了方便實現我們自己的action,大多數情況下都會繼承com.opensymphony.xwork2.ActionSupport類,並重寫此類裏的public String execute() throws Exception方法。因爲此類中實現了很多的實用藉口,提供了很多默認方法,這些默認方法包括國際化信息的方法、默認的處理用戶請求的方法等,這樣可以大大的簡化Acion的開發。
Struts2中通常直接使用Action來封裝HTTP請求參數,因此,Action類裏還應該包含與請求參數對應的屬性,並且爲屬性提供對應的getter和setter方法。


2.8 增加數據校驗
在上面應用中,即使瀏覽者輸入任何用戶名、密碼,系統也會處理用戶請求。在我們整個HelloWorld應用中,這種空用戶名、空密碼的情況不會引起太大的問題。但如果數據需要保存到數據庫,或者需要根據用戶輸入的用戶名、密碼查詢數據,這些空輸入可能引起異常。
爲了避免用戶的輸入引起底層異常,通常我們會在進行業務邏輯操作之前,先執行基本的數據校驗。
2.8.1 繼承ActionSupport
ActionSupport類是一個工具類,它已經實現了Action接口。除此之外,它還實現了Validateable接口,提供了數據校驗功能。通過繼承該ActionSupport類,可以簡化Struts 2的Action開發。
在Validatable接口中定義了一個validate()方法,重寫該方法,如果校驗表單輸入域出現錯誤,則將錯誤添加到ActionSupport類的fieldErrors域中,然後通過OGNL表達式負責輸出。
爲了讓Struts 2增加輸入數據校驗的功能,改寫程序中的LoginAction,增加重寫validate方法。修改後的LoginAction類代碼如下:

//Struts 2的Action類就是一個普通的Java類
public class LoginAction
{
//下面是Action內用於封裝用戶請求參數的兩個屬性
 private String username;
private String password;
//username屬性對應的getter方法
 public String getUsername()
{
 return username;
 }
//username屬性對應的setter方法
 public void setUsername(String username)
{
 this.username = username;
}
//password屬性對應的getter方法
 public String getPassword()
{
 return password;
 }
//password屬性對應的setter方法
 public void setPassword(String password)
{
 this.password = password;
 }
//處理用戶請求的execute方法
public String execute() throws Exception
{
//當用戶請求參數的username等於scott,密碼請求參數爲tiger時,返回success
字符串
//否則返回error的字符串
 if (getUsername().equals("scott")
&& getPassword().equals("tiger") )
{
 return "success";
 }
else
{
 return "error";
 }
 }
//完成輸入校驗需要重寫的validate方法
public void validate()
{
//如果用戶名爲空,或者用戶名爲空字符串
if (getUsername() == null || getUsername().trim().equals(""))
{
//添加表單校驗錯誤
addFieldError("username", "user.required");
}
//當密碼爲空,或者密碼爲空字符串時,添加表單校驗錯誤
if (getPassword() == null || getPassword().trim().equals(""))
{
addFieldError("password", "pass.required");
}
}
}

上面的Action類重寫了validate方法,該方法會在執行系統的execute方法之前執行,如果執行該方法之後,Action類的fieldErrors中已經包含了數據校驗錯誤,請求將被轉發到input邏輯視圖處。
爲了在校驗失敗後,系統能將視圖轉入input處,必須在配置該Action時配置input屬性。下面是修改後login Action的配置片段:

<!-- 定義login的Action -->
<action name="Login" class="lee.LoginAction">
<!-- 定義input的邏輯視圖名,對應login.jsp頁面 -->
<result name="input">/login.jsp</result>
<!-- 定義error的邏輯視圖名,對應error.jsp頁面 -->
 <result name=" success ">/error.jsp</result>
<!-- 定義welcome的邏輯視圖名,對應welcome.jsp頁面 -->
 <result name="success">/welcome.jsp</result>  
</action>

對比上面的Action配置與前面的Action配置,我們發現該Action配置片段中增加了input邏輯視圖的配置,該邏輯視圖映射到login.jsp頁面。
前面已經提到:當用戶提交請求時,請求得到execute方法處理之前,先會被validate方法處理,如果該方法處理結束後,Action的fieldErrors裏的校驗錯誤不爲空,請求將被轉發給input邏輯視圖。如果我們不輸入用戶名、密碼而直接提交表單,將看到如圖2.13所示的界面。

圖2.13 輸入校驗的界面

看到這裏也許讀者覺得非常神奇:我們僅僅在Action添加了數據校驗錯誤,並未在輸入頁面輸出這些校驗錯誤信息,但圖2.13所示的頁面,卻可以看到頁面已經輸出了這些校驗信息——這是因爲Struts 2的標籤,上面的JSP頁面中表單使用的並不是HTML表單,而是用了<s:form .../>標籤,Struts 2的<s:form ... />標籤已經具備了輸出校驗錯誤的能力。
提示 Struts 2的<s:form .../>默認已經提供了輸出校驗錯誤的能力。
但上面的程序還存在一個問題:校驗信息的國際化。查看上面的Action類代碼發現:重寫validate方法時,如果發生校驗失敗的問題,校驗錯誤的提示信息是以硬編碼方式寫死了——這就失去了國際化的能力。
實際上,ActionSupport類已經提供了國際化信息的能力,它提供了一個getText(String key)方法,該方法用於從資源文件中獲取國際化信息。爲了讓校驗信息支持國際化,再次改寫Action裏的validate方法,改寫後的validate方法代碼如下:

//執行數據校驗的validate方法
public void validate()
{
//如果用戶名爲空,或者爲空字符串
if (getUsername() == null || getUsername().trim().equals(""))
{
//添加校驗錯誤提示,使用getText方法來使提示信息國際化
addFieldError("username", getText("user.required"));
}
if (getPassword() == null || getPassword().trim().equals(""))
{
addFieldError("password", getText("pass.required"));
}
}

在上面的validate方法中,添加校驗錯誤提示時,並不是直接給出了錯誤提示的字符串,而是調用了getText方法來獲取錯誤提示。因爲在Action中,使用getText方法來獲取了兩個國際化提示:user.required和pass.required,因此應該在國際化資源文件中添加這兩條提示信息。
提示 ActionSupport增加了讓提示信息國際化的能力,ActionSupport提供的getText方法可以根據資源文件加載獲得國際化提示信息。
此時,如果沒有任何輸出,直接提交登錄表單,將看到如圖2.14所示的界面。

圖2.14 國際化數據校驗的錯誤提示
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章