StringTemplate: значение увеличения, если условие истинно

Я хочу узнать, поддерживает ли StringTemplate увеличение числа.
Ситуация следующая:

ввод: – это массив объектов с геттером "isKey() и getName()".
вывод должен быть (i=0; IF !obj.getKey() THEN ps.setObject(i++,obj.getName)) ENDIF):

ps.setObject(1,"Name");  
ps.setObject(2,"Name");  
ps.setObject(3,"Name");  
...

В настоящее время у меня есть следующий ST: <objs:{<if(it.key)><else>ps.setObject(<i>, <it.name;>);<"\n"><endif>}>
И вывод в случае, если 1st является ключевым:

ps.setObject(2,"Name");  
ps.setObject(3,"Name");  
ps.setObject(4,"Name");  
...

Теперь мне нужно найти способ заменить «i» чем-то, что будет увеличиваться только тогда, когда условие истинно.

Посоветуйте пожалуйста кто сталкивался с такой проблемой!


person SairuS    schedule 27.06.2012    source источник


Ответы (1)


Как правило, изменение состояния в ответ на получение состояния ST не является хорошей идеей, поэтому нумерация неключевых полей должна выполняться в вашей модели до начала генерации.

Добавьте геттер для nonKeyIndex в класс вашей модели, в котором размещено свойство name. Просмотрите всех братьев и сестер и пронумеруйте их, как вам нужно (т.е. начиная с одного и пропуская ключи в вашей нумерации). Теперь вы можете использовать этот ST для получения желаемого результата:

<objs:{<if(it.key)><else>ps.setObject(<it.nonKeyIndex>, <it.name;>);<"\n"><endif>}>

Иногда может быть невозможно добавить такие методы, как nonKeyIndex, в классы вашей модели. В таких случаях вы должны обернуть свои классы в классы представления, разработанные специально для работы со строковым шаблоном, и добавить туда дополнительные свойства:

public class ColumnView {
    private final Column c;
    private int nonKeyIdx;
    public ColumnView(Column c) {this.c = c;}
    public String getName() { return c.getName(); }
    public boolean getKey() { return c.getKey(); }
    public int getNonKeyIndex() { return nonKeyIdx; }
    public void setNonKeyIndex(int i) { nonKeyIdx = i; }
}
person Sergey Kalinichenko    schedule 27.06.2012
comment
Спасибо за ваш ответ, это был своего рода подход, который был для меня запасным планом. Также я надеялся, что ST будет иметь какую-либо поддержку для этих случаев. Если готовить весь ввод вручную только для печати, то, ИМХО, StringTemplate уже не так созвучен. - person SairuS; 27.06.2012
comment
@SairuS Это правильный подход, учитывая приверженность ST шаблону MVC. Вот как я сделал это на своей последней работе, где использовался ST. - person Sergey Kalinichenko; 27.06.2012
comment
@SairuS Если подготовить весь ввод вручную только для печати, то, ИМХО, StringTemplate не так совместим. Идея ST состоит в том, чтобы переместить зависимость вывода от вашего кода в вашу среду выполнения. Вы можете спроектировать свою модель один раз (т. е. ввести все данные вручную), а затем написать несколько ST для создания документов C++, Java и HTML для вашего проекта, и все это без изменения ни одной строки кода Java. - person Sergey Kalinichenko; 27.06.2012