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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Набираем Velocity 
:(
    Опции темы
Domestic Cat
Дата 10.3.2005, 07:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Консольное приложение в

1. Сначала нужно стянуть Велосити, версия 1.4:
http://jakarta.apache.org/site/downloads/d...city-engine.cgi
Разархивируем в директорию, скажем, C:\velocity\

2. В разархивированном виде можно ради интереса собрать Велосити самим : для этого нужно зайти в директорию build и запустить ант.
Далее владельцам тигра нужно матерно обругать тех, кто решил использовать переменную enum и установить в билд файле source="1.4" проперти.
Далее можно прогнать все возможные тесты с помощью ant test.

3. Для тех, кто делать этого не хочет, в корне лежат 2 jarа : velocity-1.4.jar и velocity-dep-1.4.jar. Их нужно добавить в CLASSPATH.

4. Теперь можно создать свое первое десктоп приложение (сервлет надеюсь добавить на днях).
Начинаем с темплейта: создаем файл test.vm такого содержания
Код

#set ($name = "Sam")
Hello, World
I am $name 
$name I am

Это очень простой темплейт. Он содержит директиву #set и одну переменную.

5. Пишем файл VeloTest.java
Код

import org.apache.velocity.app.*;
import org.apache.velocity.*;
import java.io.*;
import java.util.*;

public class VeloTest
{
    public static void DoVelo(String file) throws Exception
    {
        Velocity.init();
        VelocityContext vc = new VelocityContext();
        Template t = Velocity.getTemplate(file);
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        t.merge(vc, bw);
        bw.flush();
        bw.close();        
    }
    
    public static void main(String[] args) throws Exception
    {
        DoVelo("test.vm");
    }    
}


Чтоб иксепшны не путались под ногами, я их убрал в throws.

6. Компилим

javac VeloTest.java

и запускаем:
java VeloTest
Цитата

Hello, World
I am Sam
Sam I am



--------------------

PM   Вверх
batigoal
Дата 10.3.2005, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Посмотрел на http://jakarta.apache.org/, что такое Velocity, но все равно не понял. Для чего используются эти шаблоны?


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Domestic Cat
Дата 10.3.2005, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Цитата
It permits web page designers to reference methods defined in Java code. Web designers can work in parallel with Java programmers to develop web sites according to the Model-View-Controller (MVC) model, meaning that web page designers can focus solely on creating a well-designed site, and programmers can focus solely on writing top-notch code. Velocity separates Java code from the web pages, making the web site more maintainable over the long run and providing a viable alternative to Java Server Pages  (JSPs) or PHP.

Velocity can be used to generate web pages, SQL, PostScript and other output from templates. It can be used either as a standalone utility for generating source code and reports, or as an integrated component of other systems. When complete, Velocity will provide template services for the Turbine web application framework. Velocity+Turbine will provide a template service that will allow web applications to be developed according to a true MVC model.



--------------------

PM   Вверх
batigoal
Дата 10.3.2005, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Вот именно это я и не понял. Можно вызывать методы из текста страницы? Так это можно сделать и без использования сторонних технологий.
Исходя из твоего примера, я так понял, что можно иметь готовый шаблон (который представляет из себя HTML, XML, SQL, текст и т.д.) и передавать в него значения переменных, получая таким образом документ, запрос и т.д.
Но ведь точно так же мы можем сделать и в тексте обычной JSP.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Domestic Cat
Дата 10.3.2005, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Текст обычной JSP - это Java код. Задача фреймворка состоит в том, чтобы презентацию сделать как можно более простой. Тогда за хтмл можно посадить обычного веб-дизайнера. Далее этот дизайнер делает супер-пупер страницу. Программист пишет бизнес логику. Они встречаются, и программер дает дизайнеру имена переменных. Дизайнер вставляет их в свою страницу, типа "Привет, $name".
То есть, дизайнеру не нужно ничего знать о java или jsp.
Кроме того, четкое отделение презентации от модели есть хорошо, и называется Модель 2 паттерн.


--------------------

PM   Вверх
batigoal
Дата 10.3.2005, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Domestic @ 10.3.2005, 11:57)
Текст обычной JSP - это Java код

Но ведь можно просто привести все к виду обычного HTML с включенными <%= name %>, или, в крайнем случае, с циклами или итераторами, и мы получим ту же самую изоляцию (хотя у меня пока сводить все к этому не получается smile , все равно на странице присутствуют методы)


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Sleepy_PIP
Дата 10.3.2005, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Domestic @ 10.3.2005, 11:57)
Текст обычной JSP - это Java код. Задача фреймворка состоит в том, чтобы презентацию сделать как можно более простой. Тогда за хтмл можно посадить обычного веб-дизайнера. Далее этот дизайнер делает супер-пупер страницу. Программист пишет бизнес логику. Они встречаются, и программер дает дизайнеру имена переменных. Дизайнер вставляет их в свою страницу, типа "Привет, $name".
То есть, дизайнеру не нужно ничего знать о java или jsp.
Кроме того, четкое отделение презентации от модели есть хорошо, и называется Модель 2 паттерн.

так задача UI интерфейса везеде и всегда - не просто выдать юзеру какой-то отчет, хоть он и прекрасно строится в терминах Velocity, но и получить реакцию от клиента. т.е. интерактив .... т.е. на лицо - в Velicity можно писать _выходные_ _отчеты_, не требующиее интеракива. Это конечно хорошо, но далеко не все, и к тому-ж проигрывает PDF отчетам.
Ну все конечно ИМХО чайника smile


--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 10.3.2005, 18:42 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Цитата
так задача UI интерфейса везеде и всегда - не просто выдать юзеру какой-то отчет, хоть он и прекрасно строится в терминах Velocity, но и получить реакцию от клиента. т.е. интерактив .... т.е. на лицо - в Velicity можно писать _выходные_ _отчеты_, не требующиее интеракива. Это конечно хорошо, но далеко не все, и к тому-ж проигрывает PDF отчетам.


Нет такой серверной технологии, которая б давалa интерактив. А JavaScript или аналогичый клиентский скрипт / АктивХ / апплет никто не мешает пользовать.


--------------------

PM   Вверх
Domestic Cat
Дата 14.3.2005, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Пример посерьезнее.

Код

// test.vm
We want to present you our new products:

#foreach ($product in $products)
    Product : $product.name, just for $product.price
#end

#include("logo.txt")


Код

//logo.txt
Spamers, Inc. Copyright 2005, All rights reserved


Код

public class Product
{
    private String name;
    private float price;
    
    public Product(String name, float price)
    {
            this.name = name;
            this.price = price;
    }
    
    public String getName()
    {
        return name;    
    }
    
    public float getPrice()
    {
        return price;    
    }
    
    public void setName(String s)
    {
        name = s;
    }
    
    public void setPrice(float q)
    {
        price = q;
    }
    
    public String toString()
    {
        return name + ", $" + price;
    }    
}


Код

public class Velo
{
    private ArrayList al = new ArrayList();
    
    private void fillList()
    {
        al.add(new Product("Enlargement pills", 12.99f));
        al.add(new Product("English courses", 55.99f));
        al.add(new Product("Book - How to Lose Weight", 34.99f));    
    }
    
    public void DoVelo(String file) throws Exception
    {
        fillList();
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        Velocity.init();
        Template t = Velocity.getTemplate(file);
        VelocityContext vc = new VelocityContext();
        vc.put("products", al);
        t.merge(vc, bw);
        bw.flush();
        bw.close();
    }
    
    public static void main(String[] args) throws Exception
    {
        new Velo().DoVelo("test.vm");
    }    
}


Запуск дает:

Цитата
We want to present you our new products:

        Product : Enlargement pills, just for 12.99
        Product : English courses, just for 55.99
        Product : Book - How to Lose Weight, just for 34.99

Spamers, Inc. Copyright 2005, All rights reserved



--------------------

PM   Вверх
Се ля ви
Дата 16.3.2005, 02:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

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



Domestic Cat
По-моему, довольно похожие облегченные конструкции встречались в спецификации JSP 2.0 - там тоже есть конструкции без традиционных "<%" и "%>" - можно их сравнить как-то?

За топик большое спасибо)


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Domestic Cat
Дата 16.3.2005, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Цитата
По-моему, довольно похожие облегченные конструкции встречались в спецификации JSP 2.0 - там тоже есть конструкции без традиционных "<%" и "%>" - можно их сравнить как-то?


