基于布尔条件渲染复合组件

时间:2013-05-02 15:34:59

标签: jsf-2 composite-component

我开发了一个复合JSF 2组件,它运行得很好。 在我使用自定义组件的其中一个页面中,必须根据布尔条件呈现复合组件。 与JSF标准组件中的呈现属性非常相似。

所以我试着像这样实现它:

    <cc:interface componentType="ciudadComponent">
        <cc:attribute name="paises" type="java.util.List" required="true" />
        <cc:attribute name="departamentos" type="java.util.List" required="true" />
        <cc:attribute name="ciudades" type="java.util.List" required="true" />
        <cc:attribute name="name"  type="java.lang.String" required="true" />
        <cc:attribute name="value" type="org.colfuturo.model.to.CiudadTO" required="true"## Heading ## />
        <cc:attribute name="etiquetaPais" type="java.lang.String"  />
        <cc:attribute name="etiquetaBotonOK" type="java.lang.String"  />
        <cc:attribute name="etiquetaBotonCancelar" type="java.lang.String"  />
        <cc:attribute name="etiquetaDepartamento" type="java.lang.String"  />
        <cc:attribute name="etiquetaCiudad" type="java.lang.String"  />
        <cc:attribute name="styleClass" type="java.lang.String"  />
        <cc:attribute name="backGroundColor" type="java.lang.String" default="#b0c4de"  />
        <cc:attribute name="rendered" type="java.lang.Boolean" required="false" default="true" />
    </cc:interface>
    <cc:implementation>
        <h:inputText id="seleccionado" binding="#{cc.seleccionado}" disabled="true" rendered="#{cc.rendered}">
            <f:converter converterId="CiudadConverter" />
        </h:inputText>
    </cc:implementation>

在我插入复合组件的页面中,它是这样的:

<gambatte:ciudad
    paises="#{menuTreeBean.listaPaises}"
    departamentos="#{menuTreeBean.listaDepartamentos}"
    ciudades="#{menuTreeBean.listaCiudades}" styleClass="mySelectStyle"
    etiquetaBotonOK="#{msg['perfil.common.btnOK']}" etiquetaBotonCancelar="#{msg['perfil.common.btnCancelar']}"
    etiquetaPais="#{msg['perfil.common.lblPais']}"
    etiquetaDepartamento="#{msg['perfil.common.lblDepartamento']}"
    etiquetaCiudad="#{msg['perfil.common.lblCiudad']}" name="otraSedeCiudad"
    value="#{EstudiosRealizadosBean.otraSedeCiudad}"  
    rendered="#{EstudiosRealizadosBean.showOtraSede()}"  />

方法EstudiosRealizadosBean.showOtraSede()返回java.lang.Boolean。

渲染页面时出现以下异常:

java.lang.IllegalArgumentException: rendered

我该如何解决这个问题? 我也试图设置一个布尔条件,但引发了同样的异常

我发布了我的整个组件代码:

<?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:c="http://java.sun.com/jstl/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:cc="http://java.sun.com/jsf/composite">


<cc:interface componentType="ciudadComponent">
    <cc:attribute name="paises" type="java.util.List" required="true" />
    <cc:attribute name="departamentos" type="java.util.List" required="true" />
    <cc:attribute name="ciudades" type="java.util.List" required="true" />
    <cc:attribute name="name"  type="java.lang.String" required="true" />
    <cc:attribute name="value" type="org.colfuturo.model.to.CiudadTO" required="true" />
    <cc:attribute name="etiquetaPais" type="java.lang.String"  />
    <cc:attribute name="etiquetaBotonOK" type="java.lang.String"  />
    <cc:attribute name="etiquetaBotonCancelar" type="java.lang.String"  />
    <cc:attribute name="etiquetaDepartamento" type="java.lang.String"  />
    <cc:attribute name="etiquetaCiudad" type="java.lang.String"  />
    <cc:attribute name="styleClass" type="java.lang.String"  />
    <cc:attribute name="backGroundColor" type="java.lang.String" default="#b0c4de"  />
    <cc:attribute name="cacheInterface" type="org.colfuturo.business.interfaces.IServicioCache" required="false" />
</cc:interface>

