2012-10-15 8 views
6

Ich habe folgende Verbundkomponente:Bedingtes Elements des Attributs in einem Verbundbauteil machen

<?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> 

Das Problem ist, dass, wenn ich diese Komponente bin mit, ohne seine size Attribut einstellen, ist es immer noch als size=0 in der gerendert wird HTML-Eingabeelement

Was ich will, ist das verschachtelte h:inputText Attribut nur dann rendern, wenn es einen gültigen Wert (zB nicht leer) hat. Alternativ möchte ich alle Attribute des verschachtelten Elements offen legen, wenn sie nicht explizit überschrieben werden.

Wie wäre es möglich?

+0

Bitte seien Sie vorsichtig mit der Kennzeichnung, eine zusammengesetzte Komponente ist keine benutzerdefinierte Komponente. Siehe auch http://stackoverflow.com/questions/5704620/what-is-the-difference-between-custom-components-and-composite-components – BalusC

+0

Danke für die Korrektur. Ich bin mir dessen bewusst, aber ich war ein bisschen sorglos, vielleicht brauche ich ein paar Minuten Pause: S –

Antwort

10

Sie können JSTL verwenden <c:if> die Ansicht bedingt und <f:attribute> zu bauen separat ein Attribut angeben:

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

Eine Alternative ist es, einen Standard für das Verbundbauteil Attribut angeben:

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

Danke! Es funktioniert, aber es ist komisch für mich, wenn ich direkt hinzufügen \t '' oder '' Ich bekomme 'javax.servlet.ServletException: argument type mismatch' und wenn ich' 'Ich bekomme' Open quote wird für das Attribut "value" 'erwartet. –

+0

Es muss ein 'Integer' sein, nicht' String'. – BalusC

+0

Ja, aber wie fügt man eine 'Integer' in das' value' Attribut ein? Bei Anführungszeichen wird es als "String" interpretiert, ohne Anführungszeichen ist die Ausnahme anders. –

1

Zusatz zu BalusC's Beitrag:

Sie müssen

verwenden

type = "int" in der cc: attribute-tag:

cc: attribute name = "maxlength" type = "int"

0

Ich glaube, es wird eine alternative Methode für den Zugriff auf Attribute. Ich habe dies mit JSF 2 beim Zugriff auf ein Attribut verwendet, das mit einem reservierten Java-Schlüsselwort benannt wurde.

{cc.attrs ['Größe']}

Verwandte Themen