Преимущества FreeMarker

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.

1С:Предприятие

Самый большой опыт работы был накоплен при внедрении программных продуктов от компании "1С".
Подробнее...

PALO

Этот продукт мы включили специально для тех заказчиков, которые решили организовать финансовый учет, на своем предприятии, либо ведут его в таблицах MS Excel.
Подробнее...

Профессионалам

Информационные материалы содержащие справочную информацию или полезные сведения для повышения квалификации.
Подробнее...