项目中经常会用到xml模板,如邮件、短信等,在java中填充xml模板,方法很多,这边介绍两个方法(jaxb不算),用到freemarker.template.Template和org.apache.velocity.VelocityContext
一、报文模板:cancel_hesitation_request.xml
${seatDept}
${seatCode}
${insu}
11
${subject}
${traDate}
${trans}
${validateTime}
${policyNo}
11
${serviceId}
${productNum}
${withdrawMoney}
方法一:使用freemarker.template.Template和org.springframework.ui.freemarker.FreeMarkerTemplateUtils
private String getCancelRequestMsg(CancelRequestDTO request) {
// 定义局部变量
String templatePath = "/template/cancel/"; // 报文模板路径
String templateFileName = "cancel_hesitation_request.xml"; // 模板文件名
String requestXml = "";
// 构建请求报文,并转换成报文字符串
Configuration config = new Configuration();
try {
//config.setDirectoryForTemplateLoading(new File(templatePath));
//Template template=config.getTemplate(templateFileName);
config.setClassForTemplateLoading(getClass(), "/");
Template template = config.getTemplate("template/cancel/cancel_hesitation_request.xml","GBK");// 报文模板
// 设置模板参数
Map context = new HashMap();
context.put("seatDept", request.getSeatDept());
context.put("seatCode", request.getSeatCode());
context.put("insu", request.getInsu());
context.put("subject", request.getSubject());
context.put("traDate", DateUtils.dateToString("yyyyMMdd", request.getTraDate()));
//
context.put("trans", request.getTrans());
context.put("validateTime", DateUtils.dateToString("yyyyMMdd",request.getValidateTime()));
context.put("policyNo", request.getPolicyNo());
context.put("serviceId", request.getServiceId());
context.put("productNum", request.getProductNum().get(0));
context.put("withdrawMoney", request.getWithdrawMoney().get(0)==null ? "" : request.getWithdrawMoney().get(0).toString());
requestXml = FreeMarkerTemplateUtils.processTemplateIntoString(template,context);
LogTool.inf(this.getClass(), "getCancelRequest is: " + requestXml);
System.out.println(this.getClass()+ " getCancelRequest is: \n" + requestXml);
if (requestXml == null || "".equals(requestXml)) {
errorLogTool.addErrorLog("填充模板出错,模板路径:" + templatePath
+ templateFileName, ConstantTool.ErrorTemplateFill);
return null;
}
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
// 返回报文字符串
return requestXml;
}
方法二:使用org.apache.velocity.VelocityContext和org.apache.velocity.Template
1、封装的TemplateTool.java,用于填充模板
import java.io.PrintStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
public class TemplateTool
{
public static String fill(VelocityContext context, String tmdir, String tmFile)
{
String result = "";
try {
Properties p = new Properties();
p.setProperty("file.resource.loader.path", tmdir);
VelocityEngine ve = new VelocityEngine();
ve.init(p);
Template t = ve.getTemplate(tmFile);
StringWriter writer = new StringWriter();
t.merge(context, writer);
result = writer.toString();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static String fill(VelocityContext context, String tmdir, String tmFile, String inputEncode, String ouputEncode)
{
String result = "";
try {
Properties p = new Properties();
p.setProperty("file.resource.loader.path", tmdir);
p.setProperty("ISO-8859-1", "UTF-8");
p.setProperty("input.encoding", inputEncode);
p.setProperty("output.encoding", ouputEncode);
VelocityEngine ve = new VelocityEngine();
ve.init(p);
Template t = ve.getTemplate(tmFile);
StringWriter writer = new StringWriter();
t.merge(context, writer);
result = writer.toString();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static String fill(VelocityContext context, String templateString)
{
String result = "";
try
{
VelocityEngine ve = new VelocityEngine();
ve.init();
StringWriter writer = new StringWriter();
StringReader reader = new StringReader(templateString);
ve.evaluate(context, writer, "temp", reader);
result = writer.toString();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static String test(int i)
{
return "array:" + i;
}
}
2、具体写入的方法,其中调用TemplateTool.fill()方法。
private String getCancelRequestMsg(CancelRequestDTO request) {
// 定义局部变量
String templatePath = "/template/cancel/"; // 报文模板路径
String templateFileName = "cancel_hesitation_request.xml"; // 报文模板文件名
String requestXml = "";
// 构建请求报文,并转换成报文字符串
VelocityContext context = new VelocityContext();
context.put("seatDept", request.getSeatDept());
context.put("seatCode", request.getSeatCode());
context.put("insu", request.getInsu());
context.put("subject", request.getSubject());
context.put("traDate", DateUtils.dateToString("yyyyMMdd", request.getTraDate()));
context.put("trans", request.getTrans());
context.put("validateTime", DateUtils.dateToString("yyyyMMdd",request.getValidateTime()));
context.put("policyNo", request.getPolicyNo());
context.put("serviceId", request.getServiceId());
context.put("productNum", request.getProductNum().get(0));
context.put("withdrawMoney", request.getWithdrawMoney().get(0));
requestXml = TemplateTool.fill(context, this.getClass().getResource(
templatePath).getPath(), templateFileName, "GBK", "GBK");
LogTool.inf(this.getClass(), "getCancelRequest is: " + requestXml);
if (requestXml == null || "".equals(requestXml)) {
errorLogTool.addErrorLog("填充模板出错,模板路径:" + templatePath
+ templateFileName, ConstantTool.ErrorTemplateFill);
return null;
}
// 返回报文字符串
return requestXml;
}