Как передать объект из контроллера Spring 3.0 в представление JSP и протестировать с помощью JSTL

Сначала у меня есть контроллер Spring 3.0 с методом, подобным следующему.

Я передаю представление объект с именем «сообщение» и надеюсь напечатать это сообщение через представление, если оно было установлено методом «doStuff».

@RequestMapping("/index")
public ModelAndView doStuff() {
    ModelAndView mav = new ModelAndView();
    Map<String, String> message = new HashMap<String, String>();
    message.put("message", "Hello World");
    mav.setViewName("pages/myView");
    mav.addObject("message", message);
    return mav;
}

Представление похоже на следующее,

<%@ page session="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
<html>
<head>
<title>Test</title>
</head>
<body>
<c:if test="${message.message} != null">
    <div class="msg">test1: ${message.message}</div>
</c:if>
<c:if test="${message.message} != ''">
    <div class="msg">test2: ${message.message}</div>
</c:if>
<c:if test="${message.message}">
    <div class="msg">test3: ${message.message}</div>
</c:if>
<c:if test="not empty ${message.message}">
    <div class="msg">test4: ${message.message}</div>
</c:if>
<div class="msg">test5: ${message.message}</div>
</body>
</html>

Пока только «test5» печатает сообщение, но я хочу напечатать сообщение только в том случае, если «${message.message}» не равно нулю.

Я пробовал как "http://java.sun.com/jstl/core_rt", так и "http://java.sun.com/jstl/core", но не может показаться чтобы операторы "‹c:if /›" работали правильно.

У кого-нибудь есть идеи относительно того, что я делаю неправильно или лучший способ сделать это?

Спасибо


person wsams    schedule 12.02.2010    source источник


Ответы (3)


Ваши первые два тега <c:if> должны выглядеть так:

<c:if test="${message.message != null}">
    <div class="msg">test1: ${message.message}</div>
</c:if>
<c:if test="${message.message != ''}">
    <div class="msg">test2: ${message.message}</div>
</c:if>

Обратите внимание на размещение != и } в тестовом атрибуте — условие должно быть внутри фигурных скобок.

также тест в № 3:

<c:if test="${message.message}">
    <div class="msg">test3: ${message.message}</div>
</c:if>

Будет оцениваться как true только в том случае, если значение message.message на самом деле является значением «true». Поскольку это не так (это «Hello World»), тест не пройден.

Тест № 4 также отформатирован неправильно (внутри фигурных скобок тоже должно быть "не пусто")...

person BCunningham    schedule 12.02.2010
comment
@ user272159: Вам на самом деле нужно избавиться только от устаревших URI и любых старых JSTL JAR. Также смотрите мой ответ. - person BalusC; 15.02.2010

Неверный URI taglib. Это старый JSTL 1.0 URI. Откуда вы это взяли? Выбросьте этот 10-летний учебник/книгу;) Идите и получите JSTL 1.2 здесь и поместите его в /WEB-INF/lib после удаления всех старых библиотек JSTL (jstl.jar и standard.jar) и возможного извлеченного содержимого (в некоторых плохих руководствах, а именно, предлагается извлечь файлы .tld и поместите его в путь к классам, это неправильно).

Правильный URI указан в последней документации JSTL TLD. . Если вы щелкнете любую из отдельных библиотек JSTL, вы увидите правильный пример URI в верхней части документа, например. ядро JSTL:

Стандартный синтаксис:

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

Синтаксис XML:

    <anyxmlelement xmlns:c="http://java.sun.com/jsp/jstl/core" />

Тем не менее, ваши тесты на самом деле неверны. Вы должны были использовать ${message.message != null}, ${message.message != ''} и ${not empty message.message}. Вы можете узнать больше об EL в учебнике по Java EE, часть II, глава 5. и о JSTL в учебнике по Java EE, часть II, глава 7. Удачи.

person BalusC    schedule 12.02.2010

Искомый URI: http://java.sun.com/jsp/jstl/core

person skaffman    schedule 12.02.2010