Мой контроллер / сервлет с отображением "/" не перекрывает "Hello App Engine!" - PullRequest
1 голос
/ 20 января 2012

Я работаю с Spring MVC на движке приложений Google, и хотя у меня работает базовый пример "Привет, мир", я не могу заставить свой сервлет появиться, когда использую отображение запроса "/". Даже когда я указываю «/» в качестве сопоставления моего запроса в моем контроллере, я продолжаю получать «Hello App Engine!» страница со ссылкой на мой проект. Я уже вытащил декларацию файла приветствия из моего веб-файла xml.

В основном ...

package my.package.for.spring.stuff.controllers;

import ....;

// It doesn't seem to make a difference if 
// I have this reqeustmapping or not...
@Controller
public class MainController {

  // If I change mapping to "/main" and then go to
  // localhost:8888/main then everything works as expected
  @RequestMapping("/")
  public String HelloWorld() {
    return "MyView";
  }
}

все еще собирается "Hello App Engine!" стр. Также, вот мой web.xml ...

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


    <servlet>
        <servlet-name>SpringAppEngine</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>SpringAppEngine</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

А вот и моя весна 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:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

        <context:component-scan base-package="my.package.for.spring.stuff" />

        <bean id="viewResolver"
                class="org.springframework.web.servlet.view.InternalResourceViewResolver"
                p:prefix="/WEB-INF/views/main/" p:suffix=".jsp" />

</beans>

Почему генерируемый движком приложения файл приветствия все еще отображается, хотя я объявляю корневое сопоставление в моем контроллере? Я знаю, что мои настройки должны быть правильными, потому что когда я изменяю сопоставление запросов, все работает как положено.

Ответы [ 3 ]

8 голосов
/ 21 января 2012

Спецификация сервлета 3.0 гласит:

Строка, содержащая только символ ’/’, обозначает «по умолчанию» сервлет приложения.

И это также говорит:

По умолчанию все приложения будут иметь index.htm (l) и index.jsp в список welcome-file-list. Дескриптор может быть использован для переопределить эти настройки по умолчанию.

Итак, я думаю, что контейнер считает, что неявный index.html файл приветствия является точным соответствием, которое имеет приоритет над сервлетом по умолчанию, сопоставленным с /.

Решением является удаление файла index.html или, возможно, определение явного пустого списка файлов приветствия в дескрипторе.

1 голос
/ 21 января 2012

Очевидно, что извлечения отображения index.html из web.xml недостаточно, вам действительно нужно удалить index.html.Если кто-то может опубликовать ответ, объясняющий, почему я все еще буду голосовать и принимать.

0 голосов
/ 06 января 2013

Этот пост помог мне, и я думаю, что могу объяснить, почему удаление файла решает проблему.Согласно GAE, любой файл в каталоге war (кроме JSP и всего, что есть в WEB-INF) получает сопоставление с этим именем файла.Это неявное отображение заменяет любые правила сервлетов в web.xml:

https://developers.google.com/appengine/docs/java/gettingstarted/staticfiles

Как только вы удалите или переименуете index.html, ваше правило сервлета для "/" будет использоваться вместонеявное отображение для статического файла.

...