Có cách nào thích hợp để ghi đè cách JSF truy cập các trường bean từ một ngôn ngữ biểu thức không? Ý tưởng là bắt chước hành vi này để truy cập một giá trị Map<String, ?>
, trong đó các trường bean sẽ là các khóa bản đồ.Làm cho JSF truy cập vào một giá trị Map <String, ?> từ một EL thay vì một trường bean?
Nói cách khác, có thể sử dụng bất kỳ cách nào để sử dụng #{beanContainingNestedMap.keyOfSaidNestedMap}
, giống như nếu keyOfSaidNestedMap
là trường của beanContainingNestedMap
?
Nếu không, tôi có thể có giải pháp nào khác?
Ví dụ:
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" -->
Điều gì sẽ là tuyệt vời là nếu tôi có thể làm điều gì đó tương tự (loại pseudo-code vì tôi không biết nếu một phương pháp như vậy tồn tại ;)
):
@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;
}
}
}
}
Vấn đề này không phải về JSF mà là EL. Có một phần truy cập bản đồ trong [Wiki StackOverflow EL] (http://stackoverflow.com/tags/el/info). Để trích dẫn hai ví dụ: '$ {someMap [dynamicKey]}', '$ {some ['class']. SimpleName}' –
@LuiggiMendoza Cảm ơn bạn đã biết mẹo, nhưng ý tưởng đầu tiên là biết liệu có thể sử dụng '# {beanContainingAMap.keyOfTheSaidMap}' thay vào đó, giống như 'keyOfTheSaidMap' là một trường của bean. – sp00m
Nếu bạn kiểm tra liên kết được cung cấp trong bình luận của tôi, bạn sẽ thấy rằng hiện tại là không thể. Bạn phải sử dụng '# {exampleBean.holder [foo]}'. –