📜  Spring – MVC 正则表达式验证

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

Spring – MVC 正则表达式验证

Spring MVC 中的正则表达式验证可以通过使用 Hibernate Validator 来实现,它是 Bean Validation API 的实现。 Hibernate Validator 提供了用于正则表达式验证的@Pattern 注解。

句法:

@Pattern(regex="", flag="", message="")
private String someDataMember;

请注意,标志和消息属性是可选的。让我们构建一个简单的 Web 应用程序,以便更好地了解如何在 Spring MVC 中使用 Regex 验证。在这个应用程序中,我们将构建一个访客登录页面。

例子

项目结构:

项目结构

访客登录应用程序的项目结构

正则表达式用法:

@Pattern 注释确保传递给数据成员的值遵循提供的正则表达式。属性 regexp 采用要匹配的正则表达式。

@Pattern(regexp = "^[a-zA-Z0-9]{6,12}$",
            message = "username must be of 6 to 12 length with no special characters")
private String username;

在上面的代码片段中,正则表达式表示用户名可以包含任何小写字符、任何大写字符或任何数字。此外,用户名的长度只能是 6 到 12 个(含)。

@Pattern(regexp = "^((?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$&*])(?=.*[0-9])){4,12}$",
            message = "password must contain atleast 1 uppercase, 1 lowercase, 1 special character and 1 digit ")
private String password;

在上面的代码片段中,正则表达式表示密码必须至少包含 1 个小写字母、1 个大写字母、1 个特殊字符和 1 个数字,并且它的大小必须为 4 到 12(含)。

用户类(数据模型):

Java
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.*;
  
@Data
@AllArgsConstructor
@NoArgsConstructor
class User {
  
    @Pattern(regexp = "^[a-zA-Z0-9]{6,12}$",
            message = "username must be of 6 to 12 length with no special characters")
    private String username;
  
    @Pattern(regexp = "^((?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$&*])(?=.*[0-9])){4,12}$",
            message = "password must contain atleast 1 uppercase, 1 lowercase, 1 special character and 1 digit ")
    private String password;
}


Java
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
  
import javax.validation.Valid;
  
@Controller
public class LoginController {
  
    @GetMapping("/")
    public String getForm(User user) {
        return "login";
    }
  
    @PostMapping("/")
    public String login(@Valid User user, Errors errors, Model model) {
        if (errors.hasErrors()) {
            return "login";
        } else {
            model.addAttribute("message", "Guest login successful ...");
            return "login";
        }
    }
}


HTML



    Guest Login
    
    
    
    
    
    


    

       
        

Guest login

        
            
                                 
                

               
                   
                                 
                

               
                   
                             
                     
    
  


XML

    org.springframework.boot
    spring-boot-starter-thymeleaf


    org.springframework.boot
    spring-boot-starter-web


    org.hibernate.validator
    hibernate-validator
    6.2.0.Final


    org.springframework.boot
    spring-boot-devtools
    runtime
    true


    org.projectlombok
    lombok
    true


    org.springframework.boot
    spring-boot-starter-test
    test


User 类充当我们应用程序的数据模型。在这里,我们使用 Lombok 来减少样板代码。 User 类仅包含我们的访客登录页面所需的 2 个字段。

API:我们的应用程序由以下 API 组成。

@GetMapping("/")
  public String getForm(User user) {
      return "login";
}

上面的代码片段演示了 GET API,这里使用它来呈现驻留在我们的资源/模板文件中的 login.html 页面。 GET API 的端点是“/”。

@PostMapping("/")
 public String login(@Valid User user, Errors errors, Model model) {
     if (errors.hasErrors()) {
        return "login";
    } else {
        model.addAttribute("message", "Guest login successful ...");
        return "login";
    }
}

上面的代码片段演示了 POST API,它用于获取登录表单输入并将正则表达式验证的错误(如果有)传递给登录页面,然后呈现它。

完整的控制器类:

Java

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
  
import javax.validation.Valid;
  
@Controller
public class LoginController {
  
    @GetMapping("/")
    public String getForm(User user) {
        return "login";
    }
  
    @PostMapping("/")
    public String login(@Valid User user, Errors errors, Model model) {
        if (errors.hasErrors()) {
            return "login";
        } else {
            model.addAttribute("message", "Guest login successful ...");
            return "login";
        }
    }
}

登录页面(Html + Thymleaf):

HTML




    Guest Login
    
    
    
    
    
    


    

       
        

Guest login

        
            
                                 
                

               
                   
                                 
                

               
                   
                             
                     
    
  

上面的代码代表我们的登录页面。在这里,我们使用了 thymleaf 而不是 JSP,它是一个模板引擎,无疑是创建模板的更好方法。

依赖:

在 pom.xml 文件中添加以下依赖项。

XML


    org.springframework.boot
    spring-boot-starter-thymeleaf


    org.springframework.boot
    spring-boot-starter-web


    org.hibernate.validator
    hibernate-validator
    6.2.0.Final


    org.springframework.boot
    spring-boot-devtools
    runtime
    true


    org.projectlombok
    lombok
    true


    org.springframework.boot
    spring-boot-starter-test
    test

输出:

输出

让我们尝试用一些无效的输入数据来验证它。例子:

  • 用户名:anu0-0
  • 密码:QWqw123

由于用户名不允许特殊字符并且密码需要特殊字符,因此错误消息将被传递到登录页面,然后呈现显示输入数据与给定的正则表达式格式不匹配。

输出

输入数据无效

让我们尝试使用一些有效的输入数据来验证它。例子:

  • 用户名:anu000
  • 密码:QWqw@123

输出