FreeMarker的递归生成网站类
package com.uuzz.demo.template.service.impl;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Iterator;
import java.util.Map;
import org.springframework.stereotype.Service;
import com.uuzz.demo.template.service.HtmlCreator;
import com.uuzz.demo.template.util.FreeMarderFactory;
import freemarker.cache.StringTemplateLoader;
import freemarker.core.TemplateElement;
import freemarker.ext.beans.StringModel;
import freemarker.template.Template;
import freemarker.template.TemplateSequenceModel;
@Service
public class HtmlCreatorImpl implements HtmlCreator {
private String homeTemplate;
private String basePath;
@Override
public String getHomeTemplate() {
return homeTemplate;
}
@Override
public void setHomeTemplate(String homeTemplate) {
this.homeTemplate = homeTemplate;
}
@Override
public String getBasePath() {
return basePath;
}
@Override
public void setBasePath(String basePath) {
this.basePath = basePath;
}
@Override
public boolean createHtmlByNameAndData(String templateName, Map<String, Object> dataMap) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean createHtmlByTemplateAndData(Map<String, String> templateMap, Map<String, Object> dataMap) {
StringTemplateLoader stringTemplateLoader = (StringTemplateLoader) FreeMarderFactory.getTemplateLoader();
Iterator<String> iterator = templateMap.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
stringTemplateLoader.putTemplate(key, templateMap.get(key));
}
recuriseHtml(getHomeTemplate(), stringTemplateLoader, dataMap);
FreeMarderFactory.getConfiguration().clearTemplateCache();
iterator = templateMap.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
try {
Template template = FreeMarderFactory.getConfiguration().getTemplate(key);
File afile = new File(this.getBasePath() + key);
if (!afile.exists()) {
afile.createNewFile();
}
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(afile), "UTF-8"));
template.process(dataMap, out);
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
public void recuriseHtml(String templateName, StringTemplateLoader stringTemplateLoader, Map<String, Object> rootMap) {
try {
Template template = FreeMarderFactory.getConfiguration().getTemplate(templateName, "UTF-8");
TemplateSequenceModel list = template.getRootTreeNode().getChildNodes();
for (int i = 0; i < list.size(); i++) {
StringModel model = (StringModel) list.get(i);
TemplateElement element = (TemplateElement) model.getWrappedObject();
if (element.getNodeName().equals("Include")) {
String templateSource = element.getSource();
recuriseHtml(templateSource.substring(templateSource.indexOf("\"") + 2,
templateSource.lastIndexOf("\"")), stringTemplateLoader, rootMap);
}
}
StringWriter out = new StringWriter();
Map<String, Object> dataMap = (Map<String, Object>) rootMap.get(templateName);
template.process(dataMap, out);
stringTemplateLoader.putTemplate(templateName, out.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
调用方式
Map<String, String> templateMap = new HashMap<String, String>();
Map<String, Object> dataMap = new HashMap<String, Object>();
QueryTestBean t = new QueryTestBean();
//获取所有模板
List<TestBean> resultList = testServiceImpl.queryPojoForList(t);
// 所有模板
for (int i = 0; i < resultList.size(); i++) {
TestBean testBean = resultList.get(i);
templateMap.put(testBean.getColumn_2(), testBean.getColumn_6());
List<Map<String, String>> templateDataMap = new ArrayList<Map<String, String>>();
Map<String, Object> data = new HashMap<String, Object>();
Map<String, String> map = new HashMap<String, String>();
map.put("name", "您好!" + testBean.getColumn_2());
map.put("href", "href");
templateDataMap.add(map);
data.put("list", templateDataMap);
dataMap.put(testBean.getColumn_2(), data);
}
htmlCreator.setHomeTemplate("index.html");
htmlCreator.setBasePath(this.request.getServletContext().getRealPath("/html" )+ "/");
htmlCreator.createHtmlByTemplateAndData(templateMap, dataMap);
分享到:
相关推荐
总的来说,自定义FreeMarker标签是提高模板引擎灵活性和扩展性的有效方式,也是Java开发中的一个重要技能。通过深入理解FreeMarker的工作原理和API,开发者可以构建出更强大、更符合项目需求的模板解决方案。
1. **代码格式化**:允许用户自定义代码格式化规则,如缩进方式(空格或制表符)、缩进宽度、换行处理等,自动整理Freemarker模板代码,使其符合编码规范。 2. **语法高亮**:提供Freemarker关键词和语法的色彩突出...
此外,`test`包下的测试类展示了一种使用Freemarker的方式,通过构建数据模型并将其传递给模板,实现了动态内容的生成。 综上所述,Freemarker是一种强大的模板引擎,它能够高效地处理复杂的数据结构,并生成各种...
Freemarker的核心概念是模板语言,它是一种声明式的编程方式,允许开发者编写不包含任何控制逻辑的文本模板。在模板中,开发者可以使用特定的语法(如`<#if>`、`<#foreach>`等)来控制输出,并通过变量将数据绑定到...
FreeMarker的模板语言是一种声明式的编程方式,它允许开发者通过简单的标记语法来控制输出。这些标记不包含执行逻辑,而是与数据模型结合以生成最终输出。例如,`<#if>`、`<#foreach>`用于条件判断和循环,`...
- **FreeMarker**支持直接赋值方式如`$foo`,同时也支持通过表达式进行赋值如`$bar = $foo + 1`。 - **Velocity**的变量赋值方式较为简单,通常采用`#set($foo = "value")`的形式。 2. **循环**: - **...
**Freemarker** 是一个模板语言,用于将数据模型渲染成HTML或其他文本格式。它的语法简洁且强大,支持条件判断、循环、函数调用等编程特性。在Struts2中,Freemarker模板通常被用作视图层,将由Action处理后的数据...
例如,设置模版的加载路径、数据模型的处理方式等。这一步骤确保了Freemarker能够正确地识别和处理模版。 ```java Configuration cfg = new Configuration(Configuration.VERSION_2_3_30); cfg....
FreeMarker提供了一种灵活且强大的方式来处理动态内容,尤其适用于Web开发中的视图层。在FreeMarker中实现通用的分页功能是提高Web应用程序性能和用户体验的重要一环。 ### FreeMarker通用分页知识点解析 #### 1. ...
标题“velocity和freemarker的比较”涉及到的是两个在Java...提供的文件列表似乎包含了一些日志文件、项目配置文件和源代码库,这可能是项目开发或调试过程中的记录,对于深入理解这两个模板引擎的工作方式有一定帮助。
- **错误处理**:Freemarker提供异常处理机制,如`TemplateExceptionHandler`,可以定制错误处理方式。 - **调试模式**:开启调试模式,可以在模板错误时输出详细信息,方便定位问题。 8. **性能优化** - **缓存...
通过这种方式,你可以创建高度定制、样式丰富的PDF文件,同时利用Freemarker的灵活性和wkhtmltox的渲染能力。在实际开发中,还需要考虑错误处理、资源管理以及与前端交互的细节,确保整个流程的稳定性和用户体验。
导出docx文件通常涉及到将Freemarker模板转换成OpenXML格式,这是.docx文件的内部结构。可以使用开源库如Apache POI或者docx4j来实现。Apache POI提供了一系列API,可以用来创建、修改和读取Microsoft Office文件,...
这种方式的好处在于,模板可以独立于业务代码进行维护,降低了代码的耦合度,同时也便于非程序员(如设计师)参与文档格式的设计。 步骤通常如下: 1. **创建FreeMarker模板**:在模板文件中定义PDF的结构,使用...
5. 通用数据模型:FreeMarker 不是直接反射到 Java 对象,Java 对象通过插件式对象封装,以变量方式在模板中显示。 6. 为 Web 准备:在模板语言中内建处理典型 Web 相关任务(如 HTML 转义)的结构。 7. 智能的国际...
FreeMarker的核心特性包括: 1. **通用目标**:FreeMarker能够生成各种文本格式,如HTML、XML、RTF等,并且可以通过自定义模板加载器从各种来源获取模板。 2. **强大的模板语言**:提供了丰富的指令,如`include`...
表达式是FreeMarker中用于获取数据值的方式。它们可以是简单的变量引用,也可以是函数调用或者更复杂的运算表达式。例如:`${user}`表示获取名为`user`的变量的值。 ### 三、FreeMarker的核心功能 #### 1. 模板...
Freemarker 提供了多种循环遍历方式,包括遍历普通 List、遍历 Map 和遍历 List 的前面几项。遍历普通 List 的语法如下: ```html ... ``` 遍历 Map 的语法如下: ```html () as name> ${nameMap.get(name)} ``...
这份教程可能以实例驱动的方式,通过实际的Web项目场景来教授Freemarker的用法。它可能会涵盖如何在Spring MVC或其它框架中集成Freemarker,以及如何在模板中进行复杂逻辑处理。此外,还可能讲解Freemarker的模板...
这种工作方式提高了开发效率,降低了维护成本。 在2.3.10这个版本中,Freemarker提供了以下关键特性: 1. **模板语言**:Freemarker的模板语言是一种简单的、非侵入式的标记语言,允许开发者在模板中嵌入变量和...