1

情况如下:

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

问题如下:如果我使用一个xml文件,表单字段有一些错误,struts框架并没有通过我布置的类方法,而是直接返回input结果。那么有什么意义呢?这样我就无法加载各种选项<select>我上面提到的各种标签的选项。

所以我想做这样的事情:

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

但是有了这个技巧,我会丢失所有错误消息,即hasFieldErrors()总是返回假。

我该如何解决?

4

2 回答 2

1

很多问题,虽然都很好。

  1. 转换验证错误强制Workflow拦截器触发INPUT结果,工作流将执行INPUT结果而不是到达操作方法(execute()或其他)。

  2. 如果您需要填充一些静态数据,例如选择框源,在结果的情况下也必须可用INPUT,您应该将该加载放在一个prepare()方法中,并让您的操作实现Preparable接口。此方法在返回 INPUT 结果之前由 Interceptor 运行,如官方文档中所述

  3. 避免使用chain结果。多年来,官方一直不鼓励这种做法。

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

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

  6. 如果您决定将消息存储与 PRG 一起使用,还有更多考虑因素,这里写得太长了,但将来可以解释,关于防止无限递归,因为Field Error -> INPUT -> PRG -> Retrieve Field Error -> INPUT -> etc...这将在第 10 次递归附近被浏览器阻止。 ..但这是另一个故事。

于 2016-06-15T10:14:50.013 回答
0

一种选择:

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()方法来自实现的ValidationAware接口ActionSupport

另一种选择是对input结果进行重定向并使用消息存储拦截器来保留操作消息

于 2016-06-15T09:48:41.970 回答