首页 > 代码库 > spring mvc表单的展现、输入处理、校验的实现

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模板):

<form method="post">
    <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>
View Code

 

② 然后,在页面上填入值,点击提交,如果不指定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="http://www.mamicode.com/{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坐标:

<dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-validator</artifactId>
                <version>4.2.0.Final</version>
                <!-- <optional>true</optional> -->
            </dependency>

 

OK,看下User的校验规则

public class 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后提交:

 

2、输入特殊字符的Username后提交:

4、输入正常的Username后提交(没传count,因此没有值):