6

Map<Integer, Object>コントローラからJSPに渡されたインがあります。デフォルト値を持つnullキーがあります。これmap.get(null)は、デフォルトオブジェクトを返すことを意味します。keyObject.keyPropは整数であり、nullの可能性があります。

これをjspで使用すると

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

nullキーの出力がありません。jspでnullキーを機能させる方法はありますか?

4

1 に答える 1

10

null標準のEL実装を使用してキーの値を取得する唯一の方法は、マップ上のメソッドを呼び出すことであるようです(get()整数オブジェクトkeyObject.keyPropに解決されると言ったことを考慮して)。

<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);
    }
}


test-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>&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>


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を使用して引数付きのメソッドを呼び出せるようにするには、最小のサーブレットバージョン3.0を使用する必要があります。
ここから引用:https ://stackoverflow.com/tags/el/info

サーブレット3.0/JSP 2.2(Tomcat 7、Glassfish 3、JBoss AS 6など)の一部として維持されているEL 2.2以降、必要に応じて引数を使用して非ゲッターメソッドを呼び出すことができます。


上記のソリューションとは別に、代替ソリューションを持つ JUELなどのカスタム統一式言語実装を使用できます。

キーを使用してマップ値にアクセスできない理由の説明とカスタムソリューションは、Java Unified Expression Language(JUEL)のドキュメントに記載されています(段落の強調は私のものです)。 null []

2.5。高度なトピック

..。

nullプロパティの有効化/無効化

EL仕様では、の評価セマンティクスについて説明していbase[property]ます。プロパティがnullの場合、仕様では、ベースでnullを解決しないように指定されています。getValue(...)むしろ、呼び出された場合はnullが返さ れ、それ以外の場合はaPropertyNotFoundExceptionがスローされます。結果として、マップのキーとしてnullを解決することは不可能です。ただし、JUELの式ファクトリは、他のプロパティ値と同様にnullを解決するように構成できます。ELプロパティ値としてnullを有効(無効)にするには、プロパティ javax.el.nullPropertiesをtrue(false)に設定します。

識別子マップがに解決されると仮定しますjava.util.Map

  • 機能javax.el.nullPropertiesが無効になっている場合${base[null]}、右辺値(左辺値)として評価するとnullが返されます(例外がスローされます)。

  • 機能javax.el.nullProperties が有効になっている場合、右辺値(左辺値)として評価${base[null]}すると、そのマップのキーnullの値が取得(配置)されます。デフォルトでは、ELプロパティ値としてnullを許可していません。

..。

これがお役に立てば幸いです。

于 2013-01-17T22:51:34.620 に答える