Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Набираем Velocity 
:(
    Опции темы
necromancer
Дата 24.7.2007, 14:31 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 317
Регистрация: 26.7.2006
Где: Москва

Репутация: 6
Всего: 7



Присматрияваюсь я к этому Velocity, и все никак не могу найти очевидных плюсов.
1 если вам претит код в JSP - то его можно запретить специальной дерективой + проверка при автоматической сборке приложения.
2 Интерграция с многими достаточно популярными фреймворками хромает очень сильно
3 Мне лично не поянтно, если используется сложная логика в оотбражении, к примеру циклы, условия и прочее, то шаблон все равно выглядит мягко скажем некрасиво.
4 Тут упоминалось что отдал шаблон дизайнеру и сказал какие тэги, а можно пойти и от обратного, дизайнер отдал тебе шаблон и ты заменил нужные фрагменты на тэги, плюс я не совсем понимаю как дизайнер будет описывать таблицы с навигацией.
5 Как ни крути но скорость скомпилированного JSP всетаки выше чем постоянный прогон через шаблон.

Я не спорю, что velocity полезная штука и находит свое применение. Но это к сожалению/счастью НЕ стандарт.
Недавно столкнулся с проектом использующим Velocity для генерации jsp страниц, которые потом еще раз обрабатывались видимо внутренним движком. Реализовано все было жутко, поэтому беда плохого кода/страниц это не беда технологии это беда программистов ее использующих. 

Сейчас я довольно долгое время уже пишу на JSF, не скажу что все устраивает, но по крайней мере мне нравится.
Velocity это все таки front-end, практически не затрагивающий серверную часть, многие как я понимаю, предпочитают использовать его вместе с Spring.

Хотелось бы тут увидеть не описание вроде такого: ооо какой это крутой/хороший/замечательный фреймворк.
А к примеру такое: на нем можно сделать такое и такое, зато к сожалению нельзя так то и так то.




--------------------
С уважением, 
                 Виталий Смык
----------------------------------------------------------------------------------------------
SCJP, SCWCD, OCA
http://dev.maryno.net/video/
PM MAIL WWW ICQ Skype   Вверх
Maksym
Дата 24.7.2007, 14:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 24
Всего: 62



Маленький камушек в огород jsp:
На jsp никогда не получишь точно-такого результата в html (посимвольно), как хотелось бы -- все равно какие-то пробелы, переносы строк на месте скриптов и т.п. мусор. При использовании jsf ситуация в этом смысле усугубляется. Понятное дело, что все более менее отлажено и браузеры допускают подобные вольности, они привыкли хавать и не такое, и при желании можно подчищать на выходе (хотя на практике этого никто не делает) но все же как то не кошерно..
На Velocity же получаешь именно то, что написал в шаблоне, в силу специфики технологии.

PM MAIL   Вверх
PashaOvechkin
Дата 26.7.2007, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 394
Регистрация: 1.4.2007
Где: Riga, Latvia

Репутация: 1
Всего: 4



Маленький камушек в огород Velocity -  как у етой технологии с reusability?
По моему reusability ето главный  и определяющий плюс jsp/jsf над Velocity.
PM MAIL Skype   Вверх
Stampede
Дата 26.7.2007, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Тому, кто живет в стеклянном доме, не следует бросаться камнями.

Древняя мудрость


Цитата(PashaOvechkin @  26.7.2007,  11:52 Найти цитируемый пост)
Маленький камушек в огород Velocity -  как у етой технологии с reusability?


Можно полюбопытствовать, о какой reusability мы говорим? Между проектами, между страницами одного веб приложения или еще какой-то другой?

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

В то время как в JSP включение одних страниц в другие (а) менее гибкое, (б) более накладное, за счет инициации дополнительных циклов обработки запроса, и (в) исключает возможность сколько-нибудь вразумительной стратегии обработки ошибок внутренних страниц.

Так что см. эпиграф smile



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
PashaOvechkin
Дата 26.7.2007, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 394
Регистрация: 1.4.2007
Где: Riga, Latvia

Репутация: 1
Всего: 4



Stampede, спорить с Вами не возьмусь. Просто высказал мнение.

Участвовал в проетке, который создовался на базе Struts 1.3, и вйю часть была как раз на Velocity.
Не могу сказать что было плохо... 

А сейчас создаём достаточно болшое веб приложение на JSF - испольсуем Trinidad имплементацию, а так же кое что из Tomohawk.


Так вот... Думаю ето же приложение (что сейчас на JSF делаем) с велосити делалось бы раз так... Может в 5 дольше.
Ето одно. Следующее - писать используя Velocity гораздо приятней, по скольку, как упомянул Maksym, что напишеш, то и будет smile

Гораздо красивей ХТМЛ получается. Всё под твоим контролем.


А какая именно reusability? В принципе обе упомяннутые. 

P.S А дом у меня не стеклянный ;)
PM MAIL Skype   Вверх
Maksym
Дата 27.7.2007, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 24
Всего: 62



