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

Java 如何在struts 1.x中准备视图,java,model-view-controller,jsp,struts,struts-1,Java,Model View Controller,Jsp,Struts,Struts 1,我是个新手。我有一个表单、一个动作和一个jsp视图 在视图中,我使用以下方法渲染select元素: <html:select property="..." > <html:optionsCollection name="countries" ... /> </html:select> 在我添加一些与国家无关的验证检查(例如姓氏!=空 根据struts规范,一旦出现错误,Actionexecute就不会执行。因此,countries集合不再在请求中,视

我是个新手。我有一个表单、一个动作和一个jsp视图

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

<html:select property="..." >
    <html:optionsCollection name="countries" ... />
</html:select>
在我添加一些与国家无关的验证检查(例如姓氏!=空

根据struts规范,一旦出现错误,Actionexecute就不会执行。因此,countries集合不再在请求中,视图呈现为空的select元素

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


有什么想法吗?

我认为最简单的方法是使用前面描述的预填充方法。虽然我使用了会话范围的表单,但我个人从未使用过这种方法


或者,您可以在表单的验证方法中包含国家/地区列表的设置,但这有点麻烦。

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

我克服struts验证问题的方法是绕过struts,在表单上添加我自己的验证方法:

从行动中召唤它:


很好,满足了我的要求。现在,操作总是在显示视图、错误或成功页面之前执行,并包含准备视图的代码。

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

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

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

在validate方法中添加countries loading确实有效,但这显然违反了分层和MVC。是的,但我需要一些Java代码,最好是在将控件发送到JSP之前运行execute的操作。我需要这个,以便从数据库加载国家列表。在这种情况下,我建议您作为预处理来筛选加载并将其保存在会话缓存中。我不喜欢在http会话中存储此类数据。我认为这是不对的。嗯,是的,从某种程度上说,你是对的,保持会议尽可能干净是可取的。另一种方法是根据某些条件将代码正确地放在validate方法中。将代码放在validate方法中确实有效,但在分层和MVC方面感觉不正确。
<html:select property="..." >
    <html:optionsCollection name="countries" ... />
</html:select>
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;
}
saveErrors(request, ((BookEventForm)form).validate());
@Override
public void reset(ActionMapping mapping, HttpServletRequest request) {
    request.setAttribute(SITES, siteDao.findAll());
    request.setAttribute(SERVICES, serviceDao.findAll());
}