如何将对象从Spring 3.0控制器传递到JSP视图并使用JSTL进行测试

wsa*_*ams 6 java spring jsp jstl spring-mvc

首先,我有一个Spring 3.0控制器,其方法类似于以下方法.

我正在向视图传递一个名为"message"的对象,如果已经通过"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;
}
Run Code Online (Sandbox Code Playgroud)

该视图类似于以下内容,

<%@ 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>
Run Code Online (Sandbox Code Playgroud)

到目前为止,只有"test5"正在打印消息,但我只想在"$ {message.message}"不为空时打印消息.

我试过" http://java.sun.com/jstl/core_rt "和" http://java.sun.com/jstl/core ",但似乎无法得到"<c:if />"语句正常工作.

谁会对我做错了什么或更好的方法有任何想法?

谢谢

小智 2

您的前两个<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>
Run Code Online (Sandbox Code Playgroud)

请注意测试属性中 != 和 } 的位置 - 条件需要位于大括号内。

另外,#3 中的测试:

<c:if test="${message.message}">
    <div class="msg">test3: ${message.message}</div>
</c:if>
Run Code Online (Sandbox Code Playgroud)

仅当 message.message 的值实际上是值“true”时,才会评估为 true。由于它不是(它是“Hello World”),因此测试失败。

测试 #4 的格式也不正确(“非空”也需要位于大括号内)...