使用freemarker生成html

http://herryhaixiao.iteye.com/blog/677524

由于freemarker这个技术很久很久就有了,注释我就没写得很详细了,相信大家都看得懂。下面就直接上代码以及一些代码上的解释了 
ShowCourseView 类负责一些属性的封装,

package test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import pojo.ShowCourseView;

import freemarker.template.Configuration;
import freemarker.template.Template;

public class FreeMarkerTest {
	private Configuration config;

	public Configuration getConfig() {
		return config;
	}

	/**
	 * 注意:setEncoding这个方法一定要设置国家及其编码,不然在flt中的中文在生成html后会变成乱码
	 *
	 * @param filePath
	 *            文件路径
	 * @throws Exception
	 */
	public void init(String filePath) throws Exception {
		config = new Configuration();
		config.setDirectoryForTemplateLoading(new File(filePath));
		config.setEncoding(Locale.CHINA, "utf-8");
	}

	/**
	 * 通过flt文件用html文件展示课程数据
	 *
	 * @param filePath
	 *            flt文件路径
	 * @param templateFile
	 *            flt模板文件
	 * @param list
	 *            要生成html的集合数据
	 * @param charset
	 *            flt生成数据的编码格式
	 * @param htmlFile
	 *            通过flt生成html的文件
	 * @throws Exception
	 */
	public void showCourse(String filePath, String templateFile,
			List<ShowCourseView> list, String charset, String htmlFile)
			throws Exception {
		init(filePath);
		Map<String, Object> root = new HashMap<String, Object>();
		Template temp = getConfig().getTemplate(templateFile);
		root.put("courseList", list);
		Writer out = new OutputStreamWriter(new FileOutputStream(htmlFile),
				charset);
		temp.process(root, out);
	}

	public static void main(String[] args) throws Exception {
		FreeMarkerTest test = new FreeMarkerTest();
		ShowCourseView view1 = new ShowCourseView();
		view1.setCategoryName("categoryName1");
		view1.setCourseCode("code1");
		view1.setName("name1");

		ShowCourseView view2 = new ShowCourseView();
		view2.setCategoryName("categoryName2");
		view2.setCourseCode("code2");
		view2.setName("name2");
		ShowCourseView view3 = new ShowCourseView();
		view3.setCategoryName("categoryName3");
		view3.setCourseCode("code3");
		view3.setName("name3");
		List<ShowCourseView> list = new ArrayList<ShowCourseView>();
		list.add(view1);
		list.add(view2);
		list.add(view3);
		test.showCourse("E:/myProject/freemarker&html/src", "course.ftl", list,
				"utf-8", "course.html");
	}
}

  

package pojo;

public class ShowCourseView {
	private String name;
    private String courseCode;
    private String categoryName = null;  

    public String getCategoryName() {
        return categoryName;
    }
    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName;
    }  

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
         public String getCourseCode() {
        return courseCode;
    }
    public void setCourseCode(String courseCode) {
        this.courseCode = courseCode;
    }
}

  course.flt

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	</head>
	<body>
		<table border="0">
			<#list courseList as row>
				<tr>
					<td>
						<#if row.categoryName?exists>
							[<font color="red">${row.categoryName }</font>]
						</#if>
						<a href="/shlll/platform/course/CourseBrowse.do?courseCode=${row.courseCode}">${row.name}</a>
					</td>
				</tr>
			</#list>
		</table>
		<div align="right">
			${showMore?default("更多...")}
		</div>
	</body>
</html>

  我就说下模板文件中用到的几个标签,一个是<#list>标签,用过struts2的人就知道在jsp中是有个list迭代标签的,这个和那个迭代标签大同小异,关键是这个语法不一样,在标签中有个“courseList”,这个courseList就是对应我在FreemarkerTest类中的showCourse方法中的Map中放置的一个key,而这个key又是一个List集合,通过这个list迭代出每一个CourseShowView对象;<#if>这个标签和自定义标签中的if标签性质是一样的,只是它的判断语法不同,?exists从翻译来讲,这个就是存在,加个问号表示是否存在,存在返回true,不存在返回false,row.categoryName?exists判断ShowCourseView中的categoryName是否有值,有值就显示categoryName,没有就不显示;其余的语法比如取值问题,对象取值问题,这个是大家关注的比较多的问题,取值怎么取呢,其实这个很简单,这个和EL表达式中的取值方法是一样的;${}这样就可以取值了;最后在<div>中有个函数,default这个是什么意思?我来给大家讲讲,表示showMore如果为空的话就显示default中的值。 
     在flt文件中我有2个中文字体,这就是为什么我在FreeMarkerTest类中的init方法中,为什么要设置config的编码方式了。因为在生成html的时候,如果你没有配置config的编码方式,它就会用它默认的编码进行编码,所以导致你在html中看到的中文就会变成乱码了(这里指的乱码是指flt中的中文,不是后台生成的中文,切记)。 
     好了,以上就是我研究freemarker用到的知识,欢迎各位拍砖,写的不好别见怪,写这个也是因为网上具体的代码不多,没有一个比较完整的,倒是对freemarker的说明还是蛮多的,当然我这个也是个比较简单的例子,如果需要加深了解,还是需要自己动手去写代码的,我只是给大家起一个引导的作用,(*^__^*) 嘻嘻……

