【问题标题】:how to prepare view in struts 1.x如何在 struts 1.x 中准备视图
【发布时间】:2011-01-19 16:41:48
【问题描述】:

我是一个 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 进行一些验证检查(与国家/地区无关,例如 surname != null)之前,这工作正常。

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

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

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 在 validate() 方法中添加加载的国家/地区确实有效,但这绝对违反了分层和 MVC。
    【解决方案2】:

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

    【讨论】:

    • 是的,但是我需要一些 Java 代码(最好是一个动作),这些代码将在控制被分派到 JSP 之前运行。我需要这个才能从数据库中加载国家/地区列表。
    • 在这种情况下,我建议您将其作为屏幕加载的预处理并将其保存在会话缓存中。
    • 我不喜欢在 http 会话中存储那种数据。我不认为这是正确的。
    • 嗯,是的,在某种程度上你是对的,保持会话尽可能干净是可取的。另一种方法是将您的代码放在 validate 方法中,但要符合一些条件。
    • 将此代码放入 validate 方法中确实有效,但在分层和 MVC 方面感觉不对。
    【解决方案3】:

    我为克服 struts validate 问题所做的是绕过 struts 并在 Form 上添加我自己的 validate 方法:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2017-12-15
        • 2011-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-26
        • 1970-01-01
        • 1970-01-01
        • 2014-11-09
        相关资源
        最近更新 更多