views:

98

answers:

3

I'm looking for a template engine. Requirements:

  • Runs on a JVM. Java is good; Jython, JRuby and the like, too...
  • Can be used outside of servlets (unlike JSP)
  • Is flexible wrt. to where the templates are stored (JSP and a lot of people require the templates to be stored in the FS). It should provide a template loading interface which one can implement or something like that
  • Easy inclusion of parameterized templates- I really like JSP's tag fragments
  • Good docs, nice code, etc., the usual suspects

I've looked at JSP- it's nearly perfect except for the servlet and filesystem coupling, Stringtemplate- I love the template syntax, but it fails on the filesystem coupling, the documentation is lacking and template groups and stuff are confusing, GXP, TAL, etc.

Ideas, thoughts?

Alex

+3  A: 

How about Velocity?

  • full Java
  • does not require servlets
  • it has file, jar, classpath & URL resource loaders (and maybe more)
  • templates can include other templates (if this is what you mean)
  • has good tutorials, so far I could get what I needed from the docs
Péter Török
+1  A: 

If my memory serves, FreeMaker is decent - Suppose to be some sort of "Velocity, the next generation".

Little Bobby Tables
A: 

maybe check out "JSTP", http://jstp.sourceforge.net/manual.html

its syntax is subset of JSP, therefore IDE support is excellent.

a "jstp" template is translated into a plain java class at build time. there is no runtime dependency.

"parameters" to a template should be passed by member fields. static typing all the way.

Bar.jstp

<%!                                        
    public String name;                    
%>

Hello <%= name %> 

build converts it into Bar.java

public class Bar                                        
{                                                       
    public String name;                                 
    public void render(java.io.PrintWriter out)         
    {                                                   
        out.print("Hello ");                            
        out.print(String.valueOf(name));                
        ...                                             
    }                                                   
}  

and you invoke the template by

Bar bar = new Bar();                              
bar.name = "John";                               
bar.render(..);       

with typical "hotswap" you shouldn't have to restart serve when editing the template.

irreputable