Нет, Велосити - это template engine, jsp - это ява код внутри хтмла smile
Велосити похож конечно, например, можно "вызывать методы" : $product.setPrice(55). Разница в том, что темпейт - файл vm парсится и все, jsp компилируется в класс и исполняется. В темплейтах нельзя определять методы. Зато можно делать макросы.



--------------------

PM   Вверх
Zandr
Дата 1.4.2005, 11:00 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
Зато можно делать макросы.

Что ни начнешь писать - все компилятор получается...
PM MAIL   Вверх
Domestic Cat
Дата 2.4.2005, 23:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Цитата(Zandr @ 1.4.2005, 02:00)
Что ни начнешь писать - все компилятор получается...

smile Скорее интерпретатор.
А вообще, мощный шаблонный движок.


--------------------

PM   Вверх
simanyay
Дата 21.5.2005, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Антон Ковалёв
****


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

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



У меня вопрос:
Какое преимущество, в плане производительности, даёт Velocity по сравнению с использованием JSP (<%= %>)? Просто я не до конца понимаю смысла Velocity для web-страниц.


--------------------
«It's better to be a pirate than to join the Navy» — Steve Jobs.
PM MAIL WWW   Вверх
simanyay
Дата 21.5.2005, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Антон Ковалёв
****


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

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



Вопрос и сомнения вроде отпали. Советую всем, у кого такой же вопрос прочитать это: Case Study: JSP vs. Velocity
Добавлено @ 16:12
Попробую, в общем курсовую написать используя Velocity. Авось и получится smile


--------------------
«It's better to be a pirate than to join the Navy» — Steve Jobs.
PM MAIL WWW   Вверх
batigoal
Дата 21.5.2005, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



А разве на JSTL этого нельзя сделать?


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Stampede
Дата 21.5.2005, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


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

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



Цитата(simanyay @ 21.5.2005, 15:55)
Просто я не до конца понимаю смысла Velocity для web-страниц


Я могу (и хочу) много-много написать о том, почему Velocity раз так в восемьдесят пять лучше JSP, но мы сейчас уезжаем на длинные выходные в Банфф, так что вернусь не раньше понедельника.

А тем, у кого есть неясности/сомнения, советую пока что погуглевать по слову IoC - inversion of control.

Дело в том, что IoC - это не самый очевидный (и часто опускаемый в обсуждениях) аспект использования Velocity, но на мой взгляд это самое важное.

До понедельника!

PM WWW   Вверх
simanyay
Дата 21.5.2005, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Антон Ковалёв
****


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

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



Цитата(Stampede @ 21.5.2005, 19:58)


Я могу (и хочу) много-много написать о том, почему Velocity раз так в восемьдесят пять лучше JSP, но мы сейчас уезжаем на длинные выходные в Банфф, так что вернусь не раньше понедельника.

А тем, у кого есть неясности/сомнения, советую пока что погуглевать по слову IoC - inversion of control.

Дело в том, что IoC - это не самый очевидный (и часто опускаемый в обсуждениях) аспект использования Velocity, но на мой взгляд это самое важное.

До понедельника!


Ждём-с с нетерпением smile Гуглим до понедельника.


--------------------
«It's better to be a pirate than to join the Navy» — Steve Jobs.
PM MAIL WWW   Вверх
Chinook
Дата 27.5.2005, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 21.5.2005
Где: Vancouver, BC, Ca nada

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



Код

// test.vm
We want to present you our new products:

#foreach ($product in $products)
    Product : $product.name, just for $product.price
#end

#include("logo.txt")


Это как-то очень слабо напоминает HTML, и выучить это html-девелоперу никак не легче, чем библиотеки тегов, которые намного больше похожи на HTML. IMHO.

PM MAIL   Вверх
Stampede
Дата 7.6.2005, 23:43 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


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

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



Ну. поехали...

1. Ты помнишь, как все начиналось...

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

Код

OutputStream out = response.getOutputStream();
out.println("<htm>");
out.println("<head><title></title> <link type=\"text/css\" rel=\"stylesheet\" href=\"/css/style.css\" /></head>");
out.println("<body bgcolor=\"green\">");

// bla-blah-blah



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

О новой технологии тут же раструбили по всем жабным изданиям, понавыпускали книжек, и пошло-поехало. Как же, ведь Sun опубликовал стандарт, под который можно писать веб приложения, которые будут исполняться в любом контейнере! Слава открытым спецификациям! Даешь конкурентный рынок контейнеров!

Эйфория от появления новой технологии была настолько сильной, а пиар - таким массированным, что в массовом сознании очень быстро сложился стереотип: J2EE веб приложение == Servlets + JSP. Но за фанфарами остался незамеченным один маленький факт: что JSP - это отнюдь не единственная и совсем не обязательно самая лучшая технология для генерации динамических веб страниц.


2. Не все то золото, что кричит

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

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

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

Часто ли такое происходит? Сплошь и рядом, особенно в ситуациях, когда готово должно было быть еще вчера. Как следствие, через какое-то время страницы оказываются просто завалены вставками - бестолково написанными, с массой дублированного кода, раскиданного по разным стрвницам. И не надо думать, что это происходит только на поздних этапах жизненного цикла приложения. Даже во время непосредственно разработки, на пути от прототипа к готовому продукту, все время возникают новые требования, всплывают разные нюансы и т. д.

Так вот, самая большая беда JSP как технологии, на мой взгляд, это то, что она does not promote good design (не промоутит правильный дизайн?). На самом деле JSP вполне можно приспособить в качестве удовлетворительной вью технологии, и я вернусь к этой теме после разговора о Velocity.

3. И тут на сцене появляется...

Правильно, вы угадали. Появляется Velocity, собственной персоной. Если точнее, то целая группа шаблонных движков: FreeMarker, WebMacro и т. д. Основная идея была позаимствована из скриптовых языков типа PHP: ты передаешь странице кучу параметров (например, через переменные окружения), а в коде страницы ссылаешься на них по имени. В результате у тебя получается относительно чистый HTML код, только вместо конкретных строк фигурируют конструкции вида:

Код

<title>$article_title</title>
<div class="header">
  <p>Автор: <a href="$author_url">$author_name</a>
  <p>Отправлено: $article_date_сreated
</div>
<div class="text">
$article_text
</div>


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

Код

<title>$article.title</title>
<div class="header">
  <p>Автор: <a href="$article.author.url">$article.author.name</a>
  <p>Отправлено: $article.dateCreated
</div>
<div class="text">
$article.text
</div>


Вы не находите, что это элегантно, просто, удобно, читабельно, сопровождаемо - это, наконец, просто красиво! И, в отличие от JSP, это промоутит правильный дизайн с самого начала. Почему? Потому что такой подход мягко и ненавязчиво принуждает вас думать о вашем приложении в терминах объектов, которые наиболее естественным образом описывают вашу предметную область - потому что это именно то, что вы будете передавать вашим страницам, и чем эти страницы будут оперировать. Вы скажете, да это же просто бины! Бины, да не совсем.

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

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

Код

public static boolean mergeTemplate(java.lang.String templateName,
                                    Context context,
                                    java.io.Writer writer)


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

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

Код

String artid = request.getParameter("artid");
Article article = yourResourseLocator.getArticle(artid);

Context context = new VelocityContext();
context.put("article", article);


И фсе! Слейте созданный таким образом контекст с описанным ранее шаблоном, и у вас получится отличная веб страница!

Я не буду рассказывать о различных конструкциях Velocity, предназначенных для облегчения вам жизни: set, if-else, foreach, include, macro и других - поверьте, у них очень простой синтаксис, и они хорошо документированы. Давайте лучше поговорим о более высоких вещах - например, об инверсии управления.

4. Немного об инверсии

Я не буду долго разливаться мыслю по древу о том, что такое инверсия управления. Если на пальцах, это такая организация системы, при которой ты смотришь на вещи и думаешь в терминах понятий иных, нежели в другом подходе. Например, event-driven подход к программированию гуя - это инверсный подход по сравнению с тем, когда ты всю логику программируешь в классе окна, ждешь всяких событий и как-то на них реагируешь.

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

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

Создатели JSP как спецификации этого абсолютно не понимали, а вслед за ними не понимают этого и миллионы разработчиков, последовавшие за ними. Мне горько и обидно это видеть, что, собственно, и побудило меня сесть и написать эту статью.

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

Надеюсь, наш разговор о Velocity не закончен, и после вашей конструктивной критики мы продолжим обсуждение.

До новых встреч в эфире! smile

