Строковая функция скорости

Я только начинаю использовать Java Velocity. Теперь я хочу создать шаблон класса Java.

package $app.package_namespace
public class ${app.name}Station

{
    #foreach($s_attribute in $app.station)
         $s_attribute.type $s_attribute.name,
    #end
    public $app.name Station(#foreach($s_attribute in $app.station)
                                 $s_attribute.type $s_attribute.name;
                             #end)
{
    #foreach($s_attribute in $app.station)
          $s_attribute.name=$s_attribute.name;
    #end
}
#foreach($s_attribute in $app.station)
    public ${s_attribute.type} get${s_attribute.name}()
    {
        return  get${s_attribute.name}();
    }
#end
}

Проблема в том, что первый символ s_attribute.name в нижнем регистре. Когда я создаю функцию получения и установки для атрибутов. Мне нужно изменить первый символ на верхний регистр.

Кто-нибудь знал, как это сделать?


person Yiming    schedule 09.08.2011    source источник


Ответы (4)


Вы можете вызывать стандартные методы Java для этих объектов. Если s_attribute.name имеет тип String, вы можете напрямую использовать $s_attribute.name.toUpperCase() или для вашего конкретного случая использовать $s_attribute.name.substring(0,1).toUpperCase() и $s_attribute.name.substring(1).toLowerCase()

person d-live    schedule 09.08.2011
comment
Надеюсь, вы имели в виду toUpperCase и toLowerCase? - person adarshr; 09.08.2011
comment
Да, в этом случае один и тот же макрос должен быть применен дважды, один раз для первого символа и один раз для остальной части строки. Лично я бы избегал этого, поскольку это уровень представления. Кроме того, во второй строке выполнение toLowerCase - плохая идея, что, если ваш допустимый объект называется customerName, вы хотели бы, чтобы созданный метод был getCustomerName, а не getCustomername. - person Ali; 09.08.2011
comment
@adarshr Оппа, да .. Я имел в виду toUpperCase()/toLowerCase() - с прошлого года не делал никакой Java !! - но да, вы поняли идею. - person d-live; 09.08.2011
comment
@Ali - Да, я в некоторой степени согласен - у вас могут быть всевозможные несоответствия форматирования во входящем тексте - для этого вам может понадобиться написать где-нибудь служебную функцию и вызвать ее для создания правильно отформатированных имен / переменных и т. д. Что я хотел выделить здесь Velocity поддерживает вызов стандартных методов для объектов точно так же, как в java. Таким образом, $myObj.value будет таким же, как $myObj.getValue(), если этот метод определен в классе myObj. - person d-live; 09.08.2011
comment
Я думаю, что toLowerCase() может быть удалено, чтобы извлечь выгоду из обработки случая скорости. т.е. $s_attribute.name.substring(0,1).toUpperCase() и $s_attribute.name.substring(1) - person Vincent Pazeller; 03.04.2020

В DisplayTool:

get${display.capitalize($s_attribute.name)}()
person serg    schedule 09.08.2011
comment
О сладкий! Я видел заглавные буквы в API, но решил, что это для форматирования текста на бэкенде. Это использование также имеет смысл! - person Ali; 09.08.2011
comment
Это ${display.capitalize(...)} не сработало для меня. Мой вывод имеет ${display.capitalize(...)}. Нужно ли мне делать что-то дополнительно, чтобы DisplayTool сработал? Я использую прямую ванильную скорость 1.7 - person k427h1c; 05.08.2012
comment
@KarticRaghupathi DisplayTool находится в отдельной зависимости, называемой скоростными инструментами. Обязательно включите его, а затем добавьте DisplayTool в свой VelocityContext. vc.put(отображение,новый DisplayTool()); - person AJD; 20.12.2013

Если вы используете commons-lang, вы можете использовать класс StringUtils:

context.put("StringUtils", org.apache.commons.lang3.StringUtils.class);

Затем в вашем шаблоне:

...
return  get$StringUtils.capitalize(s_attribute.name)();
...
person naimdjon    schedule 21.01.2016
comment
Есть ли способ сделать это в шаблонах VTL для AWS Appsync? Я понятия не имею, как импортировать класс в шаблон vtl для вызова этих строковых функций. Я просто хочу вызвать функцию капитализации вместо того, чтобы писать ее самостоятельно. - person Mattijs; 17.05.2021

Вы можете просто создать 2 метода getName() и getname(), тогда, когда вы используете ${s_attribute.name}, скорость будет использовать getname(), а когда вы используете ${s_attribute.Name}, скорость будет использовать метод getName().

Из руководства по скорости:

Правила поиска недвижимости

Как упоминалось ранее, свойства часто ссылаются на методы родительского объекта. Velocity довольно умен, когда выясняет, какой метод соответствует запрошенному свойству. Он пробует различные альтернативы, основанные на нескольких установленных соглашениях об именах. Точная последовательность поиска зависит от того, начинается ли имя свойства с прописной буквы. Для имен в нижнем регистре, таких как $customer.address, последовательность следующая:

getaddress()
getAddress()
get("address")
isAddress()

Для имен свойств в верхнем регистре, таких как $customer.Address, это немного отличается:

getAddress()
getaddress()
get("Address")
isAddress()

Что я предлагаю, так это то, что вы обрабатываете это в своем объекте на бэкэнде.

person Ali    schedule 09.08.2011