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的说明还是蛮多的,当然我这个也是个比较简单的例子,如果需要加深了解,还是需要自己动手去写代码的,我只是给大家起一个引导的作用,(*^__^*) 嘻嘻……

使用freemarker生成html的更多相关文章

  1. JSP利用freemarker生成基于word模板的word文档

    利用freemarker生成基于word模板的word文档 freemarker简介 FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器 ...

  2. 使用FreeMarker生成静态HTML

    1.FreeMarker需要添加的Maven依赖: <dependency> <groupId>org.freemarker</groupId> <artif ...

  3. FreeMarker 生成Java、mybatis文件

    FreeMarker 生成Java.mybatis文件 将mysql数据库表通过FreeMarker生成对应的Java文件和对应的mybatis文件. FreeMarker是一款模板引擎: 即一种基于 ...

  4. 【问题记录】使用FreeMarker生成数据,模板明明没错却一直报错“The following has evaluated to null or missing:”

    今天使用FreeMarker生成数据时一直报错,错误信息是“The following has evaluated to null or missing:”,告知我找不到值. 但是我再三确认,这些属性 ...

  5. 使用freemarker生成xml模板

    今天在java交流群里有个人问我如何用freemarker生成xml模板文件,可以手动配置参数,于是我到网上百度了一下.发现有一位同行的博文写的很nice,于是我就照着他的代码敲了一遍,最后实现了,本 ...

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

            最近做了一个需求,要求导出一个采购合同的Excel表格,这个表格样式比较多.由于是合同,这个Excel表格里面有好多格式要求,比如结尾处签字那部分就有格式要求.这里介绍种采用FreeM ...

  7. springmvc+freemarker生成静态html文件

    参考资料: http://mylfd.iteye.com/blog/1896501 http://www.cnblogs.com/xxt19970908/p/5553045.html 个人实践: 1. ...

  8. java使用freemarker生成静态html页面

    1. 模板文件static.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...

  9. freemarker生成word,表格分页

    在做项目的过程中,使用到了freemarker生成word.又有一个需求,明细的要确定有多少页,这就用到了换页的xml标签了,找了我好久 <w:p ><w:r><w:br ...

  10. 使用freemarker生成word、html时图片显示问题

    使用freemarker生成word.html时图片显示问题 博客分类: Java 使用freemarker生成word时图片显示问题使用freemarker生成html时图片显示问题使用iText生 ...

随机推荐

  1. BZOJ 1735: [Usaco2005 jan]Muddy Fields 泥泞的牧场

    Description 大雨侵袭了奶牛们的牧场.牧场是一个R * C的矩形,其中1≤R,C≤50.大雨将没有长草的土地弄得泥泞不堪,可是小心的奶牛们不想在吃草的时候弄脏她们的蹄子.  为了防止她们的蹄 ...

  2. mac 浏览器 强刷快捷键

    windows 浏览器的刷新快捷键F5,强制刷新Ctrl+F5 Mac 系统下浏览器的刷新快捷键 command+R, 强制刷新快捷键为 command+shift+R

  3. SQL模糊查询与删除多条语句复习

    string IDlist="1,2,3"; 批量删除数据 StringBuilder strsql=new StringBuilder(); strSql.Append(&quo ...

  4. Ubuntu10.10 安装scim

    Ubuntu10.10 上没有找到默认的输入法,所以要安装一个中文输入法,网上好多介绍的,但都 不怎么好用,下面参考http://blog.csdn.net/caodesheng110/article ...

  5. (转载)NET流操作

    http://www.oseye.net/user/kevin/blog/86 概念 数据流(Stream)是对串行传输数据的一种抽象表示,是对输入/输出的一种抽象.数据有来源和目的地,衔接两者的就是 ...

  6. wzplayer V1.6正式版(无限制)不支持加密版本 2014-07-08

    2014-07-08 修复部分视频倾斜问题,同时给受影响的客户给予更新. wzplayer V1.6正式版(无限制)不支持加密版本 发布于官方,下载地址wzplayer V1.6正式版(无限制)不支持 ...

  7. IPv6 tutorial 1 Get started now

    https://4sysops.com/archives/ipv6-part-1-get-started-now/ You’ve probably heard the news that the In ...

  8. istringstream、ostringstream、stringstream 类介绍 .

    istringstream.ostringstream.stringstream 类介绍 . 转自:http://www.cnblogs.com/gamesky/archive/2013/01/09/ ...

  9. MySQL配置文件-my.ini

    下面允许我介绍一下MySQL的my.ini配置文件: my.ini是什么? my.ini是MySQL数据库中使用的配置文件,修改这个文件可以达到更新配置的目的. my.ini存放在哪里? my.ini ...

  10. [转] POJ 题目分类

    转载来自http://www.cnblogs.com/kuangbin/archive/2011/07/29/2120667.html 初期:一.基本算法:     (1)枚举. (poj1753,p ...