PM WWW   Вверх
Domestic Cat
Дата 8.6.2005, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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





--------------------

PM   Вверх
simanyay
Дата 8.6.2005, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Антон Ковалёв
****


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

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



smile Я понял зачем нужен Velocity! Буду юзать его в Jizer'e. Спасибо.


--------------------
«It's better to be a pirate than to join the Navy» — Steve Jobs.
PM MAIL WWW   Вверх
Souljah
Дата 28.9.2005, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



тов. Stampede не в первый раз радует меня трезвостью мышления

поставьте плз + от моего имени, а то я еще не дорос до такого действа
PM MAIL   Вверх
batigoal
Дата 28.9.2005, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Souljah @ 28.9.2005, 11:59)
поставьте плз + от моего имени, а то я еще не дорос до такого действа


Это всегда пожалуйста.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
pvo
Дата 21.10.2005, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Velocity штука конечно хорошая. Но есть у нее пара изрядных минусов:

1. С рекурсией проблемы. Если передать в шаблон объект с "деревянной" структурой, то построить результирующий документ без танцев с бубнами не получится. (в версии 1.3, по крайней мере)
2. Скорость. Как не крути, но она меньше, чем у jsp. Компилятор-то пока-что не дописан ... smile
PM MAIL ICQ   Вверх
Stampede
Дата 22.10.2005, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


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

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



Цитата(pvo @ 21.10.2005, 22:19)
Velocity штука конечно хорошая. Но есть у нее пара изрядных минусов


Минусы, конечно, есть, но вот именно по поводу перечисленного - возражаю.


Цитата(pvo @ 21.10.2005, 22:19)
1. С рекурсией проблемы. Если передать в шаблон объект с "деревянной" структурой, то построить результирующий документ без танцев с бубнами не получится.


Что в данном случае понимается под рекурсией? Рекурсивный вызов макросов? Честно говоря, не знаю, не пробовал, но беглый поиск в гугле показывает, что с этим проблем быть не должно. Наоборот, там один чувак жалуется, что Velocity не ограничивает глубину рекурсии, из-за чего его программа иногда подвисает. Держите, говорит, меня семеро, а то если я разойдусь, так уж разойдусь smile Да, речь там идет о 1.4.


Цитата(pvo @ 21.10.2005, 22:19)
2. Скорость. Как не крути, но она меньше, чем у jsp.


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

А про минусы я потом скажу отдельно smile

PM WWW   Вверх
Ортхэннер
Дата 22.10.2005, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



М-да. А вы вот объясните, господа, чем, кроме синтаксиса, отличается Velocity от JSPX+JSTL. А то я немного не понимаю. Дело в том, что, как показывает практика, вставлять галимый Java-код в JSPX-страницы, мягко говоря, обломно. Если и получится - прочитать это точно будет потом нельзя. Но получается зачастую не с первого раза и выглядит жутко. А вот с библиотеками тегов и EL'ем - очень красиво и очень просто.
PM MAIL ICQ   Вверх
pvo
Дата 3.11.2005, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
М-да. А вы вот объясните, господа, чем, кроме синтаксиса, отличается Velocity от JSPX+JSTL

1. Гибкостью. Например, есть у нас Velocity & JSP шаблоны некоторой html страницы. В один прекрасный момент нам требуется отправить эту страницу по почте, причем не в процессе обслуживания запроса (ServletRequest не доступен). Что нужно будет делать в случае с jsp? \
В случае с велосити один и тот же код можно использовать и для генерации html, и для генерации email.
2. Обломно или не обломно добавлять java код в jsp страницы, но народ все равно упорно это делает.
3. Лаконичностью. ИМХО, понять шаблон velocity проще, нежели многие jsp шаблоны с использованием кучи кастом тегов ...
PM MAIL ICQ   Вверх
Guest
Дата 7.11.2005, 14:00 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











То, что Velocity на порядок выше JSP - не вопрос!
JSP - это дань старым и корявым технологиям, типа PHP, ASP и прочия... Но они решают свою нишу задач, типа быстро нацарапать сайт из 10 страниц с несложным функционалом. Для серьезных вещей уровня предприятия, такие движки не самый лучший выбор. Тут на сцену выходит Velocity и другие фрамеворки,а вот сравнивать его с другими технологиями и имеет смысл! Например, ХМЛ+ХСЛТ! Мое мнение, он тут проигрывает....
  Вверх
Ортхэннер
Дата 8.11.2005, 06:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(pvo @ 3.11.2005, 18:47)
Цитата
М-да. А вы вот объясните, господа, чем, кроме синтаксиса, отличается Velocity от JSPX+JSTL

1. Гибкостью. Например, есть у нас Velocity & JSP шаблоны некоторой html страницы. В один прекрасный момент нам требуется отправить эту страницу по почте, причем не в процессе обслуживания запроса (ServletRequest не доступен). Что нужно будет делать в случае с jsp? \
В случае с велосити один и тот же код можно использовать и для генерации html, и для генерации email.
2. Обломно или не обломно добавлять java код в jsp страницы, но народ все равно упорно это делает.
3. Лаконичностью. ИМХО, понять шаблон velocity проще, нежели многие jsp шаблоны с использованием кучи кастом тегов ...

Да я вообще-то не про JSP, а про JSPX. Это несколько разные вещи с разным синтаксисом. И добавить код java в JSPX-страницу - задача довольно трудоёмкая. Ибо приходится все кавычки и знаки сравнения заменять соответствующими сущностями. Головняк ещё тот. К тому же, хоть убей, ты уже не сможешь задействовать выражения в атрибутах (типа <%=a%>). По поводу "кучи кастом тегов" - ну это скорее вопрос именования. Но вот первый пункт... принял.

Это сообщение отредактировал(а) Ортхэннер - 8.11.2005, 06:20
PM MAIL ICQ   Вверх
Wowa
Дата 6.2.2006, 03:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



Цитата(Guest @ 7.11.2005, 12:00 Найти цитируемый пост)

сравнивать его с другими технологиями и имеет смысл! Например, ХМЛ+ХСЛТ! Мое мнение, он тут проигрывает....

Для обсуждения этого я создал отдельную тему: http://forum.vingrad.ru/index.php?act=ST&a...80&amp;unread=1
Т.к. вероятно там много о чем можно поговорить.
PM WWW   Вверх
Nobody
Дата 6.2.2006, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Velocity - это, в отличие от JSP, совсем не обязательно серверная технология.


--------------------
Алгоритм помещения вопросов на форуме
Выражаем спасибо вот ТАК
Use the Source, Luke!
PM MAIL WWW ICQ   Вверх
Се ля ви
Дата 16.5.2006, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

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



Тут вот по работе столкнулся-таки с велосити. В принципе штука удобная, но что огорчает, так это отсутствие типизации - чем-то мне отдалённо помесь JS и SSI напомнило. И так же огорчает отсутствие поддержки в средах разработки - например, не нашёл никакого путного плагина для IDEA. 


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Stampede
Дата 17.5.2006, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


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

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



Цитата(Се ля ви @  16.5.2006,  07:18 Найти цитируемый пост)
В принципе штука удобная, но что огорчает, так это отсутствие типизации


Ну хорошо, давай пофантазируем, как выглядел бы синтаксис шаблонного движка, если бы он поддерживал типизацию.

Допустим, мы имеем некую страницу интернет-магазина, которая использует следующие переменные:
  • $productInfo
  • $shoppingCart
  • $bestDealList
  • $topRatedList

Мы могли бы предусмотреть синтаксис для объявления переменных, что-то вроде:

Код

#use com.ebizsolutions.eshop.data.ProductInfo $productInfo
#use com.ebizsolutions.eshop.data.ShoppingCart $shoppingCart
#use java.util.List<com.ebizsolutions.eshop.data.Deal> $bestDealList
#use java.util.List<com.ebizsolutions.eshop.data.ProductInfo> $topRatedList


Хорошо это было бы или плохо? Если сделать объявление опциональным (ведь движку все равно, есть объявление или нет: он ведь полагается на runtime информацию и рефлексию), то не исключено, что это была бы полезная фича: можно было бы написать плагин, который по крайней мере может делать:
  • автозаполнение;
  • валидацию имен методов/пропертей;
  • рефакторинг;

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

Но вот заставлять разработчика делать явные объявления - это будет уже насилие над личностью smile А что касается опционального объявления, то это вполне можно было бы реализрвать как надстройку в форме синтаксиса, который Velocity воспринимает как комментарии, например ##use вместо #use. И уже на этой основе наваять соответствующий плагин.

