2012-07-13 47 views
0

我有一個非常簡單的問題。以下是我的JSP代碼,其中我顯示了多個行中的複選框。默認情況下,所有複選框都被選中,如果用戶想忽略某一行,他將取消選中該行的複選框。html-el:在Struts驗證錯誤顯示後檢查複選框

我的問題是,如果行的複選框未選中,並且由於其他字段,如果Struts在屏幕上引發表單驗證錯誤,則未選中的複選框將顯示爲選中狀態。我錯過了什麼嗎?如果沒有struts validtion,那麼一切看起來都是正確的。

<c:forEach var="map" items="${form.displayList}" varStatus="index"> 
    <html-el:checkbox styleId="someCheckbox_${index.index}" property="someCheckboxes[${index.index}]" /> 
    <td> .....</td> 
    <td> .....</td> 
    <td> .....</td> 
</c:forEach> 
+0

你的表單的setSomeCheckboxes屬性是做什麼的?如果可能的話,發佈此代碼和getSomeCheckboxes,並在您的操作中顯示驗證的代碼。 – 2012-07-16 09:22:23

回答

1

當你提交的數據和Struts以下的事情發生:

  • Struts有一個front controller,所有的請求都在經歷這種控制器。這是ActionServlet類,然後根據在struts-config.xml中配置的內容將請求傳遞給相應的Action類。
  • 在此之前,如果是會話保存表單,則會構建或重用一個ActionForm實例;
  • reset()在ActionForm上被調用。 This is where you reset checkbox properties to false。這是必需的,因爲未提交的HTML複選框在提交時不會在請求上發送,所以Struts不會爲它們請求數據綁定(如果在加載頁面時檢查了它們,即使用戶在提交時未選中它們,也會檢查它們);
  • ActionForm中填充了請求數據(任何選中的複選框現在都被選中,那些沒有被提交的提交者因爲前面的重置而未被選中);
  • ActionForm的validate()方法被調用,如果在struts-config.xml中被指定的話;
  • 如果驗證失敗,則控件返回到輸入JSP,如果在struts-config.xml中這樣指定的(提交的數據是頁面將顯示的內容,因爲它在ActionForm上);
  • 如果代替驗證成功,則調用Action類的​​方法;
  • Action類執行它的任務並轉發給某個JSP。

這是你如何使用Struts?我的猜測是你在Action類中做了一些填充/重置/驗證,當驗證失敗時,你用默認數據重新加載ActionForm。

檢查您的ActionForm的reset()validate()代碼和您的Action類​​並查看數據正在檢查的位置。