Czy istnieje jakiś właściwy sposób na przesłonięcie sposobu, w jaki JSF uzyskuje dostęp do pól fasoli z języka wyrażeń? Chodzi o to, aby naśladować to zachowanie, aby uzyskać dostęp do wartości Map<String, ?>
, gdzie pola fasoli byłyby kluczami map.Czy JSF ma dostęp do wartości mapy <String, ?> z pola EL zamiast pól fasoli?
Innymi słowy, czy możliwe jest korzystanie z #{beanContainingNestedMap.keyOfSaidNestedMap}
, tak jakby keyOfSaidNestedMap
było polem beanContainingNestedMap
?
Jeśli nie, jakie inne rozwiązanie mogę mieć?
przykład:
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" -->
Co byłoby świetnie brzmi, czy mogę zrobić coś takiego (rodzaju pseudo-kodu, ponieważ nie wiem, czy taka metoda istnieje ;)
):
@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;
}
}
}
}
Ten problem nie dotyczy JSF, ale EL. Istnieje sekcja dostępu do map w [wiki StackOverflow EL] (http://stackoverflow.com/tags/el/info). Aby zacytować dwa przykłady: '$ {someMap [dynamicKey]}', '$ {some ['class']. SimpleName}' –
@LuiggiMendoza Dziękujemy za porady, ale pomysł był pierwszy wiedzieć, czy jest to możliwe zamiast tego użyj '# {beanContainingAMap.keyOfTheSaidMap}, tak jakby' keyOfTheSaidMap' było polem komponentu bean. – sp00m
Jeśli zaznaczysz link podany w moim komentarzu, zobaczysz, że obecnie nie jest to możliwe. Musisz użyć '# {exampleBean.holder [foo]}'. –