2009-10-07 17 views
8

Tengo lo que debería ser un problema fácil de resolver, pero no estoy teniendo suerte.JSPs que no muestran objetos del modelo en Spring

En mi archivo de servlet-servlet.xml, tengo los siguientes granos (además de otros):

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

Mi controlador de prueba se ve así:

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

} 

mi punto de vista JSP miradas de esta manera:

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

Así, cuando veo el JSP, yo esperaría que el valor de someMessage (un trozo de cuerda aquí), pero sólo me obtener la siguiente:

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

Cuando poner encima de la tala de árboles, veo que mi objeto someMessage es ser el lugar en el modelo:

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 

Obviamente, mi opinión está asignado correctamente, pero puedo' Parece que accede a los objetos modelo agregados a la solicitud en la vista. He hecho este tipo de cosas con Spring MVC muchas veces en el pasado, pero me falta algo obvio aquí. ¿Algunas ideas? Gracias.

+0

¿Puede proporcionar su web.xml? y todo su servlet-servlet.xml ?? He probado su controlador con la misma vista de mi lado y se representa correctamente. – rochb

Respuesta

13

¿Está seguro de que la evaluación de EL está habilitada en su JSP? A veces tuve el problema, que cambió de alguna manera. Intente evaluar una expresión simple como ${'test'} y vea si aparece 'prueba'.

También puede intentar habilitarlo con directivas de página u otra cosa si EL debe desactivarse.

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

(Lo siento, no puedo recordar si esta 100% correcto. Podría ser 'isELEnabled')

+2

¡Agradable! Agregar <% @ page isELIgnored = "false"%> a la parte superior de mi jsp solucionó mi problema. No estoy seguro de qué está pasando para deshabilitar EL. Oh, incluyendo la propiedad isScriptingEnabled parece romper el jsp, así que simplemente lo eliminé. Parece que la propiedad isScriptingEnabled era válida antes de JSP 2.0? Entonces, en resumen, agregar <% @ page isELIgnored = "false"%> a mi jsp solucionó el problema. Gracias, Moxn – labratmatt

+1

De nada. Estoy bastante seguro de que hay alguna forma de configurar esto en el web.xml. Según [this] [1], puede agregar la configuración come a su web.xml para habilitar EL para todos sus JSP. [1] http://www.theserverside.com/discussions/thread.tss?thread_id=44097 – moxn

1

No he usado tanta configuración de anotación como la que tiene con Spring MVC, así que no estoy seguro de todo lo que se hace automáticamente con su configuración. Mi único pensamiento es este: ¿debería ser el parámetro del método un objeto ModelMap? Los ejemplos que he visto antes todos han usado ModelMap como el tipo de parámetro. La sección 13.11.3 de esta página es una de ellas: http://static.springsource.org/spring/docs/2.5.6/reference/mvc.html.

Como he dicho, no he utilizado este tipo de configuración automática antes: lo hago de forma un poco más manual, y extiendo mis controladores desde algo así como un AbstractController o un SimpleFormController.

+0

Gracias por el tiempo. He intentado usar un ModelMap y tuve el mismo resultado. – labratmatt

4

me encontré con el mismo problema, y ​​después de comparar 2 aplicaciones similares (uno con EL trabajando bien y el otro no), notó que el problema en mi tomcat 7 dependía de la versión de la aplicación web especificada en el web.xml de la aplicación.

El mismo jsp que usa Web App 2.3 muestra $ {someMessage}. (Por cierto, esto es lo que obtienes usando arquetipo maven: generate con 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> 
... 

La misma JSP mediante aplicación web 2.4 muestra el modelo de objetos correctamente:

<?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 que ayuda!

Cuestiones relacionadas