@RequestMapping(“/”)无法访问

时间:2014-07-31 13:18:19

标签: tomcat spring-mvc

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

控制器类:

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的Dynamic Web项目)来隔离问题。可以从http://code.google.com/p/basic-spring-java/

的svn查看

的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>

为什么我的控制器没有使用“/”路径激活? 非常感谢!

1 个答案:

答案 0 :(得分:2)

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


我不知道为什么,但在我的控制器中,我必须使用""来访问根网址。

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


现在正确的方法:

由于只有Spring开发人员(以及其他一些专家)知道的原因,将弹簧调度程序servlet映射到&#34; /&#34;打破春根网址检测。我只在其他帖子的最后一个答案中找到了一个元素: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 config或

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

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

如果使用java配置。