简单的HelloSpringMVC的程序,调整了大半天一直是404,但是最终还是解决了,为此做个记录
跟着狂神说学习的SpringMVC,狂神是Spring5,用的依赖为:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.22</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.0</version>
<scope>test</scope>
</dependency>
<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>
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
由于我使用的最新版本的Spring6,所以采用的依赖为:
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>6.1.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/jakarta.servlet.jsp.jstl/jakarta.servlet.jsp.jstl-api -->
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>3.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/jakarta.servlet.jsp/jakarta.servlet.jsp-api -->
<dependency>
<groupId>jakarta.servlet.jsp</groupId>
<artifactId>jakarta.servlet.jsp-api</artifactId>
<version>3.1.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
唯一区别大概就是所有的javax都改成了jakarta,这是因为Spring6之后全部都改为了jakarta,这是由于
编写HelloSpringMVC.class时,Spring6需要导入的包为
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
而Spring5需要导入的包为:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
如果对应版本的Spring导入的包错误,以下代码就会爆红
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
}
接下来便是踩坑之路:
首先,我是按照视频敲得代码(代码绝对无错误),配置的Tomcat9,运行后直接404,然后根据网上的教程改为Tomcat10,结果还是404,网上找了半天,都没解决,心态崩了。
直接删项目,重新建了一个,结果被我发现了问题所在。
由于我按照狂神的步骤来建立的maven项目,也就是先建立一个父工程,然后在里面建立子Module,最后对子工程Add FrameWork Support:
问题就出在这,狂神对子工程Add FrameWork Support时,在父工程的pom.xml中是没有导入依赖的,这就导致了Add的web默认是4.0版本的,且无法进行选择:
最终得到的web.xml是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
</web-app>
但是如果父工程已经导入了Spring6的依赖后,注意,一定要已经下载下来了:
这时候再对子工程Add web时,就默认是6.0版本了。
最终得到的web.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
version="6.0">
</web-app>
看到区别了吧!
最终得出的结论就是,Spring6不匹配web版本4,因此需要将web改成版本6的才行,当然,如果采用Spring5,那么用web版本4是没有问题的。
最后,运行,成功!