Spring MVC:为什么我需要(以及我如何?)为JSP视图提供映射?

时间:2011-11-03 20:49:35

标签: spring-mvc

我正在尝试让控制器方法返回一个使用JSP作为视图的ModelAndView对象。 ViewResolver的应用程序上下文配置:

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

我用于视图的JSP位于/WEB-INF/jsp/error.jsp:

<%@ page language="java" 
         contentType="text/html; charset=ISO-8859-1" 
         pageEncoding="ISO-8859-1"%>
<html>
    <body>
        <h1>Unexpected Error</h1>

        ${message}

    </body>
</html>

在我的控制器中,我解析了View并返回ModelAndView:

ModelAndView modelAndView = new ModelAndView("error");
modelAndView.addObject("message", errorMessage);
return modelAndView;

我可以单步执行代码,所有看起来都很好,直到返回ModelAndView,此时我在日志中看到了这一点:

DEBUG 2011-11-03 15:33:52,262 (org.springframework.web.servlet.view.JstlView:236) - Forwarding to resource [/WEB-INF/jsp/error.jsp] in InternalResourceView 'error'
DEBUG 2011-11-03 15:33:52,262 (org.springframework.web.servlet.DispatcherServlet:845) - DispatcherServlet with name 'dispatcherServlet' determining Last-Modified value for [/nacem-rest/WEB-INF/jsp/error.jsp]
DEBUG 2011-11-03 15:33:52,263 (org.springframework.web.servlet.DispatcherServlet:853) - No handler found in getLastModified
DEBUG 2011-11-03 15:33:52,263 (org.springframework.web.servlet.DispatcherServlet:693) - DispatcherServlet with name 'dispatcherServlet' processing GET request for [/nacem-rest/WEB-INF/jsp/error.jsp]
WARN  2011-11-03 15:33:52,263 (org.springframework.web.servlet.PageNotFound:965) - No mapping found for HTTP request with URI [/nacem-rest/WEB-INF/jsp/error.jsp] in DispatcherServlet with name 'dispatcherServlet'
DEBUG 2011-11-03 15:33:52,264 (org.springframework.web.servlet.DispatcherServlet:674) - Successfully completed request

所以看起来我还需要对JSP文件进行某种映射,即使web.xml指定所有URL都应由DispatcherServlet处理:

<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/application-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

显然我需要将这个JSP文件的请求映射添加到控制器中,尽管我不知道为什么或如何。 JSP支持的View是一个JstlView,我认为Spring知道如何处理它,并确保它在浏览器中呈现。但也许不是,我需要添加一些代码才能实现这一目标?看起来正在进行重定向,我需要通过另一个映射的控制器方法再次捕获请求,并在该方法中继续渲染JSP。是这样的吗?我在参考文件中没有看到任何解释如何做到这一点,也许有人可以指出我正确的方向?

提前感谢您的意见,建议等。

1 个答案:

答案 0 :(得分:1)

我不确定区别是什么,但在我的(工作)应用中查看等效内容时,我使用的是InternalResourceViewResolver而不是UrlBasedViewResolver。例如:

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

此外,我的web.xml不太可能具有不同的模式(/而不是/*):

<servlet>
  <servlet-name>dispatcher</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/spring/*.spring.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>dispatcher</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

你拥有的其他一切看起来都差不多。