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----

爱好:<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 被注解元素非空

   

 

原文地址:https://www.cnblogs.com/wigginess/p/13447458.html