使用 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/