Преимущества FreeMarker
Это инструмент для генерации текста на основании шаблонов и встраиваемых данных. FreeMarker является библиотекой Java, которую можно встраивать в собственные программы.
Чем же FreeMarker отличается от других подобных инструментов? На мой взгляд, таких преимуществ несколько, а точнее ровно три, но эти три преимущества делают его уникальными для решения определенных задач. FreeMarker прост в использовании, работает с любыми текстовыми файлами, и к тому же этот мощный инструмент, бесплатен.
Шаблон составляется с использованием языка шаблонов (FreeMarker Template Language - FTL). По большому счету, это не является полноценным языком, скорее это разметка, позволяющая модулю FreeMarker добавлять в шаблон необходимую информацию.
Эта архитектура и является главным преимуществом FreeMarker. Использование такого подхода позволяет разделить программистов и дизайнеров, по крайней мере это в полной мере относится к построению динамических веб сайтов.
В качестве примера возьмем построение гистограммы в векторной графике Scalable Vector Graphics (SVG).

В готовый SVG вставляем метки шаблона. <#assign heightChart = 300>
создаем переменную в которой будем хранить максимальную высоту графика. ${heightChart}
подставляет значение переменной в параметры отображения линий. Так как прорисовка всех фигур начинается с верхнего левого угла рассчитываем начальное положение точки прорисовки прямоугольника ${heightChart - heightChart * firstValue}
. Рассчитываем высоту прямоугольника ${heightChart * firstValue}
. В данном случае firstValue – это относительная высота прямоугольника, как Текущее значение / Максимальное значение, итак для каждого элемента. Инструкция ${name!"Наименование гистограммы"}
устанавливает подпись под рисунком, если строка не передается из программы, то подставляется значение по умолчанию.
<svg version="1.1" width="600" height="400" baseprofile="full">
<g>
<#assign heightChart = 300> <#-- Максимальная высота графика -->
<line x1="0" y1="0" x2="0" y2="${heightChart}" stroke-width="1" stroke="rgb(0,0,0)"></line>
<line x1="0" y1="${heightChart}" x2="570" y2="${heightChart}" stroke-width="1" stroke="rgb(0,0,0)"></line>
<rect x="10" y="${heightChart - heightChart * firstValue}" width="100" height="${heightChart * firstValue}" fill="#FF6666" stroke-width="1" stroke="rgb(0,0,0)"></rect>
<rect x="120" y="${heightChart - heightChart * secondValue}" width="100" height="${heightChart * secondValue}" fill="#FF9966" stroke-width="1" stroke="rgb(0,0,0)"></rect>
<rect x="230" y="${heightChart - heightChart * thirdValue}" width="100" height="${heightChart * thirdValue}" fill="#FFFF33" stroke-width="1" stroke="rgb(0,0,0)"></rect>
<rect x="340" y="${heightChart - heightChart * fourthValue}" width="100" height="${heightChart * fourthValue}" fill="#66FF99" stroke-width="1" stroke="rgb(0,0,0)"></rect>
<rect x="450" y="${heightChart - heightChart * fifthValue}" width="100" height="${heightChart * fifthValue}" fill="#9999FF" stroke-width="1" stroke="rgb(0,0,0)"></rect>
<text x="30" y="320" fill="#330099" font-style="italic" font-weight="bold">${name!"Наименование гистограммы"}</text>
</g>
</svg>
Составляем код, для создания HTML страницы на основании полученного шаблона.
import java.io.*;
import java.util.*;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
...
/* Формируем хэш-таблицу с данными для шаблона */
Map root = new HashMap();
/* Относительное значение как (текущее значение/максимальное значение) */
root.put("firstValue", 0.47); /* Первая колонка.*/
root.put("secondValue", 0.2); /* Вторая */
root.put("thirdValue", 0.33); /* Третья */
root.put("fourthValue", 0.5); /* Четвертая */
root.put("fifthValue", 0.8); /* Пятая */
root.put("name", "Пример гистограммы");
/* Инициируем freemarker */
String path_flt = CurrentDir();
File filepath = new File(path_flt);
Configuration cfg = new Configuration(Configuration.VERSION_2_3_23);
try {
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER);
cfg.setDirectoryForTemplateLoading(filepath);
} catch (IOException e) {
e.printStackTrace();
}
/* Выполняем заполнение шаблона */
Writer out = new StringWriter();
try {
Template temp = cfg.getTemplate("template.ftl");
temp.process(root, out);
} catch (Exception e) {
e.printStackTrace();
}
...
/**
* Функция возвращает путь к каталогу с шаблонами, относительно каталога
* запуска приложения.
* @return - путь к каталогу шаблонов.
*/
private static String CurrentDir(){
String path = System.getProperty("java.class.path");
String FileSeparator = (String)System.getProperty("file.separator");
int semicolon = path.indexOf(';');
if (semicolon == -1) {
return path.substring(0, path.lastIndexOf(FileSeparator)+1);
} else {
String interim = path.substring(0, semicolon);
String temp = interim.substring(0, interim.lastIndexOf(FileSeparator)+1);
return temp + "ftl";
}
}
Выполнив указанный код, получаем готовую гистограмму. Теперь, чтобы внести в ее вид изменения нет необходимости в перекомпиляции. Достаточно изменить шаблон. Из прямоугольной можно сделать треугольную или вообще заменить на график с кривой или ломанной линией.
Демонстрационный пример можно скачать по этой ссылке |File: fm.zip - Hash: MD5 - 7AAB53EE0EB3D7484726D578E15E05AD |. Пример реализован в виде проекта для Eclipse.