<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-1  評(píng)論-8  文章-1  trackbacks-0

    基于JAVA標(biāo)注實(shí)現(xiàn)統(tǒng)一的前臺(tái)(JS層)后臺(tái)(JAVA層)想法

    原創(chuàng),非轉(zhuǎn)
    基于JAVA標(biāo)注實(shí)現(xiàn)統(tǒng)一的前臺(tái)(JS層)后臺(tái)(JAVA層)想法[/b]
    通過(guò)標(biāo)注的方式進(jìn)行前后臺(tái)的統(tǒng)一驗(yàn)證的好處是很多的,增強(qiáng)前后臺(tái)驗(yàn)證的一致性,減少代碼的重復(fù),不需要前臺(tái)與一份驗(yàn)證,后臺(tái)再寫(xiě)一份了。

    本人想基于這種方式寫(xiě)一個(gè)基于Annotation的完整的Validator的開(kāi)源的小框架,但發(fā)現(xiàn)要做的事情很多,工作量很大,要一點(diǎn)一點(diǎn)的來(lái),一點(diǎn)一點(diǎn)的完善,最后閑時(shí)寫(xiě)了個(gè)大 概,與大家一起探討
    1. 通過(guò)JAVA標(biāo)注將前臺(tái)和后臺(tái)的驗(yàn)證規(guī)則標(biāo)到JAVA的值對(duì)象的類(lèi)中。
    2. Validator在初始化的過(guò)程中,一次性讀入JAVA的值對(duì)象的類(lèi)中驗(yàn)證規(guī)則的標(biāo)注信息,并生成前臺(tái)需要的校驗(yàn)的JS文件。
    3. 前臺(tái)頁(yè)面可以直接引入自動(dòng)生成的校驗(yàn)的JS文件,進(jìn)行校驗(yàn)。a
    4. 后臺(tái)得到從前臺(tái)請(qǐng)求request綁定好值的JAVA的值對(duì)象,通過(guò)AnnotationValidator類(lèi)進(jìn)行驗(yàn)證。

    以下是Annotation標(biāo)注的代碼。

    進(jìn)行不可以為空的校驗(yàn)標(biāo)注
    1. @Retention (RetentionPolicy.RUNTIME)   
    2. @Target(ElementType.FIELD)   
    3.   
    4. public @interface CanNotNull {     
    5.   
    6. }  
    進(jìn)行是否是整數(shù)的校驗(yàn)標(biāo)注
    1. @Retention(RetentionPolicy.RUNTIME)   
    2. @Target(ElementType.FIELD)   
    3. public @interface IsInteger {   
    4.     public int minWidth() default 1;   
    5.     public int maxWidth() default Integer.MAX_VALUE;   
    6.     public  int minValue() default Integer.MIN_VALUE;   
    7.     public  int maxValue() default Integer.MAX_VALUE;   
    8.   
    9. }  
    用于添寫(xiě)字段中文的標(biāo)注


    1. @Retention(RetentionPolicy.RUNTIME)   
    2. @Target(ElementType.FIELD)   
    3. public @interface FieldDesc {   
    4.     public String value();   
    5.   
    6. }  

    驗(yàn)證器的代碼:
    1. package com.javaest.validity.process;   
    2.   
    3. import java.io.BufferedWriter;   
    4. import java.io.File;   
    5. import java.io.FileWriter;   
    6. import java.io.IOException;   
    7. import java.lang.reflect.Field;   
    8. import java.lang.reflect.InvocationTargetException;   
    9. import java.lang.reflect.Method;   
    10. import java.util.ArrayList;   
    11. import java.util.HashMap;   
    12. import java.util.List;   
    13. import java.util.Map;   
    14.   
    15. import com.javaest.util.StringUtils;   
    16. import com.javaest.validity.annotation.CanNotNull;   
    17. import com.javaest.validity.annotation.FieldDesc;   
    18. import com.javaest.validity.annotation.IsInteger;   
    19. import com.javaest.validity.test.pojo.Student;   
    20.   
    21. public class PojoBeanAnnotationValiditer {   
    22.     private static Map<String, Map> allValidityRuleMap = new HashMap<String, Map>();   
    23.     private static Map<String, Map> allFieldDescMap = new HashMap<String, Map>();   
    24.     private static String jsValiditerFilePath;   
    25.     private static String[] pojoBeanPackageName;   
    26.     /**  
    27.      *   
    28.         將指定的包下邊的所有Pojo類(lèi)的標(biāo)注信息一次性的讀取到Map中,以備以后驗(yàn)證對(duì)象時(shí)使用  
    29.      */  
    30.     public static void loadAllClassAnnotationValidityInfoInPackage(String[] packageNameArr)   
    31.             throws IllegalArgumentException, SecurityException, IllegalAccessException, NoSuchMethodException,   
    32.             InvocationTargetException, ClassNotFoundException, IOException {   
    33.         for (int i = 0; i < packageNameArr.length; i++) {   
    34.             List<Class> classList = ReflectUtils.getAllClassInPackage(packageNameArr[i]);   
    35.             for (int j = 0; j < classList.size(); j++) {   
    36.                 Class currClass = classList.get(j);   
    37.                 String classFullName = currClass.getPackage().getName() + "." + currClass.getName();   
    38.                 Map[] validityRuleMapAndFieldDescMap = loadValidityRuleAndCreateValidityJsFile(currClass);   
    39.                 allValidityRuleMap.put(classFullName, validityRuleMapAndFieldDescMap[0]);   
    40.                 allFieldDescMap.put(classFullName, validityRuleMapAndFieldDescMap[1]);   
    41.             }   
    42.         }   
    43.     }   
    44.     /*  
    45.      * 對(duì)具體的一個(gè)類(lèi)的標(biāo)注做處理,讀入字段描述 信息,讀入非空驗(yàn)證信息,讀入整數(shù)驗(yàn)證信息,并根據(jù)這些信息生成JS代碼。  
    46.      */  
    47.   
    48.     private static Map[] loadValidityRuleAndCreateValidityJsFile(Class currClass) throws IllegalArgumentException,   
    49.             IllegalAccessException, SecurityException, NoSuchMethodException, InvocationTargetException, IOException {   
    50.         StringBuffer validityCanNotNullJsStrBuf = new StringBuffer();   
    51.         StringBuffer validityIsIntegerJsStrBuf = new StringBuffer();   
    52.         Field[] fieldArr = currClass.getDeclaredFields();   
    53.         List<String> canNotNullFieldNameList = new ArrayList<String>();   
    54.         List<IsIntegerValiditerRuleInfo> isIntegerValiditerRuleInfoList = new ArrayList<IsIntegerValiditerRuleInfo>();   
    55.         Map<String, String> fieldDescMap = new HashMap<String, String>();   
    56.         for (int i = 0; i < fieldArr.length; i++) {   
    57.             String currFieldName = fieldArr[i].getName();   
    58.             //讀入字段描述 信息   
    59.             FieldDesc fieldDescAnnotation = fieldArr[i].getAnnotation(FieldDesc.class);   
    60.             if (fieldDescAnnotation != null) {   
    61.                 String fieldDesc = fieldDescAnnotation.value();   
    62.                 System.out.println(fieldDesc);   
    63.                 fieldDescMap.put(currFieldName, fieldDesc);   
    64.             }   
    65.             else {   
    66.                 fieldDescMap.put(currFieldName, currFieldName);   
    67.             }   
    68.             //讀入非空驗(yàn)證信息   
    69.             if (fieldArr[i].isAnnotationPresent(CanNotNull.class)) {                   
    70.                 canNotNullFieldNameList.add(currFieldName);   
    71.                 validityCanNotNullJsStrBuf.append("if(document.all." + currFieldName + ".value.trim()==\"\"){alert('"  
    72.                         + fieldDescMap.get(currFieldName) + "不可以為空');}\n");   
    73.             }   
    74.             //讀入整數(shù)驗(yàn)證信息   
    75.             IsInteger isIntegerAnnotation = fieldArr[i].getAnnotation(IsInteger.class);   
    76.             if (isIntegerAnnotation != null) {   
    77.                 int minWidth = isIntegerAnnotation.minWidth();   
    78.                 int maxWidth = isIntegerAnnotation.maxWidth();   
    79.                 int minValue = isIntegerAnnotation.minValue();   
    80.                 int maxValue = isIntegerAnnotation.maxValue();   
    81.                 IsIntegerValiditerRuleInfo isIntegerValiditerRuleInfo = new IsIntegerValiditerRuleInfo(currFieldName,   
    82.                         minWidth, maxWidth, minValue, maxValue);   
    83.                 isIntegerValiditerRuleInfoList.add(isIntegerValiditerRuleInfo);   
    84.                 if (minWidth > 0) {   
    85.                     validityIsIntegerJsStrBuf.append("if(document.all." + currFieldName   
    86.                             + ".value.length()<minWidth){alert('" + fieldDescMap.get(currFieldName) + "寬度不夠!');}\n");   
    87.                 }   
    88.                 if (maxWidth < Integer.MAX_VALUE) {   
    89.                     validityIsIntegerJsStrBuf.append("if(document.all." + currFieldName   
    90.                             + ".value.length()>maxWidth){alert('" + fieldDescMap.get(currFieldName) + "寬度太長(zhǎng)!');}\n");   
    91.                 }   
    92.                 if (minValue > Integer.MIN_VALUE) {   
    93.                     validityIsIntegerJsStrBuf.append("if(document.all." + currFieldName + ".value*1<minValue){alert('"  
    94.                             + fieldDescMap.get(currFieldName) + "的數(shù)值太小!');}\n");   
    95.                 }   
    96.                 if (maxValue < Integer.MAX_VALUE) {   
    97.                     validityIsIntegerJsStrBuf.append("if(document.all." + currFieldName + ".value*1>maxValue){alert('"  
    98.                             + fieldDescMap.get(currFieldName) + "的數(shù)值太大!');}\n");   
    99.                 }   
    100.             }   
    101.         }   
    102.         Map<String, List> classValidityRuleMap = new HashMap<String, List>();   
    103.         classValidityRuleMap.put("canNotNullFieldNameList", canNotNullFieldNameList);   
    104.         classValidityRuleMap.put("isIntegerValiditerRuleInfoList", isIntegerValiditerRuleInfoList);   
    105.         //根據(jù)這些信息生成JS代碼   
    106.         BufferedWriter jsFileWriter = new BufferedWriter(new FileWriter(new File(jsValiditerFilePath   
    107.                 + java.io.File.separator + currClass.getName() + ".js")));   
    108.         jsFileWriter.write(validityCanNotNullJsStrBuf.toString());   
    109.         jsFileWriter.write(validityIsIntegerJsStrBuf.toString());   
    110.         jsFileWriter.close();   
    111.         return new Map[] { classValidityRuleMap, fieldDescMap };   
    112.   
    113.     }   
    114.     /*  
    115.      * 具體的后臺(tái)驗(yàn)證過(guò)程  
    116.      */  
    117.   
    118.     public static ValidityResult validity(Object currObj) throws IllegalArgumentException, IllegalAccessException,   
    119.             SecurityException, NoSuchMethodException, InvocationTargetException {   
    120.         Class aClass = currObj.getClass();   
    121.         String classFullName = aClass.getPackage().getName() + "." + aClass.getName();   
    122.         Field[] fieldArr = aClass.getDeclaredFields();   
    123.   
    124.         Map validityRuleMap = allValidityRuleMap.get(classFullName);   
    125.         Map fieldDescMap = allFieldDescMap.get(classFullName);   
    126.         List canNotNullFieldNameList = (List) validityRuleMap.get("canNotNullFieldNameList");   
    127.         List isIntegerValiditerRuleInfoList = (List) validityRuleMap.get("isIntegerValiditerRuleInfoList");   
    128.         ValidityResult validityResult = new ValidityResult();   
    129.         for (int j = 0; j < canNotNullFieldNameList.size(); j++) {   
    130.             String currFieldName = (String) canNotNullFieldNameList.get(j);   
    131.             String getMethodName = "get" + currFieldName.substring(01).toUpperCase() + currFieldName.substring(1);   
    132.             Method getFieldValueMethod = aClass.getMethod(getMethodName);   
    133.             String fieldValue = ((String) getFieldValueMethod.invoke(currObj));   
    134.             if (fieldValue == null || fieldValue.equals("")) {   
    135.                 System.out.println(fieldDescMap.get(currFieldName) + " 不可以為空 ! ");   
    136.                 validityResult.addValidityInfo(fieldDescMap.get(currFieldName) + " 不可以為空 ! ");   
    137.             }   
    138.         }   
    139.   
    140.         for (int j = 0; j < isIntegerValiditerRuleInfoList.size(); j++) {   
    141.             IsIntegerValiditerRuleInfo isIntegerValiditerRuleInfo = (IsIntegerValiditerRuleInfo) isIntegerValiditerRuleInfoList   
    142.                     .get(j);   
    143.             String currFieldName = isIntegerValiditerRuleInfo.getFieldName();   
    144.             String getMethodName = "get" + currFieldName.substring(01).toUpperCase() + currFieldName.substring(1);   
    145.             Method getFieldValueMethod = aClass.getMethod(getMethodName);   
    146.             String fieldValue = ((String) getFieldValueMethod.invoke(currObj));   
    147.             int minWidth = isIntegerValiditerRuleInfo.getMinWidth();   
    148.             int maxWidth = isIntegerValiditerRuleInfo.getMaxWidth();   
    149.             int minValue = isIntegerValiditerRuleInfo.getMinValue();   
    150.             int maxValue = isIntegerValiditerRuleInfo.getMaxValue();   
    151.   
    152.             if (StringUtils.isInteger(fieldValue)) {   
    153.                 if (fieldValue.length() < minWidth) {   
    154.                     validityResult.addValidityInfo(fieldDescMap.get(currFieldName) + " 寬度不可以小于 " + minWidth + "! ");   
    155.                 }   
    156.                 if (fieldValue.length() > maxWidth) {   
    157.                     validityResult.addValidityInfo(fieldDescMap.get(currFieldName) + " 寬度不可以大于 " + maxWidth + "! ");   
    158.                 }   
    159.                 if (Integer.parseInt(fieldValue) < minValue) {   
    160.                     validityResult.addValidityInfo(fieldDescMap.get(currFieldName) + " 的值不可以小于 " + minValue + "! ");   
    161.                 }   
    162.                 if (Integer.parseInt(fieldValue) > maxValue) {   
    163.                     validityResult.addValidityInfo(fieldDescMap.get(currFieldName) + " 的值不可以大于 " + maxValue + "! ");   
    164.                 }   
    165.   
    166.             }   
    167.             else {   
    168.   
    169.                 validityResult.addValidityInfo(fieldDescMap.get(currFieldName) + " 必須是整數(shù)格式 ! ");   
    170.   
    171.             }   
    172.         }   
    173.         return validityResult;   
    174.   
    175.     }   
    176.   
    177.     public static String[] getPojoBeanPackageName() {   
    178.         return pojoBeanPackageName;   
    179.     }   
    180.   
    181.     public static void setPojoBeanPackageName(String[] pojoBeanPackageName) {   
    182.         PojoBeanAnnotationValiditer.pojoBeanPackageName = pojoBeanPackageName;   
    183.     }   
    184.   
    185.     public static String getJsValiditerFilePath() {   
    186.         return jsValiditerFilePath;   
    187.     }   
    188.   
    189.     public static void setJsValiditerFilePath(String jsValiditerFilePath) {   
    190.         PojoBeanAnnotationValiditer.jsValiditerFilePath = jsValiditerFilePath;   
    191.     }   
    192.   
    193.     public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, SecurityException,   
    194.             NoSuchMethodException, InvocationTargetException, ClassNotFoundException, IOException {   
    195.         PojoBeanAnnotationValiditer.setPojoBeanPackageName(new String[] { "com.javaest.validity.test.pojo" });   
    196.         PojoBeanAnnotationValiditer.setJsValiditerFilePath("JS\\VALIDITY");   
    197.         PojoBeanAnnotationValiditer   
    198.                 .loadAllClassAnnotationValidityInfoInPackage(new String[] { "com.javaest.validity.test.pojo" });   
    199.         Student aStudent = new Student();   
    200.         aStudent.setAddress("吉林省長(zhǎng)春市二道區(qū)");   
    201.         aStudent.setId("");   
    202.         aStudent.setAge("9");   
    203.         ValidityResult validityResult = PojoBeanAnnotationValiditer.validity(aStudent);   
    204.     }   
    205.   
    206. }</SPAN>  


    下邊是一個(gè)加好了標(biāo)注的Student類(lèi)

    1. public class Student {   
    2.     @CanNotNull    
    3.     @FieldDesc("姓名")   
    4.     private String name;   
    5.     @CanNotNull    
    6.     @FieldDesc("性別")   
    7.     private String sex;   
    8.     @IsInteger(minValue=18,maxValue=60)   
    9.     @CanNotNull  
    10.     @FieldDesc("年齡")   
    11.     private String age;   
    12.     @CanNotNull  
    13.     @FieldDesc("編碼")   
    14.     private String id;   
    15.     private String address;   
    16.     public String getName() {   
    17.         return name;   
    18.     }   
    19.     public void setName(String name) {   
    20.         this.name = name;   
    21.     }   
    22.     public String getSex() {   
    23.         return sex;   
    24.     }   
    25. 。。。。。。。。。。   
    26. }  


    在家閑著寫(xiě)代碼真好。
    posted on 2008-04-17 09:37 javaest 閱讀(1883) 評(píng)論(7)  編輯  收藏

    評(píng)論:
    # re: 基于JAVA標(biāo)注實(shí)現(xiàn)統(tǒng)一的前臺(tái)(JS層)后臺(tái)(JAVA層) 2008-04-17 10:57 | Libo
    這個(gè)思路不錯(cuò).hibernate validator 只是實(shí)現(xiàn)后臺(tái)的驗(yàn)證.如果能和這個(gè)結(jié)合起來(lái)可能用途會(huì)更廣泛.  回復(fù)  更多評(píng)論
      
    # re: 基于JAVA標(biāo)注實(shí)現(xiàn)統(tǒng)一的前臺(tái)(JS層)后臺(tái)(JAVA層) 2008-06-02 17:57 | 懶人
    你家是二道區(qū)的么?  回復(fù)  更多評(píng)論
      
    # re: 基于JAVA標(biāo)注實(shí)現(xiàn)統(tǒng)一的前臺(tái)(JS層)后臺(tái)(JAVA層)[未登錄](méi) 2008-06-05 13:12 | javaest
    @懶人
    對(duì),你如果知道?
      回復(fù)  更多評(píng)論
      
    # re: 基于JAVA標(biāo)注實(shí)現(xiàn)統(tǒng)一的前臺(tái)(JS層)后臺(tái)(JAVA層) 2008-08-04 09:52 | 殘夢(mèng)追月
    不錯(cuò),是不是可以使用正則表達(dá)式來(lái)驗(yàn)證呢?就是說(shuō)在使用的時(shí)候,只有一個(gè)標(biāo)記,里面有個(gè)參數(shù),輸入正則表達(dá)式…………就可用驗(yàn)證了。  回復(fù)  更多評(píng)論
      
    # re: 基于JAVA標(biāo)注實(shí)現(xiàn)統(tǒng)一的前臺(tái)(JS層)后臺(tái)(JAVA層) 2008-08-04 09:53 | 殘夢(mèng)追月
    他看的這里:

    aStudent.setAddress("吉林省長(zhǎng)春市二道區(qū)");   回復(fù)  更多評(píng)論
      
    # re: 基于JAVA標(biāo)注實(shí)現(xiàn)統(tǒng)一的前臺(tái)(JS層)后臺(tái)(JAVA層)[未登錄](méi) 2010-04-14 09:59 | fangjava
    能看到  回復(fù)  更多評(píng)論
      
    # re: 基于JAVA標(biāo)注實(shí)現(xiàn)統(tǒng)一的前臺(tái)(JS層)后臺(tái)(JAVA層)[未登錄](méi) 2010-04-14 10:00 | fangjava
    能看到我的留言么??  回復(fù)  更多評(píng)論
      

    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲国产精品xo在线观看| 日韩精品视频免费网址| 亚欧免费一级毛片| 91免费国产视频| 色多多免费视频观看区一区| 黄色a级片免费看| 一级全免费视频播放| 国产成人自产拍免费视频| 无码人妻一区二区三区免费视频| 高清免费久久午夜精品| www成人免费观看网站| 国产免费区在线观看十分钟| 国内精品99亚洲免费高清| 久久久久久AV无码免费网站下载| 中国一级毛片免费看视频| 久久免费视频网站| 97视频免费观看2区| 美女视频黄免费亚洲| 天天摸天天碰成人免费视频| 免费一看一级毛片| 国产乱辈通伦影片在线播放亚洲 | 亚洲成人免费电影| 免费可以在线看A∨网站| 午夜免费福利影院| 国产一级淫片a视频免费观看| 亚洲日韩在线中文字幕第一页 | 四虎成人精品一区二区免费网站| 欧洲精品免费一区二区三区| 亚洲成a人片在线播放| 国产亚洲一区区二区在线| 亚洲欧洲日韩国产综合在线二区| 亚洲系列国产精品制服丝袜第| 亚洲第一成年免费网站| 一级黄色免费毛片| 最近中文字幕完整版免费高清| 好吊妞在线成人免费| 免费福利资源站在线视频| 99在线免费观看| 青青在线久青草免费观看| 成人伊人亚洲人综合网站222| 亚洲国产第一站精品蜜芽|