JSF 2.0复合组件进入jar

时间:2011-09-02 13:57:50

标签: jar jsf-2 facelets composite-component

我正在尝试创建一个复合组件以在我的项目中使用,因此,我创建了一个名为“componentes-ui-web”的项目,并推出了2个xhtml文件,这些文件是我的组件。

项目结构如下:

src
> |-> main
> >       |->java
> >          |->META-INF
> >              |->faces-config.xml
> >              |->resources
> >                    |->componentes
> >                           |->popupSimples.xhtml
> >                           |->popupSubmit.xhtml

这是popupSubmit.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:ui="http://java.sun.com/jsf/facelets"
        xmlns:icecore="http://www.icefaces.org/icefaces/core"
        xmlns:ice="http://www.icesoft.com/icefaces/component"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:c="http://java.sun.com/jsp/jstl/core"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:composite="http://java.sun.com/jsf/composite"
        xmlns:ace="http://www.icefaces.org/icefaces/components">
    <composite:interface>
        <composite:attribute name="modal" default="false" />
        <composite:attribute name="visivel" default="false" />
        <composite:attribute name="style" default="" />
        <composite:attribute name="titulo" default="Sem título definido" />
        <composite:attribute name="exibidoQuandoTipoUsuario" default="" />
        <composite:attribute name="metodoFechar"
        method-signature="java.lang.Void fechar()" required="true" />
        <composite:attribute name="metodoSubmeter"
        method-signature="java.lang.Void submeter()" required="true" />
        <composite:facet name="conteudo" />
    </composite:interface>
    <composite:implementation>
        <h:form>
            <ice:panelPopup modal="#{cc.attrs.modal}"
                    renderedOnUserRole="#{cc.attrs.exibidoQuandoTipoUsuario}"
                    draggable="#{cc.attrs.modal}" rendered="#{cc.attrs.visivel}"
                    clientOnly="true" autoCentre="true" style="#{cc.attrs.style}">
                <f:facet name="header">
                    <ui:insert name="barraDeTitulos">
                        <ice:panelLayout layout="flow" style="width:100%">
                            <h:outputText value="#{cc.attrs.titulo}" style="float:left" />
                            <h:commandLink value="[X]" style="float:right"
                                action="#{cc.attrs.metodoFechar}" immediate="true" />
                        </ice:panelLayout>
                    </ui:insert>
                </f:facet>
                <f:facet name="body">
                    <ice:panelLayout layout="flow" style="width:100%">              
                        <composite:renderFacet name="conteudo" />
                        <ui:insert name="barraDeBotoes">
                            <ice:panelLayout layout="flow">
                                <ace:pushButton value="CANCELAR" immediate="true"
                                    style="float:right" action="#{cc.attrs.metodoFechar}" />
                                <ace:pushButton value="OK" style="float:right"
                                    action="#{cc.attrs.metodoSubmeter}" />
                            </ice:panelLayout>
                        </ui:insert>
                    </ice:panelLayout>
                </f:facet>
            </ice:panelPopup>
        </h:form>
    </composite:implementation>
</html>

在另一个Web项目中,我尝试使用此组件,只需将该jar添加到lib(maven)并添加标记:

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:icecore="http://www.icefaces.org/icefaces/core"
xmlns:ice="http://www.icesoft.com/icefaces/component"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:hrgi="http://java.sun.com/jsf/composite/componentes"
xmlns:ace="http://www.icefaces.org/icefaces/components">
<ui:component>
    <f:loadBundle basename="com.hrgi.web.configuracoes.messages"
    var="configuracoesMsg" />   
        <hrgi:popupSubmit modal="true" visivel="true"
    titulo="#{configuracoesMsg['popup.importador_nfe.titulo']}"
    exibidoQuandoTipoUsuario="ROLE_ADMINISTRADOR"
    metodoFechar="#{controladorPopupConfiguracaoImportadorNFe.fechar}"
    metodoSubmeter="#{controladorPopupConfiguracaoImportadorNFe.submeter}">
    <f:facet name="conteudo">
          ...
    </hrgi:popupSubmit>
</ui:component>
</html>

当我运行应用程序时,组件未显示,我在firefox中收到此消息:

  

警告:此页面调用使用前缀hrgi声明的XML名称空间http://java.sun.com/jsf/composite/componentes,但该名称空间不存在taglibrary。

我做错了什么?


更新感谢您的回复,并对迟到的回答感到抱歉...

我已经创建了像BalusC一样的ResourceResolver,但没有成功。 我也检查了tomcat的输出,但没有发现任何错误。

这是我的web.xml文件,也许有人可以找到任何可以帮助我的内容。 我也会搜索ResourceHandler。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        version="3.0">
    <display-name>teste-zk</display-name>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
        <url-pattern>/icefaces/*</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name>
        <param-value>com.hrgi.web.ui.FaceletsResourceResolver</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>server</param-value>
    </context-param>
    <context-param>
        <param-name>com.sun.faces.enableMissingResourceLibraryDetection</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
        <param-value>false</param-value>
    </context-param>    
    <servlet>
        <servlet-name>Resource Servlet</servlet-name>
        <servlet-class>com.icesoft.faces.webapp.CompatResourceServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Resource Servlet</servlet-name>
        <url-pattern>/xmlhttp/*</url-pattern>
    </servlet-mapping>
</web-app>

2 个答案:

答案 0 :(得分:6)

我已经解决了这个问题。我查看了jar文件,没有看到带有xhtml文件的META-INF / resources文件夹。所以我将META-INF文件夹从src / main / java更改为src / main / resources。它工作

答案 1 :(得分:0)

您应该检查安装的ResourceHandler是否可以在JAR文件中找到库和资源(popupSubmit.xhtml)。使用ResourceResolver无济于事,因为它用于facelets(ui:xxx和facelet视图)。如果有一些ResourceHandler包装器阻止了库和资源的定位,或类路径上的其他一些问题,那么可以看到你正在查看的警告。