Spring MVC Hello World项目Tomcat运行报错:DispatcherServlet无URI映射
嘿,这个错误我可太熟了!之前折腾Spring MVC入门Hello World项目时也踩过这个坑,咱们一步步来揪出问题:
1. 先查DispatcherServlet的URL映射配置
你只贴了web.xml的开头,核心的DispatcherServlet配置还没看到——这绝对是重灾区!你得确认dispatcher这个Servlet的<url-pattern>是不是写对了:
- 如果你想让它处理所有请求,应该写
<url-pattern>/</url-pattern>(注意是单斜杠,别写成/*,那是另一种规则) - 如果是后缀匹配(比如
.do),那访问根路径/ecommerce.mvc/肯定不会被DispatcherServlet接管,自然报映射找不到的错
把你的web.xml里这部分完整代码贴出来会更清楚,比如类似这样的配置段:
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/dispatcher-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
2. 检查控制器的@RequestMapping注解
你的Hello World控制器是不是真的映射了根路径/?比如得有类似这样的代码:
@Controller public class HelloController { // 直接映射根路径 @RequestMapping("/") public String showHelloPage() { return "hello"; // 对应你的视图文件名,比如hello.jsp } }
要是控制器上的@RequestMapping写了前缀(比如@RequestMapping("/hello")),那你得访问/ecommerce.mvc/hello才能匹配,访问根路径肯定找不到。
3. 确认Spring配置的组件扫描有没有生效
检查你的Spring MVC配置文件(一般是dispatcher-servlet.xml)里,有没有开启组件扫描,而且包路径要对准你的控制器所在位置:
<!-- 替换成你自己的控制器包路径 --> <context:component-scan base-package="com.yourproject.controllers" />
要是包路径写错了,Spring根本没加载到你的控制器类,那肯定没有任何映射可用。
4. 别搞混Tomcat的上下文路径
你访问的路径是/ecommerce.mvc/,这说明Tomcat给你的应用分配的上下文路径是ecommerce.mvc——记住,DispatcherServlet处理的是上下文路径之后的部分!比如你控制器里的@RequestMapping("/")对应的就是/ecommerce.mvc/,千万别在注解里加/ecommerce.mvc,那会变成/ecommerce.mvc/ecommerce.mvc/,肯定匹配不上。
要是上面这些排查都没用,把你的完整web.xml、Spring配置文件和控制器代码贴出来,咱们再接着找问题!
内容的提问来源于stack exchange,提问作者user7179261

