Spring – MVC 自定义验证
先决条件: Spring MVC、Spring MVC 验证
有必要在任何 Web 应用程序中验证用户输入以确保处理有效数据。 Spring MVC 框架支持使用验证API。验证 API 使用注释对用户输入施加约束,并且可以验证客户端和服务器端。它提供了标准的预定义验证器,例如 @ Min 、@ Max 、@ Size 、@ Pattern和@NotNull 。如果我们必须处理更具体的输入,spring MVC 还提供了带有自定义验证逻辑的用户定义验证器的概念。在本文中,我们将创建一个自定义验证器来验证学生门户中的学生地址。
使用自定义验证创建学生表单的步骤
首先,我们需要创建一个 maven webapp 项目,在本教程中我们将使用Eclipse IDE。现在, 选择在创建新项目时创建 maven 并添加maven webapp archetype 。输入项目的组 ID 和工件 ID,然后单击完成。
将使用pom.xml配置文件创建一个 Maven Web 项目。项目结构如下所示:
现在,让我们配置pom.xml配置文件以添加依赖项。 Maven 将获取和管理此文件中定义的所有依赖项。您将需要添加所有这些依赖项才能使用这些方法。 hibernate-validator依赖项允许表达和验证应用程序约束。
XML
4.0.0
com.gfg
SpringMvcStudentValidation
0.0.1-SNAPSHOT
war
SpringMvcStudentValidation Maven Webapp
http://www.example.com
UTF-8
1.7
1.7
junit
junit
4.11
test
org.springframework
spring-webmvc
5.1.1.RELEASE
org.apache.tomcat
tomcat-jasper
9.0.12
javax.servlet
servlet-api
3.0-alpha-1
javax.servlet
jstl
1.2
org.hibernate.validator
hibernate-validator
6.0.13.Final
SpringMvcStudentValidation
maven-clean-plugin
3.1.0
maven-resources-plugin
3.0.2
maven-surefire-plugin
2.22.1
maven-war-plugin
3.2.2
maven-install-plugin
2.5.2
maven-deploy-plugin
2.8.2
org.apache.maven.plugins
maven-compiler-plugin
3.2
true
1.8
true
org.apache.tomcat.maven
tomcat7-maven-plugin
2.2
/
true
XML
To do List
login.do
gfg
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
/WEB-INF/gfg-servlet.xml
1
gfg
/
XML
/WEB-INF/views/
.jsp
Java
package com.gfg.model;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import com.gfg.validationconfig.Address;
public class Student {
@Size(min = 1, message = "Student first name can't be empty")
private String firstName;
@Size(min = 1, message = "Student last name can't be empty")
private String lastName;
@Min(value = 1000, message = "Roll number must be a four digit number")
private int rollNo;
// custom validation
@Address
private String address;
public Student(@NotNull String firstName, @NotNull String lastName,
@Min(value = 1000, message = "Roll number must be a four digit number")
int rollNo,
@Size(min = 20, message = "Address must contains atleast 20 letters") @Size(max = 40, message = "Address must contains atleast 20 letters")
String address) {
super();
this.firstName = firstName;
this.lastName = lastName;
this.rollNo = rollNo;
this.address = address;
}
public Student() {
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getRollNo() {
return rollNo;
}
public void setRollNo(int rollNo) {
this.rollNo = rollNo;
}
public String getAddress() {
return this.address;
}
public void setAddress(String address) {
this.address = address;
}
}
Java
package com.gfg.controller;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import com.gfg.model.Student;
@Controller
public class StudentController {
@RequestMapping("/login")
public String showForm(Model theModel) {
theModel.addAttribute("student", new Student());
return "portal";
}
@RequestMapping("/welcome")
public String processForm(@Valid @ModelAttribute("student") Student student, BindingResult result) {
if (result.hasErrors()) {
return "portal";
}
else {
return "welcome";
}
}
}
Java
package com.gfg.validationconfig;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class AddressValidator implements ConstraintValidator {
@Override
public boolean isValid(String s, ConstraintValidatorContext cvc) {
s = s.toLowerCase();
boolean result = s.contains("india");
return result;
}
}
Java
package com.gfg.validationconfig;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Constraint(validatedBy = AddressValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD } )
@Retention(RetentionPolicy.RUNTIME)
public @interface Address {
public String message() default "You address must contains india";
public Class>[] groups() default {};
public Class extends Payload>[] payload() default {};
}
HTML
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
Student Portal
HTML
<%-- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
--%>
Welcome ${student.firstName} ${student.lastName} to Student portal
Your Roll Number is ${student.rollNo} and you live in india.
“ webapp/WEB-INF/web.xml ”中的 web.xml 文件定义了与不同 URL 和 servlet 的映射,以处理对这些 URL 的请求。在此,我们将 servlet XML 文件定义为gfg.xml。 URL 模式设置为“/”,这意味着任何带有“/”的请求都将被发送到调度程序 servlet 进行处理。
XML
To do List
login.do
gfg
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
/WEB-INF/gfg-servlet.xml
1
gfg
/
gfg-servlet.xml文件位于“ /src/main/webapp/WEB-INF/gfg.servlet.xml ”中。该文件以我们在 web.xml 文件中提到的 servlet 名称命名,它处理 Web 应用程序的所有 HTTP 请求。注解驱动启用spring注解类。 bean 配置有助于识别和扫描位于 views 文件夹中的 jsp。组件扫描根据定义的注解定位和分配bean。这是一个非常简单的文件来处理传入的 HTTP 调用。
XML
/WEB-INF/views/
.jsp
现在,我们将在com.gfg.model包中创建一个学生类,对于我们的学生门户,我们将显示四个属性 firstName、lastName、rollNo 和 address。前两个字段有@Size验证注解作为min size as one的约束,所以不能为空。对于卷号,我们使用了@Min ,它也是一个预定义的验证器。现在,对于地址,我们使用了@Address,这是一个我们将要定义和配置的自定义验证器。
Java
package com.gfg.model;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import com.gfg.validationconfig.Address;
public class Student {
@Size(min = 1, message = "Student first name can't be empty")
private String firstName;
@Size(min = 1, message = "Student last name can't be empty")
private String lastName;
@Min(value = 1000, message = "Roll number must be a four digit number")
private int rollNo;
// custom validation
@Address
private String address;
public Student(@NotNull String firstName, @NotNull String lastName,
@Min(value = 1000, message = "Roll number must be a four digit number")
int rollNo,
@Size(min = 20, message = "Address must contains atleast 20 letters") @Size(max = 40, message = "Address must contains atleast 20 letters")
String address) {
super();
this.firstName = firstName;
this.lastName = lastName;
this.rollNo = rollNo;
this.address = address;
}
public Student() {
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getRollNo() {
return rollNo;
}
public void setRollNo(int rollNo) {
this.rollNo = rollNo;
}
public String getAddress() {
return this.address;
}
public void setAddress(String address) {
this.address = address;
}
}
Controller 类通过将传入请求重定向到适当的视图页面来处理传入请求,必须在控制器类中定义任何 URL 才能发送请求。在这个项目中,我们在com.gfg.controller包中定义了一个StudentController类。在这个类中,我们有两个方法用于两个请求,第一个简单地重定向到登录门户并简单地添加一个新的学生对象以使用模型的addAttribute将输入匹配到表单中。第二种方法重定向到欢迎页面,但在此之前,它使用BindingResult检查任何验证错误。如果存在错误,它会重定向到门户网站,否则会重定向到欢迎页面。
Java
package com.gfg.controller;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import com.gfg.model.Student;
@Controller
public class StudentController {
@RequestMapping("/login")
public String showForm(Model theModel) {
theModel.addAttribute("student", new Student());
return "portal";
}
@RequestMapping("/welcome")
public String processForm(@Valid @ModelAttribute("student") Student student, BindingResult result) {
if (result.hasErrors()) {
return "portal";
}
else {
return "welcome";
}
}
}
com.gfg.validationcongfig包中的AddressValidator类定义了需要检查对象的约束,该类实现了ConstraintValidator ,它定义了验证给定约束的逻辑。我们从 ConstrainValidator 接口重写方法类isValid ,我们在其中定义验证逻辑。
Java
package com.gfg.validationconfig;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class AddressValidator implements ConstraintValidator {
@Override
public boolean isValid(String s, ConstraintValidatorContext cvc) {
s = s.toLowerCase();
boolean result = s.contains("india");
return result;
}
}
现在,我们使用 @接口创建一个地址注解,这个类必须有三个覆盖才能使验证逻辑工作。第一个方法定义要显示的错误消息,第二个方法表示一组约束,第三个方法表示有关注释的附加信息。 @Constraint 、 @Target和@Retention注释定义了验证逻辑、要传递的元素和附加信息。
Java
package com.gfg.validationconfig;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Constraint(validatedBy = AddressValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD } )
@Retention(RetentionPolicy.RUNTIME)
public @interface Address {
public String message() default "You address must contains india";
public Class>[] groups() default {};
public Class extends Payload>[] payload() default {};
}
portal.jsp页面“ /webapp/WEB-INF/views/portal.jsp ”定义了学生登录门户。我们已经使用表单配置来格式化我们的表单。这是一个非常简单的表单,它定义了四个字段。
HTML
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
Student Portal
“ /webapp/WEB-INF/views/welcome.jsp ”中的welcome.jsp页面是登录成功后显示的视图页面。
HTML
<%-- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
--%>
Welcome ${student.firstName} ${student.lastName} to Student portal
Your Roll Number is ${student.rollNo} and you live in india.
现在,我们的 Spring MVC 项目已经完成了所有的配置文件和类。您的项目结构应如下所示:
输出:
是时候在 Tomcat 服务器上运行您的 Web 应用程序了。我假设您知道如何运行 tomcat 服务器。成功运行tomcat服务器后,在你喜欢的浏览器中输入http://localhost:8080/SpringMvcStudentValidation/welcome 。
因此,我们创建了一个带有我们自己的验证的 Spring MVC 项目,并在学生门户表单中使用它。