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

时间:2016-04-13 12:47:04

标签: java validation jsp struts2 interceptorstack

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

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)没有。提前谢谢。

2 个答案:

答案 0 :(得分:2)

阅读how the INPUT result works并放弃了除了问题之外的任何设计模式(除了问题之外的任何内容都没有添加任何内容),请注意:

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

为了防止这种情况,如果你想继续使用PRG模式(以及重定向),你可以使用hide themselves in the middle of the Interceptor Stack来为重定向存储和检索消息;只需定义一个包含它的拦截器堆栈,它就能解决你的问题。

或者像MessageStore Interceptor那样做一次。

答案 1 :(得分:1)

这是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>

这样,验证消息就会正确显示。当我使用redirectAction类型input时,邮件正在消失。看起来defaultStack完成了工作。

相关问题