1. 前言
今天以整理知识点的角度来梳理下整个SpringMVC的过程。 以及过程中的注意点
2. 合适人群
- 初学Spring MVC的人
- 有基于Spring MVC短期做需求的人
3. 开始
3.1 设备
为了更好的展示我们每一步做的内容,这里我会把我使用的开发工具的版本展示出来,因为不同的版本选项内容不同,位置不同
3.2 项目搭建
其实这里不会将每一个过程都截图,因为基本都是下一步相对来说会简单点,所以只截比较重要的图
3.2.1 构建项目第一步
3.2.2 项目的目录结构
3.2.3 项目中引入依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.5</version>
</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</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
spring-context
SpringMVC是基于Spring框架的框架,所以Spring核心包是不可缺少的spring-webmvc
,spring-web
都是做web项目中 不可或缺的包javax.servlet.jsp-api
,javax.servlet-api
是servlet中需要的包,比如说HttpServlet就是基于这两个包。但是这两个包在tomact中存在,所以在打包过程中并不需要他
3.2.4 添加基础配置
为了能够让我们的代码运行起来,我们这里需要添加一些基础的配置
- 在
web.xml
添加映射配置
下面的配置避免我们在controller中继承HttpServlet了
<?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">
<!-- 配置DispatcherServlet -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<!-- 配置映射 -->
<servlet-mapping>
<!--配置dispatcherServlet的映射路径为 / 包含全部的servlet, JSP除外-->
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
- 添加测试controller, 并且配置controller映射
在controller中 添加类DemoController
package com.lihh.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping("/demo")
@Controller
public class DemoController {
@RequestMapping(value = "/testDemo")
public String testDemo() {
return "/demo.jsp";
}
}
在resources目录下 新建文件
springmvc.xml
为什么需要配置扫描包呢??? Spring的核心之一就是IOC控制反转。其目的就是将实例化的过程交给Spring容器来做,基于多态的原理实现解耦。所以当容器发现被
@Controller
,@Service
,@Mapper
等注解时,都会通过底层反射来实例化被修饰的类。所以我们就需要配置扫描
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
<!-- 配置包扫描,其实就是为了扫描@Controller -->
<context:component-scan base-package="com.lihh.*" />
</beans>
3.2.5 配置加载springmvc.xml
在文件web.xml 中 加载springmvc.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">
<!-- 配置DispatcherServlet -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 项目启动时 实例化springmvc.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 配置映射 -->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3.2.6 此时项目结构
3.2.7 项目初步设置成功
3.3 项目细节优化
3.3.1 web项目执行流程
- 这个是一个基于请求过程的时序图
- 这个是整个SpringMVC 的核心逻辑
- 实现整个
DispatcherServlet
三大件的是:处理映射器
实现controller 查询以及映射处理处理适配器
实现适配 参数以及返回值的处理视图解析器
对视图view等进行解析
3.3.2 一定要是springmvc.xml
吗
其实不写springmvc.xml 也是可以的。SpringMvc会默认加载路径
resources
下的[servlet-name]-servlet.xml 文件的。内容跟springmvc.xml 保持一致就可以。但是这种方式其实我们并不推荐。 所以写到这里了解一下就可以了。
3.3.2 配置SpringMVC 三大核心组件
3.3.2.1 视图解析器
- 通过上述的图片可以看到,其实我们的文件demo.jsp 在web根目录下。 如果想移动到
webapp/WEB-INF/view
下应该怎么办呢。 - 那么原来的controller的返回值 就应该修改下:
/demo.jsp
=>/WEB-INF/view/demo.jsp
了。 如果每个controller都这么写的话,就太麻烦了。所以我们就需要视图解析器,来添加共同的前缀以及后缀了。
在文件
springmvc.xml
中添加下列代码,表示用来设置 视图解析器
<!-- 表示视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
</bean>
3.3.2.2 其余核心组件
- 设置
处理器映射器
以及处理器适配器
方式1:
<!-- 处理映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
<!-- 处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
- 设置
处理器映射器
以及处理器适配器
方式2:
4. 结束
以上的部分是我们在项目创建以及配置的过程中的部分,因为篇幅较长,更多的细节还在后面,如果各位喜欢的话,可以点击收藏关注。尤其如果您是新手,更加应该关注收藏了。如果有什么新想法请及时在评论区给我留言哦