【问题标题】:struts2 disable validation on page loadstruts2 在页面加载时禁用验证
【发布时间】:2012-09-27 18:36:33
【问题描述】:

我正在使用基于 xml 的验证。

问题:

我不想在第一次加载页面时对输入表单执行验证,因为所有字段都是空白供用户填写。假设注册表单添加新学生。一旦我单击按钮,它就会执行。

注意: 即使我对按钮单击进行验证,我也希望保留相同的 url。新的表单 URL 是 http://localhost:8000/Struts2_Spring_Crud/student/add,如果验证失败,甚至 URL 应该相同。

struts.xml

<default-action-ref name="list"/>
        <action name="list" class="com.myapp.actions.StudentAction" method="getAllStudents">
            <!--<interceptor-ref name="myInterceptor"/>-->
            <result name="success" type="tiles">/student.list.tiles</result>
        </action>

    <!--<action name="add">
                <result type="tiles">/student.edit.tiles</result>
            </action>-->
            <action name="add" class="com.myapp.actions.StudentAction" method="insertOrUpdateStudent">
                <result name="success" type="redirectAction">list</result>
                <result name="input" type="tiles">/student.edit.tiles</result>
            </action>

输入表单

<s:fielderror/>
    <s:form action="add" method="POST">

        <s:label name="name" value="Name *"/>
        <s:textfield name="student.name" value="%{student.name}"/>
        <s:fielderror fieldName="student.name"/>

        <s:label name="age" value="Age *"/>
        <s:textfield name="student.age" value="%{student.age}"/>

        <s:submit name="saveForm" value="#title"/>
    </s:form>

已编辑:如果我添加 excludeMethods 而不是此 URL http://localhost:8000/Struts2_Spring_Crud/student/add 将我发送到 http://localhost:8000/Struts2_Spring_Crud/student/list 并且我的添加表单未显示。

 <action name="add" class="com.myapp.actions.StudentAction" method="insertOrUpdateStudent">
            <interceptor-ref name="validation">
                <param name="excludeMethods">input,back,cancel,browse</param>
            </interceptor-ref>
            <result name="success" type="redirectAction">list</result>
            <result name="input" type="tiles">/student.edit.tiles</result>
        </action>

【问题讨论】:

    标签: jakarta-ee struts2


    【解决方案1】:

    我遇到了这个问题,我终于找到了一种解决方法,可以解决您只希望一个操作来处​​理所有事情并在浏览器上保持相同 URL 的情况:

    http://localhost:8000/Struts2_Spring_Crud/student/add

    struts.xml 只会是:

    <action name="add" class="com.myapp.actions.StudentAction" method="insertOrUpdateStudent">
        <result name="success" type="redirectAction">list</result>
        <result name="input" type="tiles">/student.edit.tiles</result>
    </action>
    

    第一次加载页面时,首先调用与“添加”操作关联的类。然后班级中的现场学生为空。然后你可以依靠这个事实来清除 strut 所做的验证。

    所以你应该在你的动作类中添加一个 validate() 方法来删​​除那些愚蠢地发现的验证错误:

    public class StudentAction extends ActionSupport{
       MyStudent student;
    
       public MyStudent getStudent(){
           return student;
       }
       public void setStudent(MyStudent student){
           this.student=student;
       }
    
       public String execute(){
           if (student==null) return INPUT; //First time page loads. We show page associated to INPUT result.
           return SUCCESS; // If student is not null and execute was called it means that everything went fine, we should return SUCCESS and go to the page associated to the SUCCESS result.
       }
    
       public String insertOrUpdateStudent(){
           if (student==null) return INPUT;  
           return SUCCESS;   
       }
    
     .....
       @Override
       public void validate(){ //
          if (student==null){ //First time page loads, student is null.
             setFieldErrors(null); //We clear all the validation errors that strut stupidly found since there was not form submission.
          }
       }
    }
    

    Struts 首先通过 xml 验证器验证表单,然后调用您的 validate 方法。

    当您在表单上点击提交时,strut 创建一个 MyStudent 对象,调用 setStudent(...) 然后它逐个字段调用 getStudent() 然后调用 set"FieldName" MyStudent 对象。之后,它通过 xml 验证器验证学生对象,然后调用您的 validate 方法。

    如果在调用 validate() 方法后仍有错误,则 strut 将返回“INPUT”结果,而无需在您的情况下调用 execute() 或 insertOrUpdateStudent() 方法。

    希望对你有帮助!!!

    【讨论】:

    • 恭喜你第一次 +1。
    【解决方案2】:

    我正在使用基于注释的验证。在我的 struts.xml 中有

    <interceptor-ref name="validation">
      <param name="validateAnnotatedMethodOnly">true</param>
    </interceptor-ref>  
    

    您可能想尝试为基于 xml 的验证添加 excludeMethods

    <interceptor-ref name="validation">
      <param name="excludeMethods">input,back,cancel,browse</param>
    </interceptor-ref>
    

    这是validation interceptor 的文档。

    【讨论】:

    • 谢谢。我已经编辑了我的问题。您的解决方案添加 excludeMethods 将我发送到我在包上的默认 url。在问题中添加默认操作和详细信息。
    【解决方案3】:

    我总是使用另一个指标来做到这一点:

    JSP:

    <s:form action="add">
        <s:hidden name="postBack" value="true"/>
        <%-- your fields --%>
    </s:form>
    

    行动:

    public String execute(){
        if(!postBack){
            return OPEN;
        } else if(!validate()) {
            return INPUT;
        } else {
            save();
            return SUCCESS;
        }
    }
    

    配置:

    <action name="add" class="com.myapp.actions.StudentAction" method="insertOrUpdateStudent">
        <result name="success" type="redirectAction">list</result>
        <result name="input" type="tiles">/student.edit.tiles</result>
        <result name="open" type="tiles">/student.edit.tiles</result>
    </action>
    

    【讨论】:

    • 谢谢。有了你的解决方案,我仍然可以验证所有字段,因为使用了 xml 验证。如何阻止它?对于你的 if 条件 !validate(),你要我添加手动验证吗?
    • 是的,那是手动验证,如果你使用的是struts2的验证,你就不必这样做了!
    • 不能解决我的问题。在 xml 验证中验证所有字段之前,不会执行执行操作。对于手动可以是解决方案。
    【解决方案4】:

    您可以使用fieldexpression validator http://struts.apache.org/2.x/docs/fieldexpression-validator.html 进行条件验证,例如基于id 等隐藏字段。

    【讨论】:

    • 对不起,这个答案与我在问题中提出的问题无关。
    • @Rashid 您希望您的操作仅在提交时得到验证,对吧?然后你可以使用一些隐藏字段,正如 Jaiwo99 和我所建议的那样,表明你的动作需要验证。使用fieldexpression validator,您可以编写条件验证。
    • 哦,嗯。我知道了。好点子。让我多玩一下,然后会回复你。谢谢
    猜你喜欢
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    相关资源
    最近更新 更多