利用Freemarker实现表到功能界面的一键生成

介绍使用Freemarker自动生成基于表结构的CRUD界面及对应Java文件的方法,大幅提升开发效率。



利用Freemarker实现表到功能界面的一键生成
2012-04-20 17:50:03
标签:执行文件 程序编写 表 工程 开发

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://danni505.blog.51cto.com/15547/839882
 

      利用Freemarker产生项目所需的常用文件,可以根据一个表产生对应的ibtais的java及xml文件,及前台的JSP文件,这样可以大大的提高普通程序编写人员的开发效率,及从表到界面及CURD功能利用这个工程可以直接生成好,下面提供下最核心的文件产生类,代码如下:

 

另外提供编译过的工程文件,可执行文件,在附件中,由于大小控制,已经删除里面的freemarker-2.3.15.jar文件。
01.package com.hundsun.pms.generator.util;
02.
03.import com.hundsun.pms.generator.api.Constants;
04.import com.hundsun.pms.generator.model.page.Page;
05.import freemarker.template.Configuration;
06.import freemarker.template.DefaultObjectWrapper;
07.import freemarker.template.Template;
08.import freemarker.template.TemplateException;
09.import org.apache.commons.lang.StringUtils;
10.import org.springframework.util.ResourceUtils;
11.
12.import java.io.*;
13.import java.net.URL;
14.import java.util.Locale;
15.import java.util.Map;
16.
17./**
18. * Created by IntelliJ IDEA.
19. * User: pangj
20. * Date: 2012-3-6
21. * Time: 10:05:26
22. * 文件操作工具类
23. */
24.public class FreemarkerUtil {
25.
26.    public static String PROJECT_ROOT = "projectRoot";
27.
28.    public static String PACKAGE_NAME = "packageName";
29.
30.    public static String CLASS_SIMPLE_NAME = "classSimpleName";
31.
32.    public static String MODULES_PACKAGE = "modulesPackage";
33.
34.    public static String METHOD_NAME = "methodName";
35.
36.    //模板根目录
37.    private static final String templateRootWithClasspath = "classpath*:com/hundsun/pms/generator/resource/template";
38.
39.    private static final String templateRoot = "com/hundsun/pms/generator/resource/template";
40.    //工程根目录
41.    private static String projectRoot;
42.    //包名
43.    private static String packageName;
44.    //服务所在的包路径
45.    private static String modulesPackage;
46.
47.    private static String classSimpleName;
48.
49.    private static String templateName;
50.
51.    private static String methodName;
52.
53.    public static final String FILE_BO_NAME_SUFFIX = "Bo.java";
54.
55.    public static final String FILE_BOIMPL_NAME_SUFFIX = "BoImpl.java";
56.
57.    public static final String FILE_DAO_NAME_SUFFIX = "Dao.java";
58.
59.    public static final String FILE_DAOIMPL_NAME_SUFFIX = "DaoImpl.java";
60.
61.    public static final String FILE_DTO_NAME_SUFFIX = ".java";
62.
63.    public static final String FILE_SQL_MAP_SUFFIX = ".xml";
64.
65.    public static final String FILE_SERVICE_SUFFIX = ".service";
66.
67.    public static final String FILE_COMPONENT_SUFFIX = ".component";
68.
69.    public static final String FILE_MODULE_NAME = "module.xml";
70.
71.    public static final String FILE_PAGE_SUFFIX = ".jsp";
72.
73.
74.    /**
75.     * 数据绑定至模板
76.     *
77.     * @param tpName 模板名
78.     * @param param  参数
79.     * @return
80.     */
81.    public static void process(String tpName, Map<String, Object> param) {
82.        init(tpName, param);
83.        Writer out = null;
84.        try {
85.            Template temp = getTemplate(templateName);
86.            String fileDir = getFileDir();
87.            File dir = new File(fileDir);
88.            if (!dir.exists()) {
89.                if (!dir.mkdirs()) {
90.                    MsgUtil.print("创建目录:" + fileDir + "失败");
91.                    return;
92.                }
93.            }
94.            File f = new File(fileDir + getFileName());
95.            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), "utf-8"));
96.            try {
97.                temp.setEncoding("utf-8");
98.                temp.process(param, out);
99.                MsgUtil.print("文件:" + getFileDir() + getFileName() + "生成完成!");
100.            } catch (TemplateException e) {
101.                MsgUtil.print("文件:" + getFileDir() + getFileName() + "生成失败,请检查原因!");
102.                MsgUtil.print(e.getMessage());
103.            }
104.            out.flush();
105.            out.close();
106.        } catch (IOException e) {
107.            e.printStackTrace();
108.            MsgUtil.print(e.getMessage());
109.        }
110.    }
111.
112.    /**
113.     * 生成页面
114.     *
115.     * @param tpName 模板名
116.     * @param jsp    jsp页面全路径
117.     * @param page   页面对象
118.     */
119.    public static void process(String tpName, String jsp, Page page) {
120.        Writer writer = null;
121.        try {
122.            Template tmp = FreemarkerUtil.getTemplate(tpName);
123.            String dir = jsp.substring(0, jsp.lastIndexOf("\\"));
124.            File fdir = new File(dir);
125.            if (!fdir.exists()) {
126.                if (!fdir.mkdirs()) {
127.                    MsgUtil.print("创建目录:" + fdir + "失败");
128.                    return;
129.                }
130.            }
131.            File file = new File(jsp);
132.            writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "utf-8"));
133.            tmp.setEncoding("utf-8");
134.            tmp.process(page, writer);
135.            writer.flush();
136.            writer.close();
137.            MsgUtil.print("页面:" + jsp + " 生成成功!");
138.        } catch (TemplateException e) {
139.            e.printStackTrace();
140.            MsgUtil.print(e.getMessage());
141.        } catch (IOException e) {
142.            e.printStackTrace();
143.            MsgUtil.print(e.getMessage());
144.        }
145.    }
146.
147.    public static Template getTemplate(String templateName) {
148.        Configuration cfg = new Configuration();
149.        Template temp = null;
150.        URL path = FreemarkerUtil.class.getClassLoader().getSystemResource("");
151.        File tmpRootFile = null;
152.        if (path == null) {
153.            tmpRootFile = getResourceURL("resource/template");
154.        } else {
155.            String tmpRoot = path + templateRoot;
156.            tmpRoot = tmpRoot.replaceAll("file:/", "");
157.            tmpRootFile = new File(tmpRoot);
158.        }
159.        if (tmpRootFile == null) {
160.            throw new RuntimeException("无法取得模板根路径!");
161.        }
162.        try {
163.            cfg.setDefaultEncoding("utf-8");
164.            cfg.setOutputEncoding("utf-8");
165.            cfg.setDirectoryForTemplateLoading(tmpRootFile);
166.            /*cfg.setDirectoryForTemplateLoading(getResourceURL());*/
167.            cfg.setObjectWrapper(new DefaultObjectWrapper());
168.            temp = cfg.getTemplate(templateName);
169.        } catch (IOException e) {
170.            e.printStackTrace();
171.            MsgUtil.print(e.getMessage());
172.        }
173.        return temp;
174.    }
175.
176.    public static File getResourceURL(String templatePath) {
177.        try {
178.            URL url = ResourceUtils.getURL(templateRootWithClasspath);
179.            String path = url.getPath();
180.            path = path.replace(templateRootWithClasspath, templatePath);
181.            MsgUtil.print("File path is:"+path);
182.            path = StringUtils.replace(path, "%20", " ");
183.            return new File(path);
184.        } catch (FileNotFoundException e) {
185.            throw new RuntimeException("不能获取路径:" + templateRootWithClasspath);
186.        }
187.    }
188.
189.    private static void init(String tpName, Map<String, Object> param) {
190.        projectRoot = (String) param.get(PROJECT_ROOT);
191.        packageName = (String) param.get(PACKAGE_NAME);
192.        classSimpleName = (String) param.get(CLASS_SIMPLE_NAME);
193.        modulesPackage = (String) param.get(MODULES_PACKAGE);
194.        methodName = (String) param.get(METHOD_NAME);
195.        templateName = tpName;
196.    }
197.
198.    private static String getFileName() {
199.        if (Constants.TEMPLATE_BO.equals(templateName)) {
200.            return classSimpleName + FILE_BO_NAME_SUFFIX;
201.        } else if (Constants.TEMPLATE_BOIMPL.equals(templateName)) {
202.            return classSimpleName + FILE_BOIMPL_NAME_SUFFIX;
203.        } else if (Constants.TEMPLATE_DAO.equals(templateName)) {
204.            return classSimpleName + FILE_DAO_NAME_SUFFIX;
205.        } else if (Constants.TEMPLATE_DAOIMPL.equals(templateName)) {
206.            return classSimpleName + FILE_DAOIMPL_NAME_SUFFIX;
207.        } else if (Constants.TEMPLATE_DTO.equals(templateName)) {
208.            return classSimpleName + FILE_DTO_NAME_SUFFIX;
209.        } else if (Constants.TEMPLATE_SQLMAP.equals(templateName)) {
210.            return classSimpleName + FILE_SQL_MAP_SUFFIX;
211.        } else if (Constants.TEMPLATE_SERVICE.equals(templateName)) {
212.            return methodName + FILE_SERVICE_SUFFIX;
213.        } else if (Constants.TEMPLATE_COMPONENT.equals(templateName)) {
214.            return NamingRuleConvert.firstLetterToLowerCase(classSimpleName) + FILE_COMPONENT_SUFFIX;
215.        } else if (Constants.TEMPLATE_CS.equals(templateName) || Constants.TEMPLATE_DS.equals(templateName) ||
216.                Constants.TEMPLATE_MODULE.equals(templateName)) {
217.            return FILE_MODULE_NAME;
218.        }
219.        return null;
220.    }
221.
222.    private static String getFileDir() {
223.        String path = null;
224.        if (packageName != null)
225.            path = packageName.replaceAll("\\.", "/");
226.        String servicePath = null;
227.        if (!StringUtils.isEmpty(modulesPackage)) {
228.            servicePath = modulesPackage.replaceAll("\\.", "/");
229.        }
230.        if (Constants.TEMPLATE_BO.equals(templateName)) {
231.            return projectRoot + Constants.SRC_DIR + path + "/bo/";
232.        } else if (Constants.TEMPLATE_BOIMPL.equals(templateName)) {
233.            return projectRoot + Constants.SRC_DIR + path + "/bo/impl/";
234.        } else if (Constants.TEMPLATE_DAO.equals(templateName)) {
235.            return projectRoot + Constants.SRC_DIR + path + "/dao/";
236.        } else if (Constants.TEMPLATE_DAOIMPL.equals(templateName)) {
237.            return projectRoot + Constants.SRC_DIR + path + "/dao/impl/";
238.        } else if (Constants.TEMPLATE_DTO.equals(templateName)) {
239.            return projectRoot + Constants.SRC_DIR + path + "/dto/";
240.        } else if (Constants.TEMPLATE_SQLMAP.equals(templateName)) {
241.            return projectRoot + Constants.SRC_DIR + path + "/dao/maps/";
242.        } else if (Constants.TEMPLATE_SERVICE.equals(templateName) || (Constants.TEMPLATE_CS.equals(templateName))) {
243.            return projectRoot + "/modules/" + servicePath + "/cs/";
244.        } else if (Constants.TEMPLATE_COMPONENT.equals(templateName) || Constants.TEMPLATE_DS.equals(templateName)) {
245.            return projectRoot + "/modules/" + servicePath + "/ds/";
246.        } else if (Constants.TEMPLATE_MODULE.equals(templateName)) {
247.            return projectRoot + "/modules/" + servicePath + "/";
248.        }
249.        return null;
250.    }
251.}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值