2013-07-26 10 views
5

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; 
      } 
     } 
    } 
} 
+0

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}' –

+0

@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

+0

Jeśli zaznaczysz link podany w moim komentarzu, zobaczysz, że obecnie nie jest to możliwe. Musisz użyć '# {exampleBean.holder [foo]}'. –

Odpowiedz

13

Możesz bezpośrednio użyć mapy według EL.

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 Map<String, Object> getObjectsMap() { 
     return objects; 
    } 

} 

EL

#{exampleBean.holder.objectsMap[your-key]} 
+2

Czy [twój klucz] może być wyrażeniem dynamicznym? – MounirReg

+0

Czy [twój klucz] może być wyrażeniem dynamicznym? Każda pomoc –

+0

@AnkitKumar: To zależy od twojej logiki, jeśli chcesz skonstruować dynamiczny klucz, możesz użyć '

-1

Ten problem nie chodzi o JSF, ale EL. Jak wspomniano w komentarzu @BalusC, możesz bezpośrednio użyć notacji, którą już chcesz/potrzebujesz z obiektami Map. Mam przygotowany podstawowy przykład na to (uwaga: jest to tylko przykład i powinien pozostać jako jest lub ulepszone ponieważ używa scriptlets i we must avoid scriptlets usage ale zrobiłem to na szybką brudnej testu):

<%@page import="edu.home.model.entity.User"%> 
<%@page import="java.util.HashMap"%> 
<%@page import="java.util.Map"%> 
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Insert title here</title> 
</head> 
<body> 
    <% 
     //Scriptlets usage, sorry. This code must be moved to a Servlet or another controller component 
     //defining the map 
     Map<String, User> aMap = new HashMap<String, User>(); 
     //defining a value for the map 
     User user = new User(); 
     user.setFirstName("Luiggi"); 
     user.setLastName("Mendoza"); 
     //adding the value in the map 
     aMap.put("userLM", user); 
     //making the map accesible in EL through PageContext attribute 
     pageContext.setAttribute("aMap", aMap); 
    %> 
    <!-- Accessing directly to the userLM key and its attributes --> 
    ${aMap.userLM.firstName} - ${aMap.userLM.lastName} 
</body> 
</html> 

użytkownika kod klasy (zminimalizowany do celów testowych):

public class User { 
    private String firstName; 
    private String lastName; 
    //empty constructor 
    //getters and setters 
} 

to generuje stronę JSP, która drukuje:

Luiggi - Mendoza 

Zauważ, że ten (z wyjątkiem części skrypty) będzie działać na stronie Facelets także ponieważ to jest EL, a nie JSF.

Powiązane problemy