代码之家  ›  专栏  ›  技术社区  ›  Dr. Hans-Peter Störr

如何使用el+jstl将任意对象转换为字符串?(调用ToString())

  •  10
  • Dr. Hans-Peter Störr  · 技术社区  · 14 年前

    有没有办法用el和jstl在对象上调用toString()?(我需要一个枚举的字符串表示形式作为jsp el表达式中映射的索引。)我希望 ${''+object} 会像Java一样工作,但是EL不是那么好,而且似乎没有任何功能来完成它。

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

    6 回复  |  直到 5 年前
        1
  •  22
  •   skaffman    14 年前

    你只是这样做:

    ${object}
    

    它会 toString 这是给你的。


    编辑 :可以这样解析嵌套表达式:

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

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

        2
  •  5
  •   Will Hartung    14 年前

    有几件事你可以做。

    第一,你可以使用c:set-

    <c:set var="nowAString">${yourVar}</c:set>
    

    您可以做的另一件事是创建自己的EL函数,将其调用为string,然后在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函数都很简单。

        3
  •  3
  •   Sebastien Lorber    12 年前

    我认为在新版本的JSPAPI中,您可以调用方法,即使使用参数也是如此!

    我只是尝试 ${statusColorMap[jobExecution.exitStatus.toString()]} 而且效果很好!

        4
  •  1
  •   BalusC    14 年前

    威尔·哈顿的回答应该有效。这是一个复制粘贴运行 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=键栏的值,foo=键foo的值

    EnUM:Foo

    映射值:键foo的值

    (scriptlets只是为了快速原型化,不要真实地使用它们!)

        5
  •  0
  •   AechoLiu    7 年前
    //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;
        }
    }
    

    AS 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>
    

    例子

    如果 托斯特林() 意志输出 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>
    
        6
  •  -1
  •   William Leung    5 年前

    丑陋但足够简单

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

    例如,SyValueUp只接受字符串(但声明为java. Lang.Object),这样就用字符串级联来强制它。