有没有办法用EL和JSTL调用对象上的toString()? (我需要枚举的String表示作为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
变量中。第二行使用myValue
索引地图。
你可以做几件事情。
一,你可以使用c:set -
<c:set var="nowAString">${yourVar}</c:set>
你可以做的另一件事是创建自己的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>
而JSP 2.0标记文件和JSTL函数都是微不足道的。
我认为在JSP api的新版本中,您可以调用方法,即使使用参数!
我刚尝试${statusColorMap[jobExecution.exitStatus.toString()]}
,它工作正常!
Will Hartung的答案应该有效。这是一个复制'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的值
(scriptlet仅用于快速原型设计,不要在实际中使用它们!)
//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 said,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>
丑陋而又简单
<someTag someValue="${yourObject}${''}" ... />
例如,someValue只接受字符串(但声明为java.lang.Object),这种方式使用字符串连接强制执行它