springmvc无法调用controller的方法

springmvc cannot call controller's method

目前我在配置 springmvc web 项目时遇到问题。

下面是我的web.xml

 <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/api/*</url-pattern>
</servlet-mapping>

我这样定义 dispatcher-servlet.xml

<context:component-scan base-package="xxx.controller"

<mvc:annotation-driven />

并且在包 xxx.controller 中我定义了一个 class TestController

@Controller
@RequestMapping(value="/api")
public class TestController {


    @RequestMapping(value = "/hello")
    @ResponseBody
    public String hello(){
        System.out.println("comming hello");
        return "hello world";
    }

} 

现在,当我启动 tomcat 并想要访问 localhost:8080/testproject/api/hello 时,spring 通知我

[10:10:58|WARN |(org.springframework.web.servlet.PageNotFound)]=[No mapping found for HTTP request with URI [/testproject/api/hello] in DispatcherServlet with name 'dispatcher']

但是如果我将 web.xml 中的 url 模式修改为

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

可以访问localhost:8080/testproject/api/hello。我不知道为什么会这样。我确实想使用 /api/* 而不是 /

谁能帮我配置控制器路径映射?非常感谢!

当您定义以下内容时,您是在告诉您的应用程序在 /api 上下文中 运行:

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

所以要访问您的控制器,URL 必须是 localhost:8080/api/api/hello

只需从您的调度程序中删除 /api,然后您的映射将自动默认为 localhost:8080/api/hello 并正常工作。

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

否则,如果您想要在 /api 上下文中 运行 您的应用程序,您始终可以选择从控制器中删除 @RequestMapping(value="/api") 。 这样它只识别方法上的映射。