Статьи

Простая система шаблонов для Java

Система шаблонов позволяет генерировать текст для HTML, электронных писем, SQL и т. Д. Без жесткого кодирования текста в Java. Это значительно улучшает управляемость вашего Java-кода и значительно упрощает внесение изменений. Хотя система шаблонов, представленная ниже, проста в реализации, она все еще поддерживает подстановки переменных, логику условий, циклы и т. Д. Эта система шаблонов требует Jelly и реализована в предоставленном классе JellyScript Wrapper .

Допустим, у вас есть приветственное письмо, которое должно выглядеть примерно так …


Здравствуйте, Кент, спасибо за создание учетной записи Trendics на
www.trendics.com

Ваше новое имя пользователя и пароль …

   Пользователь: kent13600

   Пароль: my.secret
Обязательно ознакомьтесь
с нашими инструментами для веб-мастеров по адресу http://tools.trendics.com/.

- Trendics Support Team

Вместо того, чтобы жестко кодировать этот текст в классе Java, вы можете использовать предоставленный класс JellyScript Wrapper, чтобы определить шаблон, который выглядит следующим образом …

Hello<jelly:if test='${!empty FirstName}'>, ${FirstName}</jelly:if>, thanks for creating a
Trendics account at www.trendics.com.
Your new user name and password is...
User: ${UserName}
Password: ${Password}
Be sure to checkout our webmaster tools at http://tools.trendics.com/.
- Trendics Support Team

В LastName и Пароль переменные просто замещено в соответствующих местах. Логика <jelly: if test = ‘$ {! Empty FirstName}’>, $ {FirstName} </ jelly: if> добавляет только запятую и FirstName, если FirstName не пустое.

В качестве другого примера, вы можете использовать эту систему шаблонов для генерации SQL …

SELECT *
FROM Employee
WHERE State='${State}'
<jelly:if test='${!empty City}'>
AND City='${City}'
</jelly:if>

В шаблоне SQL выше, государственный параметр фильтра требуется и City параметр фильтра может необязательно быть включен.

Приведенные выше примеры делали только простую подстановку переменных и немного условной логики; однако Jelly поддерживает целый ряд тегов, поддерживающих различные типы логических конструкций, включая циклы, создание объектов Java, вызов методов на объектах Java и т. д. (см. здесь ). Теги Jelly очень похожи на теги JSTL, обычно используемые на страницах JSP — это облегчает процесс обучения для разработчиков, уже знакомых с JSTL.

Вот пример кода Java, необходимого для выполнения шаблона …

 public static void main(String[] args) {

if (logger.isLoggable(Level.FINE)) logger.fine("main()");
try {
// Create a template
final String text = "";
text += "Hello<jelly:if test='${!empty FirstName}'>";
text += ", ${FirstName}</jelly:if>, ";
text += "thanks for creating a Trendics account ";
text += "at www.trendics.com. ";
text += "Your new user name and password is...\n";
text += "\n";
text += " User: ${UserName}\n";
text += " Password: ${Password}\n";
text += "\n";
text += "Be sure to checkout the instant website ";
text += "speed check at http://tools.trendics.com/sc.\n";
text += "\n";
text += "- Trendics Support Team\n";

// Create the JellyScript instance
final JellyScript jellyScript = new JellyScript(text);

// Create the variables needed by the template
final Map<String, Object> variables = new HashMap<String, Object>();
variables.put("FirstName", "Kent");
variables.put("UserName", "kent13600");
variables.put("Password", "my.secret");

// Execute the script to merge the variables with the template
final String result = jellyScript.execute(variables);
System.out.println(result);
}
catch (Exception e) {
logger.log(Level.SEVERE, "main()", e);
}
}

Обратите внимание, что определение шаблона в Java-коде сводит на нет ключевое преимущество шаблонов — вы обычно определяете свои шаблоны в файле конфигурации XML или храните шаблоны в своих собственных файлах.

Если вам нужно более надежное шаблонное решение, взгляните на Apache Velocity Project .