Freemarker:意外指令,“</#if>”
Freemarker: Unexpected directive, "</#if>"
我的登录模板中有一些代码显示了用 freemarker 编写的错误凭据的错误。一切看起来都应该如何,语法正确,但 sparkjava 抛出 ParseException
freemarker.core.ParseException: Syntax error in template "freemarker/admin_login.ftl" in line 40, column 9:
Unexpected directive, "</#if>". Check if you have a valid #if-#elseif-#else structure.
at freemarker.core.FMParser.generateParseException(FMParser.java:5251)
at freemarker.core.FMParser.jj_consume_token(FMParser.java:5122)
at freemarker.core.FMParser.Root(FMParser.java:3433)
at freemarker.template.Template.<init>(Template.java:208)
at freemarker.cache.TemplateCache.loadTemplate(TemplateCache.java:495)
at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:409)
at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:261)
at freemarker.template.Configuration.getTemplate(Configuration.java:1786)
at freemarker.template.Configuration.getTemplate(Configuration.java:1646)
at spark.template.freemarker.FreeMarkerEngine.render(FreeMarkerEngine.java:69)
at pl.bluedotdevs.adminpanel.utils.ViewUtil.render(ViewUtil.java:22)
at pl.bluedotdevs.adminpanel.login.LoginController.lambda$static[=11=](LoginController.java:21)
at spark.RouteImpl.handle(RouteImpl.java:61)
at spark.http.matching.Routes.execute(Routes.java:61)
at spark.http.matching.MatcherFilter.doFilter(MatcherFilter.java:128)
at spark.embeddedserver.jetty.JettyHandler.doHandle(JettyHandler.java:50)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119)
at org.eclipse.jetty.server.Server.handle(Server.java:517)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:302)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:245)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
at org.eclipse.jetty.io.SelectChannelEndPoint.run(SelectChannelEndPoint.java:75)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)
at org.eclipse.jetty.util.thread.QueuedThreadPool.run(QueuedThreadPool.java:572)
at java.lang.Thread.run(Thread.java:745)
我的代码:
<#if($authenticationFailed)>
<div class="alert alert-danger" role="alert">Niepoprawny email lub hasło</div>
<#elseif($authenticationSucceeded)>
<div class="alert alert-success" role="alert">Zalogowano pomyślnie</div>-->
<#elseif($loggedOut)>
<div class="alert alert-success" role="alert">Wylogowano pomyślnie</div>-->
</#if>
真不知道怎么了。我查看了文档,我认为我的 elseif 语法很好。你能帮帮我吗?
条件中的括号导致解析错误(例如 <#if($authenticationFailed)>
)。要么删除它们,要么正如@ddekany 在下面的评论中指出的那样,在 if 关键字和左括号之间放置一个 space。
此外,变量通常不以 $
开头,但如果变量名称确实包含 $
字符,则它会起作用。
试试这个。
<#if $authenticationFailed>
<div class="alert alert-danger" role="alert">Niepoprawny email lub hasło</div>
<#elseif $authenticationSucceeded>
<div class="alert alert-success" role="alert">Zalogowano pomyślnie</div>-->
<#elseif $loggedOut>
<div class="alert alert-success" role="alert">Wylogowano pomyślnie</div>-->
</#if>
括号可能在您与 if
一起使用时导致异常。 Freemaker 中使用的表达式的具体示例是 -
When you supply value for interpolations: The usage of interpolations
is ${expression} where expression gives the value you want to insert
into the output as text. So ${(5 + 8)/2} prints "6.5" to the output
(or possibly "6,5" if the language of your output is not US English).
如果是这样,您可以尝试使用 <#if ${authenticationFailed}>
。
When you supply a value for the directive parameter: You have already
seen the if directive in the Getting Started section. The syntax of
this directive is: <#if expression>.... The expression here must
evaluate to a boolean value. For example in <#if 2 < 3> the 2 < 3 (2
is less than 3) is an expression which evaluates to true.
在这种情况下,您也可以按照@Frank 的建议简单地使用 <#if authenticationFailed>
。
注意 - 同样适用于您共享的代码中使用的所有条件分支。
我的登录模板中有一些代码显示了用 freemarker 编写的错误凭据的错误。一切看起来都应该如何,语法正确,但 sparkjava 抛出 ParseException
freemarker.core.ParseException: Syntax error in template "freemarker/admin_login.ftl" in line 40, column 9:
Unexpected directive, "</#if>". Check if you have a valid #if-#elseif-#else structure.
at freemarker.core.FMParser.generateParseException(FMParser.java:5251)
at freemarker.core.FMParser.jj_consume_token(FMParser.java:5122)
at freemarker.core.FMParser.Root(FMParser.java:3433)
at freemarker.template.Template.<init>(Template.java:208)
at freemarker.cache.TemplateCache.loadTemplate(TemplateCache.java:495)
at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:409)
at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:261)
at freemarker.template.Configuration.getTemplate(Configuration.java:1786)
at freemarker.template.Configuration.getTemplate(Configuration.java:1646)
at spark.template.freemarker.FreeMarkerEngine.render(FreeMarkerEngine.java:69)
at pl.bluedotdevs.adminpanel.utils.ViewUtil.render(ViewUtil.java:22)
at pl.bluedotdevs.adminpanel.login.LoginController.lambda$static[=11=](LoginController.java:21)
at spark.RouteImpl.handle(RouteImpl.java:61)
at spark.http.matching.Routes.execute(Routes.java:61)
at spark.http.matching.MatcherFilter.doFilter(MatcherFilter.java:128)
at spark.embeddedserver.jetty.JettyHandler.doHandle(JettyHandler.java:50)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119)
at org.eclipse.jetty.server.Server.handle(Server.java:517)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:302)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:245)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
at org.eclipse.jetty.io.SelectChannelEndPoint.run(SelectChannelEndPoint.java:75)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)
at org.eclipse.jetty.util.thread.QueuedThreadPool.run(QueuedThreadPool.java:572)
at java.lang.Thread.run(Thread.java:745)
我的代码:
<#if($authenticationFailed)>
<div class="alert alert-danger" role="alert">Niepoprawny email lub hasło</div>
<#elseif($authenticationSucceeded)>
<div class="alert alert-success" role="alert">Zalogowano pomyślnie</div>-->
<#elseif($loggedOut)>
<div class="alert alert-success" role="alert">Wylogowano pomyślnie</div>-->
</#if>
真不知道怎么了。我查看了文档,我认为我的 elseif 语法很好。你能帮帮我吗?
条件中的括号导致解析错误(例如 <#if($authenticationFailed)>
)。要么删除它们,要么正如@ddekany 在下面的评论中指出的那样,在 if 关键字和左括号之间放置一个 space。
此外,变量通常不以 $
开头,但如果变量名称确实包含 $
字符,则它会起作用。
试试这个。
<#if $authenticationFailed>
<div class="alert alert-danger" role="alert">Niepoprawny email lub hasło</div>
<#elseif $authenticationSucceeded>
<div class="alert alert-success" role="alert">Zalogowano pomyślnie</div>-->
<#elseif $loggedOut>
<div class="alert alert-success" role="alert">Wylogowano pomyślnie</div>-->
</#if>
括号可能在您与 if
一起使用时导致异常。 Freemaker 中使用的表达式的具体示例是 -
When you supply value for interpolations: The usage of interpolations is ${expression} where expression gives the value you want to insert into the output as text. So ${(5 + 8)/2} prints "6.5" to the output (or possibly "6,5" if the language of your output is not US English).
如果是这样,您可以尝试使用 <#if ${authenticationFailed}>
。
When you supply a value for the directive parameter: You have already seen the if directive in the Getting Started section. The syntax of this directive is: <#if expression>.... The expression here must evaluate to a boolean value. For example in <#if 2 < 3> the 2 < 3 (2 is less than 3) is an expression which evaluates to true.
在这种情况下,您也可以按照@Frank 的建议简单地使用 <#if authenticationFailed>
。
注意 - 同样适用于您共享的代码中使用的所有条件分支。