Используете шаблон скорости и JSON для создания HTML?

Мне нужен прямой способ использования шаблона скорости и строковых данных JSON для генерации данных HTML. Например:

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

Как это сделать? Пожалуйста, предложите код для "someMethodToParseTemplate"?


person Pratik Nagelia    schedule 23.06.2016    source источник


Ответы (2)


Вам просто нужно проанализировать строку JSON (например, используя org.json library), а затем построить 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 следующим образом:

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-объект в какое-то корневое свойство контекста, скажем, $json, тогда это еще проще:

....
JSONObject jsonObj = new JSONObject(jsonString);
VelocityContext context = new VelocityContext();
context.put("json", jsonObj);        
....
person Claude Brisson    schedule 24.06.2016
comment
Большое спасибо за хороший описательный ответ! Был запрос, так что теперь, если JSON большой, не замедлит ли это преобразование? - person Pratik Nagelia; 25.06.2016
comment
Если JSON большой, метод может не подходить, но HTML также может не подходить, поскольку большие объемы не предназначены для загрузки в браузеры. Это действительно зависит от того, что вы называете большим. При превышении определенного размера уместна только потоковая обработка (которая выполняет построчный синтаксический анализ + публикацию, а-ля sed / awk), и очень часто написание собственной является лучшим вариантом. - person Claude Brisson; 27.06.2016

Если основная цель Html - отображаться в браузере, может быть лучше использовать механизм рендеринга скорости на стороне клиента и шаблон json + отдельно от клиента.

Если вашим клиентом является браузер, вы можете использовать в браузере velocityjs. По сути, это сводится к чему-то вроде var renderedHtml = velocityjs.render(htmlTemplate,jsonData). Затем вы можете установить renderedHtml как innerHtml некоторого элемента dom.

Ознакомьтесь с моим другим ответом для более подробных инструкций

person faizan    schedule 11.08.2016