2009-10-07 2 views
8

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

В моем файле сервлет-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> 

Так что, когда я рассматриваю СПЯ, я бы ожидать, что значение 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 '[email protected]' 
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 

Очевидно, что моя точка зрения правильно отображается, но я могу» t, похоже, получают доступ к объектам модели, добавленным к запросу в представлении. Я делал это с Spring MVC много раз в прошлом, но я должен упустить что-то очевидное здесь. Есть идеи? Благодарю.

+0

Можете ли вы предоставить свой web.xml? и весь ваш servlet-servlet.xml ?? Я проверил ваш контроллер с тем же видом на моей стороне, и он отображается правильно. – rochb

ответ

13

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

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

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

(К сожалению, я не могу вспомнить, если это 100% правильно. Это может быть «isELEnabled»)

+2

Ницца! Добавление <% @ страницы isELIgnored = "false"%> в начало моей jsp исправило мою проблему. Я не уверен, что происходит, чтобы отключить EL. О, включая свойство isScriptingEnabled, похоже, разбивает jsp, поэтому я просто удалил его. Кажется, что свойство isScriptingEnabled было действительным до JSP 2.0? Итак, в добавлении <% @ page isELIgnored = "false"%> к моему jsp исправлена ​​проблема. Спасибо, Moxn – labratmatt

+1

Добро пожаловать. Я уверен, что есть какой-то способ настроить это в web.xml. В соответствии с [этим] [1] вы можете добавить конфигурацию на свой web.xml, чтобы включить EL для всех ваших JSP. [1] http://www.theserverside.com/discussions/thread.tss?thread_id=44097 – moxn

1

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

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

+0

Спасибо за внимание. Я пробовал использовать ModelMap и имел тот же результат. – labratmatt

4

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

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

Надеется, что это помогает!

Смежные вопросы