2012-10-15 21 views
6

Ho il seguente componente composito:condizionale rendono attributo di elemento in un componente composito

<?xml version="1.0" encoding="UTF-8"?> 
<ui:component xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:c="http://java.sun.com/jsp/jstl/core" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:fn="http://java.sun.com/jsp/jstl/functions" 
    xmlns:composite="http://java.sun.com/jsf/composite"> 

    <composite:interface> 
     <composite:attribute required="true" name="field" /> 
     <composite:attribute required="true" name="value" /> 
     <composite:attribute required="false" name="size"/> 
    </composite:interface> 

    <composite:implementation> 
    ... 
      <div class="wrapper"> 
       <h:inputText value="#{cc.attrs.value}" 
        id="#{field.id}" 
        rendered="#{field.rendered}" 
        size="#{cc.attrs.size}"> 
       </h:inputText> 
       <h:messages for="#{field.id}" styleClass="errorMessage"/> 
      </div> 
    ... 
    </composite:implementation> 
</ui:component> 

Il problema è che quando sto utilizzando questo componente senza impostare l'attributo size, viene comunque riprodotto come size=0 nel elemento di input html.

Quello che voglio è rendere l'attributo nidificato h:inputText solo se ha un valore valido (ad esempio non vuoto). In alternativa, vorrei esporre tutti gli attributi dell'elemento nidificato se non sono sovrascritti esplicitamente.

Come sarebbe possibile?

+0

Prestare attenzione ai tag, un componente composito non è un componente personalizzato. Vedi anche http://stackoverflow.com/questions/5704620/what-is-the-difference-between-custom-components-and-composite-components – BalusC

+0

Grazie per la correzione. Ne sono consapevole, ma sono stato un po 'incurante, forse ho bisogno di un paio di minuti di pausa: S –

risposta

10

È possibile utilizzare JSTL <c:if> per costruire la vista condizionale e <f:attribute> per specificare un attributo separatamente:

<h:inputText ...> 
    <c:if test="#{not empty cc.attrs.size}"> 
     <f:attribute name="size" value="#{cc.attrs.size}" /> 
    </c:if> 
</h:inputText> 

Un'alternativa è quella di specificare un valore predefinito per l'attributo componente composito:

<cc:attribute name="size" required="false" default="10" /> 
+0

Grazie! Funziona ma è strano per me che se aggiungo direttamente \t '' or '' Ricevo 'javax.servlet.ServletException: argomento type mismatch' e se aggiungo' 'Ottengo' Preventivo aperto per l'attributo "value" '. –

+0

Deve essere un 'Integer', non' String'. – BalusC

+0

Sì, ma come aggiungere un 'Integer' nell'attributo' value'? Con le virgolette viene interpretato come 'String', senza virgolette l'eccezione è diversa. –

1

aggiuntive al post di BalusC:

È necessario utilizzare

type = "int" nel cc: attributo-tag:

cc: nome attributo = tipo "maxlength" = "int"

0

Credo che ci sia un metodo alternativo per accedere attributi. Ho usato questo con JSF 2 quando si accede a un attributo chiamato con una parola chiave riservata java.

{cc.attrs ['size']}

Problemi correlati