HTTP-статус 404 в приложении Spring 3.1 MVC - PullRequest
2 голосов
/ 13 февраля 2012

Я пытаюсь создать и запустить простое веб-приложение mvc Spring 3.1, в котором я определил контроллер, который просто возвращает «привет» в теле ответа, используя класс ниже:

package com.jr.freedom.controllers;

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

@Controller
public class Hello {

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    @ResponseBody
    public String helloWorldInJson() {

        return "hello";
    }
}

Я пробовал этот URL, но продолжаю возвращать ошибку 404?

http://localhost:8080/FreedomSpring/hello

Вот мой сервлет:

<?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.1.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <import resource="mvc-config.xml" />

    <bean
        class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources 
        in the /WEB-INF/views directory -->
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />

    <context:component-scan base-package="com.jr.freedom.controllers"></context:component-scan>


</beans>

вот файл web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <servlet>
        <servlet-name>FreedomSpring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>FreedomSpring</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>


    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>

        </param-value>
    </context-param>

    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/log4j.xml</param-value>
    </context-param>

    <welcome-file-list>
        <welcome-file>
      index.jsp
    </welcome-file>
    </welcome-file-list>

    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>

</web-app>

И, наконец, мой mvc-config.xml

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

    <mvc:annotation-driven />

    <!-- the application context definition for the springapp DispatcherServlet -->


    <mvc:view-controller path="/" view-name="index.jsp" />


</beans>

Кстати, я использую Tomcat 7 на компьютере с Windows 7. В моем лог-файле от tomcat ошибок не найдено:

13-Feb-2012 12:37:36 org.apache.catalina.core.ApplicationContext log
INFO: Destroying Spring FrameworkServlet 'FreedomSpring'
13-Feb-2012 12:37:36 org.apache.catalina.core.ApplicationContext log
INFO: Shutting down log4j
13-Feb-2012 12:37:36 org.apache.catalina.core.ApplicationContext log
INFO: Closing Spring root WebApplicationContext
13-Feb-2012 12:37:37 org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
13-Feb-2012 12:37:37 org.apache.catalina.core.ApplicationContext log
INFO: Set web app root system property: 'webapp.root' = [C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\FreedomSpring\]
13-Feb-2012 12:37:37 org.apache.catalina.core.ApplicationContext log
INFO: Initializing log4j from [C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\FreedomSpring\WEB-INF\log4j.xml]
13-Feb-2012 12:37:37 org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring FrameworkServlet 'FreedomSpring'


0:0:0:0:0:0:0:1 - - [13/Feb/2012:12:37:45 +0000] "GET /FreedomSpring HTTP/1.1" 302 -
0:0:0:0:0:0:0:1 - - [13/Feb/2012:12:37:45 +0000] "GET /FreedomSpring/ HTTP/1.1" 404 997
0:0:0:0:0:0:0:1 - - [13/Feb/2012:12:37:51 +0000] "GET /FreedomSpring/hello HTTP/1.1" 404 1012

Есть идеи?

1 Ответ

4 голосов
/ 13 февраля 2012

Ваш DispatcherServlet сопоставлен с *.htm:

<servlet-mapping>
    <servlet-name>FreedomSpring</servlet-name>
    <url-pattern>*.htm</url-pattern>
</servlet-mapping>

Но вы обращаетесь к контроллеру по несоответствующему URL: http://localhost:8080/FreedomSpring/hello. У вас есть три варианта:

  1. Измените ваш сервлет диспетчера на:

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

    , но в этом случае все запросы будут обрабатываться через Spring MVC, включая изображения и другие статические ресурсы

  2. Также используйте расширение в контроллерах:

    <url-pattern>/*.htm</url-pattern>
    

    и сопоставьте Hello контроллер с .htm, чтобы вы использовали: http://localhost:8080/FreedomSpring/hello.htm.

  3. Карта контроллеровв другой подкаталог:

    <url-pattern>/mvc/*</url-pattern>
    

    , чтобы получить к ним доступ, вам придется использовать: http://localhost:8080/FreedomSpring/mvc/hello без внесения каких-либо изменений в сам контроллер.

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