部署 JSF 复合组件以供共享使用
Posted
技术标签:
【中文标题】部署 JSF 复合组件以供共享使用【英文标题】:Deploy JSF composite components for shared use 【发布时间】:2011-12-22 17:25:06 【问题描述】:我在一个 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 前端到不同的位置,取决于实际的页面。
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>
在我的主应用程序中,我想使用 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 内容。
我的面孔-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】:那个 JAR 必须在 WAR 的 /WEB-INF/lib
中结束(这又可以是 EAR 的一部分)。
你的 JAR 文件结构没问题。
【讨论】:
感谢您的快速回答。我会试试看。但是,有没有办法将 um.ear 放入 JBoss 并从那里使用复合材料? EJB 只需部署一次... 不可能。在 JBoss 中,WAR 有自己的类加载器,它无法访问 EAR 中的库。 谢谢! JSF 的东西现在可以工作了。我现在明白了,JSF 的东西需要在一个地方组装起来进行渲染。现在我遇到了跨 EAR 的远程 EJB 的问题。这可能会成为另一个问题,当我直到明天才弄清楚时...... ;-)以上是关于部署 JSF 复合组件以供共享使用的主要内容,如果未能解决你的问题,请参考以下文章