JSPs not displaying objects from model in Spring

2020-02-01 18:23发布

I have what should be an easy issue to solve, but I'm having no luck.

In my servlet-servlet.xml file, I have the following beans (in addition to others):

<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" />

My test controller looks like this:

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";
     }

}

My jsp view looks like this:

<!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>

So, when I view the jsp, I'd expect the value of someMessage (some string here), but I only get the following:

<!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>

When I crank up the logging, I see that my someMessage object is being place in the model:

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

Obviously, my view is mapped correctly, but I can't seem to access model objects added to the request in the view. I've done this type of thing with Spring MVC many times in the past, but I must be missing something obvious here. Any ideas? Thanks.

3条回答
等我变得足够好
2楼-- · 2020-02-01 19:04

Are you sure that evaluation of EL is enabled in your JSP? I sometimes had the problem, that it got turned of somehow. Try evaluating a simple expression like ${'test'} and see if 'test' appears.

You can also try enabling it with page directives or something else if EL should be disabled.

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

(Sorry, I can't remember if this 100% correct. It might be 'isELEnabled')

查看更多
Explosion°爆炸
3楼-- · 2020-02-01 19:06

I haven't used quite as much annotation configuration as you have with Spring MVC, so I'm not sure of all the things that are being automatically done with your setup. My only thought is this: should the method parameter be a ModelMap object? The examples I've seen before have all used ModelMap as the parameter type. Section 13.11.3 of this page is one of them: http://static.springsource.org/spring/docs/2.5.6/reference/mvc.html.

Like I said, I haven't used this type of auto-configuration before -- I do it slightly more manually, and extend my controllers from something like an AbstractController or a SimpleFormController.

查看更多
萌系小妹纸
4楼-- · 2020-02-01 19:22

I ran into the same problem, and after comparing 2 similar apps (one with EL working fine and the other not), noticed that the problem on my tomcat 7 depended on the webapp version specified in the web.xml of the application.

The same jsp using Web App 2.3 displays ${someMessage}. (BTW, this is what you get using 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>
...

The same jsp using Web App 2.4 displays the model object properly:

<?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">
...

Hope that it helps!

查看更多
登录 后发表回答