Как преобразовать произвольный объект в String с EL + JSTL? (вызов toString())
Есть ли способ вызвать toString() для объекта с EL и JSTL? (Мне нужно представление строки enum как индекс в карте в выражении EL JSP.) Я надеялся, что что-то вроде ${''+object}
будет работать как в java, но EL не так уж и приятен, и похоже, что нет которая делает это.
Уточнение: у меня есть переменная somemap
, которая отображает строки в строки, и у меня есть переменная someenum
, которая является перечислением. Я хотел бы сделать что-то вроде ${somemap[someenum.toString()]}
. (Конечно .toString() не работает, но что делает?)
Ответы
Ответ 1
Вы просто делаете это так:
${object}
И это будет toString
для вас.
edit. Ваше вложенное выражение может быть разрешено следующим образом:
<c:set var="myValue">${someenum}</c:set>
${somemap[myValue]}
Первая строка строит (используя toString()
) выражение ${someenum}
и сохраняет его в переменной myValue
. Вторая строка использует myValue
для индексации карты.
Ответ 2
Пара вещей, которые вы можете сделать.
Во-первых, вы можете использовать c: set -
<c:set var="nowAString">${yourVar}</c:set>
Еще одна вещь, которую вы можете сделать, это создать свою собственную функцию EL, вызвать ее toString, а затем вызвать ее в JSTL. Функции EL - это в основном статические методы, связанные с файлом taglib. Прямо делать.
Edit:
Действительно? Вы на самом деле знаете, попробуйте?
<%@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>
И теги JSP 2.0 и JSTL-функции тривиальны.
Ответ 3
Я думаю, что в новых версиях JSP api вы можете вызывать методы, даже с параметрами!
Я просто попробовал ${statusColorMap[jobExecution.exitStatus.toString()]}
, и он отлично работает!
Ответ 4
Ответ Уилла Хартунга должен работать. Здесь copy'n'paste'n'runnable 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
(скриптлеты предназначены только для быстрого прототипирования, не используйте их в реальном режиме!)
Ответ 5
//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;
}
}
Как скаффман сказал, синтаксис 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>