Статьи

Использование StringTemplate: часть 1 «Введение в StringTemplate»

Обратите внимание: я привожу примеры SQL, потому что они могут быть короткими и простыми для понимания. Как уже отмечалось, не рекомендуется создавать SQL со строками независимо от используемой техники.

Процитируем домашнюю страницу StringTemplate : «StringTemplate — это шаблонизатор Java для генерации исходного кода, веб-страниц, электронных писем или любого другого форматированного текста».

Отлично, но что такое «движок шаблонов»?
          Механизм шаблонов (также известный как процессор шаблонов или анализатор шаблонов) — это программный компонент, который предназначен для объединения одного или нескольких шаблонов с моделью данных для создания одного или нескольких документов результатов ( Википедия ). Для нас с вами это означает, что механизм шаблонов — это альтернативный способ создания сложного текста. То, что я чувствую, — это полезность. Прежде чем мы углубимся в это, давайте рассмотрим несколько примеров традиционной конструкции String в Java.

Сначала у нас есть старый надежный оператор «+».

String message = "Hello" + " World"; 

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

    String strSQL = "UPDATE customers SET customerName='" + name
+ "', customerAddress='" + address
+ "', customerEmail = '”+ email + "
+ "customerNumber = " + phone
+ " customerPurchase = " + purchase
+ "' WHERE id=" + 12;

String new419 = "Hello "
+ "Dear, " + name + ", \n"
+ "Permit me to inform you of my desire of "
+ "going into business relationship with you. "
+ "I have the believe you are a reputable "
+ "and responsible and trustworthy person \n"
+ "I can do business with from the little"
+ "information so far I gathered about you "
+ "during my search for a partner and by matter "
+ "of trust I must not hesitate to confide "
+ "in you for this simple and sincere business. ";

Далее у нас есть StringBuilder. Обычно рекомендуется использовать StringBuilder из-за его профиля производительности.

    StringBuilder sqlBuilder = new StringBuilder(
"UPDATE customers SET customerName='").append(name).append(
"', customerAddress='").append(address).append(
"', customerEmail = '").append(email).append(
"', customerNumber = '").append(phone).append(
"', customerPurchase = '").append(purchase).append(
"' WHERE id=").append(12);

К сожалению, это не делает создание строки значительно проще. 

Наконец мы отформатировали текст .

// Explicit argument indices may be used to re-order output.
String.format("%4$2s %3$2s %2$2s %1$2s", "a", "b", "c", "d");
>> d c b a

// Optional locale as the first argument can be used to get
// locale-specific formatting of numbers. The precision and width can be given
// to round and align the value.

String.format(Locale.FRANCE, "e = %+10.4f", Math.E);

>> e = +2,7183

// The '(' numeric flag may be used to format negative numbers with
// parentheses rather than a minus sign. Group separators are
// automatically inserted.

String.format("Amount gained or lost since last statement: $ %(,.2f",balanceDelta);

>> Amount gained or lost since last statement: $ (6,217.58)

Формат мощный, но масштабируется только до нескольких параметров. Это не потому, что есть какой-то программный предел для класса Format, а больше практичности. Отслеживать сто параметров по их индексу было бы довольно сложно.

Шаблоны, лучший способ.

Шаблон — это просто документ с «заполнителями». Эти «заполнители» являются выражениями, которые сообщают шаблонному движку, куда помещать данные. Все (все в порядке) пробелы и символы перевода строки соблюдаются. Это также имеет приятное преимущество отделения форматирования (представления) от данных. Вот простой однострочный пример:

 

     StringTemplate query = new StringTemplate(
"UPDATE customers SET customerName='$customer$'," +
" customerAddress='$address$' WHERE id=$id$");

query.setAttribute("customer", "Frank");
query.setAttribute("address", "1313 Mocking Bird Lane");
query.setAttribute("id", "4453");

System.out.println(query);

Выход:

    UPDATE customers SET customerName='Frank', customerAddress='1313 Mocking Bird Lane' WHERE id=4453 

Как видите, «заполнители» ограничены $ … $ (или <…>, если вы того пожелаете). Таким образом, это напоминает подстановку переменных в таких языках, как PHP или bash. Имя внутри разделителей используется для поиска правильного фрагмента данных. Наличие имен важно для поддержания читабельности. Это также позволяет помещать данные в шаблон в любом порядке. Это был пример из одной строки. Когда вы получите многострочный текст, вы, вероятно, захотите использовать файл шаблона . Файл шаблона представляет собой простой текстовый документ, который содержит полностью отформатированную версию желаемого результата. $ … $ атрибуты размещаются в документе, чтобы указать части, которые вы хотите заменить позже StringTemplate.

Пример файла шаблона ( spam-419.st ):

От адреса $ from_addr $

до адреса $ to_addr $

Уважаемые $ to $ ,

    позвольте мне сообщить вам о моем желании

вступить в деловые отношения с вами. У меня есть     уверенность, что вы — уважаемый, ответственный и заслуживающий доверия человек, с которым я могу иметь дело

    из небольшой информации, которую я собрал о вас во время поиска партнера,

    и, исходя из соображений доверия, я не стесняюсь довериться вам в этом простом и искренний бизнес
.

… С

наилучшими пожеланиями,
$ от $

Заполнение этого шаблона включает в себя загрузку StringTemplateGroup и использование этого для создания экземпляра вашего StringTemplate.

 

    StringTemplateGroup templateGroup = new StringTemplateGroup("spam group", "templates");
StringTemplate spam419 = templateGroup.getInstanceOf("spam419");
spam419.setAttribute("to", "Collin");
spam419.setAttribute("to_addr", "[email protected]");
spam419.setAttribute("from", "Ima Spammer");
spam419.setAttribute("from_addr", "[email protected]");

System.out.println(spam419.toString());

Конструктор StringTemplateGroup в приведенном выше коде принимает два параметра. Первое — это «название группы». В этом примере это не очень важно, не стесняйтесь использовать все, что вам нравится. Второе очень важно. Здесь находится каталог (папка), в котором находятся файлы шаблонов, которые вы хотите загрузить. В этом примере я использую относительный путь. Относительно того, где я выполняю этот код, я ожидаю увидеть каталог под названием « шаблоны ». Метод getInstanceOf () принимает имя (без расширения .st ) того файла шаблона, который должен быть загружен. В этом случае я пытаюсь загрузить » spam419.st «.

С адреса [email protected]

По адресу [email protected]

Уважаемый Коллин!

    Позвольте мне сообщить вам о моем желании

вступить в деловые отношения с вами. Я     верю, что вы — уважаемый, ответственный и заслуживающий доверия человек, с которым я могу вести дела,

    основываясь на небольшой информации, которую я собрал о вас во время поиска партнера,

    и, говоря о доверии, я без колебаний доверяю вам в этом простом деле. и искренний бизнес
.

… С

наилучшими пожеланиями,
Ima Spammer

Я рекомендую вам поэкспериментировать с этим шаблоном. Я думаю, вы найдете добавление или удаление строк тривиально. Изменение пробела в шаблоне тривиально. Даже добавление новых атрибутов (заполнителей) просто. StringTemplate — это мощный инструмент, который я не могу описать в одном посте. Для тех, кто хочет поболтать, чтобы узнать больше, я бы рекомендовал прочитать официальную документацию StringTemplate, которая является фантастическим ресурсом. 

Веселись,
Коллин

 

От http://weblogs.java.net/blog/aberrant/archive/2010/05/25/using-stringtemplate-part-1-introduction-stringtemplate