JAVA

индекс
157,29

Настраиваем Tomcat для работы с JSF2 и другими компонентами Java EE 6

Данная статья описывает по шагам как настроить Tomcat (на текущий момент версия 6.0.26) на работу с разными компонентами Java EE 6.Вы можете пропустить чтение этой статьи и сразу получить настроенный Tomcat и пример приложения.

Tomcat

Почему именно Tomcat а не Glassfish V3? Для меня важно использование именно Tomcat т.к. он компактен, быстро работает и легко объединяется в кластер под управлением Apache Httpd. V3 пока не умеет работать в кластере.

Установка

  1. Установите JDK 6.
  2. Настройте переменную окружения JAVA_HOME
  3. Скачайте архив apache-tomcat-6.0.26.zip и распакуйте в текущую папку. Будет создана папка apache-tomcat-6.0.26.
Для запуска:
> bin/startup.(bat|sh) - откроет новое окно или
> bin/catalina.(bat|sh) run - запустит в новом окне.
Для увеличения памяти и возможности отладки перед запуском catalina.bat можно указать переменную окружения JAVA_OPTS:
set JAVA_OPTS=-Xmx512m -XX:MaxPermSize=256m -Xdebug -Xrunjdwp:transport=dt_socket,address=1025,server=y,suspend=n
export JAVA_OPTS=-Xmx512m -XX:MaxPermSize=256m -Xdebug -Xrunjdwp:transport=dt_socket,address=1025,server=y,suspend=n

Unified EL 2.2

Язык выражений нужен как в JSP при использовании библиотек тэгов, так и в facelets. Основные улучшения в новой версии (см. список нововведений) — возможность вызывать методы, в т.ч. с параметрами.
${application.getRealPath('/data')}

Установка

  1. Удалите lib/el-api.jar из Tomcat.
  2. Скопируйте реализацию el-api-2.2.jar и el-impl-2.2.jar в папку lib в Tomcat. Это jar-ы из Glassfish V3.
  3. Добавьте в WEB-INF/web.xml в вашем приложении следующие строки:
    <context-param>
    <param-name>com.sun.faces.expressionFactory</param-name>
    <param-value>com.sun.el.ExpressionFactoryImpl</param-value>
    </context-param>
К сожалению после обновления языка выражений Jasper (реализация компилятора JSP в Tomcat) не понимает новые выражения и они не могут быть использованы в JSP. Если вы хотите, чтобы Tomcat везде использовал новый язык выражений (а не свою реализацию org.apache.el) нужно перекомпилировать Tomcat. Подробности здесь (на англ. языке). Также пункт 3 будет не нужен.

Mojarra

Первая реализация JSF 2. Стабильно и быстро работает. Помимо реализации JSF нам также понадобится установить JSTL 1.2.

Установка

  1. Скачайте mojarra-2.0.2-FCS-binary.zip
  2. Скопируйте из архива из папки mojarra-2.0.2-FCS/lib jsf-api.jar и jsf-impl.jar в папку WEB-INF/lib вашего приложения.
  3. Скопируйте jstl 1.2 в папку WEB-INF/lib вашего приложения.
  4. Добавьте в WEB-INF/web.xml в вашем приложении следующие строки:
    <servlet>
        <servlet-name>FacesServlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>FacesServlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
  5. Создайте файл WEB-INF/faces-config.xml в вашем приложении:
    <faces-config xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
      version="2.0">
    </faces-config>

Weld

Weld реализует спецификацию JSR 299 Contexts and Dependency Injection.Вкратце Weld позволяет устанавливать значения полей автоматически с помощью аннотаций.

Установка

  1. Скачайте weld-1.0.1-Final.zip
  2. Создайте файл WEB-INF/beans.xml со следующим содержимым:
    <?xml version="1.0" encoding="UTF-8"?>
    <beans/>
    Это нужно чтобы Weld сканировал веб-приложение на предмет Java-Beans которые будут участвовать в CDI.
  3. Скопируйте weld-1.0.1-Final/artifacts/weld/weld-tomcat-support.jar из архива в lib папку в Tomcat.
  4. Cоздайте в вашем приложении файл META-INF/context.xml со следующим содержимым:
    <?xml version="1.0" encoding="UTF-8"?>
    <Context>
    <!-- Declare Weld Bean Manager -->
    <Resource name="BeanManager"
        auth="Container"
        type="javax.enterprise.inject.spi.BeanManager"
        factory="org.jboss.weld.resources.ManagerObjectFactory"/>
    <!-- For Weld to support Servlet Injection -->
    <Listener className="org.jboss.weld.environment.tomcat.WeldLifecycleListener"/>
    </Context>
  5. Скопируйте weld-1.0.1-Final/artifacts/weld/weld-servlet.jar из архива в папку WEB-INF/lib вашего приложения.
  6. Добавьте в WEB-INF/web.xml следующие строки:
    <!-- Weld listener -->
    <listener>
        <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
    </listener>
    <!-- Reference to Weld Bean Manager -->
    <resource-env-ref>
        <description>Object factory for the CDI Bean Manager</description>
        <resource-env-ref-name>BeanManager</resource-env-ref-name>
        <resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type>
    </resource-env-ref>

Hibernate Validator

JSR 303 Bean Validation дает простой способ применения правил валидации как для JSF так и для JPA. Данные правила определяются через аннотации к полям в Java Beans:
@NotNull@Size(min = 1)
private String username;

Установка

  1. Скачайте hibernate-validator-4.0.2.GA-dist.zip
  2. Скопируйте hibernate-validator-4.0.2.GA/hibernate-validator-4.0.2.GA.jar из архива в папку WEB-INF/lib вашего приложения.
  3. Скопируйте из папки в архиве hibernate-validator-4.0.2.GA/lib дополнительные библиотеки slf4j-api-1.5.6.jar, validation-api-1.0.0.GA.jar в папку WEB-INF/lib вашего приложения.

