spring mvc表单的展现、输入处理、校验的实现
之前已经实现了spring mvc的入门例子及如何处理带参数的请求Controller编写。本文主要记录:
1)重定向请求
2)处理路径中含有变量的请求
3)使用JSR-303进行校验
① 首先,编写一个方法实现一个表单的展现:
//params 可限制该方法只对包含特定参数的请求进行处理
@RequestMapping(method=RequestMethod.GET,params="new")
public String createForm(Model model){
model.addAttribute("user", new User());
return "/user/edit";
}
注意到,params="new",这意味着该方法处理的请求Url:xxx/home?new
(home是定义Controller的请求路径)
这是跳转的页面定义(使用了velocity模板):
<div>
<label for="userName">userName:</label>
<input name="userName" value="$!user.userName">
<span>$!br.getFieldError("userName").getDefaultMessage()</span>
</div>
<div>
<label for="email">Email:</label>
<input name="email" value="$!user.email">
</div>
<div>
<label for="age">age:</label>
<input name="age" value="$!user.age">
</div>
<button type="submit">Submit</button>
</form>
② 然后,在页面上填入值,点击提交,如果不指定form的提交路径,则默认是xx/home(Controller的请求路径),此时需要编写处理表单的输入方法:
@RequestMapping(method=RequestMethod.POST)
//@Valid是对user参数的验证
public String addForm(@Valid User user,BindingResult br,Model model){
if(br.hasErrors()){
model.addAttribute("br",br);
return "/user/edit";
}
userService.saveUser(user);
return "redirect:/home/"+user.getUserName();
}
a.在输入参数中,对User使用了@Valid,表示在user传入之前会进行校验,这是使用了JSR-303的校验规则,如何定义校验规则呢?在后面④-->>
b.在方法处理上,
如果校验失败,则会将BindingResult传入到方法中,通过br.hasErrors进行判断是否校验成功,如果失败,将br放在model中,以便在edit.vm页面中显示,这就是在页面edit.vm中,有<span>$!br.getFieldError("userName").getDefaultMessage()</span>(页面只写了这一处)
c.通过重定向到请求:/home/user.getUserName.路径中含有变量,因此需要定义处理请求路径变量的方法。
③ 定义处理请求路径变量的方法
//处理带有路径变量的请求
@RequestMapping(value="/{username}",method=RequestMethod.GET)
public String showUser(@PathVariable String username,Model model){
model.addAttribute("username", username);
return "home";
}
在@RequestMapping中,value使用了占位符{username},在参数String
username使用了@PathVariable,表示的是路径的变量,说明该方法处理的请求为:xx/home/somebodyName,如请求的url为xxx/home/hahaha,则方法中的username为hahaha
④ 使用JSR-303进行校验
之前使用了@Valid User
user,校验的是user对象,因此需要对User进行编写校验规则。使用的是JSR-303,在使用前,需要引入相关的jar包,如果是maven工程,需要定义maven坐标:
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.2.0.Final</version>
<!-- <optional>true</optional> -->
</dependency>
OK,看下User的校验规则
@Range(min=1,max=10,message="userName must be between 1 and 10 character long")
@Pattern(regexp="^[a-zA-z0-9]+$",message="userName Invalid")
private String userName;
private String email;
private int age;
//setter and getter...
}
运行工程,记录下效果:
1、请求展示表单的路径,输入过长的Username后提交: