2011-01-19 40 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()); 
}