Показаны сообщения с ярлыком Tomcat. Показать все сообщения
Показаны сообщения с ярлыком Tomcat. Показать все сообщения

среда, 14 января 2009 г.

JSF для Tomcat

JSF входит в поставку любого JEE-сервера приложений, но не в ходит в Tomcat, так как Tomcat только лишь контейнер Web-приложений, но никак не JEE-сервер.

Однако можно заставить Tomcat работать как полноценный сервер JSF-приложений. И сейчас я расскажу как это сделать по шагам. (Будем считать, что у вас уже установлен и работает Apache Tomcat 6.0).


  1. Загрузите архив mojarra-1.2_09-b02-FCS-binary.zip с сайта https://javaserverfaces.dev.java.net/
    Распакуйте из этого архива библиотеки jsf-api.jar и jsf-impl.jar и положите их в каталог CATALINA_HOME/lib.

  2. Перенесите библиотеки jstl.jar и standard.jar из каталога CATALINA_HOME/webapps/examples/WEB-INF/lib в каталог CATALINA_HOME/lib.

  3. Создайте тестовое JSF-приложение.
    Структура каталогов:

    CATALINA_HOME/webapps/loginjsf
    |-WEB-INF
    | |-classes
    | | |-com
    | | |-corejsf
    | | |-UserBean.class
    | |-web.xml
    | |-faces-config.xml
    |-index.html
    |-index.jsp
    |-welcome.jsp

    Исходник UserBean.java:

    package com.corejsf;

    public class UserBean {
    private String name;
    private String password;

    // PROPERTY: name
    public String getName() { return name; }
    public void setName(String newValue) { name = newValue; }

    // PROPERTY: password
    public String getPassword() { return password; }
    public void setPassword(String newValue) { password = newValue; }
    }

    Содержимое файла
    CATALINA_HOME/webapps/loginjsf/WEB-INF/web.xml:

    <?xml version="1.0"?>
    <web-app 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-app_2_5.xsd"
    version="2.5">
    <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.faces</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    </web-app>


    Содержимое файла
    CATALINA_HOME/webapps/loginjsf/WEB-INF/faces-config.xml:

    <?xml version="1.0"?>
    <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_1_2.xsd"
    version="1.2">
    <navigation-rule>
    <from-view-id>/index.jsp</from-view-id>
    <navigation-case>
    <from-outcome>login</from-outcome>
    <to-view-id>/welcome.jsp</to-view-id>
    </navigation-case>
    </navigation-rule>

    <managed-bean>
    <managed-bean-name>user</managed-bean-name>
    <managed-bean-class>com.corejsf.UserBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
    </faces-config>

    Содержимое файла
    CATALINA_HOME/webapps/loginjsf/WEB-INF/index.html:

    <html>
    <head>
    <meta http-equiv="Refresh" content= "0; URL=index.faces"/>
    <title>Start Web Application</title>
    </head>
    <body>
    <p>Please wait for the web application to start.</p>
    </body>
    </html>

    Содержимое файла
    CATALINA_HOME/webapps/loginjsf/WEB-INF/index.jsp:

    <html>
    <%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
    <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
    <f:view>
    <head>
    <title>A Simple JavaServer Faces Application</title>
    </head>
    <body>
    <h:form>
    <h3>Please enter your name and password.</h3>
    <table>
    <tr>
    <td>Name:</td>
    <td>
    <h:inputText value="#{user.name}"/>
    </td>
    </tr>
    <tr>
    <td>Password:</td>
    <td>
    <h:inputSecret value="#{user.password}"/>
    </td>
    </tr>
    </table>
    <p>
    <h:commandButton value="Login" action="login"/>
    </p>
    </h:form>
    </body>
    </f:view>
    </html>

    Содержимое файла
    CATALINA_HOME/webapps/loginjsf/WEB-INF/welcome.jsp:

    <html>
    <%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
    <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>

    <f:view>
    <head>
    <title>A Simple JavaServer Faces Application</title>
    </head>
    <body>
    <h:form>
    <h3>
    Welcome to JavaServer Faces,
    <h:outputText value="#{user.name}"/>!
    </h3>
    </h:form>
    </body>
    </f:view>
    </html>

  4. Откройте строку адреса http://127.0.0.1:8080/loginjsf/ в окне броузера и убедитесь, что JSF-приложение работает.


Литература



Дополнительно


Включить по умолчанию отдачу контента в кодировке UTF-8 можно в server.xml Tomcat'а:

< connector
executor="tomcatThreadPool"
port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="utf-8"
useBodyEncodingForURI="utf-8"/>

вторник, 8 апреля 2008 г.

Apache Tomcat 6.0 во FreeBSD 7.0

Apache Tomcat как Web-сервер? Почему нет?

Контейнер JavaServer Pages и Java Servlets по совместительству может выполнять функции Web-сервера. То есть нативные Web-сервера, получается, не так уж нужны, учитывая потенциальную небезопасность кода C/C++, на котором они написаны.

Предпосылки

Итак, Apache Tomcat, написанный на 100% pure-Java ЯП, вполне способен справиться с возложенными на него функциями Web-сервера.

