SpringMVC简介
Spring MVC
是 Spring
框架的一部分,它是一个用于构建 Web
应用程序的模型-视图-控制器(Model-View-Controller,MVC)
框架。Spring MVC
提供了一种清晰的方式来分离业务逻辑、用户界面和控制流程,使得应用程序更加模块化、易于维护和扩展。
SpringMVC入门案例
注意点
- 导入依赖
java
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
- 创建
SpringMVC
控制器类
java
//定义表现层控制器bean
@Controller
public class UserController {
//设置映射路径为/save,即外部访问路径
@RequestMapping("/save")
//设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{'info':'springmvc'}";
}
//设置映射路径为/delete,即外部访问路径
@RequestMapping("/delete")
@ResponseBody
public String delete(){
System.out.println("user save ...");
return "{'info':'springmvc'}";
}
}
- 初始化
SpringMVC
环境(同Spring
环境),设置SpringMVC
加载对应的bean
config/SpringMvcConfig .class
java
//springmvc配置类,本质上还是一个spring配置类
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
- 初始化
Servlet
容器,加载SpringMVC
环境,并设置SpringMVC
技术处理的请求
config/ServletContainersInitConfig.class
java
//web容器配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
//加载springmvc配置类,产生springmvc容器(本质还是spring容器)
protected WebApplicationContext createServletApplicationContext() {
//初始化WebApplicationContext对象
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
//加载指定配置类
ctx.register(SpringMvcConfig.class);
return ctx;
}
//设置由springmvc控制器处理的请求映射路径
protected String[] getServletMappings() {
return new String[]{"/"};
}
//加载spring配置类
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
注解
- 名称:
@Controller
- 类型:类注解
- 位置:
SpringMVC
控制器类定义上方 - 作用:设定
SpringMVC
的核心控制器bean
- 示例
java
@Controller
public class UserController {
}
- 名称:
@RequestMapping
- 类型:方法注解
- 位置:
SpringMVC
控制器方法定义上方 - 作用:设置当前控制器方法请求访问路径
- 示例
java
//设置映射路径为/save,即外部访问路径
@RequestMapping("/save")
public String save(){
System.out.println("user save ...");
return "{'info':'springmvc'}";
}
- 名称:
@ResponseBody
- 类型:方法注解
- 位置:
SpringMVC
控制器方法定义上方 - 作用:设置当前控制器方法响应内容为当前返回值,无需解析
- 示例
java
//设置映射路径为/save,即外部访问路径
@RequestMapping("/save")
//设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{'info':'springmvc'}";
}
工作流程
-
启动服务器初始化过程
- 服务器启动,执行
ServletContainersInitConfig
类,初始化web
容器 - 执行
createServletApplicationContext
方法,创建了WebApplicationContext
对象 - 加载
SpringMvcConfig
- 执行
@ComponentScan
加载对应的bean
- 加载
UserController
,每个@RequestMapping
的名称对应一个具体的方法 - 执行
getServletMappings
方法,定义所有的请求都通过SpringMVC
- 服务器启动,执行
-
单次请求过程
- 发送请求
localhost/save
web
容器发现所有请求都经过SpringMVC
,将请求交给SpringMVC
处理- 解析请求路径
/save
- 由
/save
匹配执行对应的方法save()
- 执行
save()
- 检测到有
@ResponseBody
直接将save()
方法的返回值作为响应体返回给请求方
- 发送请求
SpringMVC bean加载控制
Controller加载控制与业务bean加载控制
SpringMVC
相关bean
(表现层bean
)Spring
控制的bean
- 业务
bean
(Service
) - 功能
bean
(DataSource
等)
- 业务
因为功能不同,如何避免Spring
错误的加载到SpringMVC
的bean
SpringMVC
加载的bean
对应的包均包含在controller
包内,Spring
加载的bean
设定扫描范围为精准范围,例如service
包、dao
包
config/SpringConfig.class
java
@Configuration
@ComponentScan({"com.itheima.service","com.itheima.dao"})
public class SpringConfig {
}
config/SpringMvcConfig.class
java
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
config/ServletContainersInitConfig.class
java
//web配置类简化开发,仅设置配置类类名即可
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[]{"/"};
}
}
或者
java
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
protected WebApplicationContext createRootApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringConfig.class);
return ctx;
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
}