在完成弹簧控制器服务时获得404

时间:2015-05-06 11:57:36

标签: java html spring annotations spring-3

我创建了一个spring应用程序( Spring版本3.2.8 )。该应用程序工作正常,但我面临的问题是,当我尝试通过URL使用控制器服务时,我收到404错误

我尝试通过浏览器网址使用的网址如下所示,我希望返回test字符串

http://localhost/Spring3Sample/user/getPersonDetails

我的代码如下所示

调度-servlet.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" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
          p:prefix="/" p:suffix=".jsp" />
</beans>

的applicationContext.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">

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

</beans>

UserController.java

package com.controllers;

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

@Controller
@RequestMapping("/user")
public class UserController {

    private static final String APP_JSON = "application/json";

    @RequestMapping(value = "/getPersonDetails", method = RequestMethod.GET, produces = APP_JSON)
    public String getPersonDetails() {
        return "test";
    }
}

的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"
    id="WebApp_ID" version="2.5">
    <display-name>Spring3Sample</display-name>

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

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

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    <session-config>
        <session-timeout>1</session-timeout>
    </session-config>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
</web-app>

任何人都可以告诉我一些解决方案吗

更新1

的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_3_0.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
    <display-name>Spring3Sample</display-name>
:
:
:

5 个答案:

答案 0 :(得分:2)

您已将DispatcherServlet的网址格式映射为

 <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

每当您想要请求控制器方法时,您必须将此URL模式添加到请求中。这样Spring就会找到正确的映射。

将您的请求网址更改为以下内容: -

http://localhost:8080/Spring3Sample/user/getPersonDetails.do

您希望返回测试字符串:

添加

@ResponseBody

对你控制器方法的注释。因此,Spring不会查找名为test的JSP页面,而是将test作为String返回。

修改

来自聊天中的讨论:

你也缺少<mvc:annotation-driven /> in applicationContext.xml

从请求网址中删除*.do

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

答案 1 :(得分:2)

在观察了applicationContext.xml之后,我发现你遗失了<mvc:annotation-driven/>你的更新代码如下所示

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

    <context:component-scan base-package="com.controllers" />
    <mvc:annotation-driven/>  

</beans>
  

解释

<annotation-driven />意味着您可以定义spring bean依赖项而无需在xml中指定一堆元素或实现接口或扩展基类.Means @Controller告诉spring指定的类包含的方法将处理http请求,而无需实现Controller接口或扩展实现控制器的子类。

<context:component-scan base-package="com.controllers" />告诉spring它应该在com.controllers下搜索所有类的类路径并查看每个类以查看它是否有@Controller,@ Repository或@Service,或者@Component,如果确实如此,那么Spring将使用bean工厂注册该类,就像在xml配置文件中定义一样

根据用户评论

  

我们是否需要applicationContext.xml和dispatcher-servlet.xml

实际上,Spring允许您在父子层次结构中定义多个上下文。

applicationContext.xml定义根webapp上下文的bean意味着与webapp关联的上下文。

dispatcher-servlet.xml为一个servlet的应用程序上下文定义bean。 webapp中可以有很多dispatcher-servlet.xml,即servlet spring1的servlet1-servlet.xml,servlet spring2的spring2-servlet.xml

  

note :: spring-servlet.xml中的Bean可以引用bean   applicationContext.xml,但反之亦然。

答案 2 :(得分:1)

答案 3 :(得分:1)

首先在Spring MVC手册中

  

@Controller注释充当注释的构造型   类,表明它的作用。调度员扫描这样的注释   映射方法的类,并检测@RequestMapping注释   (见下一节)。

所以删除这个

@RequestMapping("/user")

因为下一步没有意义

@RequestMapping("/user/getPersonDetails")

你应该注意我添加&#34; / user&#34;到网址。 你也不会返回任何jSon。首先,如果我是你,我用我在这个答案中输入的字符串改变第二个请求映射(在方法getUserDetails上)。

看起来你想念配置文件...... 在web.xml中检查此字符串

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

它只会发送带有&#34; .do&#34;的网址。在他们的最后。

答案 4 :(得分:1)

我将其添加到扩展WebMvcConfigurer的配置类中:

  @Bean
    public ViewResolver viewResolver() {
        final InternalResourceViewResolver bean = new InternalResourceViewResolver();

        bean.setViewClass(JstlView.class);
        bean.setPrefix("/WEB-INF/view/pages/");
        bean.setSuffix(".jsp");

        return bean;
    }

您必须添加此依赖项才能使其起作用:

<dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
</dependency>