2013-06-06 58 views
2

我是Struts2的新手,嘗試在我的表單中使用addFieldError,標記爲<s:select>。 我有一個表格,我必須從下拉列表中選擇一個值。第一次顯示此表單時,響應來自一個Action類,我在其中創建了一個List。在我的表單我正在打印該表中使用<s:select>標籤這樣的下拉:addFieldError中的錯誤與Struts2中的<s:select>

<s:form action="clientselect"> 
    <h2>Select Client to add the case :</h2> 
    <table> 
    <s:select list="list" headerKey="-1" headerValue="Select Client" 
       label="Select Client" tooltip="Select the desired client" name="client"> 
    </s:select> 

    <tr><td><s:submit value="Register Case" theme="simple" align="right"/></td> 
    <td><s:reset value="Reset" theme="simple" align="right"/></td></tr> 
    </table> 
</s:form> 

「pageinclude = ancar」打印此表。

struts.xml的

<action name="clientselect" class="casediary.JudicialCaseRegisterValidation" method="execute"> 
    <result name="addcase">user.jsp?pageinclude=ncr</result> 
    <result name="error">user.jsp?pageinclude=errancar</result> 
    <result name="input">user.jsp?pageinclude=ancar</result> 
    <result name="loggedout">index.jsp?pageinclude=relogin</result> 
</action> 
在JudicialCaseRegisterValidation.java

public void validate() 
{  
    if(client==null || client.equals("-1"))  
     addFieldError("client", "This field can not be blank."); 
} 

所有工作正常。錯誤條件得到滿足,結果我得到了「輸入」。錯誤消息也在打印,但下拉列表中的值已消失。名單空白。因爲此時間響應不是來自設置List的Action類。

然後我改變了我的struts.xml將請求發送到Action類從<result>這樣的:

<result name="input" type="redirect">link.action</result> 

「link.action」是什麼,是在發送Action類的要求,以創建列出並打印該表格。

但是這次窗體只是再次打印&沒有打印錯誤消息。

我希望再次打印列表以及錯誤消息。請告訴如何。?

回答

2

幾乎每個從Struts2開始的人都會很快遇到這個問題。

在Struts2中請求Action時,您的請求將通過through an Interceptor Stack(攔截器列表);每個攔截器都是特定的業務,然後重定向請求(如果有錯誤),或者將執行繼續到下一個攔截器,或者如果它是最後一個,則執行到Action。

驗證由驗證攔截器執行。如果驗證失敗,它將劫持該請求並將其重定向到輸入在struts.xml中定義的結果。無論如果驗證是XML,通過註釋或操作內的validate()方法:沒有達到行動!然後,​​方法中的所有內容或您調用的方法(如果您使用的是自定義方法)都不會執行;

如果要求將您的列表元素加載到​​方法中,則在輸入結果的情況下不會執行此操作。

來避免這一問題的主要途徑有:

  1. 實施Preparable Interface,並把所有的數據裝載什麼東西后準備()方法。
    該方法由Prepare攔截器運行,它位於驗證攔截器之前;
    它會總是運行,並且它會在之前運行驗證,無論您要調用哪種方法(​​或其他),也不是如果您遇到驗證錯誤;

  2. 使用來自JSP的<s:action/>標記來調用dummy操作返回JSP片段;

  3. 使用redirectAction輸入結果類型,到​​(或別的東西)方法,因爲你在做什麼。
    重定向時,它將丟失所有請求參數(包括動作錯誤,字段錯誤,動作消息等),然後您需要手動將它們複製到struts.xml中作爲redirectAction結果的參數。

第一種方式是首選,imho。

編輯:

只是發現它的官方文檔太:how do we repopulate controls when validation fails ?

+0

謝謝爲安德烈的提示。你能回答[這個問題](http://stackoverflow.com/questions/16602464/can-we-use-sradio-tag-without-passing-the-collection-in-the-list-attribute)也.. ..? –

0

我覺得TYPE = 「redirectAction」 重定向到一個特定的動作

像這樣的事情

<result name="input" type="redirectAction">link</result>

希望它幫助

你設置它在你的execute()方法,如果我是正確的,或者你曾經回覆過這樣的動作的結果

list=setList(newList); 

return result; 
+0

我試過Chakradhar。在這種情況下,錯誤消息不會被打印。我需要錯誤消息和下拉列表。 –

+0

我在JudicialCaseRegisterValidation.java中使用setter方法。問題是,當出現錯誤或者我選擇空白時,那麼這個類沒有執行。這就是爲什麼不打印該列表。 –

+0

您只需在您的方法**中執行**之前返回結果(即成功/錯誤/輸入等)之前設置列表,以便您可以使用struts標記在** user.jsp **中檢索它們 –