# Code in JSF-Seite



## gman (8. Jan 2010)

Hallo zusammen,

ich habe eine JSF-Seite die den Inhalt einer Tabelle auflistet (also das "R" in "CRUD"). Die Tabelle hat eine Spalte "Verfügbarkeit" mit true/false als Wert. Nun möchte ich aber gerne das in der Tabelle "Yes/No" steht. Ich habe folgenden Code versucht, damit wird aber gar kein Wert ausgegeben:


```
<h:column>
                        <f:facet name="header">
                            <h:outputText value="#{bundle.ListProductTitle_available}"/>
                        </f:facet>
                        <c:if test="#{item.available.equals('FALSE')}">
                            <h:outputText value="No"/>
                        </c:if>
                        <c:if test="#{item.available.equals('TRUE')}">
                            <h:outputText value="Yes"/>
                        </c:if>
                    </h:column>
```

Hat einer von euch ne Idee wie man das hinbekommt?


----------



## nocturne (8. Jan 2010)

Du kannst ja eine TLD erstellen und mit dem BeanShellInterpreter ein Javacode übergeben.

	...<tlib-version>2.0</tlib-version>
	<short-name>bs</short-name>
	<uri>http://www.bs.de/tld/bs</uri>
	<function>
		<name>return</name>
		<function-class>de.bs.web.BSUtil</function-class>
		<function-signature>java.lang.Object inter(java.lang.Object, java.lang.String)</function-signature>
	</function>...

mit 
public static Object inter(Object param, String javacode){
  Interpreter inter = new Interpreter();
  inter.set("param",param);
  return inter.eval(javacode);
}

und dann : #{bs:return(item,'return param.available==true')}




so hast du für die Zukunft ausgesorgt


----------



## gman (9. Jan 2010)

Hm,

danke erstmal für deinen Vorschlag. Aber geht das nicht auch mit einfachem Code in der Seite selbst? Ich weiss das das nicht so schön ist, aber nun mal schneller gemacht ;-)


----------



## maki (9. Jan 2010)

Dafür gibt es doch Converter.


----------



## gman (10. Jan 2010)

Jawoll,

die Lösung mit einem Converter ist sogar noch besser als das mit Code in der Seite zu lösen. Jetzt reicht ein einfaches:


```
<h:outputText value="#{item.available}" converter="boolConverter"/>
```

mit dem entsprechenden Converter:


```
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

@FacesConverter(value="boolConverter")
public class BoolConverter implements Converter {

    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        return convert(value.toString());
    }

    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return convert(value.toString());
    }

    private String convert(String value){
        if(value.equalsIgnoreCase("true"))
            return "Yes";
        else
            return "No";
    }
}
```

wobei der vielleicht noch besser ausfallen kann. Das ist jetzt nur die Lösung auf die schnelle.


----------



## maki (10. Jan 2010)

Sieht doch gut aus 

Konverter sind ein wichtiges Element von JSF, da der Client eigentlich nur Strings unterstützt braucht man diese oft, wenn man zB. Objekte eigener Klassen an die View sendet & zurück.


----------



## Prismapanda (10. Jan 2010)

Eine weitere Möglichkeit wäre folgendes:

```
<h:column>
  <f:facet name="header">
     <h:outputText value="#{bundle.ListProductTitle_available}"/>
  </f:facet>
  <h:outputText value="#{(item.available eq 'TRUE') ? 'Yes' : 'No'}" />
</h:column>
```


----------



## gman (10. Jan 2010)

Das wäre genau das was ich ursprünglich gesucht hatte, danke. Aber ich glaube ich gewöhne mir lieber die Sache mit den Convertern an


----------