Цитата(PashaOvechkin @  26.7.2007,  22:03 Найти цитируемый пост)
Так вот... Думаю ето же приложение (что сейчас на JSF делаем) с велосити делалось бы раз так... Может в 5 дольше.

Соглашусь, что проигрыш во времени разработки на раннем этапе возможен, не в 5 раз конечно, а раза в 1.5. Но, думаю, это с лихвой окупится в дальнейшем развитии и поддержке.
PM MAIL   Вверх
am_sasa
Дата 30.7.2007, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.12.2006

Репутация: нет
Всего: нет



Делаю вьюхи на XSLT, решил попробовать велосоти! как у него с мультипоточностью или он 
Цитата

An object of this class may not be used in multiple threads running concurrently.
 как XSLT?
PM MAIL   Вверх
Tony
Дата 12.8.2007, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

Репутация: 6
Всего: 12



A как же быть с custom tagami в velocity?  smile 


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
JUncle
Дата 12.8.2007, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 6.4.2006
Где: Казань, РФ

Репутация: нет
Всего: 1



Tony, custom tags - вообще довольно спорная штука.
Лично я считаю, что ои не обеспечивают "чистого" подхода.
--------------------
class JUncle extends Man // singleton{/*...*/}
PM MAIL   Вверх
Tony
Дата 12.8.2007, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

Репутация: 6
Всего: 12



Цитата(JUncle @ 12.8.2007,  19:10)
Tony, custom tags - вообще довольно спорная штука.
Лично я считаю, что ои не обеспечивают "чистого" подхода.

Ну как же тогда решить типовые зада4и? Кастом таги спровляутся с этим на ура. Но вапрос я ставил именно про Velocity a не jsp


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
Shaggie
Дата 29.8.2007, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: 2
Всего: 72



Где-то странице на второй Stampede планировал дать подробный перечень минусов Velocity, но по неизвестным причинам так и не выложил материал. Возможно ли в ближайшее время возместить этот недостаток?


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
Maverick
Дата 25.9.2007, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



Где должен лежать шаблон для того, чтобы его увидела прога из первого примера?
Я получаю это
Код

/usr/java/jdk1.5.0_07_32/bin/java -Didea.launcher.port=7542 -Didea.launcher.bin.path=/home/sergey/JavaTools/idea-6189/bin -Dfile.encoding=UTF-8 -classpath /usr/java/jdk1.5.0_07_32/jre/lib/deploy.jar:/usr/java/jdk1.5.0_07_32/jre/lib/plugin.jar:/usr/java/jdk1.5.0_07_32/jre/lib/jsse.jar:/usr/java/jdk1.5.0_07_32/jre/lib/jce.jar:/usr/java/jdk1.5.0_07_32/jre/lib/charsets.jar:/usr/java/jdk1.5.0_07_32/jre/lib/javaws.jar:/usr/java/jdk1.5.0_07_32/jre/lib/rt.jar:/usr/java/jdk1.5.0_07_32/jre/lib/ext/dnsns.jar:/usr/java/jdk1.5.0_07_32/jre/lib/ext/sunjce_provider.jar:/usr/java/jdk1.5.0_07_32/jre/lib/ext/localedata.jar:/usr/java/jdk1.5.0_07_32/jre/lib/ext/sunpkcs11.jar:/home/sergey/JavaPro/VeloTest/classes/test/VeloTest:/home/sergey/JavaPro/VeloTest/classes/production/VeloTest:/home/sergey/JavaTools/velocity-1.5/velocity-1.5.jar:/home/sergey/JavaTools/velocity-1.5/velocity-dep-1.5.jar:/home/sergey/JavaTools/idea-6189/lib/idea_rt.jar com.intellij.rt.execution.application.AppMain VeloTest
Sep 25, 2007 4:38:43 PM org.apache.velocity.runtime.log.JdkLogChute log
INFO: FileResourceLoader : adding path '.'
Sep 25, 2007 4:38:43 PM org.apache.velocity.runtime.log.JdkLogChute log
SEVERE: ResourceManager : unable to find resource 'test.vm' in any resource loader.
Exception in thread "main" org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource 'test.vm'
    at org.apache.velocity.runtime.resource.ResourceManagerImpl.loadResource(ResourceManagerImpl.java:452)
    at org.apache.velocity.runtime.resource.ResourceManagerImpl.getResource(ResourceManagerImpl.java:335)
    at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1102)
    at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1077)
    at org.apache.velocity.runtime.RuntimeSingleton.getTemplate(RuntimeSingleton.java:303)
    at org.apache.velocity.app.Velocity.getTemplate(Velocity.java:503)
    at VeloTest.DoVelo(VeloTest.java:11)
    at VeloTest.main(VeloTest.java:20)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)