<cc:implementation>
    <span id="#{cc.clientId}" style="white-space:nowrap">
        <h:inputText id="seleccionado" binding="#{cc.seleccionado}" disabled="true" >
            <f:converter converterId="CiudadConverter" />
        </h:inputText>
        <a4j:commandButton execute="@none" immediate="true" value=".."  oncomplete="document.getElementById('#{cc.attrs.name}').style.position = 'absolute'; document.getElementById('#{cc.attrs.name}').style.display = 'inline-block';" />
        <br />
        <ui:fragment>
        <div id="#{cc.attrs.name}" layout="block" style="border-radius: 10px; background-color:#{cc.attrs.backGroundColor}; display:none;" >
            <table border="0">
                <tr>
                    <td><h:outputText value="#{cc.attrs.etiquetaPais}" /></td>
                    <td>
                        <rich:select id="pais" binding="#{cc.pais}" styleClass="#{cc.attrs.styleClass}" defaultLabel="Seleccione un País" >
                            <f:selectItems value="#{cc.listaPaises}" />
                            <f:ajax event="selectitem" execute="@this" listener="#{cc.updatePais}" />
                        </rich:select>
                    </td>                   
                </tr>
                <tr>
                    <td><h:outputText value="#{cc.attrs.etiquetaDepartamento}" /></td>
                    <td>
                        <rich:select  id="departamento" binding="#{cc.departamento}" styleClass="#{cc.attrs.styleClass}" defaultLabel="Seleccione un Departamento" >
                            <f:selectItems value="#{cc.listaDepartamentos}" />
                            <f:ajax event="selectitem" execute="@this" listener="#{cc.updateDepartamento}" />
                        </rich:select>
                        <a4j:outputPanel layout="block" binding="#{cc.panelOtroDepartamento}" >
                            <h:inputText id="otroDepartamento" binding="#{cc.otroDepartamento}"  >
                                <f:ajax event="keyup" listener="#{cc.enableSubmit}" execute="@this otraCiudad" />
                            </h:inputText>
                        </a4j:outputPanel>
                    </td>                   
                </tr>
                <tr>
                    <td><h:outputText value="#{cc.attrs.etiquetaCiudad}" /></td>
                    <td>
                        <rich:select  id="ciudad" binding="#{cc.ciudad}" styleClass="#{cc.attrs.styleClass}" defaultLabel="Seleccione una Ciudad" >
                            <f:selectItems value="#{cc.listaCiudades}" />
                            <f:ajax event="selectitem" execute="@this" listener="#{cc.updateCiudad}" />
                        </rich:select>
                        <a4j:outputPanel layout="block" binding="#{cc.panelOtraCiudad}" >
                            <h:inputText id="otraCiudad" binding="#{cc.otraCiudad}" >
                                <f:ajax event="keyup" listener="#{cc.enableSubmit}" execute="@this otroDepartamento" />
                            </h:inputText>
                        </a4j:outputPanel>
                    </td>
                </tr>
                <tr>
                    <td>
                        <h:commandButton value="#{cc.attrs.etiquetaBotonOK}" disabled="true" binding="#{cc.botonAcccion}" onclick="document.getElementById('#{cc.attrs.name}').style.position = 'absolute'; document.getElementById('#{cc.attrs.name}').style.display = 'none';"  >
                            <f:ajax execute="ciudad" listener="#{cc.submit}"  />
                        </h:commandButton>      
                    </td>
                    <td>
                        <a4j:commandButton value="#{cc.attrs.etiquetaBotonCancelar}" execute="@none" immediate="true" oncomplete="document.getElementById('#{cc.attrs.name}').style.position = 'absolute'; document.getElementById('#{cc.attrs.name}').style.display = 'none';" />
                    </td>
                </tr>
            </table>
        </div>
        </ui:fragment>
        <div style="display:block;" ></div>
    </span>
</cc:implementation>

</html>

1 个答案:

答案 0 :(得分:4)

摆脱<cc:attribute name="rendered">

UIComponent类中定义了already,其中<cc:implementation>来自。{1}}。您无需重新定义它。顺便说一下,同样的故事适用于idbinding属性。

您也不需要在复合组件的第一个孩子上重新应用rendered="#{cc.rendered}"。你也可以摆脱它。 <my:composite rendered>已经适用于整个复合组件本身。