альтернативи jsp1

З тих пір автомобілі пройшли довгий шлях в своєму розвитку. На додаток до запаморочливого різноманітності форм кузова у нас з'явилася також можливість вибирати модель радіопріемні- ка / CD-програвача, замовляти установку електричних скло - підйомників і замків на дверях, а також матерчату або шкіряну оббивку салону. І в наш час будь-хто може купити автомобіль будь-якого кольору, включаючи чорний.

До теперішнього моменту ми використовували технологію JSP при створенні уявлень для додатка. Але, на відміну від чорної фарби Генрі Форда, JSP - не єдина технологія створення уявлень, доступна для вибору. Двома іншими популярни- ми механізмами шаблонів є Velocity і FreeMarker. Посмот- рим, як використовувати ці механізми разом з фреймворком Spring MVC.

Використання шаблонів Velocity

Velocity - простий у використанні мова шаблонів для додатка жений на Java. Шаблони Velocity не містять програмного коду на Java. що полегшує їх розуміння не тільки розробниками, а й неразработчікамі. Цитата з керівництва користувача Velocity:

«Velocity відокремлює код Java з веб-сторінок, роблячи веб-сайт більш простим для тривалого супроводу і забезпечуючи жізнеспо- собнимі альтернативу технології JavaServer Pages».

Після JSP Velocity - ймовірно, найпопулярніший мова шабло- новий для веб-додатків на основі Java. Тому цілком можли але, що у вас з'явиться бажання розробити Spring-додаток з використанням Velocity як технології реалізації рівня уявлень. На щастя, Spring підтримує Velocity як мову шаблонів рівня уявлень для Spring MVC.

Подивимося, як використовувати Velocity зі Spring MVC, реалізувавши рівень уявлень додатки RoadRantz на основі Velocity.

Визначення уявлення засобами Velocity

Припустимо, що в якості технології реалізації рівня уявлень ви вирішили використовувати Velocity замість JSP. Вище вже був представлений приклад реалізації домашньої JSP-сторінки. А тепер подивимося на шаблон Velocity - home.vm (лістинг 8.15), який використовується для відображення домашньої сторінки.

Лістинг 8.15. Реалізація домашньої сторінки на основі Velocity

Add rant

Register new motorist

#foreach ($ rant in $ rants)

Шаблони Velocity і JSP мають не так багато відмінностей. Але є одне, відразу кидається в очі, - відсутність тегів шаблону. Це обумовлено тим, що механізм Velocity не спирається на вико вання тегів, як JSP. Замість цього використовується власну мову, відомий як Velocity Template Language (VTL), що містить ін- струкції управління потоком виконання та інші директиви.

Директива #foreach в файлі home.vm використовується для організації циклу за списком елементів, відображаючи в кожній ітерації властивості чергового елемента.

Незважаючи на це відміну, вирази мови Velocity багато в чому нагадують мову JSP. Фактично JSP просто слідував по п'ятах за Velocity, використовуючи нотацію $<> у виразах свого власного мови.

Тепер, після створення шаблону, необхідно налаштувати Spring на використання шаблонів Velocity як уявлення в до- датку на основі Spring MVC.

Налаштування механізму Velocity

В першу чергу слід налаштувати сам механізм Velocity. Для цього потрібно оголосити компонент VelocityConfigurer в файлі конфі- гураціі Spring, як показано нижче:

Компонент VelocityConfigurer відповідає за настройку механізму Velocity в Spring. Властивість resourceLoaderPath визначає місце по- позову шаблонів. Я рекомендую поміщати шаблони в каталог, зна дящійся всередині каталогу WEB-INF, щоб до шаблонів не можна було звернутися безпосередньо.

Знайомі з Velocity вже знають, що настройки поведінки Velocity можна визначати в файлі velocity.properties. Однак ті ж самі настройки можна визначити за допомогою VelocityConfigurer, в свой- стве velocityProperties. Наприклад, погляньте на наступне об'явле- ня компонента VelocityConfigurer:

Дозвіл уявлень Velocity

Останнє, що необхідно зробити перед використанням шаб- лонов уявлень Velocity, - налаштувати арбітр уявлень. Зокрема, оголосіть компонент VelocityViewResolver в файлі кон- фігурації контексту, як показано нижче:

Компонент VelocityViewResolver для Velocity - майже те ж саме, що InternalResourceViewResolver для JSP. Як і InternalResourceViewResolver, він має властивості prefix і suffix, які разом з логічним име- ньому уявлення використовуються для формування шляху до шабло- ну. В даному випадку достатньо встановити тільки властивість suffix, вказавши в ньому розширення .vm. Префікс не потрібно, тому що шлях до каталогу шаблонів вже було вказано в властивості resourceLoaderPath компонента VelocityConfigurer.

