首页 编程 软件学院 查看内容

简单的通用后台校验代码

2015-7-14 14:14 |来自: cnblogs.com 1635 0

摘要: 萌生写这个代码的原因,是在使用struts2的验证框架时,总觉的有些不太灵活。当一个action中有多个表单需要处理的时候,struts处理起来就稍微麻烦一点,当校验失败时都会return "input"字符串。但我不同表单单校 ...
关键词: 实体 一个 fieldName validator String 类型 框架 nbsp 字段 模型

萌生写这个代码的原因,是在使用struts2的验证框架时,总觉的有些不太灵活。当一个action中有多个表单需要处理的时候,struts处理起来就稍微麻烦一点,当校验失败时都会return "input"字符串。但我不同表单单校验失败后一般都希望返回不同的result,渲染不同的视图。另外如果我的校验是异步发起的,而我想要的结果是json的时候,也比较麻烦。虽然这些问题可以通过修改result type类型和在result中使用ognl表达式来做到,但绕来绕去实在太过麻烦。而若不适用这校验框架,在action中自己来if else if else 来判断更不可取。于是便回想到yii和 laravel框架的校验,这些校验框架在我看来做的非常优秀,非常灵活,于是我想借鉴它们来自己写一写这个校验插件。

首先,我希望做到两点

  • 可以对实体进行校验,不管实体封装的是表单数据还是数据库记录
  • 可以直接对request.getParameterMap()获得的map进行校验,这个我暂时还没完成。
  • 灵活校验,当校验失败后可以马上通过getErrors拿到错误数据,这样你想咋么响应怎么响应,发json也好,把errors传递到视图也好,都可以。
    • 也就是想下面这样,if(!entity.validate()){....}else{Map map = entity.getErrors()}

另外当实体的属性没有被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 上,有兴趣看看的可以去,有一起做的更好了。

  • http://www.svnchina.com/svn/entity_validator
  • https://github.com/lvyahui8/validator.git

我暂时只做了对实体的校验,这里还有个问题,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 != 
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部