前言
内容主要参考自《Spring源码深度解析》一书,算是读书笔记或是原书的补充。进入正文后可能会引来各种不适,毕竟阅读源码是件极其痛苦的事情。
本文主要涉及书中第十一章的部分,依照书中内容以及个人理解对Spring源码进行了注释,详见Github仓库:https://github.com/MrSorrow/spring-framework
本文作为正式研究SpringMVC的预热文章,主要目的是为了搭建SpringMVC源码的测试工程。为什么要单独的作为一篇文章,因为发现想要测试SpringMVC的源码和之前的工程搭建还是不太一样的,笔者也调试了很久才终于搭建成功。
本文主要对应书中的第一部分,为了演示SpringMVC的使用案例,完全是为了复现书上的测试过程,过程中出现很多问题,记录下来以便参考。
I. 新建模块
首先我们准备新建一个专门测试SpringMVC的 module,不再使用之前文章测试模块 spring-mytest,新建的模块名称我们定义为 spring-mymvc。具体步骤见图中红框。
新建完毕后可以看到,一个新的模块就创建好了。
II. 添加依赖
在 build.gradle 配置文件中添加SpringMVC的依赖,配置文件如下。
plugins {
id 'java'
id 'war'
}
group 'org.springframework'
version '5.1.0.BUILD-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile(project(":spring-context"))
compile(project(":spring-context-support")) // freemarker需要,不加可能报错
compile(project(":spring-webmvc"))
providedCompile 'javax.servlet:servlet-api:2.5'
compile 'javax.servlet.jsp.jstl:jstl:1.2'
compile 'org.apache.taglibs:taglibs-standard-spec:1.2.5'
compile 'org.apache.taglibs:taglibs-standard-impl:1.2.5'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
依赖关系图如下。
III. 编写示例案例
新建Web.xml
打开项目的 Project Structure 窗口,打开左侧的 Facets 和 Artifacts 两个窗口,删除之前创建好的内容,我们手动亲自创建一遍。
先进入 Facets 窗口,点击 + 号,选择 Web,然后会让我们选择模块。选中我们创建的 spring-mymvc-main,点击 OK。
新建成功后,会出现一个 Web 选项卡,点击选中,右侧会显示 web.xml 的位置。注意查看路径,IDEA默认的路径是在 .idea 目录下的,而我们最终是要在自己的测试模块的 webapp/WEB-INF/ 下的,所以要进行修改。
点击两个路径右侧的绿色铅笔进行修改。如果没有 webapp/WEB-INF/ 目录则自行新建,最后路径末尾别忘记 web.xml,这样IDEA就会在 webapp/WEB-INF/ 目录下帮我们新建一个 web.xml。
然后修改 Web Resource Path 为 webapp 目录即可。
创建完 Facets,随后创建 Artifacts。
选中我们的 spring-mymvc-main 模块,结果如下。之后我们解决问题都是在这个地方进行调整。
回到工程目录,此时 webapp/WEB-INF/ 目录下就存在 web.xml 文件了。修改文件内容,至于何种含义,相信会使用Spring的人不用多说。
<?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_3_1.xsd"
version="3.1">
<!--Spring配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-config.xml</param-value>