Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JSP中使用null键获取映射值_Java_Jsp_Map_El - Fatal编程技术网

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
    具有 已禁用,将
    ${base[null]}
    作为右值(左值)进行计算 返回null(抛出异常)

  • If-feature
    javax.el.nullProperties
    已启用
    ,将${base[null]}作为右值(左值)进行计算 获取(放置)该映射中键null的值。默认情况下,不允许 允许null作为EL属性值


希望这会有所帮助。

什么是
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>&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>
<?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>