我是一个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数据)。
有什么想法吗?
答案 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());
}