JSP не отображают объекты из модели в Spring - PullRequest
9 голосов
/ 07 октября 2009

У меня есть то, что должно быть легко решить, но мне не повезло.

В моем файле servlet-servlet.xml у меня есть следующие компоненты (в дополнение к другим):

<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 много раз в прошлом, но я, должно быть, здесь упускаю что-то очевидное. Есть идеи? Благодаря.

Ответы [ 3 ]

14 голосов
/ 07 октября 2009

Вы уверены, что оценка EL включена в вашем JSP? У меня иногда возникала проблема, что это как-то обернулось. Попробуйте оценить простое выражение, например ${'test'}, и посмотрите, появляется ли «test».

Вы также можете попробовать включить его с помощью директив страницы или чего-то еще, если EL следует отключить.

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

(Извините, я не помню, правильно ли это на 100%. Возможно, это isELEnabled)

4 голосов
/ 05 декабря 2013

Я столкнулся с той же проблемой, и после сравнения 2 похожих приложений (одно с EL работает нормально, а другое нет) заметил, что проблема на моем tomcat 7 зависит от версии webapp, указанной в web.xml приложения .

В том же jsp с использованием Web App 2.3 отображается $ {someMessage}. (Кстати, это то, что вы получаете, используя maven archetype: генерируйте с помощью 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">
...

Надеюсь, что это поможет!

1 голос
/ 07 октября 2009

Я не использовал столько конфигурации аннотаций, как у вас с Spring MVC, поэтому я не уверен во всех вещах, которые автоматически выполняются с вашей настройкой. Моя единственная мысль заключается в следующем: должен ли параметр метода быть объектом ModelMap? Все примеры, которые я видел ранее, использовали ModelMap в качестве типа параметра. Раздел 13.11.3 этой страницы является одним из них: http://static.springsource.org/spring/docs/2.5.6/reference/mvc.html.

Как я уже сказал, я раньше не использовал этот тип автоконфигурации - я делаю это немного вручную, и расширяю свои контроллеры из чего-то вроде AbstractController или SimpleFormController.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...