如何使用EL + JSTL将任意对象转换为String? (调用toString())

时间:2010-05-21 16:20:15

标签: java jsp jstl el

有没有办法在带有EL和JSTL的对象上调用toString()? (我需要枚举的String表示作为JSP EL表达式中的映射的索引。)我希望${''+object}之类的东西能像java一样工作,但是EL不是很好,而且似乎没有是任何做它的功能。

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

6 个答案:

答案 0 :(得分:22)

你这样做:

${object}

它会为你toString


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

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

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

答案 1 :(得分:5)

你可以做几件事。

一,你可以使用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函数很简单。

答案 2 :(得分:3)

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

我刚试过${statusColorMap[jobExecution.exitStatus.toString()]},它运行正常!

答案 3 :(得分:1)

Will Hartung的答案应该有效。这是一个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的值}

     

Enum:FOO

     

地图价值:关键FOO的价值

(scriptlet仅用于快速原型设计,不要实际使用它们!)

答案 4 :(得分: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 said,EL语法${obj}将调用toString()

因此,如果foo中的对象JSTLFoo的实例。 然后,

// 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的{​​{1}}输出toString()格式字符串。然后:

JSON

答案 5 :(得分:-1)

丑陋但足够简单

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

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