验证表单是否已更改

时间:2011-04-20 06:34:25

标签: java spring spring-webflow

我正在编写一个验证器,需要测试弹簧形式对象是否已经改变。

在验证程序中,如果未对表单进行任何更改,则应显示错误。

有弹簧机制吗?

这是因为我提交时会进行非常昂贵的webservice更新调用,如果没有进行任何更改,我需要阻止进行webservice调用。

干杯。

3 个答案:

答案 0 :(得分:2)

我不知道有任何内置的Spring机制来处理这个问题。我将保存原始对象和修改对象的副本。我会适当地覆盖Form.equals()方法(可能委托给org.apache.commons.lang.builder.EqualsBuilder.reflectionEquals(),如果所有字段都是基元/字符串)并使用Form.equals()来检查表格是否有变化。

我在这里看到了两个不同的响应,这意味着重写“hashCode”方法是一个很好的方法。它不在hashCode()的合同中来保证不平等,这可能会导致问题。一定要重写equals()。当然,它是哈希冲突的万亿分之一,但是当你试图检查两个对象是否不同时,单独依赖hashCode()的设计很差。

答案 1 :(得分:1)

重写hashCode()函数以确保在表单值更改时返回不同的值。保存函数的返回值并测试它是否已更改。

public class Person {
  String first;
  String last;
  int prevHash;
  @Override
  public int hashCode() {
    // does not include the value of currHash
    String stringHash = String.format("%1$-29s%2$-29s", first,last);
    return stringHash.hashCode();
  }
}

public class PersonValidator  implements Validator {
  public void validate(Object obj, Errors e) {
    Person p = (Person) obj;
    if (p.hashCode() == p.getPrevHash()) {
      e.reject("person", "unchanged");
    } 
  }
  ...
}

我认为没有Spring提供的验证测试来检查表单支持对象是否已更改

请注意,在允许用户提交表单之前,您可以在客户端执行其他测试。

答案 2 :(得分:0)

如果表单已更改,请尝试基于客户端检查的不同方法。 从用户界面/ jQuery开始:

   $(document).ready(function() {
        var isFormChanged = false;
        var isConfirmed = false;
        $("form :input").change(function() {
            console.log($(this).attr('name'));
            isFormChanged = true;
        });

        $("#storeForm").submit(function(event) {
            if (!isConfirmed) {
                event.preventDefault();
            }
            if (isFormChanged) {
                console.log("Form has changed");
                $(":submit").addClass("btn-danger");
                $(":submit").text("Confirm");
                isConfirmed = true;
            }
        });
    });

您还可以在表单中创建隐藏字段,以便将信息发送回Spring,以便在服务器端再次检查所有这些信息。它比将所有表单数据推回服务器更快,只是为了检查每次都有变化。