ELとJSTLを使用してオブジェクトでtoString()を呼び出す方法はありますか? (JSP EL式のマップのインデックスとして列挙型の文字列表現が必要です。)_${''+object}
_のようなものがJavaのように機能することを望みましたが、ELはそれほど素晴らしいものではなく、そうではないようです。それを行う任意の関数である。
明確化:文字列を文字列にマップする変数somemap
があり、列挙型の変数someenum
があります。 ${somemap[someenum.toString()]}
のようなことをしたいのですが。 (もちろん、.toString()は機能しませんが、何が機能しますか?)
あなたはこのようにそれをします:
_${object}
_
そしてそれはあなたのためにそれをtoString
します。
編集:ネストされた式は次のように解決できます:
_<c:set var="myValue">${someenum}</c:set>
${somemap[myValue]}
_
最初の行は、(toString()
を使用して)_${someenum}
_式を文字列化し、それをmyValue
変数に格納します。 2行目は、myValue
を使用してマップにインデックスを付けています。
あなたができることをいくつか。
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関数は簡単です。
新しいバージョンのJSPapiでは、パラメーターを使用してもメソッドを呼び出すことができると思います。
${statusColorMap[jobExecution.exitStatus.toString()]}
を試しましたが、問題なく動作します。
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の値
(スクリプトレットはラピッドプロトタイピング用です。実際には使用しないでください!)
_//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
内のオブジェクトJSTL
がFoo
のインスタンスである場合。次に、
_// test.jsp
<script>
var a = ${foo}; // ${foo} will be {"prop1": ooo, "prop2": "xxx"}
console.log(a.prop1);
console.log(a.prop2);
</script>
_
たとえば、toString()
がJSON
フォーマット文字列を出力する場合、Foo
のtoString()
は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>
_