2013-04-28 62 views
2

在我的Struts2 JSP表單中,有文本字段和一個選擇標記。例如,驗證驗證框架之外的struts2表單

<s:form> 
<s:textfield name="name" label="Name"/> 
<s:textfield name="dob" label="Date of Birth"/> 
<s:select name="degree" list="degreeList" listKey="degreeID" listValue="degreeName"/> 
<s:submit/> 
</s:form> 

這個JSP裝入前,我在行動類充滿degreeList。 我需要驗證此表單。所以我嘗試了驗證框架。但是如果驗證失敗,問題是行動類返回"input"本身。如果驗證失敗,我無法補充degreeList。所以上面的JSP不能被加載。錯誤說degreeList不是列表/集合,因爲列表不再位於值棧中。有人請指導我如何以另一種方式驗證?謝謝。

+3

這是Prepareable的用途。 – 2013-04-28 19:21:42

回答

3

您需要解決的所有問題是在從validate()方法返回時重新填充列表。我想你的行動擴大了ActionSupport,如果不是,那麼你應該這樣做。覆蓋validate()方法。在那裏你應該檢查hasActionErrors()hasFieldErrors()。如果有的話重新填充列表。作爲一種良好的做法,您應該分開用於呈現JSP的代碼並在validate方法中重用它。在validate()之後INPUT結果沒有執行動作就返回。

3

沒有什麼阻止你在execute()中進行驗證並返回你希望的結果字符串,或者拋出一個異常。

但是真正的問題似乎是「如果驗證失敗,我無法補充degreeList」,爲什麼不,爲什麼不能把它們發送回相同的表單呢?

你應該能夠註釋你的動作(或使用struts.xml)重定向到適當的頁面,如果返回「輸入」,即使這意味着頁面在發送表單之前或不合理的頁面聲明「對不起,你放錯了價值和因爲形式的時間敏感的性質,我們再也不能給你想要的選項:)」

更新

@Results({ @Result( name =「input」,location =「/ package/my-action」) })

+0

<<重定向到合適的頁面應該「輸入」返回>>如果我手動返回來自動作類方法的「輸入」,是的,我可以用這種方法重新填充列表。但驗證框架本身返回「輸入」。結果「輸入」必須返回到表單頁面以顯示錯誤,但列表未填充,表單頁面無法顯示。爲了重新填充列表,我使用,在頁面加載前首先進入操作類。然後列表被填充併成功顯示錶格頁面。但不要顯示錯誤消息。 :( – 2013-04-28 18:16:27

+0

該動作返回的字符串用於確定應該調用什麼,您可以控制這個。請參閱更新,其中註釋演示了這一點,這需要約定插件,但您可以在struts.xml中輕鬆配置它。不要做元刷新! – Quaternion 2013-04-28 18:32:02

+0

http://img.viralpatel.net/2009/12/customer-page-validation-errors.png 請看看。我想在返回「輸入」時顯示這樣的錯誤,有了xml驗證請不要介意我很難理解 – 2013-04-29 01:06:18