Как преобразовать произвольный объект в строку с помощью EL + JSTL? (вызывая toString ()) - PullRequest
10 голосов
/ 21 мая 2010

Есть ли способ вызвать toString () для объекта с EL и JSTL? (Мне нужно представление String для перечисления в качестве индекса в карте в выражении JSP EL.) Я надеялся, что что-то вроде ${''+object} будет работать как в Java, но EL не так хорош, и, похоже, нет функция, которая делает это.

Уточнение: у меня есть переменная somemap, которая отображает строки в строки, и у меня есть переменная someenum, которая является перечислением. Я хотел бы сделать что-то вроде ${somemap[someenum.toString()]}. (Конечно .toString () не работает, но что делает?)

Ответы [ 6 ]

22 голосов
/ 21 мая 2010

Вы просто делаете это так:

${object}

И это будет toString для вас.


edit : Ваше вложенное выражение может быть разрешено следующим образом:

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

Первая строка преобразует (используя toString()) выражение ${someenum} и сохраняет его в переменной myValue. Вторая строка использует myValue для индексации карты.

5 голосов
/ 21 мая 2010

Пара вещей, которые вы можете сделать.

Во-первых, вы можете использовать c: set -

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

Еще одна вещь, которую вы можете сделать, это создать свою собственную функцию EL, вызвать ее toString, а затем вызвать ее в JSTL. EL-функции - это в основном статические методы, связанные с файлом taglib. Просто сделать.

Edit:

В самом деле? Знаете, вы пробовали это на самом деле?

<%@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 tagfile и JSTL тривиальны.

3 голосов
/ 30 ноября 2012

Я думаю, что в новых версиях JSP API вы можете вызывать методы даже с параметрами!

Я только что попробовал ${statusColorMap[jobExecution.exitStatus.toString()]}, и он отлично работает!

1 голос
/ 21 мая 2010

Ответ Уилла Хартунга должен сработать. Вот копия '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

(скриптлеты только для быстрого создания прототипов, не используйте их на самом деле!)

0 голосов
/ 13 марта 2019

некрасиво, но достаточно просто

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

например, someValue принимает только строки (но объявляется как java.lang.Object), таким образом принудительно применяет его с конкатенацией строк

0 голосов
/ 15 августа 2017
//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().

Итак, если объект 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>

Пример

Если toString() выведет строку формата 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>
...