Java 如何在JSP中使用null键获取映射值
我有一个Java 如何在JSP中使用null键获取映射值,java,jsp,map,el,Java,Jsp,Map,El,我有一个映射从控制器传递到JSP。有一个带有默认值的null键,这意味着map.get(null)返回一个默认对象keyObject.keyProp为整数,可能为空 当我在jsp中使用它时 <c:out value="${map[keyObject.keyProp]}"/> 我没有得到空键的任何输出。有没有办法让空键在jsp中工作?看来,使用标准EL实现获取null键值的唯一方法是调用映射上的get()方法(考虑到您所说的keyObject.keyProp解析为整数对象):
映射
从控制器传递到JSP。有一个带有默认值的null键,这意味着map.get(null)
返回一个默认对象keyObject.keyProp
为整数,可能为空
当我在jsp中使用它时
<c:out value="${map[keyObject.keyProp]}"/>
我没有得到空键的任何输出。有没有办法让空键在jsp中工作?看来,使用标准EL实现获取
null
键值的唯一方法是调用映射上的get()
方法(考虑到您所说的keyObject.keyProp
解析为整数对象):
简单的例子: TestMapServlet.java
package.com.example;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入javax.servlet.ServletException;
导入java.util.Map;
导入java.util.HashMap;
导入java.io.IOException;
公共类TestMapServlet扩展了HttpServlet{
受保护的void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
Map Map=newhashmap();
整数noValueInt=null;
整数1=新整数(1);
整数二=新整数(2);
put(noValueInt,“空整数键的默认对象”);
put(一个,“键的对象=整数(1)”;
put(两个,“键的对象=整数(2)”;
setAttribute(“map”,map);
setAttribute(“noValueInt”,noValueInt);
setAttribute(“一”,一);
setAttribute(“两个”,两个);
getRequestDispatcher(“/test map.jsp”).forward(请求,响应);
}
}
test-map.jsp
主页
仅使用EL测试对java.util.Map的访问
\${map.get(noValueInt)}:${map.get(noValueInt)}
\${map[one]}:${map[one]}
\${map[two]}:${map[two]}
使用JSTL和EL测试对java.util.Map的访问
c:out value=“\${map.get(noValueInt)}”/:
c:out value=“\${map[one]}”/:
c:out value=“\${map[two]}”/:
打印java.util.Map键和值(当Key=null时,将不显示null)
Key=“${entry.Key}”,Value=“${entry.Value}”
web.xml
测试映射Servlet
com.example.TestMapServlet
测试映射Servlet
/TestMap.do
重要提示
为了能够使用EL调用带有参数的方法,必须使用最低版本的Servlet 3.0。
引述如下: 从EL2.2开始,它作为Servlet3.0/JSP2.2的一部分进行维护 (Tomcat7、GlassFish3、JBossAS6等),可以调用 非getter方法,如有必要,使用参数
除了上面的解决方案之外,您还可以使用自定义统一表达式语言实现,例如具有替代解决方案的实现 解释为什么(在标准实现中)无法使用
[]
通过null
键访问映射值,可以在中找到自定义解决方案(段落中的重点是我的):
2.5。高级主题。。。启用/禁用null
属性EL规范描述了评估
base[property]
的语义。如果属性为null,则该规范
声明不在基上解析null。相反,如果
getValue(…)
已被调用,并且应该出现PropertyNotFoundException
异常
被扔到别的地方。因此,不可能将null解析为
地图上的钥匙。但是,可以配置JUEL的表达式工厂
要像解析任何其他属性值一样解析空值。启用(禁用)
null作为EL属性值,您可以设置属性
javax.el.nullProperties
设置为true(false)
假设标识符映射解析为java.util.map
- 如果feature
具有 已禁用,将javax.el.nullProperties
作为右值(左值)进行计算 返回null(抛出异常)${base[null]}
- If-feature
已启用,将${base[null]}作为右值(左值)进行计算 获取(放置)该映射中键null的值。默认情况下,不允许 允许null作为EL属性值javax.el.nullProperties
希望这会有所帮助。什么是
keyProp
?它在哪里实例化?顺便说一句,您似乎错过了EL eval表达式,即${expr}
或{expr}
。您说您从控制器(servlet)向JSP传递了一个映射。可能您设置了一个属性(请求或其他)。然后,要在JSP中访问地图,您应该使用表达式语言()更新我的答案,并提供一个简单的示例。非常好的答案。非常感谢。
<c:out value="${map.get(keyObject.keyProp)}" />
${map.get(keyObject.keyProp)}
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);
}
}
<%@ 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>
<?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>