A simple test follows:
Hello, world!
package guestbook; import freemarker.template.*; import java.util.Date; import java.util.TimeZone; import java.text.DateFormat; public class GuestbookEntryTM implements TemplateHashModel { private GuestbookEntry entry; private SimpleScalar date; private SimpleScalar name; private SimpleScalar message; public GuestbookEntryTM(GuestbookEntry entry) { this.entry = entry; } public TemplateModel get(String key) throws TemplateModelException { if (key.equals("date")) { return getDate(); } else if (key.equals("name")) { return getName(); } else if (key.equals("message")) { return getMessage(); } else { return null; } } private TemplateModel getDate() { if (date == null) { DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.LONG); dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); date = new SimpleScalar(dateFormat.format(entry.getDate())); } return date; } private TemplateModel getName() { if (name == null) { name = new SimpleScalar(entry.getName()); } return name; } private TemplateModel getMessage() { if (message == null) { message = new SimpleScalar(entry.getMessage()); } return message; } public boolean isEmpty() throws TemplateModelException { return (entry == null); } }