【问题标题】:JSPs not displaying objects from model in SpringJSP在Spring中不显示模型中的对象
【发布时间】:2009-10-07 02:25:41
【问题描述】:

我有一个应该很容易解决的问题,但我没有运气。

在我的 servlet-servlet.xml 文件中,我有以下 bean(除了其他):

<bean id="viewResolver"
    class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

<context:component-scan base-package="com.servlet.web" />

我的测试控制器如下所示:

package com.servlet.web;

import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestController
{
    protected final Log log = LogFactory.getLog(getClass());

    @RequestMapping("/test")
     public String methodName(Map<String, Object> map) {
         map.put("someMessage", "some string here");
         return "test";
     }

}

我的 jsp 视图如下所示:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>servlet.com</title>
</head>
<body>
${someMessage}
</body>
</html>

所以,当我查看 jsp 时,我期望 someMessage 的值(这里是一些字符串),但我只得到以下内容:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>servlet.com</title>
</head>
<body>
${someMessage}

</body>
</html>

当我启动日志记录时,我看到我的 someMessage 对象被放置在模型中:

22:21:17,425 DEBUG DispatcherServlet:852 - DispatcherServlet with name 'servlet' determining Last-Modified value for [/servlet/access/test]
22:21:17,426 DEBUG DefaultAnnotationHandlerMapping:183 - Mapping [/test] to handler 'com.servlet.web.TestController@762fef'
22:21:17,426 DEBUG DispatcherServlet:868 - Last-Modified value for [/servlet/access/test] is: -1
22:21:17,426 DEBUG DispatcherServlet:700 - DispatcherServlet with name 'servlet' processing GET request for [/servlet/access/test]
22:21:17,427 DEBUG HandlerMethodInvoker:158 - Invoking request handler method: public java.lang.String com.servlet.web.TestController.methodName(java.util.Map)
22:21:17,427 DEBUG DispatcherServlet:1070 - Rendering view [org.springframework.web.servlet.view.JstlView: name 'test'; URL [/WEB-INF/jsp/test.jsp]] in DispatcherServlet with name 'servlet'
22:21:17,427 DEBUG JstlView:328 - Added model object 'someMessage' of type [java.lang.String] to request in view with name 'test'
22:21:17,428 DEBUG JstlView:237 - Forwarding to resource [/WEB-INF/jsp/test.jsp] in InternalResourceView 'test'
22:21:17,429 DEBUG DispatcherServlet:666 - Successfully completed request

显然,我的视图已正确映射,但我似乎无法访问添加到视图中请求的模型对象。过去我用 Spring MVC 做过很多次这种类型的事情,但我必须在这里遗漏一些明显的东西。有任何想法吗?谢谢。

【问题讨论】:

  • 你能提供你的 web.xml 吗?和你的整个 servlet-servlet.xml??我已经用我这边的相同视图测试了你的控制器,并且它被正确渲染了。

标签: java spring jsp spring-mvc


【解决方案1】:

您确定在您的 JSP 中启用了 EL 评估吗?我有时会遇到问题,它以某种方式关闭。尝试评估像${'test'} 这样的简单表达式,看看是否出现“测试”。

如果应该禁用 EL,您也可以尝试使用页面指令或其他方式启用它。

<%@ page isScriptingEnabled="true" isELIgnored="false" %> //of course it has to be FALSE

(抱歉,我不记得这是否 100% 正确。可能是 'isELEnabled')

【讨论】:

  • 不错!将 添加到我的 jsp 顶部解决了我的问题。我不确定禁用 EL 发生了什么。哦,包括 isScriptingEnabled 属性似乎破坏了 jsp,所以我只是将其删除。似乎 isScriptingEnabled 属性在 JSP 2.0 之前有效?因此,总而言之,将 添加到我的 jsp 可以解决问题。谢谢,莫克斯
  • 不客气。我很确定有一些方法可以在 web.xml 中配置它。根据 [this][1],您可以在 web.xml 中添加配置来为所有 JSP 启用 EL。 [1]theserverside.com/discussions/thread.tss?thread_id=44097
【解决方案2】:

我遇到了同样的问题,在比较了 2 个类似的应用程序(一个使用 EL 工作正常,另一个没有)后,注意到我的 tomcat 7 上的问题取决于应用程序的 web.xml 中指定的 webapp 版本.

使用 Web App 2.3 的同一 jsp 显示 ${someMessage}。 (顺便说一句,这就是使用 maven archetype:generate with archetypeArtifactId=maven-archetype-webapp 得到的)。

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
...

同一个jsp使用Web App 2.4正确显示模型对象:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="webapp-id" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
...

希望对你有帮助!

【讨论】:

    【解决方案3】:

    我没有像 Spring MVC 那样使用那么多的注解配置,所以我不确定你的设置会自动完成所有的事情。我唯一的想法是:方法参数应该是 ModelMap 对象吗?之前看到的例子都是用ModelMap作为参数类型的。本页第 13.11.3 节是其中之一:http://static.springsource.org/spring/docs/2.5.6/reference/mvc.html。

    就像我说的,我以前没有使用过这种类型的自动配置——我稍微手动操作,并从 AbstractController 或 SimpleFormController 扩展我的控制器。

    【讨论】:

    • 感谢您的宝贵时间。我尝试使用 ModelMap 并得到相同的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多