【问题标题】:Struts2 validation is not working properly, validation error messages not shownStruts2 验证无法正常工作,未显示验证错误消息
【发布时间】:2016-08-04 13:50:55
【问题描述】:

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

struts.properties

struts.ui.theme=simple

我的行动

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

【问题讨论】:

  • getModel() - 使用模型驱动?停止使用它。
  • @Aleksandr M:如果这与我的问题有关,我会 :)
  • redirect 将删除所有错误。不要重定向。通常redirectAction 应该用于重定向到操作。

标签: java validation jsp struts2 interceptorstack


【解决方案1】:

在阅读了how the INPUT result works 并放弃了 ModelDriven 设计模式之后,除了问题之外什么都不会增加您的编程体验,这可能很容易hide themselves in the middle of the Interceptor Stack,请注意:

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

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

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

【讨论】:

  • 感谢安德里亚提供的有用的东西。我放弃了 ModelDriven,并在 struts.xml 中尝试了这个:在操作 saveOrUpdateUser 中添加,使用 STORE 操作和 defaultStuck 存储拦截器。然后我将输入类型更改为redirectAction。我错过了什么?提交具有空名称的表单后,重定向到具有空字段的同一页面。没有显示验证错误。
  • defaultStuck 非常有趣:D
  • 顺便说一句:在 struts.xml 中定义你的 (myStack) 堆栈,该堆栈是通过复制分解的 defaultStack (取自此处 struts.apache.org/docs/struts-defaultxml.html )并将消息存储拦截器添加到其中而创建的。然后使用default-interceptor-ref 指定 myStack 是每个未定义堆栈本身的操作的默认拦截器。然后将其设置为 AUTOMATIC:它将适用于每个重定向,可能不会给您带来缺点。如果它仍然不起作用,请使用更新的代码编辑问题,我们会看到
  • 或者像文档中的示例一样执行一次:struts.apache.org/docs/message-store-interceptor.html
  • 是的@manu,请随时编辑我的答案,添加帮助您使其正常工作的评论。请不要忘记为有用的答案投票,谢谢 - 编辑我现在看到你已经回答了自己,甚至更好;)
【解决方案2】:

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

<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 完成了这项工作。

【讨论】:

  • 检查以在 struts.xml 的顶部设置您的拦截器,这样您就不必将它们分别放在每个操作上。
猜你喜欢
  • 2023-04-06
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 2019-06-11
  • 2020-06-20
  • 1970-01-01
相关资源
最近更新 更多