2017-05-28 85 views
0
public static void main(String[] args) throws IOException { 
    port(8080); 

    Configuration config = new Configuration(Configuration.VERSION_2_3_26); 
    config.setDirectoryForTemplateLoading(new File("PATH_NAME")); 



    get("/test", (req,res) ->{ 
     StringWriter writer = new StringWriter(); 
     Template temp = config.getTemplate("loginform.ftl"); 
     temp.process(null, writer); 
     return writer; 
    }); 


    post("/select", (req,res) -> { 
     String city = req.queryParams("city"); 
     String state = req.queryParams("state"); 


     Map<String, Object> data = new HashMap<>(); 

     data.put("Hello", "Your not null!"); 

     StringWriter writer = new StringWriter(); 
     Template temp = config.getTemplate("result.ftl"); 

     temp.process(data, writer); 

     return writer; 

     }); 

} 

以上是我正在開發的Spark應用程序的主要方法。它涉及兩個模板,loginform.ftl和result.ftl。 Loginform.ftl是一個簡單的html表單,它將一個post請求發送給上面代碼中由post handler處理的服務器。當我填寫表單併發送請求時,我收到500內部服務器錯誤。該錯誤與result.ftl有關,目前我正在使用它來測試模板製作。我將一個HashMap傳遞給result.ftl模板。我得到的錯誤是:Freemarker template error:null or missing

FreeMarker template error: 
The following has evaluated to null or missing: 
==> data [in template "result.ftl" at line 2, column 8] 


FTL stack trace ("~" means nesting-related): 
    - Failed at: #list data as key, value [in template "result.ftl" at line 
2, column 1] 
---- 

我把這個意思是說,當模板生成時數據是空的,但它很明顯不是。我不知道這是怎麼回事。下面是我的模板文件。
loginform.ftl

<form action= "/select" method= "POST" accept-charset="utf-8"> 

    City Name: <input type= "text" name = "city"> 

    State(2 letter format):<input type= "text" name = "state"> 

<input type= "submit" id = "submitButton"> 

</form> 

result.ftl

<html> 
    <#list data as key, value> 
    ${key} = ${value}; 
    </#list> 
</html> 

回答

0

該錯誤消息是正確的。在您的Java代碼中使用data作爲數據模型根。根本身不是頂級變量,而是頂級變量的容器。因此,例如${Hello}將工作,並打印「你不是空!」。 (還要注意,「data」只是一個局部變量名,在Java編譯過程中這個變量名已經不存在了,並且你永遠不會將「data」變量名傳遞給FreeMarker。)所以你應該製作一個rootMap(或者bean),把dataMap(或豆),並通過rootTemplate.process

更新:也就是說,在現在你有temp.process(data, writer);,你應該有:

Map<String, object> root = new HashMap<>(); 
root.put("data", data); 

temp.process(root, writer); 
+0

你介意給一個小例子嗎? –

+0

好的,請參閱更新。 – ddekany

+0

但是,當我試圖對地圖數據中的所有鍵進行排序時,這會對我有幫助嗎?列表屬性是否仍然只通過數據映射中的鍵和值運行? –

相關問題