Upload
nljug
View
1.076
Download
3
Embed Size (px)
DESCRIPTION
Citation preview
Shootout! Template engines on the JVM
Jeroen Reijn | @jreijn | #jfall13
About me
• Architect @ Hippo
• Worked on web based platforms since 2001 with PHP, XSLT, JSP, Velocity and Freemarker
• Blogger at http://blog.jeroenreijn.com
Session agenda
• General overview
• Interesting template engines
• Benchmark project
• Performance results
Template engine?
• What is a Template ?
• What is a Template Engine ?
• How many Java Template Engines ?
• Java-Source.net : 21
• Wikipedia: 17
Most commonly used
• JSP
• Freemarker
• Velocity
Overview
Selection criteria
• Project activity
• Framework support
• Active Community
• Brings added value
• IDE support
Most interesting
• Thymeleaf
• Mustache
• Jade
• Scalate
Thymeleaf
Overview
• Available at http://www.thymeleaf.org/
• Java, DOM based template engine
• XML / XHTML / HTML5
• Full Spring MVC integration
• ‘Natural templating’
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”
JSP in browser
Thymeleaf in browser
Variables & Loops
• Variables
• Loops
Fragments
• Include fragment
• Define fragment based on th:fragment
{{ Mustache }}
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.
Overview
• Java implementaions:
• JMustache
• Mustache.java
• Not web specific
• Spring MVC integration as an add-on
Variables
{“greeting” : “Hello”,
“message” : “World”}
{{greeting}} {{message}}
Data Template
Hello World
Output
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
Fragments
base.mustache:<h2>Presentations</h2>{{#presentations}} {{> presentation}}{{/presentations}}
presentation.mustache:<h3>{{title}}</h3><p>{{startTime}}</p>
Template
Jade
Jade
• Available at http://jade-lang.com
• Node.js Template engine
• Java Implementation: Jade4j
• Compact notation
Syntax
Result
Variables & Iterations
• Variables
• Iterations
Fragments
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, ...
Template languages
• SSP (Scala Server Pages)
• SCAML (based on Ruby’s HAML)
• Mustache
• Jade
Scaml
• Based on HAML (HTML abstraction markup language)
• Integrates Scala code
• Well formatted markup
• Similar to Jade
Variables & Loops
• Fragment support is possible
• Inline Scala code
Benchmark project
Benchmark project
• Simple Spring MVC application
• Multiple view resolvers
• Page that show a list of presentations
• Uses page layouts / fragments
• Uses i18n where possible
Spring MVC
public class Presentation { private Long id; private String title; private String speakerName; private String summary; private String room; private Date startTime; private Date endTime;}
Project available
• Project will be available as open source on github.
• https://github.com/jreijn/spring-comparing-template-engines
Results!
Performance
12,50s
16,00s
19,50s
23,00s
26,50s
30,00s
Total time taken for 25.000 requests (less is better)
Thymeleaf - v2.1.0Jade4j - v0.3.17Scalate - v1.6.1Mustache - v1.8Freemarker - v2.3.19Velocity - v1.7JSP - 2.1
Findings
• Thymeleaf used 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
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