tomcat - @RequestMapping (“/” )无法访问

标签 tomcat spring-mvc

使用 Spring MVC,我想将 Java Web 应用程序的根路径映射到 Controller 。

Controller 类:

package project.controller;

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

@Controller
public class MainController {

    @RequestMapping(value={"/", "/index"})
    public String home() {
        return "index";
    }
}

home() 方法映射到“/”和“/index”url 片段。/index 工作正常:

http://localhost:8080/JavaSpringWebProject/index

但是“/”会生成 http 404 错误。

http://localhost:8080/JavaSpringWebProject/

我使用调试器来查看 DispatcherServlet 中的 doService() 方法是否按应有的方式调用。它通过/index 调用,但不通过/调用。我的猜测是 Tomcat (v7) 不会调用 DispatcherServlet。但为什么呢?

我使用 Spring 4.0.6 创建了一个测试项目(来自 Eclipse WTP 的动态 Web 项目)来隔离问题。可以从 svn 中查看 http://code.google.com/p/basic-spring-java/

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

      <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>/</url-pattern>
      </servlet-mapping>

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

      <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.css</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.jpg</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.html</url-pattern>
      </servlet-mapping>

    </web-app>

为什么我的 Controller 没有通过“/”路径激活? 非常感谢!

最佳答案

编辑:第一个建议是错误的或至少不够


我不知道为什么,但在我的 Controller 中,我必须使用 "" 才能访问根 URL。

只需使用 @RequestMapping(value={"", "/", "/index"}) 就可以了。


现在正确的方法是:

由于只有 Spring 开发人员(也许还有其他一些专家)知道的原因,将 spring 调度程序 servlet 映射到“/”会破坏 spring 根 url 检测。我只在另一篇文章的最后一个答案中找到了一个元素:In a servlet mapping in Spring MVC how do I map the root of a url pattern directory? ,但是我用Spring 3.2.4测试了一下,似乎是真的。

因此在 web.xml 中,您必须编写:

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

不幸的是,这会捕获所有内容,并且尝试让默认服务器提供任何服务是没有用的。您必须通过

配置 Spring 内部资源管理
<mvc:resources mapping="/resources/**" location="/public-resources/"/>

如果使用 xml 配置或

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations("/public-resources/");
  }
}

如果使用java配置。

关于tomcat - @RequestMapping (“/” )无法访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25059898/

相关文章:

tomcat - 安装具有评估拓扑的 IBM Rational CLM 解决方案后服务器不会启动

java - spring mvc 不返回 json 内容 - 错误 406

java - 如何使等待 Tomcat 的阻塞 Java 线程可中断

eclipse - 使用 jsp 和 session 创建一个简单的登录页面

javascript - 获取 Thymeleaf ${pageContext.request.contextPath} 的语法是什么

java - 我想使用 spring mvc 通过 zohomail 发送电子邮件 zoho mail 发送电子邮件的此配置是否正确

Spring (数据、mvc、安全)依赖项 : IncompatibleClassChangeError

java - spring boot dosent编译jsp

java - 使用 servlet 3.1 异步 io 有什么真正的好处?

Java 类不会导入到 .jsp 文件