вторник, 16 декабря 2008 г.

Создаем веб-приложение на базе Tapestry в Eclipse WTP


Здравствуйте, уважаемые читатели. Суровый челябинский программист все еще жив, он по прежнему очень суровый и временами даже челябинский.

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

Вообще есть плагин под эклипс для работы с Tapestry, но плагин очень старый, для 3й версии фреймворка. Соответственно, никаких преимуществ в его использовании я не вижу, поэтому работать будем без специальных tapestry-плагинов.

Начнем с того, что определимся с инструментарием. Итак, будем иметь:

  • Eclipse 3.4 (впрочем не принципиально, 3.2 и 3.3 тоже подойдут) с установленным WTP

  • Tapestry 5.0.15

  • Tomcat 6 (хотя работать будет и на 5-й версии)



Для тестового приложения я создаю отдельный воркспэйс. Также устанавливаю томкат, просто распаковывая zip-архив в отдельную папку (это под Windows). Папка с томкатом находится, естественно, вне воркспэйса.


Запускаем эклипс, переключаемся в перспективу J2EE. Вообще книги и туториалы по Tapestry про перспективу J2EE ничего не говорят, вероятно из-за того, что не у всех установлен WTP. Но, использование данной перспективы помогает работать с серверами, деплоем приложения и прочими вкусностями. Естественно, соответствующие виды можно открыть и вручную изспользуя меню Window -> Show View, но какой в этом смысл?

Теперь создаем новый проект Web -> Dynamic Web Project:



Запускается мастер нового проекта. В нем задаем имя проекта и самое интересное - Target Runtime. Т.е. а на чем собственно все это будет работать. Можно нажать кнопку New и выбрать сервлет-контейнер или сервер-приложения для нашей программы. Список поддерживаемых сервером очень большой. Выбираем Apache Tomcat v6.0, жмем Next в появившемся окне выбираем путь к установленному серверу и указываем используемый JRE. Жмем Finish, теперь наше приложение будет деплоится на Apache Tomcat v6.0

Далее можно выбрать поддерживаемую версию Servlet API - поле Dynamic Web Module version. Я обычно выбираю 2.4, для Tapestry этого достаточно.

Поле Configuration служит для указания конфигурации веб-приложения. Суть в том, что Eclipse умеет автоматически генерировать окружения для JSF, XDoclet и т.д. Я так понимаю можно настроить и другие (например указать совместимость с Java 1.4, использование JPA и т.д.), но с этим моментом не разбирался. Единственное, что скажу - набор опций зависит от используемого сервера и поддерживаемых им технологий.

В итоге имеем:



Жмем Next - получаем окошко настройки приложения, здесь можно задать каталог в котором будет лежать приложение, каталог в котором будут находится WEB-INF и другие файлы приложения (я обычно называю его web) и каталог для исходников Java-классов.

Окошко выглядит следующим образом:



Все, финиш. Итак, что мы имеем - вот такое дерево проекта:



Интересным тут является Deployment-descriptor, здесь мы можем визуальными средствами добавлять сервлеты, фильтры, контекст-листенеры, настройки безопастности и т.д. Естественно - все это лишь возможности визуального (т.е. Visual Studio/Delphi style) редактирования файла web.xml

Кстати, вот такой вот web.xml нам сгенерировали:

<?xml version="1.0" encoding="UTF-8"?>

<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>

    tapestry-demo</display-name>

    <welcome-file-list>

        <welcome-file>index.html</welcome-file>

        <welcome-file>index.htm</welcome-file>

        <welcome-file>index.jsp</welcome-file>

        <welcome-file>default.html</welcome-file>

        <welcome-file>default.htm</welcome-file>

        <welcome-file>default.jsp</welcome-file>

    </welcome-file-list>

</web-app>


Теперь необходимо сделать 2 вещи: настроить проект и настроить деплой проекта. Деплой проекта настраивается на вкладке Servers. Если щелкнуть в этой вкладке правой кнопкой мыши - будет меню из одного пункта New. Выбираем New -> Server. Появляется мастер добавления нового сервера, выбираем Apache Tomcat v6.0. Т.к. мы его настраивали при создании проекта - то пути уже указывать ненужно, можно лишь прописать желаемое название, которое будет отображаться на вкладке Servers.




Нажимаем Next - получаем список всех проектов в системе. ВНИМАНИЕ! В списке отображаются только проекты типа Dynamic Web Project, отдеплоить просто Java Project так не получится.

Выбираем нужный проект, жмем Finish. Все, проект отдеплоен.



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

  • Скопировать нужные библиотеки в папку web/WEB-INF/lib - чтобы они были доступны в рантайме

  • Подключить нужные библиотеки к проекту, чтобы их можно было использовать при компиляции

  • Настроить дескриптор развертывания, создать сервлеты, фильтры, параметры контекста.

  • Создать страницу и ее обработчик - для теста



Какие нам нужны библиотеки. Естественно прежде всего - servlet-api.jar (с версией не ниже 2.4) Впринципе в рантайме эта библиотека уже есть и в папку; lib ее копировать ненадо, подключить к проекту же необходимо.

Далее - сам Tapestry, по минимуму это:
- tapestry5-annotations-5.0.15.jar
- tapestry-core-5.0.15.jar
- tapestry-ioc-5.0.15.jar (в девичестве - hivemind 2)

