Groovy templating engines providing JSP-style scripting, GString expressions, markup builders, and streaming template capabilities for generating dynamic content from templates with variable substitution and control flow
—
The basic template engines (SimpleTemplateEngine and GStringTemplateEngine) provide JSP-style and GString templating capabilities for generating dynamic text content.
The SimpleTemplateEngine processes templates with JSP-style <% %> script blocks and <%= %> expressions, plus GString-style ${...} expressions. It compiles templates to Groovy scripts for execution.
class SimpleTemplateEngine extends TemplateEngine {
SimpleTemplateEngine();
SimpleTemplateEngine(boolean verbose);
SimpleTemplateEngine(ClassLoader parentLoader);
SimpleTemplateEngine(GroovyShell groovyShell);
Template createTemplate(Reader reader) throws CompilationFailedException, ClassNotFoundException, IOException;
void setVerbose(boolean verbose);
boolean isVerbose();
void setEscapeBackslash(boolean escapeBackslash);
boolean isEscapeBackslash();
}<% ... %> - Execute Groovy code<%= ... %> - Output expression result${...} and $variable - Variable interpolationout - PrintWriter bound to template outputimport groovy.text.SimpleTemplateEngine;
import groovy.text.Template;
import java.util.HashMap;
import java.util.Map;
SimpleTemplateEngine engine = new SimpleTemplateEngine();
String templateText = """
Dear <%= firstname %> ${lastname},
We <% if (accepted) print 'are pleased' else print 'regret' %> \\
to inform you that your paper entitled
'$title' was ${ accepted ? 'accepted' : 'rejected' }.
The conference committee.
""";
Template template = engine.createTemplate(templateText);
Map<String, Object> binding = new HashMap<>();
binding.put("firstname", "Grace");
binding.put("lastname", "Hopper");
binding.put("accepted", true);
binding.put("title", "Groovy for COBOL programmers");
String result = template.make(binding).toString();import java.io.File;
import java.nio.charset.StandardCharsets;
SimpleTemplateEngine engine = new SimpleTemplateEngine();
File templateFile = new File("template.gsp");
// With auto-detected encoding
Template template = engine.createTemplate(templateFile);
// With explicit encoding
Template template2 = engine.createTemplate(templateFile, StandardCharsets.UTF_8);
// Apply binding
String result = template.make(binding).toString();SimpleTemplateEngine engine = new SimpleTemplateEngine(true);
// or
engine.setVerbose(true);
// This will print generated script source to System.out
Template template = engine.createTemplate(templateText);SimpleTemplateEngine engine = new SimpleTemplateEngine();
engine.setEscapeBackslash(true); // Handle \$ and \< sequences
String templateText = "Price: \\$${price}"; // Outputs: Price: $100<!-- web.xml -->
<servlet>
<servlet-name>SimpleTemplate</servlet-name>
<servlet-class>groovy.servlet.TemplateServlet</servlet-class>
<init-param>
<param-name>template.engine</param-name>
<param-value>groovy.text.SimpleTemplateEngine</param-value>
</init-param>
</servlet>The GStringTemplateEngine provides equivalent functionality to SimpleTemplateEngine but uses a streaming closure-based approach, making it more scalable for large templates.
class GStringTemplateEngine extends TemplateEngine {
GStringTemplateEngine();
GStringTemplateEngine(ClassLoader parentLoader);
Template createTemplate(Reader reader) throws CompilationFailedException, ClassNotFoundException, IOException;
}Same as SimpleTemplateEngine:
<% ... %> - Execute Groovy code<%= ... %> - Output expression result${...} and $variable - Variable interpolationout - PrintWriter bound to template outputimport groovy.text.GStringTemplateEngine;
import groovy.text.Template;
GStringTemplateEngine engine = new GStringTemplateEngine();
String templateText = """
Hello <%= name %>!
Your balance is ${currency}${balance}.
<% if (balance > 1000) { %>
You qualify for premium service!
<% } %>
""";
Template template = engine.createTemplate(templateText);
Map<String, Object> binding = new HashMap<>();
binding.put("name", "Alice");
binding.put("currency", "$");
binding.put("balance", 1500);
String result = template.make(binding).toString();ClassLoader customLoader = MyClass.class.getClassLoader();
GStringTemplateEngine engine = new GStringTemplateEngine(customLoader);
Template template = engine.createTemplate(templateSource);<!-- web.xml -->
<servlet>
<servlet-name>GStringTemplate</servlet-name>
<servlet-class>groovy.servlet.TemplateServlet</servlet-class>
<init-param>
<param-name>template.engine</param-name>
<param-value>groovy.text.GStringTemplateEngine</param-value>
</init-param>
</servlet>Both engines throw the same exceptions:
import groovy.text.TemplateExecutionException;
import groovy.text.TemplateParseException;
import org.codehaus.groovy.control.CompilationFailedException;
try {
Template template = engine.createTemplate(templateSource);
String result = template.make(binding).toString();
} catch (TemplateParseException e) {
// Template syntax error
System.err.println("Parse error at line " + e.getLineNumber() +
", column " + e.getColumn() + ": " + e.getMessage());
} catch (CompilationFailedException e) {
// Groovy compilation error
System.err.println("Compilation failed: " + e.getMessage());
} catch (TemplateExecutionException e) {
// Runtime error during template execution
System.err.println("Execution error at line " + e.getLineNumber() +
": " + e.getMessage());
} catch (Exception e) {
// Other errors (IO, ClassNotFound, etc.)
System.err.println("Template error: " + e.getMessage());
}Install with Tessl CLI
npx tessl i tessl/maven-org-codehaus-groovy--groovy-templates