3

我正在使用基于 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 比这个 urlhttp://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

4 回答 4

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>

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

因此,您应该向您的操作类添加一个 validate() 方法,该方法将删除 strut 愚蠢地发现的验证错误:

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(),然后调用 MyStudent 对象的 set"FieldName"。之后,它通过 xml 验证器验证学生对象,然后调用您的验证方法。

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

希望这可以帮助!!!

于 2013-05-09T21:15:38.557 回答
0

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

于 2012-10-08T07:49:11.253 回答
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>

这是验证拦截器的文档。

于 2012-10-07T04:08:26.240 回答
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>
于 2012-10-07T21:05:08.353 回答