使用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>
为什么我的控制器没有使用“/”路径激活? 非常感谢!
答案 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配置。