我正在从事一个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 /类,并将资源移至WEB-INF /资源)时,一切正常。但是,我该如何部署托管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必须以WAR的/WEB-INF/lib
结尾(后者又可以是EAR的一部分)。
您的JAR的文件结构很好。