如何在struts 1.x中准备视图

时间:2011-01-19 16:41:48

标签: java model-view-controller jsp struts struts-1

我是一个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());

在视图中我使用:

渲染select元素
<html:select property="..." >
    <html:optionsCollection name="countries" ... />
</html:select>

在我添加ActionForm#validate进行一些验证检查(与国家无关,例如姓氏!= null)之前,此方法正常。

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

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

有什么想法吗?

4 个答案:

答案 0 :(得分:0)

我认为最简单的方法是使用here所述的预填充方法。我从来没有亲自使用过这种方法(我使用了会话范围的表单)。

或者,您可以在表单的validate()方法中包含国家/地区列表的设置(但这有点像黑客攻击)。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我为克服struts validate问题所做的是绕过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());

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

答案 3 :(得分:0)

Struts 1中实际上有一个机制允许你需要的东西:ActionForm的重置方法。

它旨在将表单的字段重置为默认值,但是当它在表单填充之前执行时,即在调用validate方法之前执行时,它也适用于在会话中存储集合或其他对象:< / p>

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