0

我是一个struts新手。我有一个Form,一个Action和一个jsp view

<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());

在视图中,我使用以下方法渲染选择元素:

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

这工作正常,直到我添加ActionForm#validate来做一些验证检查(与国家无关,例如姓氏!= null)。

通过 struts 规范,一旦出现错误,就Action#execute永远不会执行。因此,countries集合不再在请求中,视图呈现为空的选择元素。

我知道我很可能错过了一些 struts 的核心概念。一位朋友建议让 dao 在视图上可用,这样我就可以随时获取国家/地区,但我通常更喜欢在执行任何 JSP“代码”之前准备视图(预取数据库数据)。

有任何想法吗?

4

4 回答 4

0

我认为最简单的方法是使用此处描述的预填充方法。不过,我从未亲自使用过这种方法(我使用了会话范围的表单)。

或者,您可以在表单的 validate() 方法中包含国家/地区列表的设置(但这有点小技巧)。

于 2011-01-20T03:05:21.043 回答
0

据我所知,如果验证失败,控件将返回屏幕,并在 validate 方法中填充 ActionErrors。在调用 validate 之前,会填充表单。

于 2011-01-20T03:09:10.980 回答
0

我为克服 strutsvalidate问题所做的是绕过 struts 并在以下位置添加我自己的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());

效果很好,满足我的要求。现在,该操作始终在呈现视图、错误或成功页面之前执行,并且具有准备视图的代码。

于 2011-01-24T10:09:54.833 回答
0

实际上,Struts 1 中内置了一种机制,可以满足您的需要:ActionForm 的 reset 方法。

它旨在将表单的字段重置为默认值,但由于它是在填充表单之前执行的,即在调用 validate 方法之前,它也可以很好地在会话中存储集合或其他对象:

@Override
public void reset(ActionMapping mapping, HttpServletRequest request) {
    request.setAttribute(SITES, siteDao.findAll());
    request.setAttribute(SERVICES, serviceDao.findAll());
}
于 2011-07-29T17:54:31.327 回答