具有从数据库加载的字段选项和验证的表单

Form with field options loaded from DB and validation

情况如下:

  1. 我有一个带有表单的 JSP 页面。
  2. 此表单包含各种 <select> 标签,带有从数据库加载的选项。
  3. 我想对 XML 文件使用验证。

问题如下:如果我使用 XML 文件并且表单字段中存在一些错误,struts 框架不会通过 class 方法我布局了,但是会直接return input 结果。那么有什么意义呢?这样我就无法加载上面提到的各种 <select> 标签的选项。

所以我想做这样的事情:

<result name="input" type="chain">
  <param name="actionName">Class_method</param>
</result>

但是通过这个技巧我丢失了所有错误消息,即 hasFieldErrors() returns 总是错误的。

我该如何解决?

一个选项:

public class Foo extends ActionSupport {
    public string myAction() { return SUCCESS; }
    public void validateMyAction() { // executed after XML validation
        // other complex validation here if needed
        if (hasErrors()) {
            // repopulate form data from DB here
        }
    }
}

hasErrors() 方法来自 ActionSupport 实现的 ValidationAware 接口。

另一种选择是对 input 结果进行重定向并使用 message store interceptor 保留操作消息

很多问题,但都很好。

  1. Conversion and validation errors forces the Workflow interceptor to trigger the INPUT result,工作流将执行 INPUT 结果 而不是 到达操作方法 (execute()或其他)。

  2. 如果您需要填充一些静态数据,例如选择框源,这些数据在 INPUT 结果的情况下也必须可用,您应该将该加载放在 prepare()方法,并使您的操作实现 Preparable 接口。此方法在返回 INPUT 结果之前由 Interceptor 运行 as described in the official docs.

  3. 避免使用 chain 结果。官方不推荐使用多年。

  4. 如果你想防止重复提交(通过在提交页面并呈现结果后按 F5),你可以使用 PRG patternredirectAction 结果.但是,这样,您会遇到与 chain 结果相同的问题:消息(和参数)将丢失。

  5. 要在重定向中保留错误消息、操作错误和字段错误,您可以使用名为 Message Store 拦截器的预定义拦截器,您必须将其包含在堆栈中,因为 defaultStack 不包括它。我已经描述了 .

  6. 如果您决定将 Message Store 与 PRG 一起使用,则还有更多注意事项,太长无法写在这里,但将来可以解释,关于防止由于 Field Error -> INPUT -> PRG -> Retrieve Field Error -> INPUT -> etc... 将在第 10 次递归附近被浏览器阻止...但这是另一回事了。