【问题标题】:Struts 2 skip validation at first page loadStruts 2 在第一页加载时跳过验证
【发布时间】:2012-10-14 06:38:12
【问题描述】:

我有一个表单需要在提交时进行验证。我已将public void validate() 添加到我的动作课程中。但是,当表单尚未提交时,即使在初始页面加载时也会显示错误。

我已经阅读了thisthis,但没有解决我的问题。实现像在第一次加载表单时跳过验证这样简单的事情真的那么难吗? :(

我在动作类中使用手动验证。

struts.xml

<action name="login" class="community.action.LoginAction">
    <result name="success" type="redirect">/forums/list</result>
    <result name="login">/WEB-INF/login.jsp</result>
    <result name="input">/WEB-INF/login.jsp</result>
</action>

LoginAction.java

public void validate() {
    //validation rule
    addActionError("Error message");
}

public String execute() {
    if (//username and password correct) {
        return SUCCESS; //redirect to forums page
    } else {
        return LOGIN;
    }
}

目前即使没有提交表单也会显示错误。

我尝试在execute() 上使用@SkipValidation 注释,但这完全可以防止显示错误,即使在提交表单之后也是如此。

【问题讨论】:

    标签: validation struts2


    【解决方案1】:

    您可以在 LoginAction 类中使用另一种方法来返回带有 @SkipValidation 的 Input 的 login.jsp

    LoginAction.java

         public String execute()
            {       
                 if (//username and password correct) {
                   return SUCCESS; //redirect to forums page
                 } else {
                 return LOGIN;
                  }     
            }
    
        public void validate()
         {
                 //validation rule
                  addActionError("Error message");
         }
    
    
        @SkipValidation
        public String loginForm()
         {
                return INPUT;
         }
    

    现在验证将只发生在执行方法上。首先请求应该来到 loginForm 方法。为此,在配置中稍作修改

    struts.xml

    <action name="login_*" class="community.action.LoginAction"  method="{1}">
        <result name="success" type="redirect">/forums/list</result>
        <result name="login">/WEB-INF/login.jsp</result>
        <result name="input">/WEB-INF/login.jsp</result> </action>
    

    action 元素中的方法="{1}" 条目将用于检查请求的方法,如果请求中未指定任何内容,则将调用 execute() 方法,否则将调用提到的方法。请注意,操作名称已更改为 login_*

    在 JSP 中提及方法名称:


      -------
      <s:submit name="SubmitButton" value="Click To Login" action="login_loginForm"/>
    


    在上面的提交 UI 元素中提到了 login_loginForm。这里 login_ 指的是动作名称,而 loginForm 指的是要调用的方法。希望这会有所帮助

    【讨论】:

      【解决方案2】:

      您需要使用不同的操作名称。一个用于查看表单,另一个用于提交。

      【讨论】:

      • 我也考虑过这一点,但是用户仍然可以键入“处理”地址并在不提交表单时访问显示错误的页面。我同意 - 这是一种“变通”,但并不理想。有什么解决办法吗?
      • 您所说的“变通”究竟是什么意思?通过“提交”url访问带有表单的页面的解决方案取决于你想如何处理它?
      【解决方案3】:

      这意味着,我已经在第一页加载期间调用了该操作。解决此问题的最简单方法是将您的操作从 login 重命名为 loginAction 或其他名称。

      【讨论】:

      • 我同意,但请参阅我对@Aleksandr M 回答的评论。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 2015-05-03
      相关资源
      最近更新 更多