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[]{"/"};
}
}