Spring-MVC:需要最简单的表单处理,绑定和验证示例

Dav*_*rks 7 java data-binding validation spring-mvc

我有一个表格:

<form action="/processform">
   <input name="firstname" value="john" />
   <input name="lastname" value="doe" />
</form>
Run Code Online (Sandbox Code Playgroud)

我有一个Person对象:

public class Person {
   private String firstname;
   private String lastname;
   // ... getters & setters ...
}
Run Code Online (Sandbox Code Playgroud)

我想接收这些数据,对其进行验证,然后将其发布到数据存储区.

如何编写控制器来执行此操作?我理解我可以将参数作为请求参数传递,但我认为"正确"的方法是以某种方式将数据从表单绑定到Person对象,然后在控制器中接收Person对象并调用Validate对象配置为接收Person对象.

经过多次阅读,这一步令我感到困惑.有人能告诉我"绑定"数据需要什么,"验证"(例如验证器),并"处理"数据(例如控制器,特别是作为参数传递给它的内容)?

Dav*_*rks 12

这是我正在寻找的答案,我不明白Spring默认会从表单提交中获取所有参数(例如"firstname"和"lastname"),并可以通过调用为您创建对象这些参数的setter方法.

控制器:

@Controller
public class MyFormProcessor {
   @RequestMapping("/formsubmit")
   public String handleForm(@Valid Person person, BindingResult errors, Map<String,Object> model){
      // ...handle form...
   }
}
Run Code Online (Sandbox Code Playgroud)

Spring在调用handleForm此请求之前基本上做了以下魔术(显然是以比我描述的这个简单示例更可扩展的方式):

Person person = new Person();
person.setFirstname( request.getParameter("firstname") );
person.setLastname( request.getParameter("lastname") );
handleForm(person, anErrorsObject, new Model());
Run Code Online (Sandbox Code Playgroud)

对于验证,您可以创建自己的验证器(我不会在这里提及任何内容),或者如果在类路径中包含Hibernate Validator,那么您可以注释Person该类(下面的示例)并在您添加@Valid注释时如我所描述的那样在上面的示例中,Hibernate验证器将根据这些注释验证类,并将任何错误发布到错误对象(BindingResult对象是Springs的扩展Errors,对于简单的示例,Errors对象是有趣的组件).

JSR-303验证带注释的Person类(与@Valid选项一起使用):

public class Person {
   @NotNull
   @Size(min=3, max=20)
   private String firstname;

   @NotNull
   @Size(min=3, max=20)
   private String lastname;

   // ... getters & setters ...
}
Run Code Online (Sandbox Code Playgroud)