2011-09-02 57 views
2

我想创建一个复合组件用于我的项目,所以,我创建了一个名为“componentes-ui-web”的项目,并提出了2个xhtml文件,这是我的组件。JSF 2.0复合组件到罐子

项目的结构是这样的:

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项目中,我尝试使用这个组件简单地添加罐子到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> 

当我运行应用程序时,c omponent不显示我在Firefox中收到此消息:

警告:本网页呼吁与前缀hrgi声明XML命名空间http://java.sun.com/jsf/composite/componentes,但没有标记库存在该命名空间。

我做错了什么?


更新感谢您的答复,并为已故答复对不起...

我创建了ResourceResolver像BalusC告诉,但没有成功。 我也检查了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> 
+1

对不起,我的资源解析器答案是完全错误的。它确实不适用于复合材料。然而,我想知道为什么它适用于我们目前的项目中的复合材料。它们没有在任何taglib xml文件中声明。它们只是放在JAR的'/ META-INF/resources'文件夹中(另一个重要的文件是/ META-INF/faces-config.xml),它应该符合JSF2标准。 JAR构建器将它们包含在具体的JAR文件中?您可以使用zip工具提取JAR来验证它。 – BalusC

回答

6

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

0

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