让JSF从EL而不是bean字段访问Map 值?

有没有正确的方法来覆盖JSF从表达式语言访问bean字段的方式? 我的想法是模仿这种行为,以便访问Map值,其中bean字段是地图键。

换句话说,无论如何都可以使用#{beanContainingNestedMap.keyOfSaidNestedMap} ,就像keyOfSaidNestedMapbeanContainingNestedMap一个字段一样?

如果没有,我可以提供其他解决方案吗?


例:

Holder.java

 public class Holder { private Map objects = new HashMap(); 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

     

如果我可以做类似的事情(因为我不知道这样的方法是否存在;)可以做一些伪代码),那将是多么伟大的事情;) ):

 @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; } } } } 

您可以直接使用EL映射。

Holder.java

 public class Holder { private Map objects = new HashMap(); public void add(String key, Object value) { objects.put(key, value); } public Map getObjectsMap() { return objects; } } 

EL

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

这个问题不是关于JSF而是EL。 如@BalusC评论中所述,您可以直接使用Map对象已经需要/需要的符号。 我已经准备了一个基本的例子(注意:这只是一个例子,应该保持原样或改进,因为它使用了scriptlet, 我们必须避免使用scriptlet,但是要进行快速的脏测试):

 <%@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" %>     Insert title here   <% //Scriptlets usage, sorry. This code must be moved to a Servlet or another controller component //defining the map Map aMap = new HashMap(); //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); %>  ${aMap.userLM.firstName} - ${aMap.userLM.lastName}   

用户类代码(为测试目的最小化):

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

这会生成一个打印的JSP页面:

 Luiggi - Mendoza 

请注意,这个(除了scriptlet部分)也可以在Facelets页面上工作,因为这是EL而不是JSF。