Spring MVC之表单标签库和校验注解
Spring MVC 表单标签库
- Handler
1 package com.wiggin.controller;
2
3 import com.wiggin.entity.Student;
4 import org.springframework.stereotype.Controller;
5 import org.springframework.web.bind.annotation.GetMapping;
6 import org.springframework.web.bind.annotation.RequestMapping;
7 import org.springframework.web.servlet.ModelAndView;
8
9 @Controller
10 @RequestMapping("/tag")
11 public class TagHandler {
12
13 @GetMapping("get")
14 public ModelAndView get(){
15 ModelAndView modelAndView = new ModelAndView("tag");
16 Student student = new Student(1L,"张三",18);
17 modelAndView.addObject("student",student);
18 return modelAndView;
19
20 }
21 }
- JSP
1 <%--
2 Created by IntelliJ IDEA.
3 User: Administrator
4 Date: 2020/8/5
5 Time: 19:17
6 To change this template use File | Settings | File Templates.
7 --%>
8 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
9 <%@ page isELIgnored="false" %>
10 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
11 <html>
12 <head>
13 <title>Title</title>
14 </head>
15 <body>
16 <h1>学生信息</h1>
17 <form:form modelAttribute="student">
18 学生ID:<form:input path="id"/></br>
19 学生姓名:<form:input path="name"/></br>
20 学生年龄:<form:input path="age"/></br>
21 <input type="submit" value="提交">
22 </form:form>
23 </body>
24 </html>
1.前缀与定义JSTL标签库相似,前缀可以自定义,通常定义为form
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
2.将form表三与模型数据进行绑定,通过modelAttribute的值设置为模型数据对应的key值
Handler:modelAndView.addObject("student",student);
JSP:<form:form modelAttribute="student">
3.form表单完成绑定后,将模型数据的值定义到各个标签中,通过设置path属性完成,与Handler属性名一致。
学生ID:<form:input path="id"/></br>
学生姓名:<form:input path="name"/></br>
学生年龄:<form:input path="age"/></br>
常用的表单标签
- form
<form:form modelAttribute="student">
渲染的是Html中的<form></form>,通过modelAttribute属性绑定具体的模型数据
- Input
<form:input path="id"/></br>
渲染的是Html中的<input type="text"/>。form标签绑定的是模型数据input绑定是模型数据的属性值,通过path映射,支持级联。
<form:input path="address.name"/></br>
- password
<form:password path="password"/></br>
渲染的是Html中的<input type="password"/>。form标签绑定的是模型数据input绑定是模型数据的属性值,通过path映射,但不会再页面显示。
- checkbox
<form:checkbox path="hobby" value="读书"/></br>
渲染的是Html中的<input type="checkbox"/>。form标签绑定的是模型数据input绑定是模型数据的属性值,通过path映射,可以绑定bool,集合,数组。
如果绑定一个bool值,如果给定的属性为True,则checkbox选中。
如果绑定一个集合或者数组,如果给定的属性值与value值相等,则checkbox选中。
1 String [] hobby={"读书","看电影","玩游戏"};
2 List<String> hobby = Arrays.asList("读书","看电影","玩游戏");
3 Student student = new Student(1L,"张三",18,true,hobby);
----JSP----
1 爱好:<form:checkbox path="hobby" value="读书"/>
2 <form:checkbox path="hobby" value="看电影"/>
3 <form:checkbox path="hobby" value="玩游戏"/>
4 <form:checkbox path="hobby" value="打篮球"/>
- checkboxes
<form:checkboxes items="${student.hobby}" path="selectHobby"/></br>
渲染的是Html中的<input type="checkbox"/>。form标签绑定的是模型数据input绑定是模型数据的属性值,item绑定的是集合中的数据,path绑定的是被选中的数据
1 List<String> hobby = Arrays.asList("读书","看电影","玩游戏","打篮球","弹吉他");
2 List<String> selecthobby = Arrays.asList("读书","看电影","玩游戏");
3 Student student = new Student(1L,"张三",18,true,hobby,selecthobby);
----JSP----
1 爱好:<form:checkboxes path="selectHobby" items="${student.hobby}"/>
- radiobutton 和 radiobuttons
渲染的是Html中的<input type="radiobutton/radiobuttons"/>。用法与checkbox一致。
- select
<form:select items="${student.hobby}" path="selectHobby"/></br>
渲染的是Html中的<input type="select"/>。用法与checkbox一致,可以单独使用,可以与form:options一起使用。
- textarea
渲染的是Html中的<textarea/>,path绑定属性值,作为文本输入值
1 信息:<form:textarea path="introduce"/></br>
- errors
处理错误信息,一般在数据校验,该标签一般结合Spring MVC的验证器结合起来使用。
Spring MVC数据效验
Spring MVC提供了两种校验方式:1.基于Vailidator接口,2.使用Annotation JSR-303标准进行校验。
基于Validator接口的方式需要自定义Validator验证器,每一条数据的验证规则需要开发者手动完成,使用AnnotationJSR303标准则不需要自定义验证器,通过注解的方式直接在实体类中添加每个属性的验证规则,这种方式更加方便,实际开发中推荐使用。、
1.基于Validator接口的方式
- 实体类Account
1 package com.wiggin.entity;
2
3 import lombok.Data;
4
5 @Data
6 public class Account {
7 private String name;
8 private String password;
9
10 }
- 自定义验证器AccountValidator,实现Validator接口
1 package com.wiggin.validator;
2
3 import com.wiggin.entity.Account;
4 import org.springframework.validation.Errors;
5 import org.springframework.validation.ValidationUtils;
6 import org.springframework.validation.Validator;
7
8 public class AccountValidator implements Validator {
9 // 验证类,判断是否支持,如果返回false不验证,反之
10 @Override
11 public boolean supports(Class<?> aClass) {
12 // 判断是否是个类
13 return Account.class.equals(aClass);
14 }
15
16 @Override
17 public void validate(Object o, Errors errors) {
18 ValidationUtils.rejectIfEmpty(errors,"name",null,"姓名不能为空");
19 ValidationUtils.rejectIfEmpty(errors,"password",null,"密码不能为空");
20 }
21
- 控制器ValidatorHandler
1 package com.wiggin.controller;
2
3 import com.wiggin.entity.Account;
4 import org.springframework.stereotype.Controller;
5 import org.springframework.ui.Model;
6 import org.springframework.validation.BindingResult;
7 import org.springframework.validation.annotation.Validated;
8 import org.springframework.web.bind.annotation.GetMapping;
9 import org.springframework.web.bind.annotation.PostMapping;
10 import org.springframework.web.bind.annotation.RequestMapping;
11
12 @Controller
13 @RequestMapping("/validator")
14 public class ValidatorHandler {
15
16 @GetMapping("/login")
17 public String login(Model model){
18 model.addAttribute("account",new Account());
19 return "login";
20 }
21
22 @PostMapping("/login")
23 public String login(@Validated Account account, BindingResult bindingResult){
24 if (bindingResult.hasErrors()){
25 return "login";
26 }
27 return "index";
28 }
29
30 }
- JSP
1 <%--
2 Created by IntelliJ IDEA.
3 User: Administrator
4 Date: 2020/8/6
5 Time: 15:45
6 To change this template use File | Settings | File Templates.
7 --%>
8 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
9 <%@ page isELIgnored="false" %>
10 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
11 <html>
12 <head>
13 <title>Title</title>
14 </head>
15 <body>
16 <form:form modelAttribute="account" action="/validator/login" method="post">
17 姓名:<form:input path="name"/><br/>
18 密码:<form:input path="password"/><br>
19 <input type="submit" value="登录">
20 </form:form>
21 </body>
22 </html>
- Springmvc.xml配置验证器
1 <!-- 基于Validator的配置 -->
2 <bean id="accountValidator" class="com.wiggin.validator.AccountValidator"></bean>
3 <mvc:annotation-driven validator="accountValidator"></mvc:annotation-driven>
2.基于Annotation JSR303接口的方式
使用Annotation JSR303标准进行验证,需要导入支持这种标准的依赖的jar文件,我们这里使用hibermate Validator
- pom.xml
1 <!-- JSR303 -->
2 <dependency>
3 <groupId>org.hibernate</groupId>
4 <artifactId>hibernate-validator</artifactId>
5 <version>5.3.6.Final</version>
6 </dependency>
7
8 <dependency>
9 <groupId>javax.validation</groupId>
10 <artifactId>validation-api</artifactId>
11 <version>2.0.1.Final</version>
12 </dependency>
13 <dependency>
14 <groupId>org.jboss.logging</groupId>
15 <artifactId>jboss-logging</artifactId>
16 <version>3.3.2.Final</version>
17 </dependency>
- 通过注解的方式在实体类中进行验证
1 package com.wiggin.entity;
2
3 import lombok.Data;
4 import org.hibernate.validator.constraints.NotEmpty;
5
6 import javax.validation.constraints.Size;
7
8 @Data
9 public class Person {
10 @NotEmpty(message = "用户名不能为空")
11 private String username;
12 @Size(min = 6,max = 12,message = "密码的长度必须为6-12位")
13 private String password;
14 }
- 控制器ValidatorHandler
1 @GetMapping("/register")
2 public String register(Model model){
3 model.addAttribute("person",new Person());
4 return "register";
5 }
6 @PostMapping("/register")
7 public String register(@Valid Person person,BindingResult bindingResult){
8 if (bindingResult.hasErrors()){
9 return "register";
10 }
11 return "login";
12 }
- Springmvc.xml配置验证器
1 <!-- 单独配置annotationJSR303才能生效 -->
2 <mvc:annotation-driven></mvc:annotation-driven>
校验注解详解:
@Null 被注解元素必须为null
@NotNull 被注解元素不能为null
@Min(value) 被注解元素必须为数字,其值必须大于等于指定最小值
@Max(value) 被注解元素必须为数字,其值必须小于等于指定最小值
@email 被注解元素必须电子邮箱地址
@Pattern 被注解元素符合正则表达式
@Length 被注解元素大小必须在指定范围之内
@NotEmpty 被注解元素非空