如何在JSP中使用null键获取Map值

时间:2013-01-17 21:07:55

标签: java jsp map el

我从控制器传递给JSP Map<Integer, Object>。有一个带有默认值的null键,这意味着map.get(null)返回一个默认对象。 keyObject.keyProp是整数,可能为空。

当我在jsp中使用它时

<c:out value="${map[keyObject.keyProp]}"/>

我没有获得null键的任何输出。有没有办法让空键在jsp中工作?

1 个答案:

答案 0 :(得分:10)

似乎使用标准EL实现获取null密钥值的唯一方法是在地图上调用get()方法(考虑到您说{ {1}}解析为 Integer 对象):

keyObject.keyProp

我测试了这个解决方案并且有效。

实际上,在这种情况下,您可以轻松地使用<c:out value="${map.get(keyObject.keyProp)}" /> ,只需在您需要的地方使用普通EL,例如。

<c:out />

简单示例:

TestMapServlet.java

${map.get(keyObject.keyProp)}


测试map.jsp

package com.example;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;

import java.util.Map;
import java.util.HashMap;

import java.io.IOException;

public class TestMapServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
                    throws ServletException, IOException {
        Map<Integer, Object> map = new HashMap<Integer, Object>();
        Integer noValueInt = null;
        Integer one = new Integer(1);
        Integer two = new Integer(2);

        map.put(noValueInt, "Default object for null Integer key");
        map.put(one, "Object for key = Integer(1)");
        map.put(two, "Object for key = Integer(2)");

        request.setAttribute("map", map);
        request.setAttribute("noValueInt", noValueInt);
        request.setAttribute("one", one);
        request.setAttribute("two", two);

        request.getRequestDispatcher("/test-map.jsp").forward(request, response);
    }
}


的web.xml

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
    <title>Home Page</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
    <h1>Testing access to java.util.Map using just EL</h1>
    <p><b>\${map.get(noValueInt)}</b>: ${map.get(noValueInt)}</p>
    <p><b>\${map[one]}</b>: ${map[one]}</p>
    <p><b>\${map[two]}</b>: ${map[two]}</p>

    <h1>Testing access to java.util.Map using JSTL and EL</h1>
    <p><b>&lt;c:out value="\${map.get(noValueInt)}" /&gt; </b>: <c:out value="${map.get(noValueInt)}" /></p>
    <p><b>&lt;c:out value="\${map[one]}" /&gt; </b>: <c:out value="${map[one]}" /></p>
    <p><b>&lt;c:out value="\${map[two]}" /&gt; </b>: <c:out value="${map[two]}" /></p>

    <h2>Printing java.util.Map keys and values (when Key = null, the <i>null</i> won't be shown)</h2>
    <c:forEach items="${map}" var="entry">
        <p><b>Key</b> = "${entry.key}", <b>Value</b> = "${entry.value}"</p>
    </c:forEach>
</body>
</html>


重要提示
为了能够使用EL调用带参数的方法,必须使用最小的 Servlet 3.0版 从这里引用:https://stackoverflow.com/tags/el/info

  

从EL 2.2开始,它作为Servlet 3.0 / JSP 2.2的一部分进行维护   (Tomcat 7,Glassfish 3,JBoss AS 6等),它可以调用   非必要的方法,必要时带参数。


除了上述解决方案之外,您还可以使用自定义统一表达式语言实施,例如具有替代解决方案的JUEL

使用<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <servlet> <servlet-name>Test Map Servlet</servlet-name> <servlet-class>com.example.TestMapServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Test Map Servlet</servlet-name> <url-pattern>/TestMap.do</url-pattern> </servlet-mapping> </web-app> 来访问 map 解释原因(在标准实现中) null可以在Java Unified Expression Language (JUEL) documentation中找到自定义解决方案(段落中的重点是我的):

  

<强> 2.5。高级主题

...

启用/禁用null   属性

EL规范描述了评估   []的语义。如果property为null,则为规范   声明不要在基础上解决null。相反,如果是,则应返回null   base[property]已被调用,getValue(...)应该被调用   被抛出其他。因此,无法将null解析为   地图中的一个键。但是,可以配置 JUEL的表达式工厂   像任何其他属性值一样解析null 。启用(禁用)   null作为EL属性值,您可以设置属性   PropertyNotFoundException为真(假)。

     

假设标识符地图解析为javax.el.nullProperties

     
      
  • 如果功能java.util.Map有   被禁用,将javax.el.nullProperties评估为右值(左值)   return null(抛出异常)。

  •   
  • 如果功能${base[null]}   已启用,将javax.el.nullProperties评估为右值(左值)   获取(放置)该映射中的键null值。默认不是   允许null作为EL属性值。

  •   
     

...

希望这会有所帮助。