【发布时间】:2013-06-12 17:48:28
【问题描述】:
我写了一个 Jsp 标签库,使用 freemarker 作为视图模板。
custom.tld 放在 META-INF/tags/ 中。
我的标签库被捆绑为 Jar。 customTag.jar。
它有以下模板
AlertTag.ftl
ButtonTag.ftl
AlertTag.ftl 依赖于ButtonTag.ftl。
AlertTag.ftl:-
<#assign custom = JspTaglibs["http://www.abc.com/taglibs/custom"]>
<h5>${this.title}</h5>
<div class="alert ${this.typeClass} ${this.classes!}">
<@custom.button btnType="close" <span class="alt">close</span></@custom.button>
</div>
此 customTag.jar 是另一个网络应用程序的一部分。
web.xml:-
<taglib>
<taglib-uri>http://www.abc.com/taglibs/custom</taglib-uri>
<taglib-location>/WEB-INF/custom.tld</taglib-location>
</taglib>
现在当网络应用程序中的index.ftl 尝试使用标签<@custom.Alert id="abc"> 时,它会引发以下异常
Expression JspTaglibs is undefined on line 1, column 17 in freemarker/AlertTag.ftl.
The problematic instruction:
----------
==> assignment: custom=JspTaglibs["http://www.abc.com/taglibs/custom"] [on line 1, column 1 in freemarker/AlertTag.ftl]
----------
Java backtrace for programmers:
----------
freemarker.core.InvalidReferenceException: Expression JspTaglibs is undefined on line 1, column 17 in freemarker/AlertTag.ftl.
我无法在 freemarker 中使用嵌套的 jsp 标签。
AlertTag.java
Configuration cfg = new Configuration();
cfg.setClassForTemplateLoading(this.getClass(), "/");
Template ftlTemplate = cfg.getTemplate(view);
JspWriter writer = pageContext.getOut();
data.put("id", id)
Map<String, Object> rootMap = new HashMap<String,Object>();
rootMap.put("this", data);
Environment environment = ftlTemplate.createProcessingEnvironment(rootMap, writer);
environment.process();
//ftlTemplate.process(rootMap, writer);
@Daniel,我用过上面的环境,但也没有用。我使用正确吗?
【问题讨论】:
-
如何调用
AlertTag.ftl本身? -
我从 web-app 中的 index.ftl 调用它。
<@custom.Alert id="abc"> -
I
assume @custom.Alert本身就是一个自定义 JSP 标记,而不是一个普通的 FreeMarker 宏/指令。所以我的意思是如何在技术上调用AlertTag.ftl。因为我怀疑 JSP 标签会创建它自己的 FreeMarker 引擎实例,它与index.ftl使用的实例无关,因此根本存在 JSP 标签库支持。 -
是的,@custom.Alert 是一个自定义 JSP 标记。我编写了一个在 custom.tld 中定义的 AlertTag.java 文件。在 AlertTag.java 中,我正在调用 AlertTag.ftl。让我将其添加到问题中。
标签: jsp jsp-tags freemarker