Jamon Tutorial - 6. Calling Another Template From a Template
Jamon templates can call other templates. The semantics are exactly the same as a method call in Java. The only difference is the syntax. In Jamon, a template calls another template with the
<& templateName ; arguments &><& and
&><%%>.) Some examples of calling templates from a template
are shown below.
<%import>
java.util.Date;
</%import>
<& header &>
<& /org/foo/weather/ForecastTemplate; time = new Date();
message = "Thank you for using our wearther service!" &>
<& /com/tripleclick/ads/Advertisement &>
<& footer &>
This template calls the header and footer
templates from the same package (directory) as this template. It also
calls the ForcastTemplate in the
org.foo.weather package and the
Advertisement template in the
com.tripleclick.ads package. The call to the
ForecastTemplate provides arguments to the call. These
arguments may be required or they may be optional; there is no
difference in how required and optional argument values are provided
by the caller in Jamon.
Arguments to template calls are assigned by name. The name of the
argument is the name specified in the <%args>
... </%args>=> and then the value of
the argument. The value is evaluated as Java code, so it may be any
Java expression. Multiple arguments should be separated by semicolons.
An Example
The template below,JamonCallerTemplate.jamon, outputs several rows
of names and telephone numbers.
<%args>
String[] names;
String[] phoneNumbers;
</%args>
<table>
<%for int i=0; i<names.length; i++ %>
<tr>
<td><% names[i] %></td>
<td><& StdPhoneNumberFormat; number = phoneNumbers[i].trim();
separator = "-" &></td>
</tr>
</%for>
</table>
It calls the template StdPhoneNumberFormat.jamon (below)
to format the telephone number into a specified format.
The separator argument to the
StdPhoneNumberFormat template is
optional, so the JamonCallerTemplate only has to provide
a value to override the default.
<%args> String number; String separator = "."; </%args>\ <%if number.length() == 7 %>\ <% number.substring( 0, 3 ) %><% separator %><% number.substring( 3 ) %>\ <%elseif number.length() == 10 %>\ <% number.substring( 0, 3 ) %><% separator %>\ <% number.substring( 3, 6 ) %><% separator %><% number.substring( 6 ) %>\ <%else><% number %></%if>
Notice that the
The top level template, StdPhoneNumberFormat
template adds backslashes, '\', at the end of each line that outputs
text (the non-java code lines). The backslash at the end of the line
escapes the new-line on that line. Jamon outputs text exactly as it
appears in the template, including new-lines. To prevent new-lines
from being output, each Jamon line must end with a backslash.
JamonCallerTemplate is called
from the Java class
JamonCallerTut6.java:
import java.io.OutputStreamWriter;
public class JamonCallerTut6 {
public static void main(String[] argv) throws Exception {
String[] names = new String[] {
"John Public", "Mary Private", "Lee Protected"};
String[] phoneNumbers = new String[] {
"5550324", "4135559232", "4135551212" };
new JamonCallerTemplate()
.render(new OutputStreamWriter(System.out), names, phoneNumbers);
}
}
export CLASSPATH=.:/path/to/jamon-runtime.jar:/path/to/jamon-api.jar:/path/to/jamon-processor.jar
java org.jamon.TemplateProcessor --destDir=. JamonCallerTemplate SpacerTemplate
javac JamonCallerTut6.java JamonCallerTemplate*.java SpacerTemplate*.java
java JamonCallerTut6
<table>
<tr>
<td>John Public</td>
<td>555-0324</td>
</tr>
<tr>
<td>Mary Private</td>
<td>413-555-9232</td>
</tr>
<tr>
<td>Lee Protected</td>
<td>413-555-1212</td>
</tr>
</table>