让JSF从EL而不是bean字段访问Map 值?
有没有正确的方法来覆盖JSF从表达式语言访问bean字段的方式? 我的想法是模仿这种行为,以便访问Map
值,其中bean字段是地图键。
换句话说,无论如何都可以使用#{beanContainingNestedMap.keyOfSaidNestedMap}
,就像keyOfSaidNestedMap
是beanContainingNestedMap
一个字段一样?
如果没有,我可以提供其他解决方案吗?
例:
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。