数据校验:jquery前端验证和hibernate服务端验证
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <base href="<%=basePath%>"/> <title>添加/编辑用户</title> </head> <body> <form action="student.do?save" id="add_form" method="post" enctype="application/x-www-form-urlencoded"> <input type="hidden" id="studentId" name="studentId" value="${student.studentId }"/> <label>名字:</label><input name="name" id="name" /> <!--错误信息显示在label里面 --> <label></label> <label>邮箱:</label><input name="email" id="email"/> <input type="submit" value="提交"/> </form> <script src="<%=basePath%>res/js/jquery.js" type="text/javascript"></script> <script src="<%=basePath%>res/js/jquery.validate.js" type="text/javascript"></script> <script src="<%=basePath%>res/js/jquery.validate.js" type="text/javascript"></script> <script src="<%=basePath%>res/js/messages_cn.js" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function() { $("#add_form").validate({ rules: { "name": {required: true, minlength : 3, maxlength:5}, "email": {required: true, email : true} }/* 自定义报错文字 , messages: { "name" : {required: "不能为空", minlength : "大于3", maxlength: "小于5"}, "email" : {required: "不能为空", email: "请输入正确的email地址"} } */ , errorPlacement: function(error, element) { if ( element.is(":radio") ) error.appendTo( element.parent().next().next() ); else if ( element.is(":checkbox") ) error.appendTo ( element.next() ); else { error.appendTo( element.next() );//配置错误信息 } } }); }); </script> </body> </html>
新版本:
/*数据校验,并提交 */ $("#edit_form").validate({ submitHandler:function(form){ //避免重复提交 $('#submit_btn').get(0).disabled = true; event.preventDefault(); form.submit(); }, rules: { "name": {required: true, maxlength:20} , "downloadUrl":{required: true, maxlength:128} } , messages: { "name" : {required: "产品名称不能为空", maxlength: "最大不能超过20字符"}, "downloadUrl" : {required: "下载地址不能为空", maxlength: "最大不能超过128字符"} } , errorPlacement: function(error, element) { if ( element.is(":radio") ) element.after( error ); else if ( element.is(":checkbox") ) element.after( error ); else { element.after( error );//配置错误信息 } } }); 在css中如何: label.error{ border: 1px dashed red; padding: 5px 5px 5px 5px; color: red; margin: 50px 0 10px 10px; background: #FEE; font-weight: bold; }
问题:对于一个表单中同时存在多个不同名称的input字段,比如通讯录,联系人的电话可能有多个,后面几个电话input是使用动态添加的,
<input name="phone" />
<input name="phone"/>//后面这个是动态添加的
这时候使用校验,会发现,操作某一个input的时候,校验会绑定到所有的input中name为phone的上面。这个问题如何解决????????
需要下载jquery以及他的插件,文章介绍
http://my.oschina.net/wangyongqing/blog/59800
服务端数据校验
1、约束设置
public class Student { @NotNull(message="学生id不能为空", groups = EditChecks.class) private Integer studentId; @NotNull(message="姓名不能为空") @Min(value=4, message="姓名长度不能小于4", groups = EditChecks.class) private String name; private Teacher teacher;
解释:
@NotNull @Min就是hiberante validate默认的一些约束给我们使用(2.4.1节列出了一些我们可以使用的),括号里面meesage定义了不符合约束时候返回的信息,groups是分组
Groups:这个很重要,比如studentId在新增学生的时候,他必然为空,此时他必定为null,但是在编辑的时候他就必须有值,所以hibernate validate就提供了分组的概念,对于有定义某一组,他就使用那组进行约束,如果没有就使用默认组。具体请查看官方文档2.3节校验组。
2、代码中如何处理:
工具类:validateUtils
public class ValidateUtils<T, E> { public ValidateUtils() {} private Validator getValidator() { ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); return validator; } //这里有使用分组 public String getViolationMsgs(T clazz, Class<E> check) { Validator validator = this.getValidator(); String msg = ""; Set<ConstraintViolation<T>> constraintViolations = null; constraintViolations = validator.validate(clazz, check); //判断是否有约束错误 if(!CollectionUtils.isEmpty(constraintViolations)) { msg = constraintViolations.iterator().next().getMessage(); } return msg; } //不使用分组 public String getViolationMsgs(T clazz) { Validator validator = this.getValidator(); String msg = ""; Set<ConstraintViolation<T>> constraintViolations = null; constraintViolations = validator.validate(clazz); if(!CollectionUtils.isEmpty(constraintViolations)) { msg = constraintViolations.iterator().next().getMessage(); } return msg; } }
逻辑层类spring mvc的某一个方法
private static ValidateUtils validateUtils = new ValidateUtils(); @RequestMapping(params="save",method={RequestMethod.POST}) public String save(Student student, WebRequest request) { if(student.getStudentId()==null) { //String str = validateUtils.getViolationMsgs(student); //对于保存就使用默认的组,或者使用上面那个也行,下面获取返回的约束message String str = validateUtils.getViolationMsgs(student, Default.class); System.out.println(str); int id = (Integer) this.studentService.save(student); this.log.debug(id); } else { String str = validateUtils.getViolationMsgs(student, EditChecks.class); System.out.println(str); this.studentService.update(student); } List<Student> list = this.studentService.findAll(Student.class); request.setAttribute("list", list, 0); return "redirect:student.do?list"; }
官方文档中有提供了一些:
1、自定义的约束(判断大小写啊等)
2、启动validate的三种方法。
3、xml配置,等
总结:1、官方提供的基本够用;2、既然我们要使用annotation,就不用xml配置了。3、其他的用到的时候再查,个人感觉上面这些已经够了。