当我在jsp中使用它时
<c:out value="${map[keyObject.keyProp]}"/>
我没有获得null键的任何输出.有没有办法让null键在jsp中工作?
似乎使用标准EL实现获取null键值的唯一方法是在地图上调用get()方法(考虑到你说keyObject.keyProp解析为Integer对象):<c:out value="${map.get(keyObject.keyProp)}" />
我测试了这个解决方案并且有效.
实际上,在这种情况下,您可以轻松地在没有< c:out />的情况下进行操作,只需在您需要的地方使用普通EL,例如:
${map.get(keyObject.keyProp)}
简单的例子:
TestMapServlet.java
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); } }
测试map.jsp
<%@ 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><c:out value="\${map.get(noValueInt)}" /> </b>: <c:out value="${map.get(noValueInt)}" /></p> <p><b><c:out value="\${map[one]}" /> </b>: <c:out value="${map[one]}" /></p> <p><b><c:out value="\${map[two]}" /> </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>
web.xml中
<?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>
重要的提示
为了能够使用EL调用带有参数的方法,您必须使用最小的Servlet版本3.0.
从这里引用:https://stackoverflow.com/tags/el/info
Since EL 2.2, which is maintained as part of Servlet 3.0 / JSP 2.2
(Tomcat 7, Glassfish 3, JBoss AS 6, etc), it’s possible to invoke
non-getter methods, if necessary with arguments.
除了上述解决方案,您还可以使用自定义统一表达式语言实现,例如具有替代解决方案的JUEL.
解释为什么不能(在标准实现中)使用[]和自定义解决方案通过空键访问地图值的原因可以在Java Unified Expression Language (JUEL) documentation中找到(段落中的重点是我的):
2.5. Advanced Topics
…
Enabling/Disabling null
PropertiesThe EL specification describes the evaluation
semantics ofbase[property]
. If property is null, the specification
states not to resolve null on base. Rather, null should be returned if
getValue(...)
has been called and aPropertyNotFoundException
should
be thrown else. As a consequence, it is impossible to resolve null as
a key in a map. However, JUEL’s expression factory may be configured
to resolve null like any other property value. To enable (disable)
null as an EL property value, you may set property
javax.el.nullProperties
to true (false).Assume that identifier map resolves to a
java.util.Map
.
If feature
javax.el.nullProperties
has
been disabled, evaluating${base[null]}
as an rvalue (lvalue) will
return null (throw an exception).If feature
javax.el.nullProperties
has been enabled, evaluating${base[null]}
as an rvalue (lvalue) will
get (put) the value for key null in that map. The default is not to
allow null as an EL property value.…
希望这会有所帮助.