Gibt es eine geeignete Möglichkeit, die Art und Weise, wie JSF auf die Beans-Felder von einer Ausdruckssprache zugreift, außer Kraft zu setzen? Die Idee ist, dieses Verhalten nachzuahmen, um auf Map<String, ?>
Werte zuzugreifen, wobei die Bean-Felder die Map-Schlüssel wären.Machen Sie JSF Zugriff auf eine Karte <String, ?> Werte von einer EL statt einer Bean-Felder?
Mit anderen Worten, ist es jedenfalls möglich #{beanContainingNestedMap.keyOfSaidNestedMap}
zu verwenden, als ob keyOfSaidNestedMap
ein Feld der beanContainingNestedMap
waren?
Wenn nicht, welche andere Lösung könnte ich haben?
Beispiel:
Holder.java
public class Holder {
private Map<String, Object> objects = new HashMap<String, Object>();
public void add(String key, Object value) {
objects.put(key, value);
}
public Object getObject(String key) {
return objects.get(key);
}
}
ExampleBean.java
public class ExampleBean {
private Holder holder = new Holder();
public ExampleBean() {
holder.add("foo", 42);
holder.add("bar", 'X');
}
public Holder getHolder() {
return holder;
}
}
example.xhtml
<c:out value="#{exampleBean.holder.foo}" /> <!-- should print "42" -->
<c:out value="#{exampleBean.holder.bar}" /> <!-- should print "X" -->
Was groß ist, wäre, wenn ich so etwas wie tun könnte (eine Art Pseudo-Code, da ich weiß nicht, ob eine solche Methode besteht ;)
):
@Override // override JSF's (if any...)
public Object resolveEl(String el) {
try {
super.resolveEl(el);
} catch (ElException e) {
Object bean = e.getBean();
String fieldName = e.getFieldName();
if (bean instanceof Holder) {
Holder holder = (Holder) bean;
Object value = holder.getObject(fieldName);
if (value == null) {
throw e;
} else {
return value;
}
}
}
}
Bei diesem Problem handelt es sich nicht um JSF, sondern um EL. Es gibt einen Kartenzugriffsbereich im [StackOverflow EL Wiki] (http://stackoverflow.com/tags/el/info). Um zwei Beispiele zu nennen: '$ {someMap [dynamicKey]}', '$ {einige ['Klasse']. SimpleName}' –
@LuiggiMendoza Danke für die Tipps, aber die Idee war zuerst zu wissen, ob es irgendwie möglich ist Verwenden Sie '# {beanContainingAMap.keyOfTheSaidMap}' stattdessen, als wäre 'keyOfTheSaidMap' ein Feld der Bean. – sp00m
Wenn Sie den Link in meinem Kommentar überprüfen, werden Sie feststellen, dass dies derzeit nicht möglich ist. Sie müssen '# {exampleBean.holder [foo]}' 'verwenden. –