| 关键词: 实体 一个 fieldName validator String 类型 框架 nbsp 字段 模型 |
萌生写这个代码的原因,是在使用struts2的验证框架时,总觉的有些不太灵活。当一个action中有多个表单需要处理的时候,struts处理起来就稍微麻烦一点,当校验失败时都会return "input"字符串。但我不同表单单校验失败后一般都希望返回不同的result,渲染不同的视图。另外如果我的校验是异步发起的,而我想要的结果是json的时候,也比较麻烦。虽然这些问题可以通过修改result type类型和在result中使用ognl表达式来做到,但绕来绕去实在太过麻烦。而若不适用这校验框架,在action中自己来if else if else 来判断更不可取。于是便回想到yii和 laravel框架的校验,这些校验框架在我看来做的非常优秀,非常灵活,于是我想借鉴它们来自己写一写这个校验插件。 首先,我希望做到两点
另外当实体的属性没有被struts填充时,也可以使用我写的一个fill方法进行填充,为什么要写这个呢,因为struts的属性驱动, 类驱动,模型驱动都有点局限,但我的action里有多个模型,模型驱动只能为一个模型注值,不够灵活 1 public class BaseEntity{ 2 public void fill(Map<String, String[]> parameterMap) { 3 //System.out.println(this.getClass()); 4 Class clazz = this.getClass(); 5 Field fields[] = clazz.getDeclaredFields(); 6 for (int i = 0; i < fields.length; i++) { 7 String fieldName = fields[i].getName(); 8 //System.out.println(fieldName); 9 try { 10 // 查找参数集合 11 String values [] = parameterMap.get(fieldName); 12 if(values!=null && values.length>0){ 13 String methodName = "set"+fieldName.substring(0, 1).toUpperCase() 14 + fieldName.substring(1); 15 Class fieldType = fields[i].getType(); 16 Method method = clazz.getMethod(methodName,new Class[]{fieldType}); 17 // 设值 18 method.invoke(this,new Object[]{fieldType.cast(values[0])}); 19 } 20 } catch (Exception e) { 21 e.printStackTrace(); 22 } 23 } 24 } 25 ///... 26 } 我把代码放在了 svnchina 和 github 上,有兴趣看看的可以去,有一起做的更好了。
我暂时只做了对实体的校验,这里还有个问题,java本身是强类型的语言。对于实体的某些字段,他的类型本身就存在了校验,比如一个字段是Integer类型,那你觉得还有必要去校验他是number类型吗?完全多次一举。只有当属性是字符串,校验它是否是number才有意义,比如手机号码 这里我写了一个BaseEntity类, 如果一个子类要进行校验,那么这个子类要覆写父类的两个方法,rules和labels方法。这两个方法,一个用来定义对该试题的校验规则,一个定义对实体字段的中文翻译。 1 package org.lyh.validator; 2 3 import java.lang.reflect.Field; 4 import java.lang.reflect.Method; 5 import java.util.HashMap; 6 import java.util.Map; 7 8 /** 9 * Created by lvyahui on 2015-06-27. 10 */ 11 public class BaseEntity { 12 13 private Validator validator = new Validator(this); 14 15 protected Map<String,String> labelMap = new HashMap<String,String>(); 16 17 { 18 String [][] allLabels = labels(); 19 if(allLabels != null){ 20 for(String [] label : allLabels){ 21 String prop = label[0],propLabel = label[1]; 22 if(prop != null && hasProp(prop) && propLabel != |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|