Struts2 验证工作不正常,未显示验证错误消息

Struts2 validation is not working properly, validation error messages not shown

首先,我使用简单的主题,但即使没有它,也会发生相同的行为(页面格式除外)。当我提交表单时,名称字段变空并重定向到 register.jsp 而不显示验证错误。检查日志或使用调试器后,似乎验证工作正常并且服务器日志消息按预期写入。我会 post 通用代码。

struts.properties

struts.ui.theme=simple

MyAction

private User user = new User()    // getter and setter

@Inject
transient UserDAO userDAO;

@Override
public User getModel() {
    return user;
}

public void validate(){

    LOG.debug("NAME VALIDATION " + user.getName());
    if("".equals(user.getName())){
        addFieldError("user.name", "Name can't be empty");
        LOG.debug("Validation Error on name");
    }       
}

已使用调试器进行检查,验证方法正在运行并且已写入日志。

struts.xml

<package name="users" extends="struts-default">
    <action name="registerUser" method="prepareRegister" class="com.test.MyAction">
        <result name="success">/register.jsp</result>
    </action>

    <action name="saveOrUpdateUser" method="saveOrUpdate" class="com.test.MyAction">
        <result name="input" type="redirect">registerUser</result>
        <result name="success" type="redirect">listUser</result>
    </action>
</package>

register.jsp

<td>
    <s:textfield id = "userName" 
              label = "User Name" 
               name = "user.name" />
</td>
<s:fielderror fieldName = "user.name" />

随时问我澄清。我是 struts 2 的新手,我尝试了 struts 2 文档验证方式,并检查了其他教程。我不知道我是否遗漏了什么或者我有一些我没有注意到的错误配置,因为逻辑在工作,而视图部分 (jsp) 没有。提前致谢。

阅读how the INPUT result works and having abandoned the ModelDriven design pattern that adds nothing to your programming experience except problems, that might easily hide themselves in the middle of the Interceptor Stack后,请注意:

  • redirect 是重定向到外部 URL 或非 Action URL 时使用的结果,而 redirectAction 应该在重定向到 Action 时使用;
  • 重定向时,创建了一个新请求,因此旧参数(包括操作错误和消息和字段错误)丢失。

为防止这种情况发生,如果您想继续使用 PRG 模式(以及重定向),您可以使用 来为您存储和检索跨重定向的消息;只需定义一个包含它的拦截器堆栈,它就会解决你的问题。

或者像in the example from the documentation那样做一次。

这就是在 Andrea 的有用评论之后最终起作用的方法:

<action name="saveOrUpdatePlayer" method="saveOrUpdate" class="com.test.MyAction">

     <interceptor-ref name="store">
        <param name="operationMode">STORE</param>
     </interceptor-ref>
     <interceptor-ref name="defaultStack" />

     <result name="input">/register.jsp</result>
     <result name="success" type="redirectAction">listUser</result>
</action>

这样,验证消息就可以正确显示了。当我为 input 使用 redirectAction 类型时,消息消失了。看起来 defaultStack 完成了任务。