2017-05-28 279 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の2つのテンプレートが含まれます。 Loginform.ftlは、単純なhtml形式で、上記のコードで投稿ハンドラで処理された投稿要求をサーバに送信します。フォームに記入してリクエストを送信すると、500の内部サーバーエラーが発生します。エラーはresult.ftlに関連していますが、今はテンプレート作成のテストに使用しています。私はresult.ftlテンプレートにHashMapを渡しています。私が得るエラーは次のとおりです。Freemarkerのテンプレートエラー:nullまたは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] 
---- 

これは、テンプレートが生成されたときにデータがnullだったことを意味していましたが、非常にはっきりしていません。私はこれが起こっていることを知らない。私のテンプレートファイルは以下の通りです。
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}が動作し、 "Your not null!"と表示されます。 (「データ」はJavaコンパイル時にはなく、ローカルの変数名であり、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

OK、更新を参照してください。 – ddekany

+0

しかし、マップデータのすべてのキーをソートしようとすると、これは私を助けますか?リストアトリビュートは引き続きデータマップのキーと値だけを実行しますか? –

関連する問題