`

FreeMarker成站方式

 
阅读更多
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 自定义freeMarker标签

    总的来说,自定义FreeMarker标签是提高模板引擎灵活性和扩展性的有效方式,也是Java开发中的一个重要技能。通过深入理解FreeMarker的工作原理和API,开发者可以构建出更强大、更符合项目需求的模板解决方案。

    eclipse的freemarker插件

    1. **代码格式化**:允许用户自定义代码格式化规则,如缩进方式(空格或制表符)、缩进宽度、换行处理等,自动整理Freemarker模板代码,使其符合编码规范。 2. **语法高亮**:提供Freemarker关键词和语法的色彩突出...

    freemarker

    此外,`test`包下的测试类展示了一种使用Freemarker的方式,通过构建数据模型并将其传递给模板,实现了动态内容的生成。 综上所述,Freemarker是一种强大的模板引擎,它能够高效地处理复杂的数据结构,并生成各种...

    freemarker-2.3.23jar

    Freemarker的核心概念是模板语言,它是一种声明式的编程方式,允许开发者编写不包含任何控制逻辑的文本模板。在模板中,开发者可以使用特定的语法(如`&lt;#if&gt;`、`&lt;#foreach&gt;`等)来控制输出,并通过变量将数据绑定到...

    FreeMarker手册-Freemarker 2.3.18

    FreeMarker的模板语言是一种声明式的编程方式,它允许开发者通过简单的标记语法来控制输出。这些标记不包含执行逻辑,而是与数据模型结合以生成最终输出。例如,`&lt;#if&gt;`、`&lt;#foreach&gt;`用于条件判断和循环,`...

    Velocity 和 FreeMarker区别

    - **FreeMarker**支持直接赋值方式如`$foo`,同时也支持通过表达式进行赋值如`$bar = $foo + 1`。 - **Velocity**的变量赋值方式较为简单,通常采用`#set($foo = "value")`的形式。 2. **循环**: - **...

    struts2+freemarker

    **Freemarker** 是一个模板语言,用于将数据模型渲染成HTML或其他文本格式。它的语法简洁且强大,支持条件判断、循环、函数调用等编程特性。在Struts2中,Freemarker模板通常被用作视图层,将由Action处理后的数据...

    freemarker\Freemarker教程_中文版

    例如,设置模版的加载路径、数据模型的处理方式等。这一步骤确保了Freemarker能够正确地识别和处理模版。 ```java Configuration cfg = new Configuration(Configuration.VERSION_2_3_30); cfg....

    FreeMarker通用的分页

    FreeMarker提供了一种灵活且强大的方式来处理动态内容,尤其适用于Web开发中的视图层。在FreeMarker中实现通用的分页功能是提高Web应用程序性能和用户体验的重要一环。 ### FreeMarker通用分页知识点解析 #### 1. ...

    velocity和freemarker的比较

    标题“velocity和freemarker的比较”涉及到的是两个在Java...提供的文件列表似乎包含了一些日志文件、项目配置文件和源代码库,这可能是项目开发或调试过程中的记录,对于深入理解这两个模板引擎的工作方式有一定帮助。

    freemarker中文学习资料

    - **错误处理**:Freemarker提供异常处理机制,如`TemplateExceptionHandler`,可以定制错误处理方式。 - **调试模式**:开启调试模式,可以在模板错误时输出详细信息,方便定位问题。 8. **性能优化** - **缓存...

    通过freemarker模板 生成PDF

    通过这种方式,你可以创建高度定制、样式丰富的PDF文件,同时利用Freemarker的灵活性和wkhtmltox的渲染能力。在实际开发中,还需要考虑错误处理、资源管理以及与前端交互的细节,确保整个流程的稳定性和用户体验。

    freemarker导出doc及docx

    导出docx文件通常涉及到将Freemarker模板转换成OpenXML格式,这是.docx文件的内部结构。可以使用开源库如Apache POI或者docx4j来实现。Apache POI提供了一系列API,可以用来创建、修改和读取Microsoft Office文件,...

    freemarker+itext生成PDF

    这种方式的好处在于,模板可以独立于业务代码进行维护,降低了代码的耦合度,同时也便于非程序员(如设计师)参与文档格式的设计。 步骤通常如下: 1. **创建FreeMarker模板**:在模板文件中定义PDF的结构,使用...

    Freemarker简介及标签详解大全

    5. 通用数据模型:FreeMarker 不是直接反射到 Java 对象,Java 对象通过插件式对象封装,以变量方式在模板中显示。 6. 为 Web 准备:在模板语言中内建处理典型 Web 相关任务(如 HTML 转义)的结构。 7. 智能的国际...

    FreeMarker概述2008

    FreeMarker的核心特性包括: 1. **通用目标**:FreeMarker能够生成各种文本格式,如HTML、XML、RTF等,并且可以通过自定义模板加载器从各种来源获取模板。 2. **强大的模板语言**:提供了丰富的指令,如`include`...

    FreeMarker中文文档.pdf下载

    表达式是FreeMarker中用于获取数据值的方式。它们可以是简单的变量引用,也可以是函数调用或者更复杂的运算表达式。例如:`${user}`表示获取名为`user`的变量的值。 ### 三、FreeMarker的核心功能 #### 1. 模板...

    freemarker基本语法整理

    Freemarker 提供了多种循环遍历方式,包括遍历普通 List、遍历 Map 和遍历 List 的前面几项。遍历普通 List 的语法如下: ```html ... ``` 遍历 Map 的语法如下: ```html () as name&gt; ${nameMap.get(name)} ``...

    freemarker学习资料汇总

    这份教程可能以实例驱动的方式,通过实际的Web项目场景来教授Freemarker的用法。它可能会涵盖如何在Spring MVC或其它框架中集成Freemarker,以及如何在模板中进行复杂逻辑处理。此外,还可能讲解Freemarker的模板...

    freemarker 2.3.10架包

    这种工作方式提高了开发效率,降低了维护成本。 在2.3.10这个版本中,Freemarker提供了以下关键特性: 1. **模板语言**:Freemarker的模板语言是一种简单的、非侵入式的标记语言,允许开发者在模板中嵌入变量和...

Global site tag (gtag.js) - Google Analytics