SpringMVC入门
标签: SpringMVC入门
2023-04-16 18:23:23 210浏览
一、SpringMVC简介
看到SpringMVC这个名字我们会发现其中包含Spring,那么SpringMVC和Spring之间的会有关系么?
答案是肯定有,SpringMVC隶属于Spring,是Spring技术中的一部分。
那么SpringMVC到底是用来做什么的呢?
- SpringMVC技术与Servlet技术功能等同,均属于web层开发技术
- SPringMVC是一种基于Java实现MVC模型的轻量级web框架
- 优点
- 使用简单,开发便捷(相比于Servlet)
- 灵活性强

当前WEB程序的工作流程:
-
web程序通过浏览器访问前端页面,发送异步请求到后端服务器
-
后台服务器采用三层架构进行功能开发
- 表现层负责接收请求和数据然后将数据转交给业务层
- 业务层负责调用数据层完成数据库表的增删改查,并将结果返给表现层
- 表现层将数据转换成json格式返回给前端
-
前端页面将数据进行解析最终展示给用户。
二、SpringMVC入门案例
2.1、SpringMVC程序开发的流程

1.浏览器发送请求到Tomcat服务器
2.Tomcat服务器接收到请求后,会将请求交给SpringMVC中的DispatcherServlet[前端控制器]来处理请求
3.DispatcherServlet不真正处理请求,只是按照对应的规则将请求分发到对应的Bean对象
4.Bean对象是由我们自己编写来处理不同的请求,每个Bean中可以处理一个或多个不同的请求url
5.DispatcherServlet和Bean对象都需要交给Spring容器来进行管理
具体的实现步骤如下:
-
1.创建web工程(Maven结构)并在工程的pom.xml添加
SpringMVC和Servlet坐标 -
2.创建SpringMVC控制器类(等同于Servlet功能)
-
3.初始化SpringMVC环境(同Spring环境),设定SpringMVC加载对应的
bean -
4.初始化
Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理的请求
2.2、案例制作
步骤1:创建Maven项目,并导入对应的依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>day04_springmvc</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<spring.version>5.2.10.RELEASE</spring.version>
</properties>
<dependencies>
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!--springmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--tomcat服务器-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>80</port><!--tomcat端口号-->
<path>/</path><!--虚拟目录-->
<uriEncoding>UTF-8</uriEncoding><!--访问路径编解码字符集-->
</configuration>
</plugin>
</plugins>
</build>
</project>
步骤2:创建控制器类
package com.liming.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
//2.制作控制器类,等同于Servlet
//2.1必须是一个spring管理的bean
//2.2定义具体处理请求的方法
//2.3设置当前方法的访问路径
//2.4设置响应结果为json数据
@Controller
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{ 'module':'springmvc'}";
}
}
步骤3:创建配置类
package com.liming.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
//3.定义配置类加载Controller对应的bean
@Configuration
@ComponentScan("com.liming.controller")
public class SpringMvcConfig {
}
步骤4:创建Tomcat的Servlet容器配置类
//4.定义servlet容器的配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
//加载springMVC配置
protected WebApplicationContext createServletApplicationContext() {
//初始化WebApplicationContext对象
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
//加载指定配置类
ctx.register(SpringMvcConfig.class);
return ctx;
}
//设置Tomcat接收的请求哪些归SpringMVC处理
protected String[] getServletMappings() {
return new String[]{"/"};
}
//设置spring相关配置
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
步骤5:配置Tomcat环境

步骤6:启动运行项目,浏览器访问

