2016-06-23 3 views
0

ベロシティテンプレートとJSON文字列データを使ってHTMLデータを生成する方法が直接必要です。たとえば :それは行うことができますどのように速度テンプレートとJSONを使用してHTMLを生成しますか?

String mergedHtml = Velocity.someMethodToParseTemplate("VelocityTemplate.vm" ,String JsonString");

? "someMethodToParseTemplate"のコードを提案してください。

答えて

3

(例えばorg.json libraryを使用して)JSON文字列を解析し、解析結果からVelocityContextを構築するだけで済みます。

<html> 
    <body> 
    $name is $age years old and lives $address.streetAddress, ${address.city}. 
    <br/> 
    $name's friends: 
    <ul> 
    #foreach($friend in $friends) 
     <li>$friend.name, who is $friend.age years old</li> 
    #end 
    </ul> 
    </body> 
</html> 

あなたはこのようなJSON文字列に対してそれをマージすることができます:

みましょうあなたは次のテンプレートを持っていると言うあなたはいくつかのルートプロパティの下にJSONオブジェクトをラップする場合

import java.io.IOException; 
import java.io.StringWriter; 
import java.io.Writer; 
import org.apache.velocity.VelocityContext; 
import org.apache.velocity.app.VelocityEngine; 
import org.json.JSONObject; 

public class JsonPublisher 
{ 
    protected VelocityEngine velocity; 

    public JsonPublisher() 
    { 
    // init velocity                                                
    // default resource loader is a file loader on the current directory                                   
    velocity = new VelocityEngine(); 
    velocity.init(); 
    } 

    public String publish(String templatePath, String jsonString) throws IOException 
    { 
    // translate json string to velocity context                                         
    // (we only need to convey the properties of the root object)                                    
    JSONObject jsonObj = new JSONObject(jsonString); 
    VelocityContext context = new VelocityContext(); 
    for(String key : jsonObj.keySet()) 
    { 
     context.put(key, jsonObj.get(key)); 
    } 

    Writer writer = new StringWriter(); 
    velocity.mergeTemplate(templatePath, "UTF-8", context, writer); 
    writer.flush(); 

    return writer.toString(); 
    } 

    public static void main(String args[]) 
    { 
    try 
    { 
     String str = "{ \"name\": \"Alice\", \"age\": 20, \"friends\": "+ 
     "[ { \"name\":\"Bob\", \"age\":21 }, { \"name\":\"Carol\", \"age\":19 } ], " + 
     "\"address\": { \"streetAddress\": \"100 Wall Street\", \"city\": \"New York\" } }"; 
     String result = new JsonPublisher().publish("template.vm", str); 
     System.out.println(result); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    } 
} 

コンテキストは、$jsonとしましょう。さらに簡単です:

.... 
JSONObject jsonObj = new JSONObject(jsonString); 
VelocityContext context = new VelocityContext(); 
context.put("json", jsonObj);   
.... 
+0

おかげで多くのことをチェックしてください!クエリがあったので、JSONが大きい場合は、変換が遅くなることはありませんか? –

+0

JSONが大きい場合、メソッドは適切ではない可能性がありますが、大きなボリュームはブラウザにアップロードされないため、HTMLも適切でない可能性があります。それはあなたが大*と呼ぶものに本当に依存します。特定のサイズより上では、ストリーム処理(行ごとの解析+公開、àla * sed/awk *)のみが適切であり、非常に頻繁に自分自身を書くことが最良の選択肢です。 –

1

メインオブジェクトHtmlの存在がブラウザに表示される場合、クライアント側速度レンダリングエンジンとjson +テンプレートをクライアントに別々に使用するほうが良いかもしれません。

クライアントがブラウザの場合は、ブラウザでvelocityjsを使用できます。 本質的にはvar renderedHtml = velocityjs.render(htmlTemplate,jsonData)のようなものになります。次に、renderedHtmlをいくつかのdom要素のinnerHtmlに設定することができます。

は、あなたの素敵なわかりやすい答えを私another answer for more detailed steps

関連する問題