2009-09-15 5 views
0

je ne peux pas utiliser une valeur de haricots dans mon contrôle personnalisé .: par exemple:ne peut pas utiliser des valeurs de haricots dans facelets composant personnalisé

c'est mon fichier foo.taglib.xml.

<facelet-taglib> 
    <namespace>http://www.penguenyuvasi.org/tags</namespace> 
    <tag> 
    <tag-name>test</tag-name> 
    <component> 
     <component-type>test.Data</component-type> 
    </component> 
    </tag> 
</facelet-taglib> 

faces-config.xml

<component> 
    <component-type>test.Data</component-type> 
    <component-class>test.Data</component-class> 
    </component> 

test.Data classe

package test; 

import java.io.IOException; 
import javax.faces.component.UIComponentBase; 
import javax.faces.context.FacesContext; 

public class Data extends UIComponentBase { 

    private Object msg; 

    @Override 
    public String getFamily() { 
    return "test.Data"; 
    } 

    @Override 
    public void encodeBegin(FacesContext context) throws IOException { 
    super.encodeBegin(context); 
    context.getResponseWriter().write(msg.toString()); 
    } 

    public void setMsg(Object msg) { 
    this.msg = msg; 
    } 
} 

Bean.java:

package test; 

public class Bean { 

    private String temp = "vada"; 

    public String getTemp() { 
    return temp; 
    } 
} 

test.xhtml (ne fonctionne pas)

<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:py="http://www.penguenyuvasi.org/tags"> 
    <py:test msg="#{bean.temp}" /> 
</html> 

test.xhtml (travaux)

<py:test msg="#{bean.temp}" /> 

Répondre

0

Dans votre classe test.Data, je vous suggère de mettre en œuvre le getter pour msg comme ça:

public String getMsg() { 
    if (msg != null) { 
     return msg; 
    } 
    ValueBinding vb = getValueBinding("msg"); 
    if (vb != null) { 
     return (String) vb.getValue(getFacesContext()); 
    } 
    return null; 
} 

Et puis, dans votre encodeBegin méthode:

... 
context.getResponseWriter().write(getMsg()); 
... 

Cette méthode getter est nécessaire afin d'évaluer l'expression que vous pouvez donner à l'attribut msg dans votre page JSF.

Modifier, utiliser expressionvaleur au lieu du ValueBinding désapprouvée:

ValueExpression ve = getValueExpression("msg"); 
if (ve != null) { 
    return (String) ve.getValue(getFacesContext().getELContext()); 
} 
+0

Merci beaucoup. Excellente solution Informations supplémentaires: ValueBinding est obsolète. ValueExpression doit être utilisé. –

+0

Oui, en effet, ValueExpression doit être utilisé à la place. – romaintaz

+0

ValueExpression ve = getValueExpression ("msg"); if (ve! = Null) { return (Chaîne) ve.getValue (getFacesContext(). GetELContext()); } –