Shootout! Template engines for the JVM

2c3ad1c6891845c582e0171e2e1753b1?s=47 Jeroen Reijn
November 06, 2013

Shootout! Template engines for the JVM

These slides were from my JFall 2013 presentation about new template engines for the JVM. During this presentation I gave a short introduction to new and interesting template engines and show how they compare to the most well known: JSP, Velocity and Freemarker.

2c3ad1c6891845c582e0171e2e1753b1?s=128

Jeroen Reijn

November 06, 2013
Tweet

Transcript

  1. Shootout! Template engines for the JVM Jeroen Reijn | @jreijn

    | #jfall13
  2. About me • Architect @ Hippo • Worked on web

    based platforms since 2001 with PHP, XSLT, JSP, Velocity and Freemarker • Blogger at http://blog.jeroenreijn.com
  3. Session agenda • General overview • Interesting template engines •

    Benchmark project • Performance results
  4. Template engine? • What is a Template ? • What

    is a Template Engine ? • How many Java Template Engines ? • Java-Source.net : 21 • Wikipedia: 17
  5. Most commonly used • JSP • Freemarker • Velocity

  6. Overview

  7. Selection criteria • Project activity • Framework support • Active

    Community • Brings added value • IDE support
  8. Most interesting • Thymeleaf • Mustache • Jade • Scalate

  9. Thymeleaf

  10. Overview • Available at http://www.thymeleaf.org/ • Java, DOM based template

    engine • XML / XHTML / HTML5 • Full Spring MVC integration • ‘Natural templating’
  11. Natural templating • From Wikipedia: “The template can be a

    document as valid as the final result, the engine syntax doesn't break the document's structure”
  12. JSP in browser

  13. Thymeleaf in browser

  14. None
  15. Variables & Loops • Variables ! • Loops

  16. Fragments • Include fragment ! • Define fragment based on

    th:fragment
  17. {{ Mustache }}

  18. Overview • Available at https://mustache.github.com • “logic-less” because there are

    no control statements (i.e. if, else, loops, etc) • Tags are specified using {{ }} (looks like a mustache) • Implemented by many languages: Java, Ruby, JavaScript, Python, Erlang, PHP, Objective- C, .NET, C++, Go, ColdFusion, Scala, etc.
  19. Overview • Java implementations: • JMustache • Mustache.java • Not

    web specific • Spring MVC integration as an 3th party add-on
  20. Variables { “greeting” : “Hello”, “message” : “World” } {{greeting}}

    {{message}} Data Template Hello World Output
  21. Sections { "repo": [ { "name": "resque" }, { "name":

    "hub" }, { "name": "rip" }, ] } {{#repo}} <li>{{name}}</li> {{/repo}} Data Template <li>resque</li> <li>hub</li> <li>rip</li> Output
  22. Fragments base.mustache: <h2>Presentations</h2> {{#presentations}} {{> presentation}} {{/presentations}} ! presentation.mustache: <h3>{{title}}</h3>

    <p>{{startTime}}</p> Template
  23. Jade

  24. Jade • Available at http://jade-lang.com • Node.js Template engine •

    Java Implementation: Jade4j • Compact notation
  25. Syntax

  26. Result

  27. Variables & Iterations • Variables ! • Iterations

  28. Fragments

  29. None
  30. Overview • Available at http://scalate.fusesource.org/ • Scala based Template Engine

    (ScalaTE) • Templates are compiled as Scala objects • Equivalent to using JSP, JSTL, JSP EL & Tiles / Sitemesh • Integration available for Spring, Play, Lift, ...
  31. Template languages • SSP (Scala Server Pages) • SCAML (based

    on Ruby’s HAML) • Mustache • Jade
  32. Scaml • Based on HAML (HTML abstraction markup language) •

    Integrates Scala code • Well formatted markup • Similar to Jade
  33. Variables & Loops ! ! • Fragment support is possible

    • Inline Scala code
  34. Benchmark project

  35. Benchmark project • Simple Spring MVC application • Multiple view

    resolvers • Page that show a list of presentations • Uses page layouts / fragments • Uses i18n where possible
  36. Spring MVC

  37. public class Presentation { private Long id; private String title;

    private String speakerName; private String summary; private String room; private Date startTime; private Date endTime; }
  38. None
  39. Project available • Project will be available as open source

    on github. • https://github.com/jreijn/spring-comparing- template-engines
  40. Results!

  41. Performance 0,00s 3,57s 7,14s 10,71s 14,29s 17,86s 21,43s 25,00s Total

    time taken for 25.000 requests (less is better) Thymeleaf - v2.1.0 Jade4j - v0.3.17 Scalate - v1.6.1 Mustache - v1.8 Freemarker - v2.3.19 Velocity - v1.7 JSP - 2.1
  42. Findings • Thymeleaf uses more memory and was slower then

    the commonly used • Scalate was a lot slower due to the layout mechanism. More than 100 seconds for 25.000 requests. • Mustache performs really well!
  43. Tips • If you want designers to own your templates

    consider Mustache or Thymeleaf • If you want developers to own your templates: • If you want to generate HTML / XML and DRY? => Jade • otherwise: JSP, Freemarker, etc
  44. Thank you! Questions? @jreijn j.reijn@onehippo.com