java ftl 模板 输出list_关于在freemarker模板中遍历数据模型ListJavaBean的经验
本文采用简单的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的经验相关推荐
- Java Email 发HTML邮件工具 采用 freemarker模板引擎渲染
Java Email 发HTML邮件工具 采用 freemarker模板引擎 1.常用方式对比 Java发送邮件有很多的实现方式 第一种:Java 原生发邮件mail.jar和activation.j ...
- java生成word 框勾_Java 使用模板生成 Word 文件---基于 Freemarker 模板框架
Java项目引入 Freemarker 插件自行完成. 步骤如下: 1.编写 Word 模板,并将模板中要用代码动态生成数据用 Freemarker 变量取代,即${变量名},如${username} ...
- java ftl转pdf_FreeMarker(二):利用FreeMarker转pdf
1. 设计需求 订票成功后,生成一个pdf 文件,用户打印入场票,门票大致如下所示: 2. 设计思想 1). 使用FreeMarker 转换 ftl(就是FreeMarker 魔板文件),生成HTML ...
- java word合并单元格_java使用freemarker模板导出word(带有合并单元格)文档
前言:最近要做一个导出word功能,其实网上有很多的例子,但是我需要的是合并单元格的,可是查了好久都没有自己想要的.研究了几天其实挺简单的,在这儿我就简单的介绍一下吧!(此方法只是一种思路,借鉴者还有 ...
- java命令行输出hello_J2SE基础之命令行中编写第一个 Hello World
大家真正在工作中开发 java 应用都会使用eclipse,myeclipse, IntelliJ等等 不过依然值得花10分钟学习如何使用最原始的命令行格式编译和执行java 程序 使用最原始的命令行 ...
- json里面返回模板输出的html,在JSON响应中返回完整页面的HTML而不是字符串输出...
我想通过使用web方法的ajax实现最简单的任务.我的web方法如下在JSON响应中返回完整页面的HTML而不是字符串输出 [WebMethod] public static string GetDa ...
- FreeMarker模板使用方法讲解
项目需要,刚接触,正在学习. FreeMarker简介 FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:< ...
- Java项目中利用Freemarker模板引擎导出--生成Word文档
应邀写的一篇文章:Java项目中利用Freemarker模板引擎导出--生成Word文档 资源下载:https://download.csdn.net/download/weixin_41367523 ...
- java 使用 freemarker模板 生成 word 并用 aspose 转换成PDF
添加依赖: <!-- freemarker生成word文件--><dependency><groupId>org.springframework.boot</ ...
- java根据Freemarker模板渲染出Excel文件并在浏览器中下载
**java根据Freemarker模板渲染出Excel文件并在浏览器中下载** 准备工作 1.导入的依赖 2.创建模板 Freemrker语法大全: [Freemarker语法使用请点击该链接跳转学 ...
最新文章
- 快速上手ANTLR--在Windows环境下解析计算器指令语法
- dataframe 删除首尾空格_你敲空格的速度很快,但女人的手不是用来敲空格的!...
- Vue实例和生命周期
- php request time,php中time()与$_SERVER[REQUEST_TIME]用法区别分析
- 作者:王志强(1975-),男,中国标准化研究院高新技术与信息标准化研究所副研究员、副所长。...
- 【华为云技术分享】Spark中的文件源(上)
- UIView Methods
- python 技能清单_Python清单
- C语言程序设计教程_第四章:键盘输入与屏幕输出_笔记整理
- iphone粘贴关联_如何将电话号码粘贴到iPhone的电话应用程序中
- m基于FPGA的GPS收发系统开发,包括码同步,载波同步,早迟门跟踪环,其中L1采用QPSK,L2采用BPSK
- 最经典最常用的Ecplise快捷键
- 如何修改品牌电脑logo,让你电脑开机更个性
- erdaicms旅游网站程序2017款新模版正式上线
- iOS 直播专题1-直播流程原理
- 人脸识别(识别程序)
- python作业02
- 新春思考:如何用区块链与投证保护“一杯严选”「见茶卸甲」级好茶
- 最小重量机器设计问题
- flask wtf用的多吗_WTF是Docker吗?
热门文章
- android桌面adw,ADW Launcher
- 小程序marker 气泡怎么用_小程序直播怎么用,看这里!
- 人工智能的未来-揭示人类思维的奥秘How to create a mind - Ray Kurzweil
- mysql日志课程_【mysql课程七】 MySQL日志管理
- #include <iostream> C++ Hello World!
- 126.单词接龙II
- BAT[阿里、百度、腾讯]等互联网公司数据结构面试题(一) python分析实现
- 计算机操作系统详细学习笔记(一):计算机操作系统概述
- 蓝队应对攻击的常用策略一
- 常用集合(ArrayList、Hashset、HashMap)的用法(会一直更新)