文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

某些时候我们需要生成模板源码,用来添加变化内容,这能节省开发者很多时间。如果没有自动的源码生成,开发者需要不断重复的创建源文件并添加所需方法。有了自动化,工具将为我们生成这些代码,开发者只需要在所生成的文件中添加业务逻辑即可。

例如在项目中的一些 JPA 对象,我们将通过 Web 服务的方式输出基本的 CRUD 操作。开发人员可以手工创建一个 Web 服务,或者是用工具自动创建。

在这篇文章中,我们将使用 FreeMarker 生成一个简单的 Web 服务,然后你可以根据自己项目的需要对这个 Web 服务进行修改。

第 1 段(可获 1.44 积分)

FreeMarker 是一个 Java 模板引擎,可以自动化的创建输出内容。为了生成输出文本,FreeMarker 使用 FTL 模板语言,我们需要在模板语言上编写指令以及变量。然后使用 Java 对象来提供实际的数据,用于替换模板中的变量。FreeMarker 将二者结合起来输出合并后的内容。

Image title

FreeMarker 输出的生成过程

使用 FreeMarker 的好处(来自 FreeMarker 网站):

  1. 强大的模板语言:条件块、迭代、赋值、字符串、算术操作以及格式化、宏、函数以及引用其他模板等等

  2. 多用途以及轻量级:零依赖,支持任意输出格式,可以从任何地方加载模板,提供很多配置选项

  3. 国际化/本地化支持:语言环境敏感的数字和日期时间格式化、本地化模板变量

  4. XML 处理能力:可以将 XML 的 DOM 转成数据模型并进行遍历以及处理

  5. 多才多艺的数据模型:输出到模板的 Java 对象通过可嵌入式的适配器提供树状的变量访问,这决定了模板如何访问这些数据。

第 2 段(可获 2.01 积分)

为了使用 FreeMarker 来生成 Java 的 Web 服务文件,我们需要安装如下几个步骤来执行:

  1. 创建一个 FTL 模板文件,文件中定义一些输出的变量,在实际中会被替换成 Java 对象的值。

    ${package}
    
    import javax.jws.*;
    
    @WebService()
    public class ${name}
    {
    
    @WebMethod()
    public ${return} ${methodname}(${params})
    {
       ${body}
       return ${val}
    }
    
    }
  2.  接下来创建一个 Java 文件,为上面的模板文件提供数据,并标明输入的内容所存储的文件路径。为了运行这个文件,你需要下载 freemarker*.jar.

package com.example;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class WebServiceGenerator {

private static WebServiceGenerator engine = new WebServiceGenerator();
private Template template=null;
Map<String, Object> dataMap = new HashMap<String, Object>();

private WebServiceGenerator() 
{
init();
}

private void init() 
{

Configuration cfg = new Configuration();
try {
template = cfg.getTemplate("src/javaGen.ftl");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

public static WebServiceGenerator get()
{
return engine;
}

public WebServiceGenerator buildData()
{
dataMap.put("package", this.getClass().getPackage()+";");
dataMap.put("name", "HelloWorldservice");
dataMap.put("return", "String");
dataMap.put("methodname", "hello");
dataMap.put("params", "String name");
dataMap.put("body", "String res= \"Hi\" + name;\n System.out.println(res);");
dataMap.put("val", "res;");
System.out.println("Preparing Data");



return engine;
}

public void  writeFile()
{
Writer file=null;
try {
file = new FileWriter (new File("C:\\installer\\HelloWorldservice.java"));
template.process(dataMap, file);
file.flush();
System.out.println("Success");

}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{

try {
file.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}




public static void main(String[] args) {

WebServiceGenerator.get().buildData().writeFile();

}

}

输出结果: 

package com.example;

import javax.jws.*;

@WebService()
public class HelloWorldservice
{

@WebMethod()
public String hello(String name)
{
   String res= "Hi" + name;
 System.out.println(res);
return res;
}
}
第 3 段(可获 0.88 积分)

文章评论