我Map<Integer, Object>从控制器传递给JSP.有一个带有默认值的null键,这意味着map.get(null)返回一个默认对象.keyObject.keyProp是整数,可能为null.
当我在jsp中使用它时
<c:out value="${map[keyObject.keyProp]}"/>
Run Code Online (Sandbox Code Playgroud)
我没有获得null键的任何输出.有没有办法让null键在jsp中工作?
inf*_*k01 10
似乎null使用标准EL实现获取密钥值的唯一方法是在地图上调用get()方法(考虑到你说keyObject.keyProp解析为Integer对象):
<c:out value="${map.get(keyObject.keyProp)}" />
Run Code Online (Sandbox Code Playgroud)
我测试了这个解决方案并且有效.
实际上,在这种情况下,您可以轻松地完成<c:out />,只需在您需要的地方使用普通EL,例如
${map.get(keyObject.keyProp)}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
测试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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
重要说明
为了能够使用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等)的一部分维护的,因此可以在必要时使用参数调用非getter方法.
除了上述解决方案,您还可以使用自定义统一表达式语言实现,例如具有替代解决方案的JUEL.
一个原因解释这是不可能的(在标准执行)来访问地图由数值null 键使用[]和定制的解决方案中可以找到Java的统一表达式语言(JUEL)文档(重点段落是我的):
2.5.高级主题
...启用/禁用空属性
EL规范描述了评估语义base[property].如果property为null,则规范声明不在基础上解析null.相反,如果getValue(...)已经调用了null,则应该返回null, 并且PropertyNotFoundException应该抛出其他值.因此,无法将null解析为地图中的键.但是,JUEL的表达式工厂可以配置为像任何其他属性值一样解析null.要启用(禁用)null作为EL属性值,可以将property设置javax.el.nullProperties为true(false).假设标识符映射解析为a
java.util.Map.
如果
javax.el.nullProperties已禁用功能,则评估${base[null]}为右值(左值)将返回null(抛出异常).如果
javax.el.nullProperties已启用功能,则评估${base[null]}为rvalue(左值)将获取(放置)该映射中的键null值.默认情况下不允许null作为EL属性值....
希望这会有所帮助.
| 归档时间: |
|
| 查看次数: |
4693 次 |
| 最近记录: |