Freemarker一般是通过writer输出到文件的处理过程,但是这个过程不是很优化的,大量的IO操作使程序变的很慢。尤其是生成对应的文件后,再做一些处理,更是慢上加慢。
废话少说,先看看改造前的代码。
cfg.setClassForTemplateLoading(this.getClass(), "/");
cfg.setObjectWrapper(new DefaultObjectWrapper());
cfg.setNumberFormat("################");
Questionnaire questionnaire = questionnaireDAO.findById(input.getDialogId());
Map root = new HashMap();
root.put("questionnaire", questionnaire);
Template template = cfg.getTemplate("soapRequest.ftl");
OutputStream os = conn.getOutputStream();
Writer out = new BufferedWriter(new OutputStreamWriter(os, "utf-8"));
template.process(root, out);
out.flush();
out.close();
修改后的。
cfg.setClassForTemplateLoading(this.getClass(), "/");
cfg.setObjectWrapper(new DefaultObjectWrapper());
cfg.setNumberFormat("################");
Questionnaire questionnaire = questionnaireDAO.findById(input.getDialogId());
Map root = new HashMap();
root.put("questionnaire", questionnaire);
/**
* StringWriter instead of Writer
* Class StringWriter contains a StringBuffer which can be rendered toString
* modify by heweiya
*/
StringWriter stringWriter = new StringWriter();
BufferedWriter writer = new BufferedWriter(stringWriter);
template.setEncoding("UTF-8");
template.process(root, writer);
StringReader reader = new StringReader(stringWriter.toString());
writer.flush();
writer.close();
说白了就是使用StringWriter代替了writer,我在代码里直接转换成了StringReader,同样,如果你没有必要做这个的话,你可以把StringWriter转换成String.
分享到:
相关推荐
在本文中,我们将深入探讨如何使用FreeMarker来操作字符串。 FreeMarker的工作原理是将模板(HTML或XML文件)与数据模型(通常是Java对象)相结合,生成最终的输出。模板中包含了可替换的占位符,这些占位符由...
substring(1)}` 输出字符串`str`从第二个字符开始的部分。 - `${str?substring(2)}` 输出字符串`str`从第三个字符开始的部分。 - `${str?substring(3)}` 输出字符串`str`从第四个字符开始的部分。 - `${str?...
当表达式的计算结果为字符串、数字、日期或布尔值时,它们会被相应地处理和输出。 - **通用插值**(`${expr}`): - 字符串值:直接输出表达式的结果。 - 数字值:默认情况下,按照预设的格式(可通过`#setting`...
虽然部分内容中没有详细介绍`Assistant`类,但可以推测它可能提供了辅助方法,如读写文件、处理字符串等,帮助简化`FreemarkerRender`类的操作流程。 ### 四、使用步骤 1. **准备数据模型**:创建`beanRenderClass...
5. **输出XML**:生成的XML字符串可以写入文件或直接用于其他操作。 通过上述步骤,你可以利用Freemarker动态生成XML文件。值得注意的是,Freemarker支持条件判断、循环、函数调用等多种复杂逻辑,使得XML生成更加...
- **字符串**: 由单引号或双引号括起来的文本。 - **数字**: 直接使用数值。 - **日期**: 通常从数据模型中获取。 - **布尔值**: `true` 或 `false`,常用于 `<#if...>` 结构中。 **2. Hashes(哈希表)** - ...
通用插值可以输出字符串、数字、日期或布尔值。它可以使用内建的字符串函数来格式化输出结果。 例如:${answer} 将输出 42${answer?string} 将输出 42${answer?string.number} 将输出 42${answer?string.currency} ...
FreeMarker提供了文本处理功能,如字符串拼接、格式化输出: - `${'Hello, ' + user.name}`:拼接字符串。 - `${value?string('yyyy-MM-dd')}`:格式化日期。 ### 7. 自定义指令和宏 FreeMarker允许你创建自定义...
`PDFTool`可能包含使用Freemarker的方法,如`processTemplate()`,此方法接受模板文件路径、数据模型和目标PDF输出路径作为参数。`FileController`则可能是处理HTTP请求的控制器,它接收一个HTML URL,并调用`PDF...
一篇很全面的freemarker教程reeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:格式部分,不会输出 3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出 4,FTL指令:...
生成的输出通常是字符串或字节数组。 接下来,我们将引入Apache POI来插入图片。POI提供了丰富的API,用于操作Excel文件,包括读取、写入和修改。为了在`Freemarker`生成的Excel中插入图片,你需要: 1. **加载...
4. **渲染模板为PDF**:使用Freemarker API,将模板和数据模型结合,生成HTML字符串。然后,借助PDF库(如iText或Apache FOP)将HTML转换为PDF文件。这个过程可能需要处理CSS样式、图片嵌入等问题。 5. **文件导出*...
4. 转换为Excel:为了将生成的字符串转换为Excel文件,可以使用Apache POI库。创建一个`HSSFWorkbook`实例,然后将Freemarker生成的字符串写入到工作表中。 5. 写入文件:最后,将工作簿写入到本地文件系统,用户就...
- **Hello World**:一个简单的模板,展示如何输出字符串。 - **条件语句**:使用`<#if>`和`<#else>`展示条件分支。 - **循环**:`<#list>`用于遍历数组、列表或集合。 - **变量赋值**:`<#assign>`用于创建和修改...
4. **函数和方法**:Freemarker支持自定义函数和方法,可以使用内置的函数库,如字符串操作、数学计算等,也可以扩展自定义函数来满足特定需求。 5. **模板继承和导入**:通过`<#import>`和`<#extends>`,模板可以...
FreeMarker的工作原理是通过读取预定义的模板文件,然后将模板与数据模型相结合,生成最终的输出。模板文件通常包含HTML结构以及嵌入的FreeMarker指令,这些指令用于控制如何处理数据模型中的内容。FreeMarker的主要...
replace`进行字符串替换,`?upper_case`和`?lower_case`进行大小写转换。此外,还有算术操作符(+、-、*、/、%)、比较操作符(==、!=、<、>、、>=)和逻辑操作符(&&、||、!)。 6. **模板配置** 通过`freemarker...
string("yyyy-MM-dd")}` 可以将日期对象转换为指定格式的字符串。 6. **宏**:宏是可重用的模板片段,类似于函数。通过`<#macro>`定义,然后在模板中用 `<#call>` 调用。这有助于创建模块化的代码,提高代码复用性...
Freemarker提供了丰富的内置函数,可以帮助开发者在模板中进行各种操作,如字符串处理、数值运算等。 ##### 字符串操作 ```plaintext 假设 user 的值为 "john.doe" --> ${user?upper_case} // JOHN.DOE ${user?...