Если кто хочет отличиться, дарю идею бесплатно smile Тут ничего нереального нет -  надо просто взять и сделать.

 
PM WWW   Вверх
Aazmandius
Дата 19.6.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


O_o
*


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

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



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

One of the fundamental and important parts about Velocity is the resource management system and the resource loaders. They are referred to as 'resources' here rather than 'templates' because the resource management system will also handle non-template reasources, specifically things that are loaded via the #include() directive.

Судя по этому, поддержка подгрузки шаблонов есть, но как ее реализовать? 
 smile  

Это сообщение отредактировал(а) Aazmandius - 19.6.2006, 15:55
PM WWW   Вверх
Aazmandius
Дата 19.6.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


O_o
*


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

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



Решение почти найдено smile Нужно использовать директиву #parse(), только вот что делать с контекстом шаблона, который мы парсим? куда его подключать?  

Это сообщение отредактировал(а) Aazmandius - 20.6.2006, 15:13
PM WWW   Вверх
tux
Дата 21.6.2006, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Цитата(Aazmandius @  19.6.2006,  22:19 Найти цитируемый пост)
Решение почти найдено smile Нужно использовать директиву #parse(), только вот что делать с контекстом шаблона, который мы парсим? куда его подключать?  

А зачем его подключать? Будет использоваться контекст "корневого" шаблона. 
PM MAIL Skype GTalk Jabber YIM   Вверх
Tony
Дата 16.10.2006, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А можно ли перенести из sessionContext и aplicationContext в VelocityContext аттрибуты? Но не потупому 4ерз for .


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


Гносеолог
**


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

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



Цитата(Tony @  15.10.2006,  23:17 Найти цитируемый пост)
А можно ли перенести из sessionContext и aplicationContext в VelocityContext аттрибуты?


Смотря что имеется в виду: javax.ejb.SessionContext? А "aplicationContext" - это что за зверь? Класс из какого-то конкретного контейнера? Или просто некий общий контекст приложения?

В принципе самое, пожалуй, универсальное решение - это написать обертку-адаптер, который будет имплементировать интерфейс org.apache.velocity.context.Context. Там всего пять методов, которые при реализации надо будет просто перенаправить подлежащему мапу или другому контексту: containsKey(), get(), getKeys(), put(), remove().

Но можно и по-деревянному, положить весь контекст в VelocityContext под своим именем и доступаться к его элементам, используя синтакс Velocity, например $applicationContext.get("someKey");

Понятно, что второй способ менее удобен, потому что в первом варианте мы бы обратились к этому же объекту просто как $someKey.



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


Эксперт
***


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

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



Я имел в виду web.Скажем есть сервлет я беру sessionContext i servletContext в обоих есть аттрибуты.Как сделать 4тобы Velocity увидел их.Коне4но можно по тупоми через for перекладывать но ...


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


Эксперт
***


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

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



решил так: Simple test: $test.id


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


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

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



есть какиендь шаблоны  для сервлетов-контроллеров, использующих velocity?
PM Jabber   Вверх
rilio
Дата 28.10.2006, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Alexandr87 @ 27.10.2006,  10:54)
есть какиендь шаблоны  для сервлетов-контроллеров, использующих velocity?



Вот есть пример очень простого фреймворка на Velocity + AJAX: Rilio framework . 
Документация частично на русском. 

Это сообщение отредактировал(а) rilio - 28.10.2006, 21:49
PM MAIL WWW ICQ   Вверх
Stampede
Дата 29.10.2006, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


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

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



Цитата(Alexandr87 @  27.10.2006,  01:54 Найти цитируемый пост)
есть какиендь шаблоны  для сервлетов-контроллеров, использующих velocity?


Не совсем понятно, имеются ли в виду шаблоны проектирования (design patterns), шаблоны вывода (templates) или что-то другое? Хотелось бы увидеть более четко сформулированный вопрос.
PM WWW   Вверх
Alexandr87
Дата 31.10.2006, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

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



имено шаблоны проектирования.
PM Jabber   Вверх
Stampede
Дата 1.11.2006, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


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

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



Я не знаю, есть ли какие-то специальные design patterns для разработки именно "сервлетов-контроллеров, использующих velocity", хотя до некоторой степени идею сервлета-контроллера (который также нередко называют Front Servlet, Controller Servlet, etc.) саму по себе уже можно считать дизайн паттерном.

Если же говорить о том, какие из паттернов общего назначения могут пригодиться в реализации такого сервлета, то я бы назвал в первую очередь Command и Strategy.

Command

Команда - это достаточно простой компонент, который инкапсулирует выполнение некоего действия. Примерами могут служить всякие Task, Runnable, Action и пр. При этом он может принимать какие-то параметры и/или возвращать какие-то результаты, но это необязательно. Применительно к обсуждаемой задаче, такой компонент, по-видимому, должен как-то обработать входящий веб-запрос и, коль скоро речь идет о Velocity, сгенерировать некий выходной текст, для каковой цели ему придется выяснить, какой из имеющихся шаблонов (templates) он должен использовать, и подготовить в объекте типа VelocityContext все необходимые данные, которые понадобятся при рендеринге.

Strategy

Паттерн Стратегия служит для инкапсуляции в отдельном компоненте конкретной реализации некоторой функциональности. Этот патерн, к примеру, широко используется в Swing'е. Например механизм TableCellRenderer - это самая настоящая стратегия. Напиши свой рендерер, который будет выводить текст задом наперед, и получишь отличный компонент для Иврита smile

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


Вот так вот, если в общих чертах. Если будут вопросы - задавай smile

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


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


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

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



Спасибо. Будем смотреть.
PM Jabber   Вверх
JUncle
Дата 7.11.2006, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Поставьте пожалуйста плюс Stampede, сам я до этого еще не дорос.
Причина: не внял его словам о Velocity, позже к этому же пришел. Замечательная статья. smile

Это сообщение отредактировал(а) JUncle - 7.11.2006, 14:25
--------------------
class JUncle extends Man // singleton{/*...*/}
PM MAIL   Вверх
tux
Дата 7.11.2006, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Без проблем
PM MAIL Skype GTalk Jabber YIM   Вверх
Бармалей
Дата 8.11.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Скажите, а со времени написания статьи появились ли какие либо решения по интеграции Velocity с популярными IDE?

Это сообщение отредактировал(а) Бармалей - 8.11.2006, 17:14
PM MAIL WWW   Вверх
tux
Дата 8.11.2006, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Скажем так, это самое слабое место Velocity. Есть пара плагинов для Eclipse и, практически, все.
PM MAIL Skype GTalk Jabber YIM   Вверх
Бармалей
Дата 8.11.2006, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(tux @ 8.11.2006,  17:35)
Скажем так, это самое слабое место Velocity. Есть пара плагинов для Eclipse и, практически, все.

Дайте, пожалуйста, ссылки на них. Просто Eclipse - моя любимая IDE.
PM MAIL WWW   Вверх
tux
Дата 8.11.2006, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



PM MAIL Skype GTalk Jabber YIM   Вверх
Бармалей
Дата 8.11.2006, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо. 
PM MAIL WWW   Вверх
tux
Дата 11.12.2006, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



После двух с половиной, не побоюсь этого слова, лет вышла очередная версия Velocity - 1.5 beta2. Качнуть можно здесь.
PM MAIL Skype GTalk Jabber YIM   Вверх
Tony
Дата 29.12.2006, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Velocity cache - кеширует template как файл(сам исходник) или сам исходник + вставленные данные?

Это сообщение отредактировал(а) Tony - 29.12.2006, 18:31


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


Гносеолог
**


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

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



Цитата(Tony @  29.12.2006,  08:28 Найти цитируемый пост)
Velocity cache - кеширует template как файл(сам исходник) или сам исходник + вставленные данные?


Когда Velocity в первый раз открывает файл шаблона, он его парсит и преобразует в свой внутренний формат, чтобы слияние (merge) с данными (контекстом) происходило побыстрее. Вот это вот внутреннее представление он и кэширует. А результат слияния - нет, не кэширует.
PM WWW   Вверх
Tony
  Дата 9.1.2007, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А если сравнить с  FreeMarker. Похоже что он уступает ему. Или я не прав?


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


Шустрый
*


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

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



