原文地址:http://hi.baidu.com/austincao/item/270303344c2811dd6c15e9f1
最近做的一个项目使用了 Spring MVC3, 其中验证也是使用Spring的 validate 框架, 但不是全部。
我们只是使用了org.springframework.validation.Errors, org.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> //如果是英文浏览器, “邮箱格式不正确!”就会使英文版本的。
好的, 就先写到这里了。
分享到:
相关推荐
在上述示例中,`BindingResult`参数用于捕获验证结果,如果验证失败,Controller方法将返回注册页面并显示错误消息。 结合使用这两种验证方式,Spring提供了强大的数据验证能力,既支持简单的注解驱动验证,也允许...
在控制器中,你需要捕获这个结果并适当地处理错误,例如返回错误消息给客户端或者显示错误页面。 5. **工具支持**:Spring Boot提供了对JSR 303和Hibernate Validator的开箱即用支持,简化了验证的配置和使用。...
通过定义一个全局的异常处理切面,当验证失败时,可以统一捕获并返回合适的错误响应,保持服务调用的一致性。 4. **Spring MVC与Web服务的结合**:如果你的应用使用了Spring MVC,那么可以将Web服务作为一个控制器...
标题 "一个简单的Spring验证登录示例" 涉及的核心知识点是Spring框架中的身份验证和授权,特别是如何在Spring MVC环境中实现用户登录功能。这里我们将深入探讨Spring的安全组件——Spring Security,以及它如何帮助...
// 错误处理,返回错误信息给前端 } else { // 保存用户信息到数据库 } } ``` 在这里,如果用户提交的数据不符合`User`类上的验证规则,`BindingResult`对象将包含验证错误信息,可以进一步处理这些错误。 ###...
3. **ActionForm验证失败**:表单验证配置错误,可能导致验证失败但未给出明确提示。 4. **视图解析错误**:JSP或FreeMarker模板文件路径错误,导致找不到对应的展示页面。 5. **国际化资源文件问题**:国际化配置...
在本文中,我们将深入探讨如何使用Spring框架来实现登录验证,并在用户成功登录后增加积分。这个主题对于那些想要深入了解Spring及其在Web应用程序中的应用,尤其是安全性和业务逻辑处理的开发者来说,是非常有价值...
下面将详细阐述Spring MVC实现登录验证的相关知识点。 **1. Spring MVC简介** Spring MVC是Spring框架的一个模块,专门用于构建Web应用程序。它提供了模型-视图-控制器(MVC)架构,简化了开发过程,使得业务逻辑与...
Spring Cloud Feign统一设置验证token实现方法解析 Spring Cloud Feign是一个基于Netflix的Feign组件,提供了一个简洁的方式来构建RESTful风格的微服务接口。Feign组件提供了一个统一的接口调用方式,使得微服务...
转载Spring-01
- 对于需要保护的API,Spring Security会自动检查请求头中的JWT Token,如果验证失败,将返回401未经授权的响应。 7. **刷新Token**: - 可选地,可以添加刷新Token的功能,允许用户在Token即将过期时获取新的...
例如,我们可以在身份验证失败时返回 401 响应,并包含错误信息和时间戳。 四、自定义 AuthenticationFailureHandler 在自定义 AuthenticationFailureHandler 中,我们可以根据需要实现不同的行为。例如,我们可以...
如果存在验证错误,你可以根据`BindingResult`中的信息向用户返回错误消息。 然而,需要注意的是,Spring Modules项目已经不再维护,随着Spring的发展,现在更推荐使用Spring Framework自带的`Validator`接口和`...
Spring MVC Annotation验证方法 Spring MVC 框架提供了多种验证方法,其中一种常用的方式是使用Annotation验证。本文将详细介绍 Spring MVC Annotation验证的方法,包括使用 Spring MVC 自带的 Annotation 验证和...
Spring Boot 自定义返回错误码错误信息 在 Spring Boot 中,自定义返回错误码错误信息是一个非常重要的功能,这可以帮助开发者更好地处理错误信息,并将错误信息返回给调用端。本文将主要介绍如何在 Spring Boot 中...
如果验证失败,Spring将自动将错误信息添加到`BindingResult`对象,开发者可以据此向用户返回错误信息。 5. **全局错误处理**:为了提供一致的错误反馈,可以配置一个全局异常处理器,比如使用`@ControllerAdvice`...
【标题】:在Java EE环境中,使用Apache CXF与Spring框架整合实现Web服务,返回List、Bean、String、JSON及XML的完整项目实例 【描述】:本项目旨在展示如何在Java企业级应用(Java EE)中,通过Apache CXF框架创建...
标题中的“一个SPRING验证的小栗子 已经跑通”指的是使用Spring框架进行的一次简单的验证示例项目,这个项目已经成功运行并通过了测试。Spring框架是Java领域的一个核心库,它主要用于简化企业级应用的开发,提供...
当用户提交登录请求时,Controller会调用Service层的方法,根据用户名和密码查询数据库,如果匹配则返回成功信息,否则返回错误信息。 10. **注册流程**: 用户注册时,Controller接收注册信息,调用Service层的`...