2010-10-24 2 views
5

Я пытаюсь настроить скелет Проект Spring 3 MVC, но у меня возникают трудности с получением представлений. Я следовал структуру, как описано в примере проекта MVC-основной и в http://blog.springsource.com/2009/12/21/mvc-simplifications-in-spring-3-0/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+Interface21TeamBlog+%28SpringSource+Team+Blog%29 настроить web.xml, приложение-config.xml и Mvc-config.xml файлов. Контроллер получает вызов, но когда он достигает точки поиска и рендеринга, я получаю ошибку . Файлы являются следующие:Spring 3 MVC - Вызывается контроллер, но просмотры не найдены

web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

    <!-- Handles all requests into the application --> 
    <servlet> 
     <servlet-name>myServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value> 
       /WEB-INF/app-config.xml 
      </param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>myServlet</servlet-name> 
     <url-pattern>/app/*</url-pattern> 
    </servlet-mapping> 

</web-app> 

приложение-config.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <!-- Scans the classpath of this application for @Components to deploy as beans --> 
    <context:component-scan base-package="com.myProject" /> 

    <!-- Application Message Bundle --> 
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
     <property name="basename" value="/WEB-INF/messages/messages" /> 
     <property name="cacheSeconds" value="0" /> 
    </bean> 

    <!-- Configures Spring MVC --> 
    <import resource="mvc-config.xml" /> 

</beans> 

MVC-config.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 

    <!-- Configures the @Controller programming model --> 
    <mvc:annotation-driven /> 

    <mvc:view-controller path="/app" view-name="welcome"/> 

    <!-- Configures Handler Interceptors -->  
    <mvc:interceptors> 
     <!-- Changes the locale when a 'locale' request parameter is sent; e.g. /?locale=de --> 
     <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> 
    </mvc:interceptors> 

    <!-- Saves a locale change using a cookie --> 
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" /> 

    <!-- Resolves view names to protected .jsp resources within the /WEB-INF/views directory --> 
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/views/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 

</beans> 

В "Java Resources: ЦСИ" -> com.myProject ->HelloWorldController.java я есть:

package com.myProject; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.servlet.ModelAndView; 

@Controller 
@RequestMapping(value="/helloworld") 
public class HelloWorldController { 

    @RequestMapping(method=RequestMethod.GET) 
    public ModelAndView helloWorld() { 
     ModelAndView mav = new ModelAndView(); 
     mav.setViewName("helloworld"); 
     mav.addObject("message", "Hello World!"); 
     return mav; 
    } 

    @RequestMapping(value="/Second", method = RequestMethod.GET) 
    public ModelAndView Second(){ 
     ModelAndView mav = new ModelAndView(); 
     mav.setViewName("Second"); 
     mav.addObject("message", "Hello World!"); 
     return mav; 
    } 
} 

и в WebContent/WEB-INF/виды я есть:

WebContent    (folder) 
    WEB-INF    (folder) 
    views    (folder) 
     helloworld  (folder) 
     helloworld.jsp (.jsp view) 
     helloworld.jsp (.jsp view) 
     welcome.jsp  (.jsp view) 

Представления имеют в своем распоряжении html. Когда я запрашиваю http: // localhost: 8080/projectname/app Я правильно получаю просмотров -> welcome.jsp страница. Тем не менее, когда я запрашиваю http: // localhost: 8080/projectname/app/helloworld или http: // localhost: 8080/projectname/app/helloworld/ исполнение выполняет правильные действия контроллера, но я получаю HTTP Status 404 - /projectname/WEB-INF/views/helloworld.jsp

Может ли кто-нибудь сообщить, что не так?

Благодаря

+0

У вас есть разные значения '@ RequestMapping' для класса контроллера (' HelloWorldController') и метод там ('Second()'). Вы пытались помещать 'value ="/helloworld "в' @ RequestMapping' из 'helloWorld()' вместо аннотации класса? – Jan

+0

Я вообще согласен с @GaryF: есть несоответствие в URL-адресах ("/ app/helloworld" v.s. "/ helloworld"). Может быть, проще переписать аннотацию, чтобы выглядеть как '@RequestMapping (value ="/app/helloworld "), а затем использовать' UrlRewriteFilter'. Или в аннотации класса должно указываться '@RequestMapping (value ="/app ")', а в аннотации метода должно указываться '@RequestMapping (value ="/helloworld ")' (относительное сопоставление, см. [Здесь] (http: // static. springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping)). –

+0

Привет @Matthew Я столкнулся с такой же ситуацией, не могли бы вы помочь мне на http://stackoverflow.com/questions/17697899/how-to-map-dynamic-url-prj-noticeopen-2-in-spring -mvc-controller –

ответ

0

Похоже, это потому, что вы не указали viewClass собственности.

Вы можете попробовать с

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

Он работает на странице приветствия в связи с этим

<mvc:view-controller path="/app" view-name="welcome"/> 
+2

Задание 'viewClass' не требуется, Spring выберет разумное значение по умолчанию. – skaffman

1

Есть несколько вопросов. Первый из них является то, что вы только отправка/приложение/* URLs до весны в вашем web.xml:

<url-pattern>/app/*</url-pattern> 

Это нормально, если отображение запроса было/приложение/HelloWorld, но это означает, что/HelloWorld не даже получить до весны. Вероятно, вы хотите использовать фильтр urlrewrite для сопоставления запросов в пространстве/app/*.

Возьмите зависимость от Таки, а затем добавить к вашей web.xml:

<filter> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Затем добавить файл с именем urlrewrite.xml в каталоге WEB-INF, содержащий:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN" "http://tuckey.org/res/dtds/urlrewrite3.0.dtd"> 
<urlrewrite default-match-type="wildcard"> 
    <rule> 
     <from>/images/**</from> 
     <to>/images/$1</to> 
    </rule> 
    <rule> 
     <from>/scripts/**</from> 
     <to>/scripts/$1</to> 
    </rule> 
    <rule> 
     <from>/styles/**</from> 
     <to>/styles/$1</to> 
    </rule> 
    <rule> 
     <from>/**</from> 
     <to>/app/$1</to> 
    </rule> 
    <outbound-rule> 
     <from>/app/**</from> 
     <to>/$1</to> 
    </outbound-rule>  
</urlrewrite> 

После этого запрос/helloworld должен идти в нужное место. Возможно, вы захотите изменить контроллер представления корня тоже:

<mvc:view-controller path="/" view-name="welcome"/> 
0

Я думаю, что точка зрения должна быть в Views/helloworld.jsp, а не в Views/HelloWorld/helloworld.jsp

+0

Matthew скопировал 'helloworld.jsp' в двух разных местах, чтобы убедиться, что это не место JSP, вызвавшее проблему. –

0

Вы должны установить вид Имя в

mav.setViewName("/helloWorld/helloWorld"); 
0

Вы должны изменить «MVC-конфигурации» в вашеИмя-servlet.xml»вашеимя должен быть матч с вашим именем сервлета в Уре файле web.xml, что в Уре случае следует myservlet-servlet.xml потому что диспетчер весеннего диспетчера ищет файл с именем файла расширения «-сервера» в W EB-INF. и в вашем файле myservlet-servlet.xml для части суффикса вы должны сказать так: «WEB-INF/yourfoldername (например, view)», пока ваш контроллер не будет искать имя ur, которое указано u в методе контроллера ur (например, ModelAndView ("Здравствуйте")).

0

Как вы следующие конфигурации:

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

и контроллер возвращения чистое имя вида.

Проверьте, что файлы вашего вида существуют внутри /WEB-INF/views/ при запуске приложения.

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