И библиотеки, необходимые для работы Tapestry (с точностью до версии):
- slf4j-api-1.5.2.jar
- slf4j-log4j12-1.5.2.jar
- log4j-1.2.14.jar
- javassist-3.8.0GA.jar
- commons-io-1.3.jar
- commons-codec-1.3.jar

Эти файлы надо скопировать в web/WEB-INF/lib К проекту они подключатся автоматически (по крайней мере в Eclipse 3.4 и будут находится в библиотеке Web App Libraries.

В свойствах Java Build Path проекта, на вкладке Source указываем путь для компиляции: tapestry-demo/web/WEB-INF/classes

Собственно, уже можно писать код. Но чтобы все заработало надо настроить дескриптор развертывания проекта. Здесь есть 2 пути: отредактировать web.xml вручную или воспользоваться визуальными средствами эклипса. Давайте попробуем второй путь.

Прежде всего необходимо задать фильтр, который будет перехватывать все http-запросы и диспатчить их внутрь Tapestry. Для этого можно щелкнуть правой кнопкой по Deployment Descriptor -> Filters. В меню выбрать New -> Filter. Появится мастер создания фильтра запросов. Ставим галочку Use existing Filter class, в поле Class name выбираем (с помощью кнопки Browse) TapestryFilter. Жмем Next, появляется окно настройки мэпинга для фильтра. Т.е. тех урлов, при обращении к которым данный фильтр будет срабатывать. По-умолчанию там находится /TapestryFilter, меняем это на /*

Фильтр подключен, теперь Tapestry будет получать все HTTP-запросы. Но запросы надо обрабатывать, для этого необходимо создать страницы и компоненты (Tapestry - компонентно-ориентированный фреймворк). В Tapestry5 принято, что java-код страниц хранится в app-package.pages, а компонентов - app-package.components, где app-package - главный пакет приложения. Этот пакет нужно указать тейпестри-фильтру, для чего необходимо установить параметр tapestry.app-package в контексте приложения (в web.xml это тег context-param). Визуальных средств для этого нет (все таки WTP еще не до конца допилен), поэтому придется руками в web.xml прописать:

<context-param>

    <param-name>tapestry.app-package</param-name>

    <param-value>org.beq.tapestry5</param-value>

</context-param>


В итоге получается вот такой дескриптор развертывания:

<?xml version="1.0" encoding="UTF-8"?>

<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>tapestry-demo</display-name>

    <context-param>

        <param-name>tapestry.app-package</param-name>

        <param-value>org.beq.tapestry5</param-value>

    </context-param>

    <filter>

        <description>

        </description>

        <display-name>

        TapestryFilter</display-name>

        <filter-name>TapestryFilter</filter-name>

        <filter-class>org.apache.tapestry5.TapestryFilter</filter-class>

    </filter>

    <filter-mapping>

        <filter-name>TapestryFilter</filter-name>

        <url-pattern>/*</url-pattern>

    </filter-mapping>



</web-app>

 


Теперь попробуем написать простую страницу. Создаем пэкэдж org.beq.tapestry5.pages и класс org.beq.tapestry5.pages.Hello, вот такого содержания:

package org.beq.tapestry5.pages;



public class Hello {



}

 


Ну и конечно надо созать файл с разметкой страницы - Hello.tml Файлы tml хранятся в каталоге web (т.е. в том же каталоге, что и WEB-INF приложения). Для удобства работы с tml-файлами можно настроить для них html-редактор и создать шаблоны.

Наш Hello.tml будет следующего содержания:
<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">

    <h1>Tapestry 5 first page</h1>

    <p>Hello, world.</p>

</html>


Компилируем проект, идем на вкладку Servers, выбираем наш сервер Tomcat v6.0 и нажимаем кнопку Start The Server. Сервер стартует, во вкладке консоль появляется лог.

Запускаем браузер, вводим в адресную строку http://localhost:8080/tapestry-demo/Hello

Наслаждаемся:



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

Понравилось сообщение - подпишись на блог

З.Ы. Если Вы есть во Вконтакте - вступайте в группу Russian Eclipse Community.

7 комментариев:

Анонимный комментирует...

Хорошая статья. С tapestry только осваиваюсь, да и в джаве опыту пока не много.

По началу не запускалась страничка, томкат выдавал 404, посмотрел логи, оказалось нужна была ещё hibernate3.jar, у вас про неё не написано..

Всё равно спасибо..

Unknown комментирует...

Если вы используете hibernate, то естественно, что вам нужен jar с этой библиотекой. Я же показывал самое минимальное приложение, где hibernate не нужен. У меня все стартовало и работало без него.

fixxer комментирует...

А вот было бы интересно все тоже самое но через maven. В частности насколько вкусности WTP интегрированы с maven.

p104ish комментирует...

Статья то что надо!

Анонимный комментирует...

Спасибо большое!
Наконец получилосс первое tapestry-приложение :)

Unknown комментирует...

Пожалуйста. Как, кстати, впечатления от Tapestry?

Irina Derkach комментирует...

доходчиво) thanx a lot!

Отправить комментарий

Любой Ваш комментарий важен для меня, однако, помните, что действует предмодерация. Давайте уважать друг друга!