您的位置:首页 > 其它

使用freemarker作为报文发送模版

2018-01-29 11:49 393 查看
FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言, 不是 像PHP那样成熟的编程语言。 那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。

这种方式通常被称为 MVC (模型 视图 控制器) 模式,对于动态网页来说,是一种特别流行的模式。 它帮助从开发人员(Java 程序员)中分离出网页设计师(HTML设计师)。设计师无需面对模板中的复杂逻辑, 在没有程序员来修改或重新编译代码时,也可以修改页面的样式。

下面的用法是发送报文:

1:首先需要下载freemarker包

1.1:如果是maven项目,直接加入:

<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.22</version>
</dependency>

1.2:如果不是maven项目,直接下载freemarker.2.3.22.jar包。


2:freemarker模版

要发送报文,就需要报文模版,模版可以以任何后缀名结尾,常用的是.ftl结尾。

模版名:accountQuery.ftl
内容如下:
<Finance>
<Message id="${messageId}">
<AQReq id="${id}">
<version>${version}</version>
<date>${date}</date>
<#if extension ?? && extension != "">
<extension>${extension}</extension>
</#if>
</AQReq>
</Message>
</Finance>

新建一个templete文件夹或者包,将accountQuery.ftl放到templete下。

新建的templete放到项目目录下:src/main/resources 或 src/main/java 目录下
都可以。

最后使用方法是将模版取出转换成自己想要的数据格式。下面是将模版先转换成string类
型,然后再转换成Document:


/**
* 获取模版
* @param templateFileName 模版名称必须带后缀名
* @return
* @throws Exception
*/
public static Template getFtlTemplete(String templateFileName) throws Exception{
Configuration config = new Configuration(Configuration.VERSION_2_3_22);
//如果当前类不是static,直接使用this.getClass()
config.setClassForTemplateLoading(当前类.class, templatePath);
config.setDefaultEncoding("UTF-8");//要UTF-8,不然中文乱码
return config.getTemplate(templateFileName);
}

/**
* 将模版转换成string
* @param templateFileName
* @param paramMap 模版中的变量赋值
* @return
* @throws Exception
*/
public static String getFtlString(String templateFileName,Map<String, String> paramMap) throws Exception{
return FreeMarkerTemplateUtils.processTemplateIntoString(getFtlTemplete(templateFileName), paramMap);
}

/**
* 获取document
* @param sendReq
* @param paramMap
* @param templateFileName
* @return
* @throws Exception
*/
public static Document getDocument(String sendReq,Map<String, String> paramMap,String templateFileName) throws Exception{
return getDocument(getFtlString(templateFileName,getRequestStringMap(paramMap, sendReq)));
}

/**
* xml格式的String转Document
* @param ftl
* @return
* @throws Exception
*/
public static Document getDocument(String ftl) throws Exception{
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
docBuilderFactory.setNamespaceAware(true);
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc=docBuilder.parse(new InputSource(new StringReader(ftl)));
return doc;
}

/**
* 设置公共报文参数
* @param map
* @param sendReq
* @return
*/
public static Map<String, String> getRequestStringMap(Map<String, String> map,String sendReq){
map.put("messageId", "122112");
map.put("id", sendReq);
map.put("version", "1.0.1");
return map;
}
//调用 三个参数:业务类型 变量参数 模版名称
BankHelper.getDocument("QUERY", paramMap, "accountQuery.ftl")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: