Spring MVC: Почему мне нужно (и как мне это сделать) предоставить отображение для представления JSP? - PullRequest
0 голосов
/ 04 ноября 2011

Я пытаюсь заставить метод контроллера возвращать объект ModelAndView, который использует JSP в качестве представления. Конфигурация контекста приложения для 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, является JstlView, и я предположил, что Spring знает, как с этим справиться, и проследит за тем, чтобы он отображался в браузере. Но, возможно, нет, и мне нужно добавить код, чтобы это произошло? Похоже, что происходит перенаправление, и мне нужно снова перехватить запрос с помощью другого метода сопоставленного контроллера, и в этом методе выполнить рендеринг JSP. Это тот случай? Я ничего не вижу в справочных документах, которые объясняют, как это сделать, может, кто-то может указать мне правильное направление?

Заранее спасибо за ваши комментарии, предложения и т. Д.

1 Ответ

1 голос
/ 04 ноября 2011

Я не уверен, в чем разница, но, глядя на эквивалент в одном из моих (работающих) приложений, я использую 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>

Все остальное, что у вас есть, выглядит примерно так же.

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