web-dev-qa-db-ja.com

EL + JSTLを使用して任意のオブジェクトを文字列に変換するにはどうすればよいですか? (toString()の呼び出し)

ELとJSTLを使用してオブジェクトでtoString()を呼び出す方法はありますか? (JSP EL式のマップのインデックスとして列挙型の文字列表現が必要です。)_${''+object}_のようなものがJavaのように機能することを望みましたが、ELはそれほど素晴らしいものではなく、そうではないようです。それを行う任意の関数である。

明確化:文字列を文字列にマップする変数somemapがあり、列挙型の変数someenumがあります。 ${somemap[someenum.toString()]}のようなことをしたいのですが。 (もちろん、.toString()は機能しませんが、何が機能しますか?)

11

あなたはこのようにそれをします:

_${object}
_

そしてそれはあなたのためにそれをtoStringします。


編集:ネストされた式は次のように解決できます:

_<c:set var="myValue">${someenum}</c:set>
${somemap[myValue]}
_

最初の行は、(toString()を使用して)_${someenum}_式を文字列化し、それをmyValue変数に格納します。 2行目は、myValueを使用してマップにインデックスを付けています。

23
skaffman

あなたができることをいくつか。

1つは、c:setを使用できます-

<c:set var="nowAString">${yourVar}</c:set>

もう1つできることは、独自のEL関数を作成し、それをtoStringと呼んでから、JSTLで呼び出すことです。 EL関数は基本的に、taglibファイルに接続された静的メソッドです。簡単に行えます。

編集:

本当に?あなたは実際にそれを試してみましたか?

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<%@taglib uri="http://Java.Sun.com/jstl/core" prefix="c" %>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Hello World!</h1>
        <%
        pageContext.setAttribute("testDate", new Java.util.Date());
        %>

        <c:set var="myVar">${testDate}</c:set>
        testDate = ${testDate}<br/>
        myVar = ${myVar}<br/>
        testDate Class = ${testDate.class}<br/>
        myVar Class = ${myVar.class}<br/>
    </body>
</html>

また、JSP2.0タグファイルとJSTL関数は簡単です。

5
Will Hartung

新しいバージョンのJSPapiでは、パラメーターを使用してもメソッドを呼び出すことができると思います。

${statusColorMap[jobExecution.exitStatus.toString()]}を試しましたが、問題なく動作します。

3

WillHartungの答えはうまくいくはずです。これがコピー 'n'貼り付け 'n'実行可能です [〜#〜] sscce [〜#〜]

<%@taglib uri="http://Java.Sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>

<%!
    enum MyEnum {
        FOO, BAR
    }
%>
<%
    request.setAttribute("myEnum", MyEnum.FOO);
    Java.util.Map<String, String> map = new Java.util.HashMap<String, String>();
    map.put("FOO", "value of key FOO");
    map.put("BAR", "value of key BAR");
    request.setAttribute("map", map);
%>

<html lang="en">
    <head>
        <title>Test</title>
    </head>
    <body>
        <p>Map: ${map}
        <p>Enum: ${myEnum}
        <c:set var="myEnumAsString">${myEnum}</c:set>
        <p>Map value: ${map[myEnumAsString]}        
    </body>
</html>

これにより、次のようになります。

マップ:{BAR =キーBARの値、FOO =キーFOOの値}

列挙型:FOO

マップ値:キーFOOの値

(スクリプトレットはラピッドプロトタイピング用です。実際には使用しないでください!)

1
BalusC
_//In Java

public class Foo {
    // Define properties and get/set methods
    private int prop1;
    private String prop2;



    public String toString() {
        String jsonString = ...; /// Convert this object to JSON string
        return jsonString;
    }
}
_

skaffmanが言った のように、EL構文_${obj}_はtoString()を呼び出します。

したがって、foo内のオブジェクトJSTLFooのインスタンスである場合。次に、

_// test.jsp

<script>
    var a = ${foo};  // ${foo} will be {"prop1": ooo, "prop2": "xxx"}
    console.log(a.prop1);
    console.log(a.prop2);
</script>
_

たとえば、toString()JSONフォーマット文字列を出力する場合、FootoString()JSONフォーマット文字列を出力します。その後:

_// .Java codes
Foo a = ...// a Foo object. => { 'prop1': ooo }
List<Foo> b = ... //< Array. => [ {'prop1': ooo}, {prop1: xxx} ]

// Pass object to JSTL by HttpServletRequest or ..
request.setAttribute('a', a);
request.setAttribute('b', b);

// .jsp codes
<span>${a.prop1}</span>

<script>
    var aa = ${a}; // ${a} => { 'prop1': ooo }
    var bb = ${b}; // ${b} => [ {'prop1': ooo}, {prop1: xxx} ]

    console.log(aa.prop1);
    console.log(bb[0].prop1);
</script>
_
0
AechoLiu