2017-02-26 802 views
0

我已經在我的登錄模板中顯示了一些代碼,顯示錯誤的憑據在freemarker中寫入錯誤。一切看起來都只是它應該如何,語法是正確的,但sparkjava拋出ParseException的Freemarker:意外的指令,「</#if>」

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語法很好。你可以幫幫我嗎?

+1

預期的模式是' 「#如果」 空白+ Expression',和你錯過了空白。爲什麼誤導性的錯誤信息呢?因爲FreeMarker的配置完全在2.3。0模式('incompatible_improvements'配置設置),所以它模擬了一個鬼鬼祟祟的語法分析器故障,其中'<#if(',當它是模板中第一個FreeMarker標記時,被錯誤地視爲靜態文本,因此問題只會在''的表面,我強烈建議將'incompatible_improvements'提高到至少2.3.19,並且使用'()'和'$'是不對的,但是看到的答案是 – ddekany

回答

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

事實上,它是在那裏使用'()'是完全合法的(它是多餘的,但它畢竟只是一個表達式),變量名也可以以'$'開始(儘管它們將被視爲名稱的一部分,顯然不是這個問題是'#if'和'('之間沒有空格,不幸的是解析器有一些錯誤,它把'/#if'歸咎於... ... – ddekany

+0

我檢查錯誤信息是錯誤的......看看我在OP-s問題下的評論 – ddekany

+0

好的,我很高興編輯m如果需要,y進一步回答。 –

1

圓括號可能與if一起使用時會導致異常。在freemaker的使用表達式的具體例子是 -

當您插值提供值:插值 的使用是$ {表達式}其中表達給你要插入 到輸出文本的價值。因此,$ {(5 + 8)/ 2}將「6.5」打印到輸出 (或者如果輸出的語言不是美國英語,可能會打印「6.5」。

所以你可以嘗試使用<#if ${authenticationFailed}>如果是這樣的話。

當您爲指令參數提供值時:在入門指南部分中,您已經看到了if指令,其中 已經看到。 此語句的語法爲:< #if expression> ....此處的表達式必須爲 求值爲布爾值。例如在< #if 2 < 3>( 小於3)是一個表達式,其評估爲真。

在這種情況下,你可以簡單地使用<#if authenticationFailed>通過@Frank的建議爲好。

注意 - 同樣適用於您共享的代碼中使用的所有條件分支。

來源 - Freemaker docs template