2011-01-19 16 views
0

我是一個struts新手。我有一個FormActionjsp view如何在struts 1.x中編寫視圖

<form-beans> 
    <form-bean name="bookEventForm" type="com.example.BookEventForm" /> 
</form-beans> 

<action path="/bookEvent" 
     type="com.example.BookEventAction" 
     name="bookEventForm" 
     input="/WEB-INF/jsp/bookEvent.jsp" 
     scope="request"> 
    <forward name="success" path="/WEB-INF/jsp/bookEvent.jsp" /> 
</action> 

一個事件形式的屬性是Country,所以我在Action做的第一件事是:

request.setAttribute("countries", countriesDao.getAll()); 
視圖

我渲染使用select元素:

<html:select property="..." > 
    <html:optionsCollection name="countries" ... /> 
</html:select> 

這工作正常,直到我加ActionForm#validate做一些驗證檢查(與國家無關,例如surname!= null)。

通過struts規範,只要有一個錯誤Action#execute永遠不會執行。因此,countries集合不再處於請求中,並且視圖呈現具有空的select元素。

我知道我很可能錯過了struts的一些核心概念。一位朋友建議在視圖中提供dao,以便我可以隨時訪問這些國家,但我通常更喜歡在任何JSP「代碼」執行之前準備視圖(預取db數據)。

任何想法?

回答

0

我沒有克服支柱validate問題是繞過支柱和添加自己的validate方法上Form什麼:

public ActionErrors validate() { 
    ActionErrors errors = new ActionErrors(); 
    if (...) errors.add("name", new ActionError("error.field.mandatory")); 
    if (...) errors.add("surname", new ActionError("error.field.mandatory")); 
    return errors; 
} 

而且從Action調用它:

saveErrors(request, ((BookEventForm)form).validate()); 

偉大工程並滿足我的要求。此動作現在始終在呈現視圖,錯誤或成功頁面之前執行,並具有準備視圖的代碼。

0

我認爲最簡單的方法是使用描述爲here的預填充方法。雖然我從來沒有親自使用這種方法(我使用會話範圍的形式)。

或者,您可以在表單的validate()方法中包含國家/地區列表的設置(但這是一種黑客攻擊)。

+0

在validate()方法中添加加載的國家確實有效,但它確實違反了分層和MVC。 – cherouvim 2011-01-20 14:02:15

0

據我所知,如果驗證失敗,則控件返回屏幕,並在validate方法中填充ActionErrors。在調用validate之前,表單將被填充。

+0

是的,但我需要一些Java代碼(最好是一個動作),它將在控制分派給JSP之前運行執行。我需要這個來從數據庫加載國家列表。 – cherouvim 2011-01-20 14:03:05

0

在Struts 1中實際上存在一個機制,允許你需要:ActionForm的重置方法。

它旨在將表單的字段重置爲默認值,但由於它在表單的填充(即調用validate方法之前)之前執行,因此它可以很好地將集合或其他對象存儲在會話中:

@Override 
public void reset(ActionMapping mapping, HttpServletRequest request) { 
    request.setAttribute(SITES, siteDao.findAll()); 
    request.setAttribute(SERVICES, serviceDao.findAll()); 
}