Примітка. Тут атрибуту id компонента присвоєно значення viewResolver. Ця обставина грає важливу роль, коли сервлет DispatcherServlet не налаштований на пошук всіх арбітрів уявлень. Ес чи в додатку доведеться використовувати кілька арбітрів представ лений, то, ймовірно, доведеться змінити значення атрибута id на щось більш підходяще (і унікальне), таке як velocityViewResolver.

Тепер додаток готове відображати уявлення, основан- ні на шаблонах Velocity. Для цього достатньо просто повернути об'єк ект ModelAndView, що посилається на подання за його логічного імені. У випадку з HomeController робити взагалі нічого не потребует- ся, бо він вже повертає об'єкт ModelAndView:

return new ModelAndView ( "home", "rants", recentRants);

Подання має логічне ім'я home. Коли ім'я представле- ня буде визначено, до home буде додано розширення .vm, що- б сконструювати ім'я файлу шаблону home.vm. Компонент Velocity- ViewResolver знайде цей шаблон в шляху WEB-INF / velocity /.

Що стосується об'єкта моделі rants, то він буде доступний в шабло- не у вигляді властивості Velocity. У лістингу 8.15 цей об'єкт представляє колекцію, по якій директива #foreach виконує ітерації.

Форматування дат і чисел

Незважаючи на те що програма вже готове відображати представ лення Velocity, залишилося ще кілька невирішених питань. Якщо уважно вивчити шаблон home.vm (лістинг 8.15), можна заме- тить, що в home.vm відсутня форматування дат, тому було б бажано налаштувати деякі параметри і тим самим за- печити належне форматування дати.

Мова VTL не підтримує форматування дат безпосередній але. Однак в Velocity є інструменти для форматування дат і чисел. Щоб зробити їх доступними, необхідно повідомити арбітру VelocityViewResolver назви атрибутів, за допомогою кото яких ці інструменти будуть експортуватися. Імена атрибутів визначаються через властивості dateToolAttribute і numberToolAttribute компонента VelocityViewResolver:

Тут вказується, що інструмент форматування дат буде доступний в шаблоні під ім'ям $ dateTool. Тобто, щоб отформа- тировать дату, досить передати її функції format інструменту. наприклад:

Перший параметр - рядок шаблону. Тут використовується той же синтаксис, що і в java .text.SimpleDateFormat. Крім того, можна вказати один із стандартних шаблонів java .text.DateFormat, передавши у вигляді рядка шаблону одне зі значень: FULL, LONG, MEDIUM, SHORT або DEFAULT. Тут використано значення FULL, відповідне формату подання повної дати.

Як уже згадувалося, атрибут $ numberTool представляє в шаблоні Velocity інструмент для форматування чисел. За більш детальною інформацією про цей інструмент і про інструмент форматування ня дат звертайтеся до документації Velocity.

Експорт атрибутів запиту і сеансу

Більшість даних, які повинні бути відображені в шаб- лоні Velocity, можна передати поданням через об'єкт Map, ко торий передається об'єкту ModelAndView, проте іноді може потре- Бова вивести значення атрибутів таких об'єктів сервлету, як запит або сеанс. Наприклад, якщо користувач зареєструвався в додатку, в об'єкті сеансу сервлету може міститися інфор мація про користувача.

Було б дуже незручно, якби ми були змушені копі- ровать атрибути із запиту або сеансу в дані моделі в каж будинок контролері. На щастя, VelocityViewResolver може копіювати атрибути в модель автоматично. Властивості exposeRequestAttributes і exposeSessionAttributes повідомляють компоненту VelocityViewResolver про необхідність копіювання атрибутів запиту і сеансу в модель даних. наприклад:

Таблиця 8.2. Spring MVC надає колекцію макроопреде- лений Velocity для зв'язування полів форм з об'єктом

#springFormTextarea ( "rant.rantText" "rows = '5' cols = '50 '")

Для організації введення назви країни і реєстраційного но- міра використовуються макроозначення #springFormInput, що зв'язують поля введення з властивостями rant.vehicle.state і rant.vehicle.plateNumber відповідно. Це означає, що при отриманні форми, значення будуть властивості state і plateNumber властивості vehicle керуючого об'єкта (rant). В обох випадках немає необхідності визначати до- полнітельние атрибути в розмітці HTML. тому в другому пара- метр передається порожній рядок. В результаті виходить наступна розмітка HTML з полями:

State:

Plate #:

Далі слід область введення