Пока же мне нужно ввести в опытную эксплуатацию Web-сервер на домашней машине — Локалхосте — как любят выражаться прадвинутые одмины. Ну что ж, за дело!

Решение

1. Установка Apache Tomcat 6.0 во FreeBSD не должна вызвать трудностей. Порт ports/www/tomcat6 устанавливается обычным образом.

2. Для обеспечения удалённого управления Apache Tomcat нужно отредактировать файл /usr/local/apache-tomcat6.0/conf/tomcat-users.xml
Задание аккаунта менеджера сервера:

< ?xml version='1.0' encoding='utf-8'?>
< tomcat-users>
< role rolename="manager"/>
< user username="tomadmin" password="secretword" roles="manager"/>
< /tomcat-users>


3. Чтобы Apache Tomcat прослушивал порт 8080 и обеспечивал обработку запросов через пул, необходимо в файле /usr/local/apache-tomcat6.0/conf/server.xml раскомментировать блок

< Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />


Возможно, также понадобиться добавить в файл /usr/local/apache-tomcat6.0/bin/catalina.sh переменные окружения JAVA_HOME и CATALINA_HOME с абсолютными путями к каталогам JDK и Tomcat, соответственно, если Tomcat почему-либо не может быть запущен системой. Можно также задать переменную CATALINA_TMPDIR с каталогом /tmp в качестве местоназначения, чтобы переопределить путь по умолчанию $CATALINA_BASE/temp. Мне понадобилось внести в файл catalina.sh только эти две строки с переменными:

JAVA_HOME=/usr/local/jdk1.6.0/
CATALINA_TMPDIR=/tmp


4. Автозапуск Apache Tomcat можно обеспечить, если в файл /etc/rc.conf прописать следующую строчку:

tomcat60_enable="YES"


Также можно прописать дополнительные опции:

tomcat60_java_opts="-server"
tomcat60_java_home="/usr/local/jdk1.6.0"

Опция -server обеспечивает запуск Tomcat с серверной версией JVM, которая отличается более агрессивным сборщиком мусора GC, несколько другой стратегией управления памятью и JIT. Вторая строчка задаёт домашний каталог рабочего JDK.

После этого можно перезагрузить машину и проверить, запустился ли сервер:

> sockstat
...
www java 697 28 tcp4 *:8180 *:*
www java 697 30 tcp4 *:8080 *:*
www java 697 39 tcp4 *:8009 *:*
www java 697 40 tcp4 127.0.0.1:8005 *:*
...

Как видите, Web-сервер запущен и прослушивает порты 8180, 8080, 8009 и 8005.

Чтобы просмотреть стартовую страничку Apache Tomcat, в любом браузере на локальной машине достаточно ввести URL:

http://127.0.0.1:8080/


5. Apache Tomcat запускается и прослушивает входящие соединения на непривелегированных интернет-портах, что несколько неуклюже для настоящего Web-сервера. Запуск Tomcat на порту 80 возможен только от имени root'а.

Решение проблемы прослушивания служебного порта HTTP :80 Tomcat возможно с использованием механизма перенаправления IP-пакетов, доступного в IPFW и PF. Я выбрал PF в качестве перенаправителя пакетов со служебных портов на порты, которые прослушивает Tomcat в обычном состоянии.

PF доступен в системе в виде модуля ядра. Для автоматического запуска PF при старте системы необходимо в файле /etc/rc.conf прописать следующие строчки:

pf_enable="YES"
pf_rules="/etc/pf.conf"


Запуск пакетного фильтра в работающей системе осуществляется командой:

% pfctl -e

(Останов, соответственно — pfctl -d).

В файл /etc/pf.conf достаточно добавить правила перенаправления для известных портов (всего две строчки):

rdr on nve0 proto tcp from any to any port 80 -> 127.0.0.1 \
port 8080
rdr on nve0 proto tcp from any to any port 81 -> 127.0.0.1 \
port 8081

(здесь: nve0 — сетевой интерфейс, на котором ожидаются HTTP-соединения с Tomcat)

Проверка новых правил на пакетном фильтре выполняется командой:

% pfctl -nf /etc/pf.conf

И, если нет никаких ошибок в правилах, их можно активировать:

% pfctl -f /etc/pf.conf


Apache Tomcat будет откликаться из Интернет на URL вида:
http://<внешний inet-address>/


Возможные проблемы

Проблемы могут возникнуть с выполнением JSP из-за невозможности изменения содержимого рабочего каталога /usr/local/apache-tomcat6.0/work/, так как Tomcat имеет непривелегированные права пользователя www.
В этом случае достаточно удалить содержимое каталога командой:
% rm -rf /usr/local/apache-tomcat6.0/work/*

Впоследствии кэш будет создан заново самим Tomcat без особых проблем.

Также встречалась проблема с невозможностью ответа сервера Tomcat на клиентский http-запрос. Пересборка Sun J2SE JDK 1.6 из порта ports/java/jdk16 без опции поддержки IPv6 решило данную проблему.

Послесловие

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

Безусловно, эта статья не претендует на точность изложения всех аспектов развёртывания и конфигурирования Apache Tomcat и PF, а лишь отражает общие принципы работы этой связки.

Пока на этом всё.