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";
}
}
}
Note :
- The @Controller annotation indicates that a particular class serves the role of a controller.
- @GetMapping is used to handle GET type of request method.
- @PostMapping is used to handle POST type of request method.
登录页面(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