具有从DB和验证加载的字段选项的表单

时间:2016-06-15 09:35:32

标签: java validation jsp struts2 interceptorstack

情况如下:

  1. 我有一个带有表单的JSP页面。
  2. 此表单包含各种'products': products 标记,其中包含从DB加载的选项。
  3. 我想对XML文件使用验证。
  4. 问题如下:如果我使用XML文件并且表单字段中存在一些错误,那么struts框架不会通过我列出的类方法,但它将直接返回{{ 1}}结果。那么重点是什么?通过这种方式,我无法为上面提到的各种<select>标记加载选项。

    所以我想做这样的事情:

    input

    但是这个技巧我丢失了所有的错误消息,即<select>总是返回false。

    我该如何解决?

2 个答案:

答案 0 :(得分:1)

很多问题,但都很好。

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

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

  3. 避免使用chain结果。多年以来,它正式受到劝阻。

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

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

  6. 如果您决定将消息存储与PRG一起使用,还有更多的注意事项,在此处写的时间太长,但将来可以解释为防止因Field Error -> INPUT -> PRG -> Retrieve Field Error -> INPUT -> etc...引起的无限递归将在第10次递归附近被浏览器阻止......但这是另一个故事。

答案 1 :(得分: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结果进行重定向,并使用message store interceptor来保留操作消息