У оракла есть плагин к JDeveloper работающий на velocity который генерит JSF+ADF страницы.
http://www.oracle.com/technology/consultin...JHeadstart.html
Очень занятная вещь.мож кому полезно будет.
PM MAIL   Вверх
Restavrator
Дата 11.7.2007, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если я правильно понял, то использование velocity заставляет отказаться от тегов. Если это так, то это существенный минус по сравнению с JSP+JSTL. Например потому, что используя Acegi Security или тот же Spring Framework теги этих библиотек юзаются достаточно плотно. Или я не прав? 
PM MAIL   Вверх
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   Вверх
Shaggie
Дата 4.10.2007, 06:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Stampede, спасибо!


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


Шустрый
*


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

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



А я бы попросил накидать небольшой пример. Есть большой шаблон и есть шаблон новостей. Как теперь их обоих совместить? Думаю, пример бы многие споры присек.
PM   Вверх
ivg
Дата 25.11.2007, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

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



Цитата(Stampede @  3.10.2007,  20:11 Найти цитируемый пост)
Вот такой вот неполный, но, надеюсь, достаточно показательный перечень "минусов Velocity"

Добавлю ещё 5 копеек  smile
5. Доступ к элементу массива
В шаблоне не нашел возможности получить элемент массива по индексу. То есть если в контекст положить new String[] {"One", "Two"},
то "One" в результирующем тексте не вывести.
Обходное решение -> Arrays.asList("One", "Two"); тогда в шаблоне
Код

$array.get(0)

Простейшая операция, ан нету.
PS: Поправьте если ошибаюсь.
PM MAIL   Вверх
Kangaroo
Дата 25.11.2007, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


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

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



Цитата(ivg @  25.11.2007,  00:05 Найти цитируемый пост)
PS: Поправьте если ошибаюсь. 

Не ошибаетесь. Но всегда есть Velocity Tools  smile Для этого случая - вот это


--------------------
Lost....
PM MAIL MSN   Вверх
olegrolik
Дата 17.12.2007, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



 smile 

Посмотрел исходники томката (6 ой версии). А точнее manager. Он реализован без одной jsp-страницы smile Куча print и println.
Почему они не используют velocity? Сами же его написали smile

Это сообщение отредактировал(а) olegrolik - 17.12.2007, 17:43
PM MAIL   Вверх
Kangaroo
Дата 18.12.2007, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


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

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



olegrolik
я придумал три причины smile :
1) В предыдущих версиях было с принтл и зачем тогда менять?
2) Там все пару страничек, наверное, так сделано? Тогда зачем еще велосити подвязывать
3) К сорцам не нужно добавлять еще одну библиотеку (ну эта причина с 3й связана)


--------------------
Lost....
PM MAIL MSN   Вверх
diablero
Дата 25.12.2007, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

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



Подскажите как экранировать присвоение. 

Например, $one = $two, чтобы не видно было его.



--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Kangaroo
Дата 25.12.2007, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


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

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



Цитата(diablero @  25.12.2007,  00:11 Найти цитируемый пост)
экранировать присвоение. 

Это как?
Может #set подойдет?


--------------------
Lost....
PM MAIL MSN   Вверх
hamsterKSU
Дата 16.1.2008, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



читайте маны сначала:
клик
PM MAIL ICQ   Вверх
SuperFly
Дата 17.1.2008, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Maksym @  24.7.2007,  14:58 Найти цитируемый пост)
На jsp никогда не получишь точно-такого результата в html (посимвольно), как хотелось бы -- все равно какие-то пробелы, переносы строк на месте скриптов и т.п. мусор.

Хм, а у меня и с Velocity тоже не получается желаемого вывода: "все равно какие-то пробелы, переносы строк на месте скриптов и т.п. мусор."
PM   Вверх
Maksym
Дата 17.1.2008, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


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

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



Цитата(SuperFly @  17.1.2008,  10:33 Найти цитируемый пост)
Хм, а у меня и с Velocity тоже не получается желаемого вывода: "все равно какие-то пробелы, переносы строк на месте скриптов и т.п. мусор." 

То есть результат не соответствует шаблону? Интересно.. можно примерчик?
PM MAIL   Вверх
Luminal
  Дата 28.1.2008, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Коллеги,  а как все-таки с ненайденными ресурсами?
Тоже вот сейчас напоролся на эту же проблему.
Как программе из самого первого примера сказать - откуда грузить "test.vm" ???

делал как Maverick - та же фигня...  
PM MAIL   Вверх
Luminal
Дата 31.1.2008, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Кстати,  я докопался, как запустить sample пример!
Код

package vtest;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.util.Properties;

public class VeloTest {

    public static void DoVelo(String file) throws Exception {

        /* first, we init the runtime engine.  */

        Properties p = new Properties();
          p.setProperty("file.resource.loader.path", "c:/Java/Projects/myVelocity/src");
        Velocity.init(p);

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

        VelocityContext vc = new VelocityContext();
        Template t = Velocity.getTemplate(file);
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        t.merge(vc, bw);
        bw.flush();
        bw.close();
    }

    public static void main(String[] args) throws Exception {
        DoVelo("test.vm");
    }

}

Это - проект на Intellij IDEA. При запуске, по крайней мере из IDE, все работает и выводит на экран то что нужно.
Файл шаблона  test.vm лежит в каталоге "\src"
PM MAIL   Вверх
am_sasa
Дата 7.2.2008, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




Не могу проиндексировать массив, на $arr.get(0) выдает его же, a на $arr[0] выдает вообще коды адресов объектов..  подскажите как быть?
PM MAIL   Вверх
Kangaroo
Дата 8.2.2008, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


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

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



Цитата(am_sasa @  7.2.2008,  10:28 Найти цитируемый пост)
Не могу проиндексировать массив, на $arr.get(0) выдает его же, a на $arr[0] выдает вообще коды адресов объектов..  подскажите как быть? 

В Велосити нельзя так.. 
1) можно через foreach
2) использовать специальную VelocityTools - в данном случае ListTool


--------------------
Lost....
PM MAIL MSN   Вверх
am_sasa
Дата 15.2.2008, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Kangaroo @  8.2.2008,  00:32 Найти цитируемый пост)
1) можно через foreach

Я так и делал, но это криво... а за 
Цитата(Kangaroo @  8.2.2008,  00:32 Найти цитируемый пост)
2) использовать специальную VelocityTools - в данном случае ListTool 
 спасибо, то что надо!!!

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

PM MAIL   Вверх
Kangaroo
Дата 15.2.2008, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


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

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



Цитата(am_sasa @  15.2.2008,  08:52 Найти цитируемый пост)
она все время пишет в консоль про не добавление в библиотеку, как вообще управлять ими ,а если они есть в другом шаблоне? как эту библиотеку правильно делать и когда загружать?

Нужно просто положить все шаблоны в один файл и прописать конфиг:
Код

<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
        <property name="resourceLoaderPath"><value>/WEB-INF/velocity/</value></property>
        <property name="velocityProperties">
           <props>
             <prop key="velocimacro.library">library/default.vm</prop>             
           </props>
        </property>
    </bean>

Файл лежить в >/WEB-INF/velocity/library/default.vm



--------------------
Lost....
PM MAIL MSN   Вверх
am_sasa
Дата 15.2.2008, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо! сильно благодарен, буду пробовать))) 
Поставил в 
Цитата(Kangaroo @  15.2.2008,  10:22 Найти цитируемый пост)
Оцените, пожалуйста, Обьект 145. То есть меня smile

тебе пятерку!!!
PM MAIL   Вверх
Kangaroo
Дата 15.2.2008, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


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

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



Цитата(am_sasa @  15.2.2008,  10:03 Найти цитируемый пост)
Поставил в 
Цитата(Kangaroo @  15.2.2008,  10:22 Найти цитируемый пост)
Оцените, пожалуйста, Обьект 145. То есть меня smile

тебе пятерку!!! 

 smile 
Спасибо


--------------------
Lost....
PM MAIL MSN   Вверх
am_sasa
Дата 18.2.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




Осилил библиотеку, а вот русские буковки в ней не осилил... неужели придеца native2ascii юзать? может что получше есть?
PM MAIL   Вверх
am_sasa
Дата 18.2.2008, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




все, осилил! надо 
Код

    <property name="velocityProperties">
        <props>
            <prop key="velocimacro.library">library/oes.vm</prop>
            <prop key="input.encoding">cp1251</prop>
        </props>
    </property>


PM MAIL   Вверх
arrrght
Дата 1.4.2008, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет!
Изучаю яву недавно -  недели три. После долгого гугления пришёл к tomcat+spring+velocity.

