网页模板生产器

package FreeMarker;

import java.io.File;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.OutputStreamWriter;  
import java.text.SimpleDateFormat;  
import java.util.ArrayList;  
import java.util.Date;  
import java.util.HashMap;  
import java.util.List;
import java.util.Locale;
import java.util.Map;  
  
import freemarker.template.Configuration;  
import freemarker.template.Template;  
import freemarker.template.TemplateException;  
  
public class Test {  
  
    /** 
     * @param args 
     */  
    @SuppressWarnings({ "deprecation", "unchecked", "rawtypes" })  
    public static void main(String[] args) {  
        //System.out.println(System.getProperty("user.dir")+"============");  
        Configuration cfg = new Configuration();  
        try {  
            cfg.setClassForTemplateLoading(Test.class, "/FreeMarker");//指定模板所在的classpath目录
            cfg.setEncoding(Locale.CHINA, "gbk");
            cfg.setSharedVariable("upperFC", new UpperFirstCharacter());//添加一个"宏"共享变量用来将属性名首字母大写  
            Template t = cfg.getTemplate("javabean.html");//指定模板  
            cfg.setSharedVariable("upperFC", new UpperFirstCharacter());//添加一个"宏"共享变量用来将属性名首字母大写    
            FileOutputStream fos = new FileOutputStream(new File("Item.java"));//java文件的生成目录  
  
            //模拟数据源  
            Map data = new HashMap();  
            data.put("basepackage", "com.ook");//包名  
            data.put("collection", "item");  
            data.put("entity", "Item");  
            data.put("entityDes", "商品entity");  
            SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");  
            data.put("entityCt", df.format(new Date()));  
  
            List propertyList = new ArrayList();  
            Map proMap = new HashMap();  
            proMap.put("proType", String.class.getSimpleName());  
            proMap.put("proName", "name");  
            proMap.put("des", "");  
            propertyList.add(proMap);  
  
            proMap = new HashMap();  
            proMap.put("proType", Date.class.getSimpleName());  
            proMap.put("proName", "ct");  
            proMap.put("des", "//添加时间");  
            propertyList.add(proMap);  
              
            proMap = new HashMap();  
            proMap.put("proType", int.class.getSimpleName());  
            proMap.put("proName", "hotCnt");  
            proMap.put("des", "//阅读量");  
            propertyList.add(proMap);  
  
            data.put("properties", propertyList);  
            t.process(data, new OutputStreamWriter(fos,"utf-8"));//  
            fos.flush();  
            fos.close();  
              
              
            System.out.println("文件生成完毕~");  
        } catch (IOException e) {  
            e.printStackTrace();  
        } catch (TemplateException e) {  
            e.printStackTrace();  
        }  
    }  
  
}  
package FreeMarker;
import java.io.IOException;  
import java.io.Writer;  
import java.util.Map;  
import freemarker.core.Environment;  
import freemarker.template.TemplateDirectiveBody;  
import freemarker.template.TemplateDirectiveModel;  
import freemarker.template.TemplateException;  
import freemarker.template.TemplateModel;  
import freemarker.template.TemplateModelException;  
  
public class UpperFirstCharacter implements TemplateDirectiveModel{    
  
    @SuppressWarnings("rawtypes")  
    public   void  execute(Environment env,    
            Map params, TemplateModel[] loopVars,    
            TemplateDirectiveBody body)    
                    throws  TemplateException, IOException {    
        // Check if no parameters were given:     
        if  (!params.isEmpty()) {    
            throw   new  TemplateModelException(    
                    "This directive doesn't allow parameters." );    
        }    
        if  (loopVars.length !=  0 ) {    
            throw   new  TemplateModelException(    
                    "This directive doesn't allow loop variables." );    
        }    
  
        // If there is non-empty nested content:     
        if  (body !=  null ) {    
            // Executes the nested body. Same as <#nested> in FTL, except     
            // that we use our own writer instead of the current output writer.     
            body.render(new  UpperCaseFilterWriter(env.getOut()));    
        } else  {    
            throw   new  RuntimeException( "missing body" );    
        }    
    }    
  
    /**    
     * A {@link Writer} that transforms the character stream to upper case    
     * and forwards it to another {@link Writer}.    
     */      
    private   static   class  UpperCaseFilterWriter  extends  Writer {    
  
        private   final  Writer out;    
  
        UpperCaseFilterWriter (Writer out) {    
            this .out = out;    
        }    
  
        public   void  write( char [] cbuf,  int  off,  int  len)    
                throws  IOException {    
            //            char[] transformedCbuf = new char[len];     
            //            for (int i = 0; i < len; i++) {     
            //                transformedCbuf[i] = Character.toUpperCase(cbuf[i + off]);     
            //            }     
            //            out.write(transformedCbuf);     
            cbuf[0 ] = Character.toUpperCase(cbuf[ 0 ]);    
            out.write(String.valueOf(cbuf).trim());///把右边空格去掉     
        }    
  
        public   void  flush()  throws  IOException {    
            out.flush();    
        }    
  
        public   void  close()  throws  IOException {    
            out.close();    
        }    
    }    
  
}    
package ${basepackage}.entity;  
  
import java.util.Date;  
import java.io.Serializable;  
import org.springframework.data.annotation.Id;  
import org.springframework.data.mongodb.core.mapping.Document;  
  
/**  
 * ${entityDes}  
 * @date ${entityCt}  
 */  
@Document(collection="${collection}")  
public class ${entity} implements Serializable{  
    private static final long serialVersionUID = 1L;  
    @Id  
    private String id;  
<#list properties as pro>  
    private ${pro.proType} ${pro.proName};${pro.des}  
</#list>  
      
    public String getId() {  
        return id;  
    }  
    public void setId(String id) {  
        this.id = id;  
    }  
<#list properties as pro>  
    public void set<@upperFC>${pro.proName}</@upperFC>(${pro.proType} ${pro.proName}){  
        this.${pro.proName}=${pro.proName};  
    }  
      
    public ${pro.proType} get<@upperFC>${pro.proName}</@upperFC>(){  
        return this.${pro.proName};  
    }  
      
</#list>  
} 
原文地址:https://www.cnblogs.com/chenxuezhouLearnProgram/p/5712978.html