前提概要
在Spring MVC和FreeMarker整合的项目中,采用JSR-303验证框架,通过注解的方式进行数据验证
基础框架
MVC:Spring MVC 3
视图:FreeMarker
验证:Hibernate-validator实现
配置文件和Java代码的修改
在Spring MVC配置文件中添加配置
添加以下mvc的注解驱动配置,一切变成“自动化”
<mvc:annotation-driven />
在JavaBean中添加数据校验的注解
其中@Length、@email就是Hibernate-validator中的数据校验注解,还可以用javax.validation中的注解,比如@NotNull
public class SystemUser {
@Length(min = 5, max = 20, message = "用户名长度必须位于5到20之间")
private String userName;
@Email(message = "比如输入正确的邮箱")
private String email;
}
在Controller方法中指定需要进行校验
首先,要在需要进行校验的Bean前面加上@Valid注解,告诉SpringMVC框架这个Bean需要进行校验;
同时,还要在需要校验的Bean前面加上@modelattribute注解,从而将Bean暴露给视图,并且指定名字,这有两个作用,第一是显示校验错误需要使用这个名字,第二个是返回原来的页面以后,前面输入的所有值还要显示出来;
其次,每个需要校验的Bean后面紧跟一个BindingResult,SpringMVC框架会将校验结果保存在它里面,通过hasErrors方法可以判断是否有校验错误;
最后,当返回到原页面以后,SpringMVC框架还会将所有校验错误信息保存在上下文中,供页面上取得校验错误,Spring提供了一套JSP自定义标签。
@RequestMapping(value = "/create.html", method = RequestMethod.POST)
public String doCreateUser(
@Valid @ModelAttribute("userDetail") SystemUser user,
BindingResult bindingResult,
HttpServletRequest request) {
// 如果有校验错误,返回添加用户的页面
if (bindingResult.hasErrors()) {
return "/user/create";
}
this.userService.createUser(user);
return "/user/list.html";
}
进行自定义校验
如果需要添加自定义校验,比如验证用户名是否已经被使用了,那么简单的注解自然无能为力,需要自己编码实现,如果校验失败,可以手动将自定义校验错误添加到BindingResult中。
@RequestMapping(value = "/user/create.html", method = RequestMethod.POST)
public String doCreateUser(
@Valid @ModelAttribute("userDetail") SystemUser user,
BindingResult bindingResult,
HttpServletRequest request) {
// 如果有数据校验错误,返回添加用户的页面
if (bindingResult.hasErrors()) {
return "/user/create";
}
boolean isUserNameExist = this.userService.checkUserByUserName(user.getUserName());
// 如果用户名已存在,返回添加用户的页面
if (isUserNameExist) {
// 向BindingResult添加用户已存在的校验错误
bindingResult.rejectValue("userName", "该用户名已存在", "该用户名已存在");
return "/user/create";
}
this.userService.createUser(user);
return "/user/list.html";
}
在JSP页面上显示校验错误信息
返回页面以后,SpringMVC框架将所有校验错误信息都放在了上下文中,可以自己去取出来,但是那样非常麻烦,不过没关系,Spring提供了一套自定义标签,可以方便的显示校验错误信息。
页面头部需要导入Spring的自定义标签库
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
需要一次性显示全部校验错误
(commandName的值就是@modelattribute注解中指定的值)
<form:form commandName="userDetail">
<form:errors path="*" cssStyle="color:red"></form:errors>
</form:form>
需要在对应输入框的后面显示单个校验错误
(通过path指定显示那个具体的校验错误,userDetail正是@modelattribute注解中指定的值,而点号后面则是指定显示Bean中哪个属性的校验错误)
<input type="text" name="userName" value="${userDetail.userName}" >
<form:errors path="userDetail.userName" cssStyle="color:red"></form:errors>
<input type="text" name="email" value="${userDetail.email}">
<form:errors path="userDetail.email" cssStyle="color:red"></form:errors>
相关推荐
使用 Windows 窗体 BindingSource 自定义项添加,From MSDN
共同学习共同进步
android 自定义View — 自定义组合控件
在进行JSR303验证的学习时,在进行表单跳转时出现了一个问题,解决方法很简单,但是困扰了我很长时间。 原创文章 1获赞 1访问量 16 关注 私信 展开阅读全文 作者:深衫老霖
数据绑定流程: 1、框架把ServletRequest对象和请求参数传递给DataBinder ...BindingResult包含了已完成数据绑定的形参对象和校验错误信息对象。 最终SpringMVC框架会把BindingResult中的数据,分别赋给相应的处理方法。
附件为个人编写的自定义android开发MVP+ViewBinding架构Demo,已经在多个项目中使用,相对比较成熟了。使用当前主流的MVP+Viewbing架构模式,喜欢的小伙伴请给个好评,谢谢!(以此篇为准)
附件为个人编写的自定义android开发MVP+ViewBinding架构Demo,已经在多个项目中使用,相对比较成熟了。使用当前主流的MVP+Viewbing架构模式,喜欢的小伙伴请给个好评,谢谢!
本文实例讲述了Android开发之自定义View(视图)用法。分享给大家供大家参考,具体如下: View类是Android的一个超类,这个类几乎包含了所有的屏幕类型。每一个View都有一个用于绘图的画布,这个画布可以进行任意扩展...
public String userEdit(User user, BindingResult bindingResult,Model model){ if(bindingResult.hasErrors()){ err(bindingResult,model); return "/jsp/user/useredit"; }else { userService.updateUser...
在JAX-RS中,提供了NameBinding机制,简单理解NameBinding,就是把指定过滤器/拦截器通过自定义的名称注解绑定在某些匹配的资源方法上。Jersey, RESTeasy等框架都有相应的实现。 该代码利用Springboot模拟实现了...
PNC_Lab04:Ingreso产品@Valid @ModelAttribute和BindingResult。 SpringMVC
有2个地方需要修改 1.修改WCF服务应用程序 2.Web.config中修改 以下实例中: ...nqe.net" 为正式X509证书的友好名称 1.CustomAuthorizeAuthenticate\DataProvider.cs文件中的 ...这样X509的示例就算完成了
ko-multiple-select-binding-jQuery插件的自定义绑定 KO-悬浮窗结合-为自定义绑定 ko-numeric-binding-仅数字值(0、1、2 ..)的自定义绑定 ## 1。 ko-multiple-select-binding一个KnockoutJS自定义绑定,将“应用...
NULL 博文链接:https://geyubin.iteye.com/blog/1562868
本文实例讲述了Android中自定义一个View的方法。分享给大家供大家参考,具体如下: Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到一些坑,我把自己遇到的...
winform使用bindingNavigator与bindingSource定义分页控件,实现分页功能
这里将介绍使用tolua++将自定义的C++类嵌入,让lua脚本使用 ... 注意:1>,只要根据自定类.h中的内容,至于.cpp的实现,binding后lua会自动调用类的函数 2>,书写.pkg文件时要注意几条规则,我们到tol
Vue自定义指令的使用,具体内容如下 ...binding: 一个对象,包含以下属性: *name: 指令名,不包括 v- 前缀。 *value: 指令的绑定值, 例如: v-my-directive=”1 + 1”,value 的值是 2。 *oldValue: 指
mvx自定义绑定Android上的简单MvvmCross自定义数据绑定示例添加了通知示例
这是一个wpf 自定义 拖拽 无边框 的demo。用到的相关wpf知识点:binding,ICommand,Decorator,Template,WindowChrome。给刚接触的新人提供快速定义窗口的相关思路。