Spring MVC验证用户输入

本文介绍了如何在Spring MVC应用中利用Bean Validation API进行用户输入验证,包括添加注解如@Email、@CreditCardNumber和@Pattern进行不同类型的验证,以及通过Hibernate Validator作为验证实现的集成步骤。在控制器方法中使用@Valid注解以启用验证,并要注意避免出现HTTP-400错误。此外,还提到了如何自定义错误消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring MVC支持与JSR 349 Bean Validation API的集成。借助于Bean验证,可以非常容易地将验证元数据应用到模型类,并且通过合适的视图向用户反映可能的结果。该元数据可以使用注解进行定义,因此验证将更容易定义。

Step1:添加注解

public class User {
    @Size(min = 3,max = 20)
    private String name;
    private String lastname;
    @Email
    private String email;
    //匹配 以字母开头,长度在6~18之间,只能包含字符、数字和下划线
    @Pattern(regexp = "^[a-zA-Z]\\w{3,14}$")
    private String password;
    private String detail;
    @CreditCardNumber
    private String ccNumber;
    .....
}

@Size注解将用户名的长度设置为3~20之间

@Email注解根据e-mail的正则表达式来验证输入

@CreditCardNumber注解根据Luhn算法验证输入的数字

注:Luhn算法是一个简单的模数-10(modulus-10)校验公式,可用来验证各种识别码

@Pattern注解根据一个正则表达式验证密码

Step2:为了启用验证,需要向项目中添加Bean验证的实现,本例选择Hibernate Validator框架来提供验证,添加相应的依赖

<dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>5.1.0.Final</version>
    </dependency>

Step3:表单中添加包含errors的标签,以便显示在每个输入字段可能发生的错误

<mvc:form modelAttribute="user" action="result.mvc" method="post">
    <table>
        <tr>
            <td><mvc:label path="name">Name:</mvc:label></td>
            <td><mvc:input path="name" cssErrorClass="formFieldError"/></td>
            <td><mvc:errors path="name"/></td>
        </tr>
        <tr>
            <td><mvc:label path="email">E-Mail:</mvc:label></td>
            <td><mvc:input path="email" cssErrorClass="formFieldError"/></td>
            <td><mvc:errors path="email"/></td>
        </tr><tr>
        <td><mvc:label path="ccNumber">Credit Card Number:</mvc:label></td>
        <td><mvc:input path="ccNumber" cssErrorClass="formFieldError"/></td>
        <td><mvc:errors path="ccNumber"/></td>
    </tr>
........
</mvc:form>
对于errors标签,其path特性设置为模型类的属性名称。但对于errors标签来说,path特性则不是必须设置的。但如果没有设置,则无法看到相关联输入字段的错误消息。如果想在一个地方显示所有错误,可将path值设置为*,并将errors标签放置在表单之上

Step3:控制器方法

@RequestMapping("/result")
    public ModelAndView processUser(@Valid User user, BindingResult result){
        System.out.println(user.toString());
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("u",user);
        if(result.hasErrors()){
            modelAndView.setViewName("userForm");
        }else{
            modelAndView.setViewName("userResult");
        }
        return modelAndView;
    }
对用户输入的验证由在user方法参数上设置的@Valid注解触发。该注解被递归地应用到类的属性。如果没有设置该注解,就不会触发Bean验证。processUser()方法接收一个额外的参数result,该参数是一个BindingResult实例。通过使用该参数来检查在将请求参数映射到域类属性的过程中是否发生任何验证错误(使用result.hasErrors()方法)。然后根据条件设置视图,以便在输入页面显示相关错误。

注意:当在模型特性上使用@Valid注解时,如果忽略了BingResult类型的方法参数,则可能是在提交表单时遇到下面所示的问题:HTTP-400 The result sent by client was syntactically incorrect。所有需确保不要缺少BingResult类型的方法参数。

出错的输入,表单显示如图:



图示错误消息是由框架默认设置的。如果要修改这些消息,可以通过注解设置新的消息,比如对于密码字段,可以设置如下

    @Pattern(regexp = "^[a-zA-Z]\\w{3,14}$",message = "first character must be a letter and it must contain... ")


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值