时间: 2024-10-05 18:49:56

使用freemarker生成html的相关文章

freemarker生成word文档

利用freemarker生成word文档步骤: 导入jar包:freemarker-2.3.20.jar 新建word模板,调整好样式, word模板另存为2003 xml格式, xml中需要替换的内容用${param}替换,param为参数名称,例如:${name } ,传入参数map.put("name","张三"); 编写java代码,替换xml文档,导出. 1 /** 2 *@文件名称: CreateWord.java 3 *@日期: 2016-5-19 4

利用freemarker生成带fusioncharts图片的word简报

/** * 利用freemarker生成带fusioncharts图片的word简报 *         烟台海颐软件技术论坛 *         作者  牟云飞 新建 *         毕业于2013年山东中医药大学 *         qq:1147417467 *         </p> */

使用FreeMarker生成Word文档

FreeMarker简介: FreeMarker是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具,它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件. FreeMarker是免费的,基于Apache许可证2.0版本发布.其模板编写为FreeMarker Template Language(FTL),数据简单.专用的语言.需要准备数据在真实编程语言中来显示,比如数据库查询和业务运算,之后模板显

JavaWeb开发中采用FreeMarker生成Excel表格

最近做了一个需求,要求导出一个采购合同的Excel表格,这个表格样式比较多.由于是合同,这个Excel表格里面有好多格式要求,比如结尾处签字那部分就有格式要求.这里介绍种采用FreeMarker的api来生成Excel文件的方案 一.方案的对比 针对这个需求我想了2个方案,介绍如下 方案一:先做一个合同的表格模板,然后把变量都填充成类似EL表达式的样子.然后通过poi 相关类把模板读到内存中,把里面的变量的值替换,然后生成下载文件. 方案二:先做一个合同的表格模板,然后转换成xml文件,然后再改

使用FreeMarker生成数据,模板明明没错却一直报错“The following has evaluated to null or missing:”

今天使用FreeMarker生成数据时一直报错,错误信息是"The following has evaluated to null or missing:",告知我找不到值. 但是我再三确认,这些属性的值都是正常的,也就是说某些原因造成FreeMarker无法读取到这些值.困扰了我将近两个小时后,经过各种尝试后,终于被我发现了原因: FreeMarker读取数据的时候不支持属性名首字母大写(但是支持变量名全大写的属性)!将变量名全部改为小写后,数据就正常生成了. 因为我也只是个初学者(

FreeMarker生成word的代码

 用于生成word用的freemarker工具类 package com.ucap.netcheck.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.i

java使用freemarker生成word文档

1.原料 开源jar包freemarker.eclipse.一份模板word文档 2.首先设计模板word文档 一般,通过程序输出的word文档的格式是固定的,例如建立一个表格,将表格的标题写好,表格的内容使用不同的标记标好,设计好word后,将word文档另存为xml文件(注:只有word2003 以上的版本可以),使用xml工具打开文件,将要输出到word的内容使用${XX}替换,保存后将文件直接改为tdl后缀 3.使用eclipse编写程序 1)获得一个Configuration实例,并为

用Main方法调用freemarker生成文件

MyGenerator.java package com.comp.common; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import freemarker.template.Con

freeMarker生成静态页面

项目结构图 footer.ftl des==>${f.des}<br/> <a href="http://www.baidu.com"> 百度 </a> header.ftl companyName==>${h.companyName}<br/> address==>${h.address}<br/> notice.ftl <!DOCTYPE html> <html> <head

使用freemarker生成word,步骤详解并奉上源代码

1.   步骤 1.    用word编辑好模板 1. 普通字符串替换为 ${string} 2. 表格循环用标签 <#list userList as user> 姓名:${user.userName} , 性别:${user.sex} </#list> word模板原型如下图: 最终生成的结果如下: 2.    将word模板另存为xml格式 选中 [ 仅保存数据 ] 选择 [ 保持wordML(K) ] 3.    将xml模板文件后缀名改为.ftl 4.    编辑ftl文