struts2在页面加载时禁用验证

时间:2012-10-07 03:56:24

标签: java-ee struts2

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

问题:

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

注意: 我想保留相同的网址,即使我点击按钮进行验证也是如此。新表单网址为http://localhost:8000/Struts2_Spring_Crud/student/add,如果验证失败,则网址应该相同。

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,则此网址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>

4 个答案:

答案 0 :(得分:2)

我遇到了这个问题,我终于找到了一个解决方案,你只需要一个动作来处理所有内容并在浏览器上保留相同的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>

第一次加载页面时,与&#34相关联的类添加&#34;行动首先被召唤。然后该班的田径学生为空。然后你可以依靠这个事实来清除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&#34; FieldName& #34; MyStudent对象。之后,它通过xml验证器资料验证学生对象,然后调用您的验证方法。

如果在调用validate()方法后仍然存在错误,那么strut将返回&#34; INPUT&#34;结果,而不是在你的情况下调用execute()或insertOrUpdateStudent()方法。

希望这有帮助!!!

答案 1 :(得分:0)

我正在使用基于注释的验证。在我的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的文档。

答案 2 :(得分:0)

我总是使用其他指标来执行此操作:

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>

答案 3 :(得分:0)

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