`

Freemarker输出字符串而不是文件

阅读更多

    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.

分享到:
评论
2 楼 numen_wlm 2009-12-25  
kiki 写道
BufferedWriter writer = new BufferedWriter(stringWriter);  
这一步不必要吧?
==================
		Configuration cfg = new Configuration();
		cfg.setDefaultEncoding(encoding);
		Template t = new Template(TEMPALTE_DEFAULT_KEY, new StringReader(
				templateStr), cfg);
		StringWriter out = new StringWriter();
		t.process(map, out);
		return out.getBuffer().toString();

雖然不必要但是有好處,用buffer對性能上好處多多。
1 楼 kiki 2009-12-23  
BufferedWriter writer = new BufferedWriter(stringWriter);  
这一步不必要吧?
==================
		Configuration cfg = new Configuration();
		cfg.setDefaultEncoding(encoding);
		Template t = new Template(TEMPALTE_DEFAULT_KEY, new StringReader(
				templateStr), cfg);
		StringWriter out = new StringWriter();
		t.process(map, out);
		return out.getBuffer().toString();

相关推荐

    Freemarker操作字符串

    在本文中,我们将深入探讨如何使用FreeMarker来操作字符串。 FreeMarker的工作原理是将模板(HTML或XML文件)与数据模型(通常是Java对象)相结合,生成最终的输出。模板中包含了可替换的占位符,这些占位符由...

    Freemarker_内置函数_数字、字符串、日期格式化.txt

    substring(1)}` 输出字符串`str`从第二个字符开始的部分。 - `${str?substring(2)}` 输出字符串`str`从第三个字符开始的部分。 - `${str?substring(3)}` 输出字符串`str`从第四个字符开始的部分。 - `${str?...

    freemarker语法知识

    当表达式的计算结果为字符串、数字、日期或布尔值时,它们会被相应地处理和输出。 - **通用插值**(`${expr}`): - 字符串值:直接输出表达式的结果。 - 数字值:默认情况下,按照预设的格式(可通过`#setting`...

    freemarker根据模版生成文件使用例子

    虽然部分内容中没有详细介绍`Assistant`类,但可以推测它可能提供了辅助方法,如读写文件、处理字符串等,帮助简化`FreemarkerRender`类的操作流程。 ### 四、使用步骤 1. **准备数据模型**:创建`beanRenderClass...

    freemarker生成xml示例

    5. **输出XML**:生成的XML字符串可以写入文件或直接用于其他操作。 通过上述步骤,你可以利用Freemarker动态生成XML文件。值得注意的是,Freemarker支持条件判断、循环、函数调用等多种复杂逻辑,使得XML生成更加...

    freemarker语法完整版

    - **字符串**: 由单引号或双引号括起来的文本。 - **数字**: 直接使用数值。 - **日期**: 通常从数据模型中获取。 - **布尔值**: `true` 或 `false`,常用于 `<#if...>` 结构中。 **2. Hashes(哈希表)** - ...

    Freemarker语法总结

    通用插值可以输出字符串、数字、日期或布尔值。它可以使用内建的字符串函数来格式化输出结果。 例如:${answer} 将输出 42${answer?string} 将输出 42${answer?string.number} 将输出 42${answer?string.currency} ...

    freeMark语法

    FreeMarker提供了文本处理功能,如字符串拼接、格式化输出: - `${'Hello, ' + user.name}`:拼接字符串。 - `${value?string('yyyy-MM-dd')}`:格式化日期。 ### 7. 自定义指令和宏 FreeMarker允许你创建自定义...

    通过freemarker模板 生成PDF

    `PDFTool`可能包含使用Freemarker的方法,如`processTemplate()`,此方法接受模板文件路径、数据模型和目标PDF输出路径作为参数。`FileController`则可能是处理HTTP请求的控制器,它接收一个HTML URL,并调用`PDF...

    一篇很全面的freemarker教程

    一篇很全面的freemarker教程reeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:格式部分,不会输出 3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出 4,FTL指令:...

    freemarker-excel.zip

    生成的输出通常是字符串或字节数组。 接下来,我们将引入Apache POI来插入图片。POI提供了丰富的API,用于操作Excel文件,包括读取、写入和修改。为了在`Freemarker`生成的Excel中插入图片,你需要: 1. **加载...

    EOS 中使用freemarker模板生成PDF文件导出

    4. **渲染模板为PDF**:使用Freemarker API,将模板和数据模型结合,生成HTML字符串。然后,借助PDF库(如iText或Apache FOP)将HTML转换为PDF文件。这个过程可能需要处理CSS样式、图片嵌入等问题。 5. **文件导出*...

    Freemarker实现excel导出功能

    4. 转换为Excel:为了将生成的字符串转换为Excel文件,可以使用Apache POI库。创建一个`HSSFWorkbook`实例,然后将Freemarker生成的字符串写入到工作表中。 5. 写入文件:最后,将工作簿写入到本地文件系统,用户就...

    freemarker

    - **Hello World**:一个简单的模板,展示如何输出字符串。 - **条件语句**:使用`<#if>`和`<#else>`展示条件分支。 - **循环**:`<#list>`用于遍历数组、列表或集合。 - **变量赋值**:`<#assign>`用于创建和修改...

    freemarker-2.3.23jar

    4. **函数和方法**:Freemarker支持自定义函数和方法,可以使用内置的函数库,如字符串操作、数学计算等,也可以扩展自定义函数来满足特定需求。 5. **模板继承和导入**:通过`<#import>`和`<#extends>`,模板可以...

    使用FreeMarker生成Html静态文件

    FreeMarker的工作原理是通过读取预定义的模板文件,然后将模板与数据模型相结合,生成最终的输出。模板文件通常包含HTML结构以及嵌入的FreeMarker指令,这些指令用于控制如何处理数据模型中的内容。FreeMarker的主要...

    FreeMarker手册-Freemarker 2.3.18

    replace`进行字符串替换,`?upper_case`和`?lower_case`进行大小写转换。此外,还有算术操作符(+、-、*、/、%)、比较操作符(==、!=、<、>、、>=)和逻辑操作符(&&、||、!)。 6. **模板配置** 通过`freemarker...

    FreeMarker

    string("yyyy-MM-dd")}` 可以将日期对象转换为指定格式的字符串。 6. **宏**:宏是可重用的模板片段,类似于函数。通过`<#macro>`定义,然后在模板中用 `<#call>` 调用。这有助于创建模块化的代码,提高代码复用性...

    freemarker使用例子.txt

    Freemarker提供了丰富的内置函数,可以帮助开发者在模板中进行各种操作,如字符串处理、数值运算等。 ##### 字符串操作 ```plaintext 假设 user 的值为 "john.doe" --> ${user?upper_case} // JOHN.DOE ${user?...

Global site tag (gtag.js) - Google Analytics