【其实说起来也没什么复杂的,无非是用反射将模型的所有字段过一次,然后逐个字段检查,看看上面附有什么样的注解信息,顺便将它们放进验证规则里面】
【至于编写模板,将模型字段都转换成为表单信息后,就顺便可以写模板了,但是模板的最大问题在于,如何让它们适应项目】
package CodeGen.customModel.Core; import CodeGen.customModel.Annotations.HtmlUI; import CodeGen.customModel.util.DisplayType; public class DisplayHelper { public static String enumDisplayType2DisplayStr(HtmlUI displaytype){ DisplayType mytype=new DisplayType(); if(displaytype==HtmlUI.Checkbox_Boolean){ return mytype.Checkbox_Boolean; } else if (displaytype==HtmlUI.InputColorPicker){ return mytype.InputColorPicker; } else if (displaytype==HtmlUI.InputDateTimePicker){ return mytype.InputDateTimePicker; } else if (displaytype==HtmlUI.InputEmailText){ return mytype.InputEmailText; } else if (displaytype==HtmlUI.InputFileURL){ return mytype.InputFileURL; } else if (displaytype==HtmlUI.InputHiddenField){ return mytype.InputHiddenField; } else if (displaytype==HtmlUI.InputImgURL){ return mytype.InputImgURL; } else if (displaytype==HtmlUI.InputNormalText){ return mytype.InputNormalText; } else if (displaytype==HtmlUI.InputRichEditor){ return mytype.InputRichEditor; } else if (displaytype==HtmlUI.Radio_Boolean){ return mytype.Radio_Boolean; } else{ return mytype.InputNormalText; } } }
package CodeGen.customModel.Core; import CodeGen.customModel.util.DisplayType; import CodeGen.customModel.util.FormInfo; import CodeGen.customModel.util.JavaDataType; import CodeGen.customModel.util.ValidateRuleType; import Easis.Common.FileHelper; import Easis.Common.StringUtil; import Easis.Common.StringUtilWrapper; import Easis.ViewEngine.VelocityHelper; import java.io.File; import java.io.FileWriter; public class formGenerator { private String SavePath=""; VelocityHelper _ve=new VelocityHelper("/tpl/CodeGen/custom_form"); public formGenerator(String saveFilePath){ SavePath=saveFilePath; } public void Generate_HtmlForm(FormInfo form){ _ve.clear(); JavaDataType jdatatype=new JavaDataType(); DisplayType displaytype=new DisplayType(); ValidateRuleType ruletype=new ValidateRuleType(); _ve.put("javatype",jdatatype); _ve.put("displaytype",displaytype); _ve.put("ruletype",ruletype); _ve.put("formInfo",form); StringUtilWrapper strWrapper=new StringUtilWrapper(); _ve.put("StrWrapper",strWrapper); String strres= _ve.parseTempalte("form.vm","utf-8"); strres=strres.replaceAll("\\\\#","#"); try{ File fhtml=new File(SavePath+"\\"+""+form.formName+".jsp"); if (fhtml.exists()==false){ fhtml.createNewFile(); } FileWriter fw=new FileWriter(fhtml); fw.write(strres); fw.close(); } catch (Exception e){ System.out.println("========在创建文档【"+form.formName+".jsp】时出现错误!============"); e.printStackTrace(); } } public void Generate_Eform(FormInfo form){ _ve.clear(); JavaDataType jdatatype=new JavaDataType(); DisplayType displaytype=new DisplayType(); ValidateRuleType ruletype=new ValidateRuleType(); _ve.put("javatype",jdatatype); _ve.put("displaytype",displaytype); _ve.put("ruletype",ruletype); _ve.put("formInfo",form); StringUtilWrapper strWrapper=new StringUtilWrapper(); _ve.put("StrWrapper",strWrapper); String strres= _ve.parseTempalte("eform.vm","utf-8"); strres=strres.replaceAll("\\\\#","#"); try{ File fhtml=new File(SavePath+"\\"+""+form.formName+".java"); if (fhtml.exists()==false){ fhtml.createNewFile(); } FileWriter fw=new FileWriter(fhtml); fw.write(strres); fw.close(); } catch (Exception e){ System.out.println("========在创建文档【"+form.formName+".java】时出现错误!============"); e.printStackTrace(); } } public void Generate_ajaxForm(FormInfo form){ _ve.clear(); JavaDataType jdatatype=new JavaDataType(); DisplayType displaytype=new DisplayType(); ValidateRuleType ruletype=new ValidateRuleType(); _ve.put("javatype",jdatatype); _ve.put("displaytype",displaytype); _ve.put("ruletype",ruletype); _ve.put("formInfo",form); StringUtilWrapper strWrapper=new StringUtilWrapper(); _ve.put("StrWrapper",strWrapper); String strres= _ve.parseTempalte("ajax_form.vm","utf-8"); strres=strres.replaceAll("\\\\#","#"); try{ File fhtml=new File(SavePath+"\\"+"ajax_"+form.formName+".jsp"); if (fhtml.exists()==false){ fhtml.createNewFile(); } FileWriter fw=new FileWriter(fhtml); fw.write(strres); fw.close(); } catch (Exception e){ System.out.println("========在创建文档【"+form.formName+".jsp】时出现错误!============"); e.printStackTrace(); } } public void Generate_Validator(FormInfo form){ _ve.clear(); JavaDataType jdatatype=new JavaDataType(); DisplayType displaytype=new DisplayType(); ValidateRuleType ruletype=new ValidateRuleType(); _ve.put("javatype",jdatatype); _ve.put("displaytype",displaytype); _ve.put("ruletype",ruletype); _ve.put("formInfo",form); StringUtilWrapper strWrapper=new StringUtilWrapper(); _ve.put("StrWrapper",strWrapper); String strres= _ve.parseTempalte("validator.vm","utf-8"); strres=strres.replaceAll("\\\\#","#"); try{ File fhtml=new File(SavePath+"\\"+"ValidatorFor"+ StringUtil.FirstLetterUpperCase(form.formName)+".java"); if (fhtml.exists()==false){ fhtml.createNewFile(); } FileWriter fw=new FileWriter(fhtml); fw.write(strres); fw.close(); } catch (Exception e){ System.out.println("========在创建文档【"+StringUtil.FirstLetterUpperCase(form.formName)+".jsp】时出现错误!============"); e.printStackTrace(); } } }
package CodeGen.customModel.Core; import CodeGen.customModel.Annotations.FormDetail; import CodeGen.customModel.util.*; import Easis.Common.StringUtil; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import CodeGen.customModel.Annotations.*; public class FormFactory { public static void GenerateTemplates(Class modelClass,String savePath){ FormInfo finfo=model2formInfo(modelClass); formGenerator fgen=new formGenerator(savePath); fgen.Generate_HtmlForm(finfo); fgen.Generate_ajaxForm(finfo); fgen.Generate_Eform(finfo); fgen.Generate_Validator(finfo); } public static FormInfo model2formInfo(Class modelClass){ try { FormInfo myF_info=new FormInfo(); Annotation an_prefix= modelClass.getAnnotation(FormDetail.class); //--得到表单前缀 if(an_prefix!=null){ FormDetail a_prefix=(FormDetail)an_prefix; myF_info.prefix= a_prefix.prefix(); myF_info.formID=a_prefix.formID(); myF_info.formName=a_prefix.formName(); myF_info.formName_ZH=a_prefix.formName_ZH(); } //--获取所有属性及参数 Field[] paraFields=modelClass.getFields(); for (Field tmpF:paraFields){ FormParameter fp= recursion_getMetaInfo(tmpF); myF_info.paralist.add(fp); } return myF_info; } catch (Exception e){ e.printStackTrace(); } return null; } private static FormParameter recursion_getMetaInfo(Field tField){ FormParameter form_para=new FormParameter(); DisplayType displaytype=new DisplayType(); // tField.setAccessible(true); String gTypeStr=tField.getGenericType().toString(); ValidateRuleType ruletypename=new ValidateRuleType(); String realtype=getTypestr(gTypeStr); form_para.displayType=displaytype.InputNormalText; form_para.name_ZH="【"+tField.getName()+"】"; form_para.parameterName=tField.getName(); form_para.parameterType=realtype; //--检查是否有显示方式的标注,有的话就将其赋值 Annotation[] tf_annos= tField.getAnnotations(); if(tf_annos==null||tf_annos.length<=0){ System.out.println(tField.getName()+":参数没有任何注解"); } else{ //--判断display 注解 Annotation antemp1= tField.getAnnotation(Display.class); if(antemp1!=null){ Display d_ano=(Display)antemp1; form_para.displayType=DisplayHelper.enumDisplayType2DisplayStr(d_ano.display()); form_para.name_ZH=d_ano.name(); } //--判断验证规则 //--自定义正则表达式 antemp1=tField.getAnnotation(Validate_CustomRegex.class); if(antemp1!=null){ Validate_CustomRegex c_ano=(Validate_CustomRegex)antemp1; ValidateInput vi=new ValidateInput(); vi.setRuleName(ruletypename.rule_CustomRegex); vi.setErrorMessage(c_ano.ErrorMessage()); vi.set("regex",c_ano.Value()); if(form_para.validatelist.containsKey(ruletypename.rule_CustomRegex)==false){ form_para.validatelist.remove(ruletypename.rule_CustomRegex); } form_para.validatelist.put(ruletypename.rule_CustomRegex,vi); } //--是否布尔值 antemp1=tField.getAnnotation(Validate_isBoolean.class); if(antemp1!=null){ Validate_isBoolean c_ano=(Validate_isBoolean)antemp1; ValidateInput vi=new ValidateInput(); vi.setRuleName(ruletypename.rule_isBoolean); vi.setErrorMessage(c_ano.ErrorMessage()); //vi.set("regex",c_ano.Value()); if(form_para.validatelist.containsKey(ruletypename.rule_isBoolean)==false){ form_para.validatelist.remove(ruletypename.rule_isBoolean); } form_para.validatelist.put(ruletypename.rule_isBoolean,vi); } //--是否颜色 antemp1=tField.getAnnotation(Validate_isColor.class); if(antemp1!=null){ Validate_isColor c_ano=(Validate_isColor)antemp1; ValidateInput vi=new ValidateInput(); vi.setRuleName(ruletypename.rule_isColor); vi.setErrorMessage(c_ano.ErrorMessage()); //vi.set("regex",c_ano.Value()); if(form_para.validatelist.containsKey(ruletypename.rule_isColor)==false){ form_para.validatelist.remove(ruletypename.rule_isColor); } form_para.validatelist.put(ruletypename.rule_isColor,vi); } //--是否日期 antemp1=tField.getAnnotation(Validate_isDateTime.class); if(antemp1!=null){ Validate_isDateTime c_ano=(Validate_isDateTime)antemp1; ValidateInput vi=new ValidateInput(); vi.setRuleName(ruletypename.rule_isDateTime); vi.setErrorMessage(c_ano.ErrorMessage()); //vi.set("regex",c_ano.Value()); if(form_para.validatelist.containsKey(ruletypename.rule_isDateTime)==false){ form_para.validatelist.remove(ruletypename.rule_isDateTime); } form_para.validatelist.put(ruletypename.rule_isDateTime,vi); } //--是否Email地址 antemp1=tField.getAnnotation(Validate_isEmailAddr.class); if(antemp1!=null){ Validate_isEmailAddr c_ano=(Validate_isEmailAddr)antemp1; ValidateInput vi=new ValidateInput(); vi.setRuleName(ruletypename.rule_isEmailAddr); vi.setErrorMessage(c_ano.ErrorMessage()); //vi.set("regex",c_ano.Value()); if(form_para.validatelist.containsKey(ruletypename.rule_isEmailAddr)==false){ form_para.validatelist.remove(ruletypename.rule_isEmailAddr); } form_para.validatelist.put(ruletypename.rule_isEmailAddr,vi); } //--是否整数 antemp1=tField.getAnnotation(Validate_isInteger.class); if(antemp1!=null){ Validate_isInteger c_ano=(Validate_isInteger)antemp1; ValidateInput vi=new ValidateInput(); vi.setRuleName(ruletypename.rule_isInteger); vi.setErrorMessage(c_ano.ErrorMessage()); //vi.set("regex",c_ano.Value()); if(form_para.validatelist.containsKey(ruletypename.rule_isInteger)==false){ form_para.validatelist.remove(ruletypename.rule_isInteger); } form_para.validatelist.put(ruletypename.rule_isInteger,vi); } //--是否Numberic antemp1=tField.getAnnotation(Validate_isNumberic.class); if(antemp1!=null){ Validate_isNumberic c_ano=(Validate_isNumberic)antemp1; ValidateInput vi=new ValidateInput(); vi.setRuleName(ruletypename.rule_isNumberic); vi.setErrorMessage(c_ano.ErrorMessage()); //vi.set("regex",c_ano.Value()); if(form_para.validatelist.containsKey(ruletypename.rule_isNumberic)==false){ form_para.validatelist.remove(ruletypename.rule_isNumberic); } form_para.validatelist.put(ruletypename.rule_isNumberic,vi); } //--是否电话号码 antemp1=tField.getAnnotation(Validate_isPhoneNumber.class); if(antemp1!=null){ Validate_isPhoneNumber c_ano=(Validate_isPhoneNumber)antemp1; ValidateInput vi=new ValidateInput(); vi.setRuleName(ruletypename.rule_isPhoneNumber); vi.setErrorMessage(c_ano.ErrorMessage()); //vi.set("regex",c_ano.Value()); if(form_para.validatelist.containsKey(ruletypename.rule_isPhoneNumber)==false){ form_para.validatelist.remove(ruletypename.rule_isPhoneNumber); } form_para.validatelist.put(ruletypename.rule_isPhoneNumber,vi); } //--是否必须 antemp1=tField.getAnnotation(Validate_isRequired.class); if(antemp1!=null){ Validate_isRequired c_ano=(Validate_isRequired)antemp1; ValidateInput vi=new ValidateInput(); vi.setRuleName(ruletypename.rule_isRequired); vi.setErrorMessage(c_ano.ErrorMessage()); //vi.set("regex",c_ano.Value()); if(form_para.validatelist.containsKey(ruletypename.rule_isRequired)==false){ form_para.validatelist.remove(ruletypename.rule_isRequired); } form_para.validatelist.put(ruletypename.rule_isRequired,vi); } //--是否网址 antemp1=tField.getAnnotation(Validate_isURL.class); if(antemp1!=null){ Validate_isURL c_ano=(Validate_isURL)antemp1; ValidateInput vi=new ValidateInput(); vi.setRuleName(ruletypename.rule_isURL); vi.setErrorMessage(c_ano.ErrorMessage()); //vi.set("regex",c_ano.Value()); if(form_para.validatelist.containsKey(ruletypename.rule_isURL)==false){ form_para.validatelist.remove(ruletypename.rule_isURL); } form_para.validatelist.put(ruletypename.rule_isURL,vi); } //--数字范围 antemp1=tField.getAnnotation(Validate_NumberRange.class); if(antemp1!=null){ Validate_NumberRange c_ano=(Validate_NumberRange)antemp1; ValidateInput vi=new ValidateInput(); vi.setRuleName(ruletypename.rule_NumberRange); vi.setErrorMessage(c_ano.ErrorMessage()); vi.set("min",c_ano.min()); vi.set("max",c_ano.max()); if(form_para.validatelist.containsKey(ruletypename.rule_NumberRange)==false){ form_para.validatelist.remove(ruletypename.rule_NumberRange); } form_para.validatelist.put(ruletypename.rule_NumberRange,vi); } //--字符串范围 antemp1=tField.getAnnotation(Validate_StringRange.class); if(antemp1!=null){ Validate_StringRange c_ano=(Validate_StringRange)antemp1; ValidateInput vi=new ValidateInput(); vi.setRuleName(ruletypename.rule_StringRange); vi.setErrorMessage(c_ano.ErrorMessage()); vi.set("minLen",c_ano.minLen()); vi.set("maxLen",c_ano.maxLen()); if(form_para.validatelist.containsKey(ruletypename.rule_StringRange)==false){ form_para.validatelist.remove(ruletypename.rule_StringRange); } form_para.validatelist.put(ruletypename.rule_StringRange,vi); } System.out.println(tField.getName()+":参数注解如下:"); for (Annotation atm_ano:tf_annos){ System.out.println("参数名称:"+atm_ano.getClass().getName()+""); } } return form_para; } /** * 根据表单数据获得最基本的数据类型 * */ private static String getTypestr(String GenericTypeStr){ JavaDataType mydtype=new JavaDataType(); //--判断开始【基础类型】 //--普通字符串。 if(GenericTypeStr.equals("class java.lang.String")){ return mydtype.Type_String; } //---判断int,整数i else if(GenericTypeStr.equals("int")){ return mydtype.Type_Integer; } else if(GenericTypeStr.equals("class java.lang.Integer")){ return mydtype.Type_Integer; } //--判断float,浮点数 else if(GenericTypeStr.equals("float")){ return mydtype.Type_Float; } else if(GenericTypeStr.equals("class java.lang.Float")){ return mydtype.Type_Float; } //--判断double,浮点数 else if(GenericTypeStr.equals("double")){ return mydtype.Type_Double; } else if(GenericTypeStr.equals("class java.lang.Double")){ return mydtype.Type_Double; } //--判断char,字符 else if(GenericTypeStr.equals("char")){ return mydtype.Type_String; } else if(GenericTypeStr.equals("class java.lang.Character")){ return mydtype.Type_String; } //--判断数字,short,整数 else if(GenericTypeStr.equals("short")){ return mydtype.Type_Integer; } else if(GenericTypeStr.equals("class java.lang.Short")){ return mydtype.Type_Integer; } //--判断long,长整数 else if(GenericTypeStr.equals("long")){ return mydtype.Type_Integer; } else if(GenericTypeStr.equals("class java.lang.Long")){ return mydtype.Type_Integer; } //--判断boolean,布尔值 else if(GenericTypeStr.equals("boolean")){ return mydtype.Type_Boolean; } else if(GenericTypeStr.equals("class java.lang.Boolean")){ return mydtype.Type_Boolean; } else if(GenericTypeStr.equals("class java.util.Date")){ return mydtype.getType_Date(); } //--假如这些都不是,那么就看看符不符合自定义类型 else{ return ""; } } private static ValidateInput getValidateInputByTypeStr(String typeStr,String name_ZH){ JavaDataType jdtype=new JavaDataType(); if(StringUtil.isNullOrEmpty(typeStr)){ return null; } if(typeStr.equals(jdtype.Type_Boolean)){ ValidateInput v=new ValidateInput(); v.setErrorMessage(name_ZH+"必须为布尔值。"); v.setRuleName(jdtype.Type_Boolean); return v; } else if (typeStr.equals(jdtype.Type_Date)){ ValidateInput v=new ValidateInput(); v.setErrorMessage(name_ZH+"格式错误!"); v.setRuleName(jdtype.Type_Date); return v; } else if (typeStr.equals(jdtype.Type_Double)){ ValidateInput v=new ValidateInput(); v.setErrorMessage(name_ZH+"格式错误,必须为小数或整数!"); v.setRuleName(jdtype.Type_Double); return v; } else if (typeStr.equals(jdtype.Type_Float)){ ValidateInput v=new ValidateInput(); v.setErrorMessage(name_ZH+"格式错误,必须为小数或整数!"); v.setRuleName(jdtype.Type_Float); return v; } else if (typeStr.equals(jdtype.Type_Integer)){ ValidateInput v=new ValidateInput(); v.setErrorMessage(name_ZH+"格式错误,必须为整数!"); v.setRuleName(jdtype.Type_Integer); return v; } else if (typeStr.equals(jdtype.Type_Long)){ ValidateInput v=new ValidateInput(); v.setErrorMessage(name_ZH+"格式错误,必须为整数!"); v.setRuleName(jdtype.Type_Long); return v; } return null; } }
【下面是几个模板】
【form.vm用来显示自定义表单及相关验证逻辑】
【贴不完,留待下一章】