loading

Spring MVC + Webapp 项目显示 404 错误

问题原因

可能是 Tomcat 版本太高导致的,把 Tomcat 10 换成 Tomcat 9 就可以解决这个问题。

下面是我正在做的一个 Spring MVC 入门案例,因为 Tomcat 10,DispatcherServlet 不能拦截请求,访问一个路径时页面直接显示 404。

关键代码

file:[web.xml]
<web-app>
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>
file:[springmvc-config.xml]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean name="/fc" class="controller.FirstController"/>

  <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

  <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>

</beans>
file:[FirstController.java]
public class FirstController implements Controller {

  @Override
  public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
    ModelAndView mav = new ModelAndView();
    mav.addObject("msg", "这是我的第一个 MVC 程序");
    mav.setViewName("/WEB-INF/jsp/first.jsp");
    return mav;
  }

}

问题解决

更换 Tomcat 10 为 Tomcat 9。记得也把 Classes 修改了,用 Tomcat 9 的 lib:

更换 Libraries

因 Tomca 9 的 servlet 依赖是 javax 开头的,所以我们还需要更换包路径:

更换 Tomcat 9 的 servlet 包路径

更换依赖包的包路径,以下适用于 Tomcat 9:

file:[pom.xml]
<!-- servlet -->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>4.0.1</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>javax.servlet.jsp</groupId>
  <artifactId>javax.servlet.jsp-api</artifactId>
  <version>2.3.3</version>
  <scope>provided</scope>
</dependency>

问题总结

这类开发软件最好不要要用最新的,但也不需要用最老的,可以低于最一个版本,新版本改了很多东西,就容易发生各种问题。

posted @ 2022-11-15 16:19  Himmelbleu  阅读(28)  评论(0编辑  收藏  举报