Проект разрабатываем на двоих - программер + дизайнер. Не могу разделить на две части проект - на java-часть и отображение(html+css+js)

В web.xml прописал
Код

<servlet-mapping>
<servlet-name>springServlet</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>


В spring.xml
Код

<bean id="velocityConfig"
  class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
<property name="resourceLoaderPath">
<value>file://c:\web</value>
</property>
</bean>


Т.е. все обрабатываемые шаблоны находятся в c:\web\*.html - здесь все нормально, берёт, работет - на ура.
НО! На странице trtatata.html есть
<link rel="stylesheet" type="text/css" href="css/common.css" />
Т.е. полная ссылка получается - http://localhost:8080/try9/css/common.css

Вопрос: каким образом заставить tomcat чтобы он брал css/* не из корня веб-приложения, а конкретно из c:\web\css\* ??

Ещё одна проблема в том, что разрабатываем проект под Виндой, тестироваться он будет под линуксом, а работать, скорее всего, на Solaris. Т.е., в идеале я прописал бы к каком-нить конфиге, что корень web-а лежит не в c:\web, а, например, /var/www/web

Это было-бы просто удобно - взял себе (домой) весь каталог c:\web, дома подредактировал, навел красоту, принёс на работу - положил обратно.
PM MAIL   Вверх
arrrght
Дата 2.4.2008, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нашёл два решения:

Первое - простое, но неэффективное 
Описание здесь же, на форуме
Просто заменить Redir.class.getResourceAsStream на new FileInputStream

Второе - попробовать скрестить apache httpd с tomcat-ом через mod_jserv или mod_jk

Первое - работает без проблем
Второе - надо возиться, с разбегу не получилось
PM MAIL   Вверх
Kangaroo
Дата 2.4.2008, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


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

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



А чем вам стандартная структура проекта не нравится?

Типа такого:

/MyProject
--/WebContent
----/images
----/javascripts
----/css
----/WEB-INF
------/velocity-templates
------/lib
------web.xml
------springAppContext.xml




--------------------
Lost....
PM MAIL MSN   Вверх
arrrght
Дата 2.4.2008, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я за полное разделение обязанностей ::)

Есть человек, который разбирается в верстке, дизайне, юзабилити, и.т.д, /web/* - это его
Есть другой, который разбирается в кишках(java), классы* - это его.

У каждого своя область ответственности - я уверен, что у меня ничего лишнего в web.xml не появится [ ::) ], более того - каталог /web/* можно отдать, например, стороннему дизайнеру.
PM MAIL   Вверх
Емеля
Дата 5.4.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



arrrght,
Цитата(arrrght @  1.4.2008,  07:27 Найти цитируемый пост)
Вопрос: каким образом заставить tomcat чтобы он брал css/* не из корня веб-приложения, а конкретно из c:\web\css\* ??

Привет,
я как то в похожей ситуации использовал:
 
application.getRealPath("/").toString();


Попробуй.
PM MAIL   Вверх
webmolot
Дата 10.4.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет!
Подскажите, пожалуйста, где можно скачать мануал по velocity на русском языке. И какую нибудь литературу с простенькими примерами, для начала. Я - веб-дизайнер, хорошо владею html/css, хочу освоить velocity, чтобы програмеру облегчать жизнь. Спасибо!
PM MAIL   Вверх
diablero
Дата 30.4.2008, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

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



Народ, прошу прощения если такой вопрос звучал...
Как вообще запретить велосити вести свой лог?


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Maksym
Дата 30.4.2008, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


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

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



diablero
Написать в velocity.properties­ конфиге
runtime.log.logsyst­em.class=org.apache.­velocity.runtime.log­.NullLogSystem
PM MAIL   Вверх
VetaleG
Дата 10.5.2008, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый вечер.
У меня вопрос к гуру Velocity, ответ на который в документации я не нашёл.
Допустим у меня есть шаблон, причём некоторая его часть генерируется динамически. Необходимо, чтобы весь текст этой части был перенесён в результирующий документ без изменений (т.е. строчка "#if($test)", как и строчка "$something", должна остаться собой).
Простая замена символов '$' и '#' на "\$" и "\#" не помогла, т.к. Velocity оказалась чрезмерно на мой взгляд умной и переводила строчку "\${" в строчку "\${", т.к. в данном примере после доллара нет валидного имени переменной. Аналогично "\#ough" -> "\#ough".
Решение, которое пришло в голову - принимать решение о том ставить '\' перед долларом (решёткой) или нет на основе анализа символов после этого доллара. Но на мой взгляд это сложно и не удобно.
Есть ли другие способы решения проблемы?
Может некий аналог блока "<![CDATA[ ... ]]>" из xml? (идеальный вариант, на мой взгляд)

PM MAIL   Вверх
Kangaroo
Дата 10.5.2008, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


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

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



Цитата(VetaleG @  10.5.2008,  18:05 Найти цитируемый пост)
Может некий аналог блока "<![CDATA[ ... ]]>" из xml? (идеальный вариант, на мой взгляд)

Нет, такого нету я думаю. Можно взглянуть на Escape Tool, там есть методы для получения решетки, доллара и т.д.


--------------------
Lost....
PM MAIL MSN   Вверх
ivg
Дата 12.5.2008, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

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



VetaleG, так и используйте Velocity. Это ж очевидно, или я чего то не понял?
Цитата(VetaleG @  10.5.2008,  21:05 Найти цитируемый пост)
Необходимо, чтобы весь текст этой части был перенесён в результирующий документ без изменений

Вставляете в шаблон переменную, её значением и будет 
Цитата(VetaleG @  10.5.2008,  21:05 Найти цитируемый пост)
часть, которая генерируется динамически
 ?

PM MAIL   Вверх
VetaleG
Дата 13.5.2008, 21:26 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ivg, не буду вдаваться в подробности, но мне нужен именно механизм ескейпинга некоторого абстрактного текста. Т.е. вопрос в следующем:
- есть набор символов на входе (текст)
- мы его каким-то образом изменяем (ескейпим)
- скармливаем изменённый текст Velocity в качестве шаблона
- должны получить на выходе исходный текст при любом контексте.

Тривиальным образом, я как понял, данная задача не решается. а жаль...

Kangaroo, спасибо за ссылку. Escape Tool решает задачу лишь частично. (не проходит "при любом контексте", т.к. как минимум ${esc.d} будет в итоге запрешён для использования в "нормальной" части шаблона).

По теме я бы записал "странный" эскейпинг в минусы велосити. Не очень понятно для чего нужно было так усложнять. Представьте себе ситуацию, когда писать в String '\\' или '\' зависело бы от того, какие символы следуют далее  smile 
PM MAIL   Вверх
ivg
Дата 13.5.2008, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

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



VetaleG, наверно вы меня не поняли. Вот пример (все условия выполняются):
Код

import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.Random;

import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.context.Context;


public class Test {

    private static Random rand = new Random();
    
    public static String getRandomString(int length) {
        byte bm [] = new byte[length];
        bm[0] = (byte)(0x41 + rand.nextInt(26));
        for (int i = 1, j; i < length; i++) {
            j = rand.nextInt(36);
            bm[i] = (byte)(j > 9 ? 0x41 + j - 10 : 0x30 + j);
        }
        try {
            return new String(bm, "US-ASCII");
        } catch (UnsupportedEncodingException e) {
            return new String(bm);
        }
    }
    
    public static String escapeString(Context ctx, String input) {
        String name = getRandomString(16);
        ctx.put(name, input);
        return "${" + name + "}";
    }
    
    public static void main(String[] args) throws Exception {
        VelocityEngine vel = new VelocityEngine();
        vel.init();
        Context ctx = new VelocityContext();
        ctx.put("test", "This is test value;");
        
        String templateContent = "$test\n";
        String staticContent = "#if()\n\\#set()\\\\#ole()\n${test}\\$test\\\\$$";
        templateContent += escapeString(ctx, staticContent);
        
        PrintWriter w = new PrintWriter(System.out);
        vel.evaluate(ctx, w, "ole", templateContent);
        w.flush();
    }
}

PM MAIL   Вверх
VetaleG
Дата 14.5.2008, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ivg, думаю класть в контекст, в котором и без того много мусора, рандомные сущности не очень хорошая идея. Понимаю, что возможность коллизии ничтожна, но всё же существует.
Временное решение, подсказанное Kangaroo, мне больше понравилось. Запретим дизайнерам использовать $escape.dollar и $escape.sharp и каждый доллар или решётку в их тексте будем заменять на ${$escape.dollar} и ${$escape.sharp} соответственно.
Всем спасибо за помощь.
PM MAIL   Вверх
qnub
  Дата 18.6.2008, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



у меня грабельки. есть шаблон velovcity:
Код

<select name="type" title="каждое последующее включает все предыдущие">
#foreach($type in $types.keySet())
#if($right.getType()==$type)
  #set($selected = 'selected="selected"')
#else
  #set($selected = '')
#end
  <option value="$type" $selected>$types.get($type)</option>
#end
</select><br />

$types равен:
Код

{r=чтение, w=запись, m=модерация, a=администрирование}

и представляет собой TreeMap (важен порядок следования, при HashMap всё работает отлично)
на выходе получается:
Код

<select name="type" title="каждое последующее включает все предыдущие">
  <option value="r" >чтение</option>
  <option value="w" >запись</option>
  <option value="m" >$types.get($type)</option>
  <option value="a" selected="selected">$types.get($type)</option>
</select><br />

самое инстересное, что если изменить порядок следования элементов в $types на обратный то вывод будет такой:
Код

<select name="type" title="каждое последующее включает все предыдущие">
  <option value="a" selected="selected">администрирование</option>
  <option value="m" >модерация</option>
  <option value="w" >запись</option>
  <option value="r" >$types.get($type)</option>
</select><br />


куда копать?  smile 
PM MAIL   Вверх
Kangaroo
Дата 18.6.2008, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


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

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



Цитата(qnub @  18.6.2008,  08:01 Найти цитируемый пост)
куда копать?

Попробовал. Работает smile

Покажи как ты готовишь данные для велосити. И как у тебя получается порядок r,w,m,a (если это ТриМеп??)

Это сообщение отредактировал(а) Kangaroo - 18.6.2008, 09:32


--------------------
Lost....
PM MAIL MSN   Вверх
qnub
Дата 18.6.2008, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



дерево берётся из файла XStream'ом. файл:
Код

<?xml version="1.0" encoding="UTF-8"?>
<tree-map>
  <no-comparator/>
  <entry>
    <string>r</string>
    <string>чтение</string>
  </entry>
  <entry>
    <string>w</string>
    <string>запись</string>
  </entry>
  <entry>
    <string>m</string>
    <string>модерация</string>
  </entry>
  <entry>
    <string>a</string>
    <string>администрирование</string>
  </entry>
</tree-map>


собсна порядок следования записей в файле и обуславливает порядок их в дереве. если использовать такой файл:
Код

<?xml version="1.0" encoding="UTF-8"?>
<map>
  <entry>
    <string>r</string>
    <string>чтение</string>
  </entry>
  <entry>
    <string>w</string>
    <string>запись</string>
  </entry>
  <entry>
    <string>m</string>
    <string>модерация</string>
  </entry>
  <entry>
    <string>a</string>
    <string>администрирование</string>
  </entry>
</map>

для загрузки в HashMap, то порядок рушится... :( но всё работает

прошу заметить, что ключи выводятся все (value="r", и т.д.) а вот значения к нив пропадают...

при выводе в лог дерева, уже после отдачи в контекст велосити, оно выводится полностью, т.е.:
Код

{r=чтение, w=запись, m=модерация, a=администрирование}


...
PM MAIL   Вверх
Kangaroo
Дата 18.6.2008, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


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

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



qnub, попробуй сунуть ему в таком порядке:

Код

<?xml version="1.0" encoding="UTF-8"?>
<tree-map>
  <no-comparator/>
  <entry>
    <string>a</string>
    <string>администрирование</string>
  </entry>
  <entry>
    <string>m</string>
    <string>модерация</string>
  </entry>
  <entry>
    <string>r</string>
    <string>чтение</string>
  </entry>
  <entry>
    <string>w</string>
    <string>запись</string>
  </entry>
</tree-map>


И напиши, что получилось.


--------------------
Lost....
PM MAIL MSN   Вверх
qnub
Дата 18.6.2008, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



сработало:
Код

<select name="type" title="каждое последующее включает все предыдущие">
  <option value="a" selected="selected">администрирование</option>
  <option value="m" >модерация</option>
  <option value="r" >чтение</option>
  <option value="w" >запись</option>
</select><br />


но здесь перепутаны r и w. мне если брать на оборот то нужно:
Код

<?xml version="1.0" encoding="UTF-8"?>
<tree-map>
  <no-comparator/>
  <entry>
    <string>a</string>
    <string>администрирование</string>
  </entry>
  <entry>
    <string>m</string>
    <string>модерация</string>
  </entry>
  <entry>
    <string>w</string>
    <string>запись</string>
  </entry>
  <entry>
    <string>r</string>
    <string>чтение</string>
  </entry>  
</tree-map>


что даёт: 
Код

<select name="type" title="каждое последующее включает все предыдущие">
  <option value="a" selected="selected">администрирование</option>
  <option value="m" >модерация</option>
  <option value="w" >запись</option>
  <option value="r" >$types.get($type)</option>
</select><br />


заковыка в "w"? если да, то в чём прикол?  smile 
PM MAIL   Вверх
Kangaroo
Дата 18.6.2008, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


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

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



Цитата(qnub @  18.6.2008,  10:06 Найти цитируемый пост)
если да, то в чём прикол? 

Смотри - у тебя получается TreeMap с ключами не в алфавитном порядке, а это противоествественно. Поэтому и .get() криво работает. Напиши свой компаратор, который будет выставлять ключам правильный порядок.

Странно как XStream так добавляет в мапу, что получается бардак.


--------------------
Lost....
PM MAIL MSN   Вверх
qnub
Дата 18.6.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ок. спасибо. буду доделывать smile
PM MAIL   Вверх
qnub
Дата 19.6.2008, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



решил проблему:

компаратор писать не стал, ибо непонятно по каким критериям сравнивать позиции, а наиболее оптимальным является вариант произвольного задания поледовательности в файле в итоге сделал так. файл опций, загружаемый XStream'ом:
Код

<?xml version="1.0" encoding="UTF-8"?>
<tree-map>
  <no-comparator/>
  <entry>
    <int>0</int>
    <string-array>
      <string>r</string>
      <string>чтение</string>
    </string-array>
  </entry>
  <entry>
    <int>1</int>
    <string-array>
      <string>w</string>
      <string>запись</string>
    </string-array>
  </entry>
  <entry>
    <int>2</int>
    <string-array>
      <string>m</string>
      <string>модерация</string>
    </string-array>
  </entry>
  <entry>
    <int>3</int>
    <string-array>
      <string>a</string>
      <string>администрирование</string>
    </string-array>
  </entry>
</tree-map>


т.е. сортировка происходит по ключу, который является целым числом и сортируется по возрастанию. а значением является одномерный массив из двух компонентов, первый из которых - значение переменной, а второй её описание, понятное человеку. в итоге добавил в контекст ListTool для Velocity:
Код

page.put("list",new ListTool());


и, собсна, генератор списка выходит такой:
Код

<select name="type" title="каждое последующее включает все предыдущие">
#foreach($type in $types.keySet())
#if($right.getType()==$type)
  #set($selected = 'selected="selected"')
#else
  #set($selected = '')
#end
  <option value="$list.get($types.get($type),0)" $selected>$list.get($types.get($type),1)</option>
#end
</select><br />


вобщем пользуйте, ежели кому нужно smile

Это сообщение отредактировал(а) qnub - 19.6.2008, 07:59
PM MAIL   Вверх
twilightDream
Дата 4.8.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



[QUOTE=pvo,3.11.2005,  09:47]
Цитата
 В один прекрасный момент нам требуется отправить  эту страницу по почте, причем не в процессе обслуживания запроса 

В ПШП такое давно есть. Можно сгенерировать страницу, затем делать с ней что угодно.
Вообще. смотря на ситуацию глобально создается впечатление что ява в вэб программировании постепенно угасает, несмотря на старания, и в скором времени перекочует в мобильники.
PM MAIL   Вверх
qnub
Дата 4.8.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ОФФТОП
думаю не надо путать тёплое с мягким... ПХП неможет многое что может ява... кроме того тема не про то

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


Эксперт
***


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

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



twilightDream, я как представитель, побывавший в 2-х лагерях, делаю свой выбор в пользу Java
PM MAIL ICQ   Вверх
Kangaroo
Дата 4.8.2008, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


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

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



Цитата(twilightDream @  4.8.2008,  13:54 Найти цитируемый пост)
смотря на ситуацию глобально создается впечатление что ява в вэб программировании постепенно угасает, несмотря на старания, и в скором времени перекочует в мобильники. 

Аффтар жжот  smile 


--------------------
Lost....
PM MAIL MSN   Вверх
twilightDream
Дата 4.8.2008, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(qnub @ 4.8.2008,  12:04)
ОФФТОП
думаю не надо путать тёплое с мягким... ПХП неможет многое что может ява... кроме того тема не про то

В теме упоминалось PHP, а так же velocity шло в сравнении с JSP. Так что тема про веб программирование. Конечно, сравнивать JSP и velocity и этим ограничиться в рамках явы, это суть темы. Но так же и PHP может именно с сфере web-программирования ой как много, чего не может ява, или нужно писать специальные пакеты. Хотя.... Конечно тема не о том, Вы правы.

Добавлено через 5 минут и 42 секунды
Цитата(Platon @ 4.8.2008,  12:14)
twilightDream, я как представитель, побывавший в 2-х лагерях, делаю свой выбор в пользу Java

Я сейчас в двух лагерях. И выбор не сделал пока что. Хотя.... Если знаю, что проект будет включать в себя web-mail для пользователей, то всегда за яву голосую, потому как там не обойтись без кучи роботов, которые постоянно обрабатывают ящики, собирают почту, анализируют квоты, рассылают автоматические сообщения, автоответчики и т.д. на яве это удобней делать. А так PHP.
PM MAIL   Вверх
SectoR
Дата 17.2.2009, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Читал сей топик долго и упорно...
и скажу следующее:

1. Поговаривают, что все Java-программисты покуривают травку?! (с)
2. Кощунство - это языки, которые заставляют программистов выполнять ненужную работу. Не расход машинного времени, а пустая трата времени программиста - вот истинная неэффективность. (с)
3. Ruby on Rails

Это сообщение отредактировал(а) SectoR - 18.2.2009, 00:45
PM   Вверх
batigoal
Дата 18.2.2009, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(SectoR @  18.2.2009,  00:30 Найти цитируемый пост)
1. Поговаривают, что все Java-программисты покуривают травку (с)

Ложь! У нас просто железы специальные есть, каннабиатно-опиатные.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
sweety_kitty
Дата 19.2.2009, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



привет! пробую ваш пример, а мне в ответ exception Exception in thread "main" org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource 'test.vm'. Я прописала classpath до папки, содержащей velocity-template, проверила- копируются в компилированные папки классов. В чем причина? 

Пользуюсь intellij idea.
PM MAIL   Вверх
Spidometrs
Дата 7.4.2009, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

В Velocity тоже не получишь чистый HTML. Обязательно будет мильён пробелов и переносов.
Положение поправит подобный servlet Trim Filter
PM MAIL   Вверх
Forsaken
Дата 22.2.2010, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Здравствуйте.
Собираюсь осваивать веб программирование для себя, вот незнаю что выбрать Velocity или Tapestry. Подскажите пожалуйста, если знаете.., насколько актуально изучение Velocity сегодня?
PM MAIL   Вверх
garbuz
Дата 22.2.2010, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Forsaken @  22.2.2010,  13:23 Найти цитируемый пост)
Здравствуйте.
Собираюсь осваивать веб программирование для себя, вот незнаю что выбрать Velocity или Tapestry. Подскажите пожалуйста, если знаете.., насколько актуально изучение Velocity сегодня? 

Думаю, что не стоит сравнивать Velocity и Tapestry, это технологии разного уровня. Первое - это движок шаблонов, второе - фрэймворк для разработки веб приложений.
Советую начать с сервлетов и jsp, этого будет более чем достаточно для начинающего.
PM MAIL   Вверх
Forsaken
Дата 22.2.2010, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



garbuz
Спасибо Вам за ответ.
Наверное действительно небуду забегать вперед, начну с jsp.
Я просто читал о том, что  Tapestry это некоторая помесь Struts+Velocity
PM MAIL   Вверх
garbuz
Дата 22.2.2010, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Forsaken @  22.2.2010,  15:57 Найти цитируемый пост)
Наверное действительно небуду забегать вперед, начну с jsp.

Только не с голых jsp, а обязательно вместе с сервлетами, не повторяйте ошибки многих.

Цитата(Forsaken @  22.2.2010,  15:57 Найти цитируемый пост)
Я просто читал о том, что  Tapestry это некоторая помесь Struts+Velocity 

Я бы не сказал.
PM MAIL   Вверх
Forsaken
Дата 22.2.2010, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



garbuz
Хорошо, сделаю как Вы советуете.
Большое спасибо за помощь!
PM MAIL   Вверх
x8m6
Дата 26.6.2010, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я правильно понимаю, что JSP и шаблонные движки используются только для того чтобы связать логику и дизайн. Почему тогда бы не использовать Wicket для этого всего? Ведь там получается "почти чистый" html. 
PM MAIL   Вверх
jk1
Дата 26.6.2010, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



x8m6, они решают разные задачи.
Wicket - фреймворк для построения web-приложений. В его задачи входит маршрутизация запросов, валидация, вызов логики.
Velocity - движок шаблонов.  Сами по себе шаблоны ничего не могут и не умеют - чистой воды представление. Некий код из web-уровня должен наполнить шаблон данными, движок шаблонов выполнит интерпретацию и тогда уже появится html-документ.
Или не html: и JSP и Velocity подходят для формирования шаблонов XML документов, да и любых других, которые могут вам пригодиться.
Более того, Velocity в отличие от Wicket можно с успехом применить в не-web-приложениях.



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Stolzen
Дата 7.6.2011, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А velocity позволяет делать наследование в шаблонах?

Вот как в django:
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    {% block media %}<link type="text/css" rel="stylesheet" href="/static/css/style.css">{% endblock %}
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    {% block body %}
    {% endblock %}
</body>
</html>


Код

{% extends "service/service_base.html" %}

{% block body %}
{% if menu_items %}
Доступные пункты меню:
<ul>
    {% for item in menu_items %}
    <li><a href="{{ item.url }}">{{ item.name }}</a></li>
    {% endfor %}
</ul>
{% endif %}
{% endblock %}



Кстати, попался мне под руки список template engines для java, может, кому-то будет полезно.
http://java-source.net/open-source/template-engines

И если не Velocity, то какой другой движок можно использовать для реализации такого наследования?

Это сообщение отредактировал(а) Stolzen - 7.6.2011, 09:34


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Embedded
Дата 7.6.2011, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Stolzen
В смысле наследование в шаблонах? Если я правильно тебя понял ты хочешь в шаблоне подключить другой шаблон, т.е. собрать главный шаблон из других шаблонов подключенных в нем в нужных местах. Если ты про это тогда, да... Velocity так может делать как два пальца...
PM MAIL   Вверх
Stolzen
Дата 7.6.2011, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Embedded
Примерно так, да.

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

Можно пример того, о чем вы говорите?



--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Embedded
Дата 7.6.2011, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Stolzen
Нет знаешь прямо так как ты сейчас описал в велосити не выйдет, выйдет иначе, может даже удобнее- если я правильно понял суть задачи...
Ну вот например твой код:

Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link type="text/css" rel="stylesheet" href="$style">
    <title>$title</title>
</head>
<body>
#parse($content)
</body>


Вот смотри что тут происходит я могу из моего ява кода передать любой объект в велосити, и он подставит любую строку какую я пожелаю в место переменной начинающейся с $ (например $title, $style или $content). Команда велосити #parse может подставить в шаблон содержимое любого другого шаблона так как будто он является частью этого. То есть я могу сделать так #parse(article.vm), а могу и вписать переменную $content как сделано у меня. Обычно когда пишут представление сайта на велосити, разделяют его на блоки скажем шапка, меню, подвал, контент и для каждого блока делают свой шаблон, затем собирают его в главном шаблоне как в моем примере выше я подключаю контент, тут появляется дополнительная гибкость.. можно в яве решать что и когда подключать.. Как бы тут наследования прямо такого нет,  - выражаясь в терминах uml есть ассоциации. 

Это сообщение отредактировал(а) Embedded - 7.6.2011, 15:01
PM MAIL   Вверх
searoso
Дата 6.3.2014, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нужно сверстать несколько шаблонов на Velocity. Пара маленьких сайтов, и один небольшой.  smile 

Кто умеет— напишите мне на почту или через jabber, плс.
PM MAIL   Вверх
Страницы: (10) [Все] 1 2 3 ... Последняя »
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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