📜  Spring – MVC 自定义验证

📅  最后修改于: 2022-05-13 01:55:01.338000             🧑  作者: Mango

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
                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[] 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[] 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 项目,并在学生门户表单中使用它。