阅读量:0
SpringMVC简介
Spring MVC
是 Spring
框架的一部分,它是一个用于构建 Web
应用程序的模型-视图-控制器(Model-View-Controller,MVC)
框架。Spring MVC
提供了一种清晰的方式来分离业务逻辑、用户界面和控制流程,使得应用程序更加模块化、易于维护和扩展。
SpringMVC入门案例
注意点
- 导入依赖
<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
控制器类
//定义表现层控制器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
//springmvc配置类,本质上还是一个spring配置类 @Configuration @ComponentScan("com.itheima.controller") public class SpringMvcConfig { }
- 初始化
Servlet
容器,加载SpringMVC
环境,并设置SpringMVC
技术处理的请求config/ServletContainersInitConfig.class
//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
- 示例
@Controller public class UserController { }
- 名称:
@RequestMapping
- 类型:方法注解
- 位置:
SpringMVC
控制器方法定义上方 - 作用:设置当前控制器方法请求访问路径
- 示例
//设置映射路径为/save,即外部访问路径 @RequestMapping("/save") public String save(){ System.out.println("user save ..."); return "{'info':'springmvc'}"; }
- 名称:
@ResponseBody
- 类型:方法注解
- 位置:
SpringMVC
控制器方法定义上方 - 作用:设置当前控制器方法响应内容为当前返回值,无需解析
- 示例
//设置映射路径为/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
@Configuration @ComponentScan({"com.itheima.service","com.itheima.dao"}) public class SpringConfig { }
config/SpringMvcConfig.class
@Configuration @ComponentScan("com.itheima.controller") public class SpringMvcConfig { }
config/ServletContainersInitConfig.class
//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[]{"/"}; } }
或者
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[]{"/"}; } }