Spring 3 MVC - контроллер вызывается, но представления не найдены - PullRequest
6 голосов
/ 24 октября 2010

Я пытаюсь настроить скелет Spring 3 MVC , но у меня возникают трудности с отображением представлений.Я следовал структуре, описанной в примере проекта mvc-basic и на 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 , app-config.xml и mvc-config.xml файлы.Контроллер вызывается, но когда он достигает точки нахождения представления и его рендеринга, я получаю 404 ошибку .Это следующие файлы:

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>

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: src» -> 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 / views у меня есть:

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, я правильно получаю страницу views -> welcome.jsp .Однако, когда я запрашиваю http://localhost:8080/projectname/app/helloworld или http://localhost:8080/projectname/app/helloworld/ выполнение попадает в правильные действия контроллера, но я получаю HTTP Status 404 - /projectname/WEB-INF/views/helloworld.jsp

Кто-нибудь может посоветовать, что не так?

Спасибо

Ответы [ 6 ]

1 голос
/ 16 ноября 2010

Есть несколько вопросов. Во-первых, вы отправляете / app / * URL-адреса Spring только в своем web.xml:

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

Хорошо, если отображение запроса было / app / helloworld, но означает, что / helloworld даже не доходит до весны. Вероятно, вы хотите использовать фильтр urlrewrite для отображения запросов в пространство / app / *.

Возьмите зависимость от Tuckey, а затем добавьте это в ваш 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 голосов
/ 28 сентября 2015

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

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

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

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

0 голосов
/ 25 декабря 2012

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

0 голосов
/ 16 ноября 2011

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

mav.setViewName("/helloWorld/helloWorld");
0 голосов
/ 23 февраля 2011

Я думаю, что представление должно быть в views / helloworld.jsp, а не в представлениях / helloworld / helloworld.jsp

0 голосов
/ 24 октября 2010

Похоже, это потому, что вы не указали свойство 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"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...