Process finished with exit code 1



Писано в Идее... шаблон лежит прямо рядом с классом... 


--------------------
smile
PM ICQ GTalk   Вверх
Maverick
Дата 25.9.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



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

Добавлено через 8 минут и 8 секунд
Код

Miscellaneous Details 
 While the above example used the default properties, setting your own properties is very simple. All you have to do is make a properties file somewhere and pass the name of that file to the init(String) method of the Velocity utility class, or make a java.util.Properties object, add the desired properties and values, and pass that to the init(Properties) method. The latter method is convenient, because you can either fill it directly from a separate properties file via the load() method, or even better, you can fill it dynamically from your own application / framework's property set at runtime. This gives you the freedom to combine all of the properties for your app into one properties file. 
 If we wanted to use a different directory than the current directory to load our template from, we could do something like this: 

 ...

import java.util.Properties;
 ...

public static void main( String args[] )
{
    /* first, we init the runtime engine.  */

    Properties p = new Properties();
    p.setProperty("file.resource.loader.path", "/opt/templates");
    Velocity.init( p );

    /* lets make a Context and put data into it */

 ...

 And, assuming you have a directory /opt/templates and the template testtemplate.vm is in there, then things would work just fine. If you try this and have a problem, be sure to look at the velocity.log for information - the error messages are pretty good for figuring out what is wrong. 
 If you need to place objects into the Velocity properties then you cannot use the Velocity.init(Properties p) method. Instead you should create a new instance of the org.apache.commons.collections.ExtendedProperties class, copy all properties from an existing Properties object into the ExtendedProperties and then add new properties with your objects to the ExtendedProperties object. 

...

    VelocityEngine velocityEngine = new VelocityEngine();
    ExtendedProperties eprops = new ExtendedProperties();

    // if you already have a Properties object do this
    eprops.putAll(props);

    // Now set the property with your object instance
    eprops.setProperty("name", object);

    ...
    velocityEngine.setExtendedProperties(eprops);
    velocityEngine.init();
    ...


 You may want to also consider using the Application Attributes feature described in the following section.



--------------------
smile
PM ICQ GTalk   Вверх
Stampede
Дата 3.10.2007, 20:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Цитата(Shaggie @  28.8.2007,  22:50 Найти цитируемый пост)
Где-то странице на второй Stampede планировал дать подробный перечень минусов Velocity, но по неизвестным причинам так и не выложил материал. Возможно ли в ближайшее время возместить этот недостаток?


Shaggie, вопрос твой видел, да все как-то руки не доходили. А тут пришлось вплотную повозиться с Velocity, вот и решил по горячим следам отписаться.

Итак, минусы... Во-первых, должен заметить: не такие уж это в общем и минусы, а так - где-то глючок, где-то бажок, где-то неудобство, где-то ограничение... Забегая вперед, сразу хочу сказать: ничего фатального там нет. Все можно обойти, порешать, извернуться. Но, конечно, лучше знать об этих "особенностях" заранее. Именно с этой целью: предупредить начинающего пользователя Velocity об имеющихся подводных граблях, я и пишу этот пост.

Пойдем по порядку.

1. Некорректное сравнение чисел разных типов

Действительно, водится такой грешок. Например, все литеральные целочисленные константы в шаблонах приводятся к типу Integer. Если мы попытаемся сравнить их с переменной типа long, то результат нас может маленько обесуражить:

Код

#if($place.population > 5000)
    $place - это город.
#else
    $place - это деревня
#end


Код

Place place = new Place("New York", new Long(21976224));
ctx.put("place", place);


Вопреки нашим ожиданиям, Velocity сообщит нам, что Нью Йорк - это деревня. А получается вот что: поскольку Long у них не сравнивается с Integer, то результатом сравнения будет false независимо от значений чисел. Спрашивается, что делать?

Ну, прежде всего об этой "фиче" нужно знать. Тогда ее можно легко обойти. Например, написав собственный универсальный компаратор:

Код

public class NumberComparator implements Comparator {
    public int compare(Object obj1, Object obj2) {
        BigDecimal bd1 = new BigDecimal(obj1.toString());
        BigDecimal bd2 = new BigDecimal(obj2.toString());
        return bd1.compareTo(bd2);
    }
}


И теперь, заранее положив экземпляр компаратора в контекст (например, под именем "cmp") и исправив условие:

Код

#if($cmp.compare($place.population, 5000) > 0)


мы получим желаемый результат. Телемаркет!

2. Редактирование макросов на лету

В Velocity есть такая удобная штука как автоподхват изменений, внесенных в файл с макросами. Контролируется это дело параметром velocimacro.library.autoreload. По умолчание стоит в true.

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

А дело, оказывается, в том, что если при парсинге макросов была встречена ошибка, то файл помечается как дефектный и на изменения больше не проверяется. Хотя вызовы макросов обрабатываются как ни в чем ни бывало! Хороша логика, да? Впрочем, кому щас легко...

Между тем выход прост: добиваться, чтобы ошибок в файле макросов не было. Для этого надо грамотно настроить логирование и время от время чекать сообщения об ошибках.


3. Рекурсивный вызов макросов

Увы, иногда бывает так, что все вроде работает хорошо, но ошибка при инициализации Velocity все-таки выскакивает, тем самым лишая нас возможности править макросы на лету (см. предыдущий пункт). Одна из печально известных ошибок такого рода - это парсинг макроса, содержащего рекурсию. В этом случае Velocity говорит нам: "too few arguments to macro".

Спрашивается, можно ли это починить? Ответ - ДА! Надо просто взять более свежую версию движка. Начиная с Velocity v1.5. эта дурацкая ошибка не будет вас беспокоить.


4. Экранирование спецсимволов

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

Код

#decorate('<a href="/">Главная</a>')


Как видим, мы заключили строку в апострофы, и это позволило нам передать в некий макрос валидно оформленную HTML ссылку. Но я еще раз повторяю, это спасает не всегда. Как быть?

А запросто. Надо просто определить переменную, значением которой является нужный символ, и подставлять ее там где надо. Вот смотрите:

Код

#set($quote = '"')
#decorate("<a href=${quote}$item.url${quote}>$item.name</a>")


Для нашего удобства в состав Velocity Tools входит штука под названием EscapeTool. В нем предусмотрены методы, которые возвращают всякие полезные спецсимволы. Если положить его экземпляр в контекст (скажем, под именем "esc"), то вставлять кракозябры в текст становится достаточно просто. Например, вот так мы выведем значок доллара:

Код

${esc.dollar}5,000 - пишет $5,000
${esc.d}5,000 - то же самое, просто для удобства


Ну и еще EscapeTool может эскейпить УРЛы, строки Java, JavaScript,  XML, вышивать крестиком и делать прочие полезные вещи.

И таких полезных тулов там еще очень много. Ну а если для ваших изысканных нужд в тулбоксе ничего не нашлось, всегда можно написать самому. Тем более что это совсем нетрудно.

Вот такой вот неполный, но, надеюсь, достаточно показательный перечень "минусов Velocity".

Удачи в избегании граблей! smile

Это сообщение отредактировал(а) Stampede - 3.10.2007, 20:15


--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
batigoal
Дата 3.10.2007, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



На минусы технологии этот перечень, действительно, не претендует.

Это сообщение отредактировал(а) batigoal - 3.10.2007, 20:17


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1885 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.