【问题标题】:How to convert an arbitrary object to String with EL + JSTL? (calling toString())如何使用 EL + JSTL 将任意对象转换为字符串? (调用 toString())
【发布时间】:2010-05-21 16:20:14
【问题描述】:

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

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

【问题讨论】:

  • 我将您问题中的“JSTL”固定为“EL”。 ${} 的东西不是 JSTL。它是表达语言(EL)。 JSTL 是标准的标签库,例如c:outc:forEach
  • 它确实是 EL + JSTL - 该解决方案不能单独使用 EL,但两者都适用。
  • 您的实际问题是 EL,而不是 JSTL。 JSTL 只是一个愚蠢的流控制标签库,它对表达式和后端数据(如枚举)一无所知。
  • stackoverflow.com/a/55136138/2465785${'' + object}无效,但可以使用${''}${object}

标签: java jsp jstl el


【解决方案1】:

你只需这样做:

${object}

它会为你toString它。


edit:您的嵌套表达式可以这样解析:

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

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

【讨论】:

  • 对,但我不能在 EL 表达式中使用它。见我的澄清;不允许使用 ${somemap[${someenum}]}。
【解决方案2】:

你可以做几件事。

一、可以用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 函数都是微不足道的。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我正在使用 EL 编写 JXLS 模板。和toString 方法拯救我的一天。谢谢!
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:
      //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()

      所以,如果JSTL 中的对象fooFoo 的实例。 那么,

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

      示例

      如果toString()会输出JSON格式字符串,例如FootoString()输出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】:

        丑陋但足够简单

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

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

        【讨论】:

          猜你喜欢
          • 2011-04-04
          • 2017-10-07
          • 1970-01-01
          • 2015-10-29
          • 2012-11-02
          • 2023-02-02
          • 1970-01-01
          • 2021-07-24
          • 2015-01-22
          相关资源
          最近更新 更多