本文采用简单的servlet作为后台处理数据的工具,前台使用freemarker的ftl模板作为输出工具,简单说明怎样将封装有实体类对象的List集合注入到ftl模板中并且成功的在遍历显示出来,之前在网上找了很多这方面的资料,但是都没有解决这个问题,所以自己就从头认真的研读的一番freemarker的API文档,阅读了相关的类和接口的功能说明,终于找到了突破口,在这里写出来供和我有相同经历的孩纸(初学者)使用:

首先看我写的domain实体类:News.java

public class News {

private Integer news_id;

private String news_title;

private String news_publish_date;

private String news_url;

public Integer getNews_id() {

return news_id;

}

public void setNews_id(Integer news_id) {

this.news_id = news_id;

}

.....以下的set和get方法都省略..

接着看我写的newsSql.xml文件中查询所有News对象的并返回List或者Map型数据的配置信息:

select *from news

下面是自己第一次写的NewsListServlet代码:

public class NewsListServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

private NewsDao dao;

private Configuration cfg;

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

request.setCharacterEncoding("utf-8");

response.setContentType("text/html;charset=utf-8");

dao = new NewsDao();

List newslist = dao.getAllNews();

Map> map=new HashMap>();

map.put("newslist",newslist);

cfg = new Configuration();

cfg.setServletContextForTemplateLoading(this.getServletContext(),"/ftl");

Template template = cfg.getTemplate("newsList.ftl");

try {

template.process(map,response.getWriter());

} catch (TemplateException e) {

e.printStackTrace();

}

}}

下面是newslist.ftl模板代码:

以下是今天的主要新闻
编号 标题 发布时间 操作
${news.news_id} ${news.news_title} ${news.news_publish_date} 查看详情

#list>#if>

但是运行时会出现下面的异常信息,着实让人很头疼:

freemarker.template.TemplateModelException: Don't know how to present an object of this type to a template: cn.domain.News

at freemarker.template.SimpleObjectWrapper.handleUnknownType(SimpleObjectWrapper.java:139)

at freemarker.template.SimpleObjectWrapper.wrap(SimpleObjectWrapper.java:116)

at freemarker.template.WrappingTemplateModel.wrap(WrappingTemplateModel.java:131)

at freemarker.template.SimpleSequence.get(SimpleSequence.java:197)

at freemarker.template.IteratorBlock$Context.runLoop(IteratorBlock.java:163)

at freemarker.template.Environment.visit(Environment.java:316)

at freemarker.template.IteratorBlock.accept(IteratorBlock.java:94)

at freemarker.template.Environment.visit(Environment.java:180)

at freemarker.template.ConditionalBlock.accept(ConditionalBlock.java:78)

at freemarker.template.Environment.visit(Environment.java:180)

at freemarker.template.MixedContent.accept(MixedContent.java:91)

at freemarker.template.Environment.visit(Environment.java:180)

at freemarker.template.Environment.process(Environment.java:166)

at freemarker.template.Template.process(Template.java:238)

这里我声明一下,数据的封装和传递绝对没有问题,这个异常信息的关键是:

Don't know how to present an object of this type to a template: cn.domain.News

无法引述新闻类对象到模版,也就是说模板不认识list里面的数据是News对象,所以无法通过news.news_title来访问属性对象

到这里我想大家明白我说的是什么意思了吧,通过查询API文档,可以容易看到Template.process()函数有两种形式,一个是含有两个参数的,而另一个则含有三个参数,他们分别为:

void freemarker.template.Template.process(Object dataModel, Writer out) throws TemplateException, IOException

void freemarker.template.Template.process(Object dataModel, Writer out, ObjectWrapper wrapper) throws TemplateException, IOException

其实二者没什么大的区别,只是第二个方法比第一个多增加了一个ObjectWrapper wrapper参数而已,那个增加这个参数有什么作用呢?

答案是:第一个方法中默认了ObjectWrapper wrapper参数是ObjectWrapper.SIMPLE_WRAPPER型的,但是在我们的情况下需要另一种类型,也即:ObjectWrapper.BEANS_WRAPPER,观看英文单词也理解是什么意思了吧,再看看官方的文档说明:

An

Object wrapper that uses SimpleXXX wrappers only. It behaves like the SimpleXXX it throws an exception. It makes no use of reflection-based exposure of anything, which may makes it a good candidate for security-restricted applications.

所以错误的修改就本简单了:

Map> map=new HashMap>();

map.put("newslist",newslist);

cfg = new Configuration();

cfg.setServletContextForTemplateLoading(this.getServletContext(),"/ftl");

Template template = cfg.getTemplate("newsList.ftl");

try {

template.process(map,response.getWriter(),ObjectWrapper.BEANS_WRAPPER);

} catch (TemplateException e) {

e.printStackTrace();

}

以下是改正后的运行效果:

以下是今天的主要新闻

编号

标题

发布时间

操作

1

MH-17航班又在乌克兰和俄罗斯边境出事了

2014-07-15 22:19:45.0

2

中国和巴西签订了很多外贸上的关系文件

2014-07-17 21:23:45.0

3

全国大学生软件大赛初赛成绩公布了,三人组合团队表现很出色

2014-07-14 15:18:22.0

4