EclipseLink

JPA позволяет сохранять в БД Java Beans без использования SQL. Нужные вызовы и если нужно схема БД создается автоматически. При этом используется простой интерфейс EntityManager. К сожалению т.к. Tomcat не является полноценным Java EE сервером то некоторые возможности JPA (управление транзакциями, автоматическое получение EntityManager) не доступны. Также все объекты которые будут сохранятся в БД должны быть описаны в файле конфигурации.

Установка

  1. Данная установка предполагает что у вас настоена MySQL БД на локальном компьютере. Пароль у root пользователя БД — "" (пустой пароль).
  2. Cкачайте драйвер для БД и положите JAR в папку lib в Tomcat.
  3. Скачайте eclipselink-2.0.1.v20100213-r6600.zip
  4. Скопируйте eclipselink/jlib/jpa/javax.persistence_2.0.0.v201002051058.jar из архива в папку WEB-INF/lib вашего приложения.
  5. Скопируйте eclipselink/jlib/eclipselink.jar из архива в папку WEB-INF/lib вашего приложения.
  6. Создайте в вашем приложении файл WEB-INF/classes/META-INF/persistence.xml со следующим содержимым:
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="1.0"
    xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
        <persistence-unit name="sample" transaction-type="RESOURCE_LOCAL">
            <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
            <!-- <class>your.class.Here</class> -->
            <exclude-unlisted-classes>false</exclude-unlisted-classes>
            <properties>
                <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
                <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/test"/>
                <property name="javax.persistence.jdbc.user" value="root"/>
                <property name="javax.persistence.jdbc.password" value=""/>
                <property name="eclipselink.logging.logger" value="JavaLogger" />
                <property name="eclipselink.logging.level" value="FINEST"/>
                    <!-- Can specify: create-tables, drop-and-create-tables -->
                <property name="eclipselink.ddl-generation" value="create-tables"/>
                <property name="eclipselink.ddl-generation.output-mode" value="database"/>
                <property name="eclipselink.target-database" value="MYSQL"/>
                <property name="eclipselink.jdbc.native-sql" value="true"/>
            </properties>
        </persistence-unit>
    </persistence>

Скачать


Ccылки

* Source code was highlighted with Source Code Highlighter.
* Подготовлено в ХабраРедакторе.
+24
21 марта 2010, 17:29
36

комментарии (11)

+5
damwihu #
Откройте для себя maven.
0
damwihu #
А комментарии к минусам будут? Что не так-то? Вы уверены что абсолютно все приложения под данным сервлет контейнером используют hibernate-validator именно 4.0.2 версии? Подкладывание таких jar в lib томката сродни установке софта с помощью ./configure && make && make install в линуксе.
0
huksley #
Это не я :-). Нет задачи чтобы все приложения использовали hibernate-validator версии 4.0.2. Если не нравится вручную подкладывать jar-ы — используйте Glassfish V3.

Maven, насколько я понимаю, данную конкретную задачу без настройки не решит.
0
damwihu #
Хм, прошу прощения, но все таки я был не прав. :) Данные манипуляции имеют экспериментальный характер и вряд ли под данным инстансом томката будет использоваться что-то еще. Мавен конечно хорош, но я признаю что данную проблему только им не решить. Спасибо за статью, руководствовался именно ей, когда надумал покрутить j2ee 6. :)
0
corpor #
Статья — список заметок «для себя, чтоб не забыть». Как руководство для новичков, имхо, не юзабельно полностью. Сильно отталкивает «необходимо перекомпилировать tomcat, как это сделать — первоисточник».
+1
huksley #
Вы правы. А насчет «необходимо перекомпилировать tomcat, как это сделать — первоисточник» — это не обязательно. JSF2 будет работать и без этого.
0
corpor #
)))А если я к такому tomcat-у простенькое приложение на jsp подкину? Оно нормально там приживется?
0
huksley #
Насколько я понимаю — да. Jasper будет использовать JSP 2.1 реализацию EL — org.apache.el. Вот как раз после рекомпиляции могут быть проблемы т.к. неожиданно будет подъезжать новая реализация, особенное если Jasper зависит от нестандартного поведения org.apache.el.

Мне кажется вы плохо прочитали статью и приложенную ссылку чтобы делать выводы. Было бы правильно попробовать как вы говорите «подкинуть простенькое приложение Tomcat-у».
0
corpor #
Я повторюсь, но чтоб до конца выяснить — как можно прочитать список нотаций?! Если бы это было связанное логическое описание некоей последовательности — то да. А здесь я заметил, что «валятся» стандартные либы томката — меняются сторонними и вот просто решил обратить на это внимание, поскольку я лично не сторонник таких действий, если это можно обойти, включив необходимые библиотеки в проект! Вот, собственно, и состоит мой интерес в том, что этот шаг, описанный вами, обязателен или можно по-человечески все оформить, не думаю, чтобы ребята при реализации нового JSF оставили такую ж… разработчикам!
0
huksley #
Просто в составе Tomcat 6.x идет EL API соотв. версии JSP 2.1. Просто подложить внутрь приложения el-api-2.2.jar не удастся (все равно будет использоваться та версия которая находится в папке lib Tomcat-а). В Tomcat 7 этого делать не надо — там уже будет использоваться EL 2.2 по умолчанию. Но пока даже альфы нет.

Это минимальные изменения — радует то, что JSF2 не требует Servlet API 3.0, иначе запустить под Tomcat 6 не было бы никаких шансов.
0
corpor #
Понятно, пасиб за разъяснения!

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