jquery<--json-->spring(3.0)之后台校验
前一段试了一下前台用jquery(1.3.2),后台用spring(3.0),之间用json交换数据,
然后写了篇总结jquery(1.3.2)<--json-->spring(3.0),有几位大侠提出了后台校验
的问题,我也觉得这是很普遍的问题,就参考一些资料做了个小demo,现在总结一下,
欢迎各位拍砖。
我是这样考虑的,在后台接收数据时,首先使用一个所有属性均为String的对象,在
这个对象上,使用Bean Validation(JSR-303)进行数据校验,校验通过后,再将该对象
转换为一个VO然后进行后续处理,在校验充分的情况下,转换步骤是不会出现例外的。
在校验失败的时候,返回由属性名(也即页面元素名)、错误信息对组成的数组,前端
根据元素名自动突出显示对应元素、并在其旁边显示错误信息,下面详细说明。
1. 前端提交
这和前文一样,没什么可说的。
2. 后台校验
2.1 属性全为String的对象,及其校验
spring 3开始全面支持JSR-303,并以hibernate validator作为默认实现,该技术可以
用声明(Annotaion)的方式定义校验,而且标记可以自由扩充,我觉得这很方便,所以
用的这一技术做的校验。
后台所有接收的对象都为全String类型属性对象,因为对于json数据传输我们无法在接收
数据之前进行校验,属性全用String可以避免在Controller获取数据前发生数据转换错误。
JSR-303内建了一些校验规则,例如Min,Max,Pattern(正则表达式,有了这个就可以
处理绝大部分校验了),hibernate validtor还扩充了NotEmpty,Email等,一下是我的
例子中客户信息的对象:
其中的applyErrors是我自己写的一段函数,就是根据错误信息的元素名,给元素画个红框,然后
把错误信息写到该元素后面的<div />
1 楼 Angel_Night 2010-05-05 楼主又更新了啊
直接上源代码吧 跑上次那个demo 我花了1个小时... 2 楼 yiyu 2010-05-05 对不起,代码在这里 3 楼 godson_2003 2010-05-05 看起来感觉不错啊 明天好好研究研究 4 楼 SSailYang 2010-05-06 在 Spring 出到 3.0.0 的时候,它内置的 Json 格式转换器还不支持 @DateTimeFormat 和 @NumberFormat,在 Ajax Simplifications in Spring 3.0 的这篇文章里作者自己写了一个 BeanPostProcessor 去解决这个问题。不知道 3.0.2 怎么样了 5 楼 oakeye 2010-05-06 试试新的入例校验,之前都没作 只是在前端考虑了 6 楼 hyl1234 2010-05-06 还没怎么看过spring3.0 下来看看效果 谢谢lz 7 楼 java_doc 2010-05-06 不错,但是在Chrome下不能用哦,还有在后台处理Json的请求和响应、验证也太繁琐了,为什么不像 Ajax Simplifications in Spring 3.0 那个sample那样处理呢? 8 楼 upup1000 2010-05-06 我发现java注解还是挺有用的,哈哈。 9 楼 yiyu 2010-05-06 java_doc 写道不错,但是在Chrome下不能用哦,还有在后台处理Json的请求和响应、验证也太繁琐了,为什么不像 Ajax Simplifications in Spring 3.0 那个sample那样处理呢?
chrome里不行啊?我看看,我一直在firefox里试的
我觉得Ajax Simplifications in Spring 3.0里有个问题,如果前台的数据转不成Account会怎么样?例如一个需要数字的地方输入了字符,我觉得会在开始校验前就出例外了,结果会是导致ajax通讯失败,而这不是我们想要的,我们想要的是ajax通讯正常结束,但是接收到的是校验错误信息 10 楼 yiyu 2010-05-06 java_doc 写道不错,但是在Chrome下不能用哦,还有在后台处理Json的请求和响应、验证也太繁琐了,为什么不像 Ajax Simplifications in Spring 3.0 那个sample那样处理呢?
chrome里不能执行的原因知道了,inputCustomerInfo.html里head里的style和script加载时好像给过滤掉了,把这两部分移到body里就行了。
不过感觉不太好,也许不该用这种页面加载的方式,哪位大侠有经验给出出主意吧 11 楼 dmhorse 2010-05-06 我没用过json,但感觉老要创建 jsoncustomer之类的object有种代码重复的感觉. 12 楼 prowl 2010-05-06 Annotation的方式很新颖 13 楼 java_doc 2010-05-06 yiyu 写道java_doc 写道不错,但是在Chrome下不能用哦,还有在后台处理Json的请求和响应、验证也太繁琐了,为什么不像 Ajax Simplifications in Spring 3.0 那个sample那样处理呢?
chrome里不行啊?我看看,我一直在firefox里试的
我觉得Ajax Simplifications in Spring 3.0里有个问题,如果前台的数据转不成Account会怎么样?例如一个需要数字的地方输入了字符,我觉得会在开始校验前就出例外了,结果会是导致ajax通讯失败,而这不是我们想要的,我们想要的是ajax通讯正常结束,但是接收到的是校验错误信息
这确实是一个问题,在网上查了一下也有其他人遇到过,但是没有比较好的解决办法,简单的就是在客户端验证,这样就不会出现这种情况了,感觉这样也不是很好。 14 楼 yiyu 2010-05-06 java_doc 写道yiyu 写道java_doc 写道不错,但是在Chrome下不能用哦,还有在后台处理Json的请求和响应、验证也太繁琐了,为什么不像 Ajax Simplifications in Spring 3.0 那个sample那样处理呢?
chrome里不行啊?我看看,我一直在firefox里试的
我觉得Ajax Simplifications in Spring 3.0里有个问题,如果前台的数据转不成Account会怎么样?例如一个需要数字的地方输入了字符,我觉得会在开始校验前就出例外了,结果会是导致ajax通讯失败,而这不是我们想要的,我们想要的是ajax通讯正常结束,但是接收到的是校验错误信息
这确实是一个问题,在网上查了一下也有其他人遇到过,但是没有比较好的解决办法,简单的就是在客户端验证,这样就不会出现这种情况了,感觉这样也不是很好。
其实我一直觉得那些简单的数据合法性校验就在前台做就行了,后台只做业务合法性校验就行了,不知大家怎么看? 15 楼 caoyangx 2010-05-07 呵呵,去年10月时,我同事也做了一个类似的,后台实体用验证注解,前台验证,效果很好,很方便。 16 楼 Angel_Night 2010-05-07 yiyu 写道
其实我一直觉得那些简单的数据合法性校验就在前台做就行了,后台只做业务合法性校验就行了,不知大家怎么看?
这东西 按情况划分 最合适
如果给一个公司做oa 那没有必要做太多的数据校验..
一个员工 是不会输入边界数据来玩极限的
最多做一些简单的前台验证就够了 当然 增加用户体验的ajax逻辑验证还是要有的..
如果是放在 天朝大局域网 上跑的东西
把验证做好...都不一定够..
17 楼 bhzln 2010-05-12 这种校验不过是增加用户体验了,看起来效果好,实际上服务器端的提交校验不一样是不能省么,个人观点用个服务器端校验就行了,其他的都是等项目完成了有时间的时候装饰一下 18 楼 lym6520 2010-05-14 感觉很不错,呵,jquery都1.4.1了,楼主可以更新了,在性能上有了很大提高。