Java 如何使用EL+;JSTL?(调用toString())
有什么方法可以用EL和JSTL对对象调用toString()吗?(我需要一个枚举的字符串表示形式作为JSP EL表达式中映射的索引。)我希望像Java 如何使用EL+;JSTL?(调用toString()),java,jsp,jstl,el,Java,Jsp,Jstl,El,有什么方法可以用EL和JSTL对对象调用toString()吗?(我需要一个枚举的字符串表示形式作为JSP EL表达式中映射的索引。)我希望像${'''+object}这样的东西可以像在java中一样工作,但是EL并没有那么好,而且似乎没有任何函数可以做到这一点 澄清:我有一个变量somemap,它将字符串映射到字符串,还有一个变量someenum,它是一个枚举。我想做一些类似于${somemap[someenum.toString()]}。(当然.toString()不起作用,但什么起作用?您
${'''+object}
这样的东西可以像在java中一样工作,但是EL并没有那么好,而且似乎没有任何函数可以做到这一点
澄清:我有一个变量
somemap
,它将字符串映射到字符串,还有一个变量someenum
,它是一个枚举。我想做一些类似于${somemap[someenum.toString()]}
。(当然.toString()不起作用,但什么起作用?您只需这样做:
${object}
<c:set var="myValue">${someenum}</c:set>
${somemap[myValue]}
它将为您字符串
编辑:嵌套表达式的解析方式如下:
${object}
<c:set var="myValue">${someenum}</c:set>
${somemap[myValue]}
${someenum}
${somemap[myValue]}
第一行字符串化(使用toString()
)${someenum}
表达式,并将其存储在myValue
变量中。第二行使用myValue
对地图进行索引。可以做一些事情
第一,你可以使用c:set-
<c:set var="nowAString">${yourVar}</c:set>
${yourVar}
您可以做的另一件事是创建自己的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页面
你好,世界!
${testDate}
testDate=${testDate}
myVar=${myVar}
testDate类=${testDate.Class}
myVar类=${myVar.Class}
jsp2.0tagfile和JSTL函数都很简单。Will Hartung的答案应该有用。这里有一个“粘贴”不可运行的副本:
试验
映射:${Map}
枚举:${myEnum}
${myEnum}
映射值:${Map[myEnumAsString]}
这将产生:
映射:{BAR=键BAR的值,FOO=键FOO的值}
枚举:FOO
映射值:键FOO的值
(Scriptlet只是用于快速原型设计,不要实际使用!)我认为在新版本的JSP api中,您可以调用方法,甚至可以使用参数
我刚刚尝试了${statusColorMap[jobExecution.exitStatus.toString()]}
,效果很好
//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()
因此,如果JSTL
中的对象foo
是foo
的实例。
那么
丑陋但足够简单
<someTag someValue="${yourObject}${''}" ... />
例如,someValue只接受字符串(但声明为java.lang.Object),这样就可以通过字符串连接强制执行它,但我不能在EL表达式中使用它。见我的澄清${somemap[${someenum}]}是不允许的。我已将您问题中的“JSTL”改为“EL”。${}
事物不是JSTL。这是表达语言(EL)。JSTL是标准的标记库,例如c:out
,c:forEach
,等等。它实际上是EL+JSTL-解决方案不是单独使用EL,而是同时使用EL。您的实际问题是EL,而不是JSTL。JSTL只是一个哑流控制taglib,它对表达式和后端数据(如枚举)一无所知。请参见,${''+object}
无效,但您可以使用${'}${object}
我正在使用EL编写JXLS模板。和toString
方法保存我的一天。谢谢
<someTag someValue="${yourObject}${''}" ... />