我开发了一个复合 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>