至此SpringMVC的入门案例就已经完成
知识点1:@Controller
| 名称 | @Controller |
|---|---|
| 类型 | 类注解 |
| 位置 | SpringMVC控制器类定义上方 |
| 作用 | 设定SpringMVC的核心控制器bean |
知识点2:@RequestMapping
| 名称 | @RequestMapping |
|---|---|
| 类型 | 类注解或方法注解 |
| 位置 | SpringMVC控制器类或方法定义上方 |
| 作用 | 设置当前控制器方法请求访问路径 |
| 相关属性 | value(默认),请求访问路径 |
知识点3:@ResponseBody
| 名称 | @ResponseBody |
|---|---|
| 类型 | 类注解或方法注解 |
| 位置 | SpringMVC控制器类或方法定义上方 |
| 作用 | 设置当前控制器方法响应内容为当前返回值,无需解析 |
2.3、入门案例总结(1+N)
- 一次性工作
- 创建工程,设置服务器,加载工程
- 导入坐标
- 创建web容器启动类,加载SpringMVC配置,并设置SpringMVC请求拦截路径
- SpringMVC核心配置类(设置配置类,扫描controller包,加载Controller控制器bean)
- 多次工作
-
定义处理请求的控制器类
-
定义处理请求的控制器方法,并配置映射路径(@RequestMapping)与返回json数据(@ResponseBody)
-
最后针对本案例中出现的Tomcat的Servlet容器配置再来总结下:
AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化Web3.0容器的抽象类- AbstractDispatcherServletInitializer提供三个接口方法供用户实现
createRootApplicationContext()方法,如果创建Servlet容器时需要加载非SpringMVC对应的bean,使用当前方法进行,使用方式同createServletApplicationContext()createServletApplicationContext()方法,创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中,而WebApplicationContext的作用范围为ServletContext范围,即整个web容器范围getServletMappings()方法,设定SpringMVC对应的请求映射路径,设置为/表示拦截所有请求,任意请求都将转入到SpringMVC进行处理createServletApplicationContext用来加载SpringMVC环境createRootApplicationContext用来加载Spring环境
2.4、bean加载控制
入门案例的内容已经做完了,在入门案例中我们创建过一个
SpringMvcConfig的配置类,再回想前面咱们学习Spring的时候也创建过一个配置类SpringConfig。这两个配置类都需要加载资源,那么它们分别都需要加载哪些内容?
- SpringMVC加载其相关bean(表现层bean),也就是
controller包下的类- Spring控制的bean:
- 业务bean(Service)
- 功能bean(DataSource,SqlSessionFactoryBean,MapperScannerConfigurer等)
概况的描述下咱们现在的问题就是因为功能不同,如何避免Spring错误加载到SpringMVC的bean?
思路分析:
针对上面的问题,解决方案也比较简单,就是:
- 加载Spring控制的bean的时候排除掉SpringMVC控制的bean
具体该如何排除,有两种方式来解决:
- 方式一:Spring加载的bean设定扫描范围为com.liming,排除掉controller包中的bean
- excludeFilters属性:设置扫描加载bean时,排除的过滤规则
- classes属性:设置排除的具体注解类,当前设置排除@Controller定义的bean
- type属性:设置排除规则,当前使用按照bean定义时的注解类型进行排除
- ANNOTATION:按照注解排除
- ASSIGNABLE_TYPE:按照指定的类型过滤
- ASPECTJ:按照Aspectj表达式排除,基本上不会用
- REGEX:按照正则表达式排除
- CUSTOM:按照自定义规则排除
@Configuration
@ComponentScan(value="com.liming",
excludeFilters=@ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = Controller.class
)
)
public class SpringConfig {
}
- 方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等
@Configuration
@ComponentScan({"com.liming.service","com.liming.dao"})
public class SpringConfig {
}
最后一个问题,有了Spring的配置类,要想在tomcat服务器启动将其加载,我们需要修改ServletContainersInitConfig
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
protected WebApplicationContext createRootApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringConfig.class);
return ctx;
}
}
对于上述的配置方式,Spring还提供了一种更简单的配置方式,可以不用再去创建AnnotationConfigWebApplicationContext对象,不用手动register对应的配置类,如何实现?
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论
您可能感兴趣的博客


