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

Jakarta ee 部署JSF复合组件以供共享使用,jakarta-ee,jsf-2,facelets,java-ee-6,Jakarta Ee,Jsf 2,Facelets,Java Ee 6,我在一个JavaEE项目上工作,该项目计划在将来变得相当大,我想分享尽可能多的代码。这不仅包括Java代码,还包括UI元素的代码。我考虑基于明确定义的主题(如用户管理、税收、产品)开发企业组件,这些主题基于消息、bean等进行交互。我还考虑为所有这些组件提供一些托管bean和JSF组合,以提供一些基本功能,供以后在web UI中使用。这就是背景 具体来说:假设我对用户管理有一个EAR(um.EAR)。其中我有一些用于数据库连接的JPA实体(JPA.jar),还有一些用于身份验证等基本功能的企业b

我在一个JavaEE项目上工作,该项目计划在将来变得相当大,我想分享尽可能多的代码。这不仅包括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前端的不同位置,具体位置取决于实际页面

login_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>
调用的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内容

My 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/lib
中结束(而战争又可能是EAR的一部分)


您的JAR文件结构很好。

谢谢您的快速回答。我会试试看。但是,有没有一种方法可以将um.ear放到JBoss中,并从那里使用复合材料呢?EJB只部署一次…不可能。在JBoss中,WAR有自己的类加载器,它不能访问EAR中的libs。谢谢!JSF的东西现在可以工作了。我现在明白了,JSF的东西需要在一个地方组装起来进行渲染。现在我遇到了跨耳朵远程EJB的问题。这可能会成为另一个问题,直到明天我才弄明白……;-)
<?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>