Развертывание составных компонентов JSF для совместного использования - PullRequest
3 голосов
/ 05 ноября 2011

Я работаю над проектом Java EE, который в будущем станет достаточно большим, и я хочу поделиться как можно большим количеством кода.Это включает в себя не только код Java, но и код для элементов пользовательского интерфейса.Я думаю о разработке корпоративных компонентов, основанных на четко определенных предметах (таких как администрирование пользователей, налоги, продукты), которые взаимодействуют на основе сообщений, компонентов и т. Д.Я также думаю о том, чтобы дать всем этим компонентам некоторые управляемые bean-компоненты и JSF-композиты, чтобы обеспечить некоторые базовые функциональные возможности для последующего использования в веб-интерфейсе.Это контекст ...

Чтобы конкретизировать: допустим, у меня есть EAR (um.ear) для управления пользователями.В ней у меня есть несколько сущностей JPA для подключения к базе данных (jpa.jar), и у меня есть несколько корпоративных компонентов для базовых функций, таких как аутентификация (ejb.jar).Кроме того, я хочу поместить другой файл jar в (jsf.jar), который содержит управляемый компонент LoginController для использования с составным компонентом (с вводом имени пользователя и пароля) login_box.xhtml, который я хочу разместить позже в моем веб-интерфейсе.в разные места, в зависимости от фактической страницы.

Логин_box.xhtml:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:composite="http://java.sun.com/jsf/composite"
    xmlns:e="http://java.sun.com/jsf/composite/login">
<h:head>
    <title>Login Box</title>
</h:head>
<h:body>
    <composite:interface>
    </composite:interface>
    <composite:implementation>
        <h:outputStylesheet library="css" name="login.css" target="head" />
        <div class="login_box">
            <h:form>
                <h:messages />
                <h:panelGrid columns="2" columnClasses="rightAlign,leftAlign">
                    <h:outputText value="Email address:" />
                    <h:inputText label="Email address" value="#{LoginController.email}"
                        required="true" size="8">
                        <f:validator validatorId="emailAddressValidator" />
                        <f:validateLength minimum="5" maximum="128" />
                    </h:inputText>
                    <h:outputText value="Password:" />
                    <h:inputText label="Password" value="#{LoginController.password}"
                        required="true" size="8" />
                </h:panelGrid>
                <h:commandButton action="${LoginController.login()}"
                    value="Login..." />
            </h:form>
        </div>
    </composite:implementation>
</h:body>
</html>

В моем основном приложении я хочу работать с шаблонами JSF для генерации страниц, и я хочу поставитьполе для входа с тегом на страницы по мере необходимости.

Текущая настройка:

jsf.jar inside um.ear:
|- META-INF/
|   |- faces-config.xml
|   |- web.xml
|   |- sub-web.xml
|   \- resources
|       \- login
|           \- login_box.xhtml
\- com
     |- inside it the managed bean classes

Вызывающий xhtml выглядит так:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:e="http://java.sun.com/jsf/composite/login">
<h:head>
    <title>Title</title>
</h:head>
<h:body>
    <e:login_box /> 
</h:body>
</html>

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

Когда я все делаю это в одном EAR и помещаю управляемые bean-компоненты и JSF вWAR (классы перемещаются в WEB-INF / classes и ресурсы в WEB-INF / resources) внутри EAR все работает нормально.Но как я могу развернуть управляемые bean-компоненты и JSF для последующего использования в других EAR или JAR?Я прочитал, что /META-INF/faces-config.xml будет достаточно, чтобы заставить контейнер сканировать JSF-файлы.

Мои лица-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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>

Я работаю с JBoss 6.1-Final и перепробовал все возможные места внутри JAR, что было логично для меня.Я помещаю классы и каталог ресурсов в корень '/', в / META-INF и в WEB-INF.Все это не сработало.У кого-нибудь есть предложения, что тут не так?

1 Ответ

3 голосов
/ 05 ноября 2011

Этот JAR должен заканчиваться в /WEB-INF/lib WAR (что, в свою очередь, может быть частью EAR).

Файловая структура вашего JAR-файла в порядке.

...