山东交通学院将来要成为一所名副其实的大学真的很困难

2012-06-11 13:18:49.0

呵呵,自己的一点总结,大手们不要见笑。。。

java ftl 模板 输出list_关于在freemarker模板中遍历数据模型ListJavaBean的经验相关推荐

  1. Java Email 发HTML邮件工具 采用 freemarker模板引擎渲染

    Java Email 发HTML邮件工具 采用 freemarker模板引擎 1.常用方式对比 Java发送邮件有很多的实现方式 第一种:Java 原生发邮件mail.jar和activation.j ...

  2. java生成word 框勾_Java 使用模板生成 Word 文件---基于 Freemarker 模板框架

    Java项目引入 Freemarker 插件自行完成. 步骤如下: 1.编写 Word 模板,并将模板中要用代码动态生成数据用 Freemarker 变量取代,即${变量名},如${username} ...

  3. java ftl转pdf_FreeMarker(二):利用FreeMarker转pdf

    1. 设计需求 订票成功后,生成一个pdf 文件,用户打印入场票,门票大致如下所示: 2. 设计思想 1). 使用FreeMarker 转换 ftl(就是FreeMarker 魔板文件),生成HTML ...

  4. java word合并单元格_java使用freemarker模板导出word(带有合并单元格)文档

    前言:最近要做一个导出word功能,其实网上有很多的例子,但是我需要的是合并单元格的,可是查了好久都没有自己想要的.研究了几天其实挺简单的,在这儿我就简单的介绍一下吧!(此方法只是一种思路,借鉴者还有 ...

  5. java命令行输出hello_J2SE基础之命令行中编写第一个 Hello World

    大家真正在工作中开发 java 应用都会使用eclipse,myeclipse, IntelliJ等等 不过依然值得花10分钟学习如何使用最原始的命令行格式编译和执行java 程序 使用最原始的命令行 ...

  6. json里面返回模板输出的html,在JSON响应中返回完整页面的HTML而不是字符串输出...

    我想通过使用web方法的ajax实现最简单的任务.我的web方法如下在JSON响应中返回完整页面的HTML而不是字符串输出 [WebMethod] public static string GetDa ...

  7. FreeMarker模板使用方法讲解

    项目需要,刚接触,正在学习. FreeMarker简介       FreeMarker模板文件主要由如下4个部分组成:          1,文本:直接输出的部分          2,注释:< ...

  8. Java项目中利用Freemarker模板引擎导出--生成Word文档

    应邀写的一篇文章:Java项目中利用Freemarker模板引擎导出--生成Word文档 资源下载:https://download.csdn.net/download/weixin_41367523 ...

  9. java 使用 freemarker模板 生成 word 并用 aspose 转换成PDF

    添加依赖: <!-- freemarker生成word文件--><dependency><groupId>org.springframework.boot</ ...

  10. java根据Freemarker模板渲染出Excel文件并在浏览器中下载

    **java根据Freemarker模板渲染出Excel文件并在浏览器中下载** 准备工作 1.导入的依赖 2.创建模板 Freemrker语法大全: [Freemarker语法使用请点击该链接跳转学 ...

最新文章

  1. 快速上手ANTLR--在Windows环境下解析计算器指令语法
  2. dataframe 删除首尾空格_你敲空格的速度很快,但女人的手不是用来敲空格的!...
  3. Vue实例和生命周期
  4. php request time,php中time()与$_SERVER[REQUEST_TIME]用法区别分析
  5. 作者:王志强(1975-),男,中国标准化研究院高新技术与信息标准化研究所副研究员、副所长。...
  6. 【华为云技术分享】Spark中的文件源(上)
  7. UIView Methods
  8. python 技能清单_Python清单
  9. C语言程序设计教程_第四章:键盘输入与屏幕输出_笔记整理
  10. iphone粘贴关联_如何将电话号码粘贴到iPhone的电话应用程序中
  11. m基于FPGA的GPS收发系统开发,包括码同步,载波同步,早迟门跟踪环,其中L1采用QPSK,L2采用BPSK
  12. 最经典最常用的Ecplise快捷键
  13. 如何修改品牌电脑logo,让你电脑开机更个性
  14. erdaicms旅游网站程序2017款新模版正式上线
  15. iOS 直播专题1-直播流程原理
  16. 人脸识别(识别程序)
  17. python作业02
  18. 新春思考:如何用区块链与投证保护“一杯严选”「见茶卸甲」级好茶
  19. 最小重量机器设计问题
  20. flask wtf用的多吗_WTF是Docker吗?

热门文章

  1. android桌面adw,ADW Launcher
  2. 小程序marker 气泡怎么用_小程序直播怎么用,看这里!
  3. 人工智能的未来-揭示人类思维的奥秘How to create a mind - Ray Kurzweil
  4. mysql日志课程_【mysql课程七】 MySQL日志管理
  5. #include <iostream> C++ Hello World!
  6. 126.单词接龙II
  7. BAT[阿里、百度、腾讯]等互联网公司数据结构面试题(一) python分析实现
  8. 计算机操作系统详细学习笔记(一):计算机操作系统概述
  9. 蓝队应对攻击的常用策略一
  10. 常用集合(ArrayList、Hashset、HashMap)的用法(会一直更新)