使用 <@s.generator 和迭代器标签时出现“Freemarker 模板错误”
Posted
技术标签:
【中文标题】使用 <@s.generator 和迭代器标签时出现“Freemarker 模板错误”【英文标题】:Getting "Freemarker template Error" while using <@s.generator and iterator tags 【发布时间】:2016-11-17 14:08:18 【问题描述】:我正在学习 Struts 2。使用 FreeMarker 模板创建视图时,出现错误。我正在使用 Eclipse IDE 并在 Tomcat 8 中运行该应用程序。
Freemarker 代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Sample...(FreeMarker)</h1><br><br>
<div>
<@s.generator separator="," val="%'15,20,30,40,50'">
Last entered protein Values -:<br>
<@s.iterator>
<@s.property /><br>
</@s.iterator>
</@s.generator>
</div>
</body>
</html>
Eclipse 控制台跟踪日志:
> Jul 14, 2016 8:19:02 PM
> com.opensymphony.xwork2.util.logging.jdk.JdkLogger error SEVERE:
> Exception occurred during processing request: The following has
> evaluated to null or missing:
> ==> s.generator [in template "WEB-INF/content/enter-protein.ftl" at line 10, column 11]
>
> ---- Tip: It's the step after the last dot that caused this error, not those before it.
> ---- Tip: If the failing expression is known to be legally refer to something that's null or missing, either specify a default value like
> myOptionalVar!myDefault, or use <#if
> myOptionalVar??>when-present<#else>when-missing</#if>. (These only
> cover the last step of the expression; to cover the whole expression,
> use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
> ----
>
> ---- FTL stack trace ("~" means nesting-related):
> - Failed at: @s.generator separator="," val="%'15... [in template "WEB-INF/content/enter-protein.ftl" at line 16, column 9]
> ---- FreeMarker template error: The following has evaluated to null or missing:
> ==> s.generator [in template "WEB-INF/content/enter-protein.ftl" at line 16, column 11]
>
> ---- Tip: It's the step after the last dot that caused this error, not those before it.
> ---- Tip: If the failing expression is known to be legally refer to something that's null or missing, either specify a default value like
> myOptionalVar!myDefault, or use <#if
> myOptionalVar??>when-present<#else>when-missing</#if>. (These only
> cover the last step of the expression; to cover the whole expression,
> use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
> ----
>
> ---- FTL stack trace ("~" means nesting-related):
> - Failed at: @s.generator separator="," val="%'15... [in template "WEB-INF/content/enter-protein.ftl" at line 16, column 9]
> ----
>
> Java stack trace (for programmers):
> ---- freemarker.core.InvalidReferenceException: [... Exception message was already printed; see it above ...] at
> freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:116)
> at freemarker.core.UnifiedCall.accept(UnifiedCall.java:112) at
> freemarker.core.Environment.visit(Environment.java:312) at
> freemarker.core.MixedContent.accept(MixedContent.java:62) at
> freemarker.core.Environment.visit(Environment.java:312) at
> freemarker.core.Environment.process(Environment.java:290) at
> freemarker.template.Template.process(Template.java:312) at
> org.apache.struts2.views.freemarker.FreemarkerResult.doExecute(FreemarkerResult.java:223)
> at
> org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:191) at
.
.
.
.
........................ So on...........
奇怪的是,当我在 JSP 中尝试同样的方法时,它可以完美运行!
(在 JSP 中,我们使用 <s:something>
而不是 <@s.something>
)
【问题讨论】:
【参考方案1】:<s:generator>
标签很简单,不是那种可以在 FreeMarker 模板中使用的标签*。
好处是:实际上根本不需要它。您可以使用 <s:iterator>
标签而不使用 <s:generator>
。
使用迭代器标签的value
属性设置可迭代源和OGNL表达式e1,e2,e3
创建列表。
<@s.iterator value="15,20,30,40,50">
<@s.property /><br>
</@s.iterator>
*想知道您可以在 FreeMarker 模板中使用哪些 Struts2 标签?看
DefaultTagLibrary#getDirectiveClasses
方法。
【讨论】:
那是我在 *** 上的第一篇文章。我想知道我什么时候能解决这个问题。而且这么早就解决了。谢谢。我喜欢你也为我提供了参考。 :) @hvsharma 欢迎来到 SO。很棒的第一篇文章。 FreeMarker 有自己的迭代器指令(#list
和它的朋友)...我不知道 Struts 的最佳实践是什么,但这对我来说看起来很奇怪。
这就像.. 我们可以为 Struts 2 使用任何 JSP、Freemarker 或 Velocity 视图。只是提及标签的语法各不相同。我发现 freemarker 个人更受欢迎,因为它使用“。” (点符号)用于访问 struts 标签(例如 )。但后来我才知道,freemarker 是一个相当大的世界。
@hvsharma 绝对是。就像 Daniel 说的,在 FreeMarker 模板中更喜欢通用的 FreeMarker 标签而不是 JSP 标签。以上是关于使用 <@s.generator 和迭代器标签时出现“Freemarker 模板错误”的主要内容,如果未能解决你的问题,请参考以下文章
primary key's generator in JPA entity