freemarker 宏定义 的not specified

宋浩 发布于 2010/04/12 15:17
阅读 5K+
收藏 0

因为页面有几个重复的判断图片的显示路径。所以自己定义了一段宏定义:

<#macro judgeImage info image="images/N_n2pic.gif">
<#if info?exists >
<dt><a href="/info/detail.do?id=${info.id}"><img src="${info.image?default('images/N_n2pic.gif')}" width="95" height="85"/></a></dt>
<#else>
<dt><img src="${image}" width="95" height="85"/></dt>
</#if>
</#macro>

引用:

<dl class="clear">

<@judgeImage zuixinloupandata/>

</dl>

运行结果报错:

==> macro judgeImage [on line 3, column 1 in content_one.ftl]
 in user-directive judgeImage [on line 121, column 11 in content_one.ftl]
 in include "content_one.ftl" [on line 28, column 1 in index.ftl]
----------

Java backtrace for programmers:
----------
freemarker.template.TemplateException: Error executing macro: judgeImage
required parameter: info is not specified.

说宏定义的第三行的info未定义。

宏定义的info只是传的一个参数而已, 会判断它是否为空?

引用的地方有几个。前面几个没问题, 是因为里面有数据, 结果运行到

<@judgeImage zuixinloupandata/>就异常。 后面的有些是没数据的, 但MAP里面存放了key,只是value为null而已。

求解。

加载中
0
红薯
红薯

应该是这样引用宏:<@judgeImage info="zuixinloupandata"/>

0
宋浩
宋浩

引用来自“红薯”的帖子

应该是这样引用宏:<@judgeImage info="zuixinloupandata"/>

试了, 结果还是异常,

不过到第五行了:


Expected hash. info evaluated instead to freemarker.template.SimpleScalar on line 5, column 35 in content_one.ftl.
The problematic instruction:
----------
==> ${info.id} [on line 5, column 33 in content_one.ftl]
 in user-directive judgeImage [on line 55, column 11 in content_one.ftl]
 in include "content_one.ftl" [on line 28, column 1 in index.ftl]
----------

Java backtrace for programmers:
----------
freemarker.template.TemplateException: Expected hash. info evaluated instead to freemarker.template.SimpleScalar on line 5, column 35 in content_one.ftl.

也就是${info.id}那有问题,

但奇怪,我明明判断了<#if info?exists>

怎么还是跑进去了?

0
红薯
红薯

那就说明你的 info 是要求一个对象,而不是字符串,你应该给 info传递一个变量

<@judgeImage info=zuixinloupandata/>

不知道你的 zuixinloupandata 是个什么东西。

0
宋浩
宋浩

zuixinloupandata是单个对象。

还是不行哦。

始终过不了<#macro judgeImage info image="images/N_n2pic.gif">这里的info

0
宋浩
宋浩

<#macro judgeImage info image="images/N_n2pic.gif">
<#if info?exists >
<dt><a href="/info/detail.do?id=${info.id}"><img src="${info.image?default('images/N_n2pic.gif')}" width="95" height="85"/></a></dt>
<#else>
<dt><img src="${image}" width="95" height="85"/></dt>
</#if>
</#macro>

今天早上仔细看了下, 也顺便查了下freemarker指令

原来info?exists只判断变量是否存不存在而不管是否为空。

map里面有这个变量。 所以这里的结果是true。因此执行到下一步获取info的属性值, 结果就报未定义错误。

<#if info?exists && info?has_content>改成这样即可。

info?has_content判断该变量是否不为null并且不为empty

0
宋浩
宋浩

哈哈, 结贴。

0
张宋付
张宋付

其实你想在调用是空的话,直接用info?has_content 就可以了。


0
宋浩
宋浩

引用来自“张宋付”的帖子

其实你想在调用是空的话,直接用info?has_content 就可以了。


嗯。

我试了下。 数据map里面没有的key用has_content判断都不会出错。

has_content既然可以满足需求, 为什么还有个exists

返回顶部
顶部