12

有没有办法使用 EL 和 JSTL 在对象上调用 toString() ?(我需要枚举的字符串表示形式作为 JSP EL 表达式中映射中的索引。)我希望类似的东西${''+object}能像在 java 中一样工作,但 EL 不是那么好,而且似乎没有任何函数可以它。

澄清:我有一个somemap将字符串映射到字符串的变量,并且我有someenum一个枚举变量。我想做类似的事情${somemap[someenum.toString()]}。(当然 .toString() 不起作用,但是有什么作用呢?)

4

6 回答 6

27

你只是这样做:

${object}

它会toString为你服务的。


编辑:您的嵌套表达式可以这样解决:

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

第一行将表达式字符串化(使用toString()${someenum}并将其存储在myValue变量中。第二行用于myValue索引地图。

于 2010-05-21T16:26:54.247 回答
6

几个你可以做的事情。

一,你可以使用 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 功能是微不足道的。

于 2010-05-21T16:42:46.357 回答
3

我认为在 JSP api 的新版本中,您可以调用方法,甚至可以使用参数!

我刚试过${statusColorMap[jobExecution.exitStatus.toString()]},效果很好!

于 2012-11-30T14:27:36.060 回答
1

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 仅用于快速原型制作,请勿在实际中使用它们!)

于 2010-05-21T19:16:01.760 回答
0
//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().

因此,如果一个对象fooinJSTLFoo. 然后,

// test.jsp

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

例子

iftoString()将输出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>
于 2017-08-15T03:33:06.680 回答
-1

丑陋但足够简单

<someTag someValue="${yourObject}${''}" ... />

例如,someValue 只接受字符串(但声明为 java.lang.Object),这种方式通过字符串连接来强制执行

于 2019-03-13T07:02:20.333 回答