【代码生成】如何生成自定义表单?(3)---将用户模型及注解转换成为表单数据

【其实说起来也没什么复杂的,无非是用反射将模型的所有字段过一次,然后逐个字段检查,看看上面附有什么样的注解信息,顺便将它们放进验证规则里面】


【至于编写模板,将模型字段都转换成为表单信息后,就顺便可以写模板了,但是模板的最大问题在于,如何让它们适应项目】


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用来显示自定义表单及相关验证逻辑】


【贴不完,留待下一章】


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值