`

Spring验证的错误返回------BindingResult

阅读更多

最近做的一个项目使用了 Spring MVC3, 其中验证也是使用Spring的 validate 框架, 但不是全部。

我们 只是使用了org.springframework.validation.Errorsorg.springframework.validation.BindingResult 来将验证错误信息返回到JSP页面。因为Spring提供了<form:errors>标签来显示BindingResult对象里的错误信 息, 并且这个验证框架还支持国际化, errorCode对应的语言文字放到工程的message资源文件就好了。

下面是一个简单的注册账户的例子:包括三个文件:JSP, AccountValidator和AccountValidator。

 

1. 首先是JSP页面:addAccount,jsp的表单

<form:form modelAttribute="accountVo" action="${actionUrl}" method="post">
            <form:hidden path="id"  readonly=“readonly”/>

           <form:input path="email" size="30" onblur="checkEmail();"/> //path的值必须和accountVo这个对象的属性一致

           <form:errors path="email" cssClass="errorMsg"></form:errors>  

                   //这里省略了表单的其他元素, 直接来提交按钮   

           <input type="button"  id="saveAccount"  value='<fmt:message key="button.next" />' onclick="submitAccount ('accountVo')"/>

                   //这里完全可以使用type=“submit”, 这里使用button可以截获提交事件, 并在提交之前先做JS层面的验证

</form:form>

Note: 使用上面这些标签, 必须引入Spring 的 form标签库:<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

大家还看到我们使用了JSTL的fmt标签库(国际化), 这个也要引入<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>, 其实我们也完全可以用<form message>标签来做国际化的。这里我还想说一个东西:readonly这个属性根本起不到只读的作用, 完全可以被修改,但是使用disable属性后,这个表单元素就无法放到accountVo这个对象并提交了, 纠结!

 

2. 这里是个不完整的验证类AccountValidator注意,我们没有实现Validator接口


public class AccountValidator {
    public void validate(AccountVo accountVo, Errors errors) {
        String email = accountVo.getEmail();
        if (!StringUtils.hasLength(email)) {
            errors.rejectValue("email", "validate.email.empty", "邮箱不能为空");//这个函数有好几个重载的变体
        }
   }
}

Note: Errors这个接口有好几个rejectValue()函数, 它们是可以支持国际化的。 比如, 上面这个例子表示, 错误的字段(filed)是“email”, errorCode是“validate.email.empty”, 与资源文件对应, 第三个是defaultMessage。很多国际化当中会带有参数, rejectValue其中的一个重载函数就是rejectValue(String field, String errorCode, Object[] errorArgs, String defaultMessage)。

 

3. 最后是AccountController

@Controller//基于注解, 声明这是一个controller
@RequestMapping(value="/account") //表示总的路径
@SessionAttributes("account") //表示account对象将会存入session当中, //默认情况下model.addAttribute(account)将会把account对象放入request当中, 并且属性名为“account”
public class AccountFormController {

@RequestMapping(value = "/add", method = RequestMethod.POST)
    public String addAccount(@ModelAttribute("accountVo") AccountVo accountVo,
            BindingResult result, //这里面,BindResult result必须紧跟着前面的@ModelAttribute, 否则会出错

            HttpServletResponse response,
            HttpSession session, Model model) {
        log.debug(accountVo.toString());
        
        if(isExist(accountVo)){
            log.debug("Opps, 这个email已经注册过了!");
            result.rejectValue("email", "misFormat", "这个email已经注册过了!");
            return "account/addAccount";
        }else{
            new AccountValidator().validate(accountVo, result);
            if(result.hasErrors()){
                log.debug("表单数据有误, 重新填写"+accountVo);
                model.addAttribute("accountVo",accountVo);//把accountVo对象返回到页面, 这样不至于表单被清空了
                return "account/addAccount";//返回到注册页面,同时,这里会自动将验证错误信息返回到JSP页面, 怎么返回呢?看后面!
            }
            //这里会做很多数据库的操作, 省略
       }

  } //end of login()

}//end of controller

Note: 这里需要特别注意几个问题:1.函 数形参 BindResult result 必须紧跟着前面的@ModelAttribute, 否则会出异常; 2. @ModelAttribute("accountVo") AccountVo accountVo, 这个参数与JSP页面的<form:form modelAttribute="accountVo" action="${actionUrl}" method="post">对应

 

4. 进阶一下, 看看验证错误信息对象是怎么传递到页面的

这 一切看起来都很完美, 但是有时候出于设计的原因, 我们不得不使用redirect, 对, 就是重定向! 就是这个东西让我对Spring MVC有了一点不好的印象, 特别是结合了sitemesh之后。这个先打住, 咱们还是说验证错误怎么传给重定向之后的JSP页面吧。

其实也简单, 咱们可以先把错误对象放入session当中, 然后在另一个Controller里把它取出来, 然后再返回到相应的JSP页面就行了!

对!但是,这里要注意了, BindingResult这个对象是自动传入JSP的, 我们不知道应该把它放在request里面呢还是session里面, 或者其他的地方, 以及属性名叫什么。这个就是我昨天晚上纠结的问题, 最后看了一下Spring 的源代码, 终于稍微清楚了一点儿。下面直接上代码,然后解释。

if(session.getAttribute("BindingResult.accountVo") != null){
            //放到session和request里面, 不论attr name设置成什么都不行
            //只有这样才能把bindingresult的错误信息传到JSP页面
            String errorAttrName = "org.springframework.validation.BindingResult.accountenterpriseVo";
            model.addAttribute(errorAttrName, session.getAttribute("BindingResult.accountVo"));
            session.removeAttribute("BindingResult.enterpriseVo");

}

首先, 验证错误对象 BindingResult 必须放入 org.springframework.ui.Model 当中返回给JSP页面。放到request和session当中都没用。

第二,这个属性名是BindingResult.getClass().getName + “.” + targetName, 也就是上面那一长串, 其中targerName对应着JSP页面的表单的modelAttribute, 即<form:form modelAttribute="accountVo" action="${actionUrl}" method="post">中的accountVo。 对了, 顺便说一下, accountVo同时还是表单的id, 大家可以用firefox的firebug查看页面元素。<form:error>标签也会被翻译成

<span class="errorMsg" id="email.errors">邮箱格式不正确!</span> //如果是英文浏览器, “邮箱格式不正确!”就会使英文版本的。

好的, 就先写到这里了。

分享到:
评论
1 楼 颜若儒 2017-06-27  
请问下,除了用session的方式 ,我采用redirectAttribute.addFlashAttribute()的方式 ,redirect之后应该怎么拿到这个bindingresult呢

相关推荐

    spring约束-4.2.xsd

    如果验证失败,Spring会将错误信息填充到`BindingResult`或`ModelAndView`中,供视图层显示。 4. **国际化错误消息**:Spring允许开发者定义国际化的错误消息,通过在`messages.properties`文件中配置错误码和对应...

    Spring MVC 学习笔记 十一 data binding

    错误信息可以通过`BindingResult`对象获取。 9. **数据绑定与异常处理** 如果数据绑定过程中出现错误,Spring MVC会自动抛出异常,如`MethodArgumentNotValidException`。通过配置全局异常处理器,我们可以统一...

    spring 验证总结

    在上述示例中,`BindingResult`参数用于捕获验证结果,如果验证失败,Controller方法将返回注册页面并显示错误消息。 结合使用这两种验证方式,Spring提供了强大的数据验证能力,既支持简单的注解驱动验证,也允许...

    spring_validator验证

    在这里,如果用户提交的数据不符合`User`类上的验证规则,`BindingResult`对象将包含验证错误信息,可以进一步处理这些错误。 ### 四、自定义Validator 虽然JSR-303/349提供了一系列通用的验证注解,但有时我们...

    利用spring-modules验证框架进行表单验证

    如果存在验证错误,你可以根据`BindingResult`中的信息向用户返回错误消息。 然而,需要注意的是,Spring Modules项目已经不再维护,随着Spring的发展,现在更推荐使用Spring Framework自带的`Validator`接口和`...

    Spring验证/list配置

    总结起来,`Spring验证/list配置`涉及到如何在Spring Web应用中对集合类型的数据进行验证,这包括使用`@Validated`、`@Valid`注解,以及自定义验证规则和处理验证错误。理解并熟练运用这些知识点,能够提升应用程序...

    spring-mvc-01.rar

    同时,通过 `@Valid` 和 `BindingResult` 可以实现数据验证,提高输入数据的正确性。 七、异常处理 通过 `@ExceptionHandler` 注解,可以在 Controller 中定义全局或特定异常的处理逻辑,提供友好的错误页面给用户...

    J2EE 毕业设计之spring实现验证源码

    如果验证失败,Spring将自动将错误信息添加到`BindingResult`对象,开发者可以据此向用户返回错误信息。 5. **全局错误处理**:为了提供一致的错误反馈,可以配置一个全局异常处理器,比如使用`@ControllerAdvice`...

    第12章Spring MVC参数绑定的验证

    `@ControllerAdvice`可以全局处理验证错误,`@InitBinder`则可以在所有控制器方法调用之前设置数据绑定规则。 - **BindingResult和ModelAttribute**: 在控制器方法中添加`BindingResult`参数,可以获取到验证...

    Java源码对添加数据进行数据验证.rar

    - 使用`@Validated`或`@Valid`注解激活验证,配合`BindingResult`对象捕获验证错误。 4. **异常处理**: - 当数据验证失败时,通常会抛出`ConstraintViolationException`或自定义的异常,应用需要捕获这些异常并...

    springmvcinaction:用于spring mvc源代码-mvc source code

    - 验证失败时,错误信息可以通过 BindingResult 参数获取。 4. **拦截器(Interceptor)** - 拦截器可以拦截请求并在进入处理器之前或之后执行自定义逻辑,例如日志记录、权限检查等。 5. **异常处理** - 全局...

    Spring MVC 框架学习总结

    - 使用@Valid和BindingResult进行表单验证,Spring MVC会自动处理验证错误。 - 数据绑定使得模型数据可以直接与表单控件关联。 9. **上传下载** - 使用CommonsMultipartResolver处理文件上传,MultipartFile接口...

    spring-thymeleaf-form:春天百里香叶形式的例子

    - 验证错误可以在Thymeleaf模板中用`th:errors`标签展示,例如`*{username}"&gt;`。 5. **处理表单提交** - 在Controller中,通过`@ModelAttribute`注解接收表单数据,例如`@PostMapping("/submit") public String ...

    ssm中hibernate-validator后台注册验证

    // 处理验证错误,如返回错误页面或提示信息 } else { // 验证通过,继续业务逻辑 } return "register"; } ``` 5. **国际化**:如果需要提供多语言的错误提示,可以创建一个资源文件(如`messages.properties`...

    详解SpringMVC学习系列(6) 之 数据验证

    import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.spring...

    Spring web MVC和spring 2.0 form tag解说

    如果存在验证错误,这些错误可以通过BindingResult对象获取并在视图中显示。 总结,Spring Web MVC和Spring 2.0 Form Tag的结合,使得在Java Web开发中处理表单和模型数据变得更加简洁高效。通过使用Form Tag,...

    Spring-Formularios_Thymeleaf-_y-_Data_Binding

    如果验证失败,错误信息可以通过Spring的BindingResult对象获取,并在Thymeleaf模板中显示。 此外,Thymeleaf还支持国际化(i18n)和本地化(l10n)。我们可以定义不同语言的资源文件,Thymeleaf会根据用户的浏览器...

    validation-api-1.0.0.GA

    如果验证失败,`BindingResult`将包含验证错误信息。 4. **配置验证**:在Spring配置中启用验证支持,例如通过`@EnableWebMvcValidation`或`&lt;mvc:annotation-driven validation="true" /&gt;`。 ### 四、使用示例 ``...

    SpringMVC使用Validation验证表单

    如果验证失败,`BindingResult`参数将包含错误信息。我们可以检查`result.hasErrors()`,并在存在错误时返回表单页面,以便显示错误消息。 为了显示错误消息,我们需要在Thymeleaf或者JSP视图模板中获取并渲染它们...

    Spring3.0 + springmodules 实现validator

    在上面的例子中,`User`类的属性可能包含了如`@NotBlank`的注解,如果输入不符合规则,`BindingResult`对象将包含验证错误信息。 至于Spring MVC,它是Spring框架的一部分,提供了一个强大的模型-视图-控制器(MVC...

Global site tag (gtag.js) - Google Analytics