Freemarker:意外的指令,“<! - #if - >”

时间:2017-02-26 10:59:31

标签: java freemarker

我的登录模板中有一些代码,显示在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$0(LoginController.java:21)
at spark.RouteImpl$1.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$2.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$3.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语法很好。你能帮帮我吗?

2 个答案:

答案 0 :(得分:1)

条件句中的括号导致解析错误(例如<#if($authenticationFailed)>)。删除它们,或者在下面的注释中添加@ddekany注释,在if关键字和左括号之间放置一个空格。

此外,变量通常不以$开头,但如果变量的名称真正包含$字符,它将起作用。

试试这个。

<#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>

答案 1 :(得分:1)

当您使用if时,括号可能会导致异常。 Freemaker中使用的表达式的具体示例是 -

  

为插值提供值时:插值的用法   是 $ {expression} 其中expression给出了要插入的值   作为文本输入到输出。所以 $ {(5 + 8)/ 2} 打印&#34; 6.5&#34;到输出   (或者可能&#34; 6,5&#34;如果你的输出语言不是美国英语)。

因此,如果是这种情况,您可以尝试使用<#if ${authenticationFailed}>

  

当您为指令参数提供值时:您已经拥有   在“入门”部分看到了if指令。的语法   这个指令是:&lt; #if expression&gt; ....这里的表达必须   求值为布尔值。例如,在&lt; #if 2&lt; 3 GT; 2&lt; 3(2   小于3)是一个表达式,其值为true。

在这种情况下,你也可以按照@Frank的建议使用<#if authenticationFailed>

注意 - 同样适用于您共享的代码中使用的所有条件分支。

来源 - Freemaker docs template