部署 JSF 复合组件以供共享使用

2024-06-21

我从事一个 Java EE 项目,该项目计划在未来变得相当大,我想共享尽可能多的代码。这不仅包括 Java 代码,还包括 UI 元素的代码。我考虑开发基于明确定义的主题(如用户管理、税收、产品)的企业组件,这些组件在消息、bean 等的基础上进行交互。我还考虑为所有这些组件提供一些托管 bean 和 JSF 组合,以提供一些基本功能供以后在 Web UI 中使用。这就是上下文...

具体来说:假设我有一个用于用户管理的 EAR (um.ear)。在其中,我有一些用于数据库连接的 JPA 实体 (jpa.jar),还有一些用于身份验证等基本功能的企业 Bean (ejb.jar)。此外,我想在 (jsf.jar) 中放入另一个 jar 文件,其中包含一个托管 bean LoginController,用于与复合组件(带有用户名和密码的输入)login_box.xhtml 一起使用,我想稍后将其放入我的 Web 前端到不同的位置,取决于实际页面。

登录框.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 内容放入 EAR 内的 WAR 中(类移至 WEB-INF/classes,资源移至 WEB-INF/resources)时,一切工作正常。但是,如何部署托管 bean 和 JSF 内容以便以后在其他 EAR 或 JAR 中使用?我读到 /META-INF/faces-config.xml 足以强制容器扫描 JSF 内容。

我的 faces-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 中。所有这一切都不起作用。有人有建议吗,这里出了什么问题?


该 JAR 必须最终位于内部/WEB-INF/libWAR(它又可以是 EAR 的一部分)。

您的 JAR 的文件结构很好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

部署 JSF 复合组件以供共享使用 的相关文章

随机推荐