情况如下:
'products': products
标记,其中包含从DB加载的选项。问题如下:如果我使用XML文件并且表单字段中存在一些错误,那么struts框架不会通过我列出的类方法,但它将直接返回{{ 1}}结果。那么重点是什么?通过这种方式,我无法为上面提到的各种<select>
标记加载选项。
所以我想做这样的事情:
input
但是这个技巧我丢失了所有的错误消息,即<select>
总是返回false。
我该如何解决?
答案 0 :(得分:1)
很多问题,但都很好。
Conversion and validation errors forces the Workflow
interceptor to trigger the INPUT
result,工作流程将执行INPUT
结果而非到达操作方法(execute()
或其他)。
如果您需要填充一些静态数据,例如selectboxes来源,在INPUT
结果的情况下也必须可用,您应该将该加载放在prepare()
方法中,并制作您的操作实现了Preparable
接口。在返回INPUT结果as described in the official docs之前,此方法由Interceptor运行。
避免使用chain
结果。多年以来,它正式受到劝阻。
如果您想阻止双重提交(在提交页面并提交结果后按F5),您可以使用PRG pattern和redirectAction
结果。但是,这样,您会遇到chain
结果的相同问题:消息(和参数)将丢失。
要保留重定向中的错误消息,操作错误和字段错误,您可以使用名为Message Store
Interceptor的预定义拦截器,您必须将其包含在堆栈中,因为defaultStack
不会不包括它。我已经描述了how it works in this answer。
如果您决定将消息存储与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来保留操作消息