【其实说起来也没什么复杂的,无非是用反射将模型的所有字段过一次,然后逐个字段检查,看看上面附有什么样的注解信息,顺便将它们放进验证规则里面】
【至于编写模板,将模型字段都转换成为表单信息后,就顺便可以写模板了,但是模板的最大问题在于,如何让它们适应项目】
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用来显示自定义表单及相关验证逻辑】
【贴不完,留待下一章】