大家好,欢迎你们来到我的博客,今天心血来潮,我给自己起了一个笔名叫做Lyle。
her~~llo,我是你们的好朋友Lyle,是名梦想成为计算机大佬的男人!
博客是为了记录自我的学习历程,加强记忆方便复习,如有不足之处还望多多包涵!非常欢迎大家的批评指正。
今天开始学习SpringMVC技术~
目录
补充AbstractDispatcherServletInitializer知识
如何避免Spring错误的加载到SpringMVC的bean?
SpringMVC简介
Spring web MVC框架提供了MVC(模型 - 视图 - 控制器)架构和用于开发灵活和松散耦合的Web应用程序的组件。 MVC模式导致应用程序的不同方面(输入逻辑,业务逻辑和UI逻辑)分离,同时提供这些元素之间的松散耦合。
- 模型(Model)封装了应用程序数据,通常它们将由POJO类组成。
- 视图(View)负责渲染模型数据,一般来说它生成客户端浏览器可以解释HTML输出。
- 控制器(Controller)负责处理用户请求并构建适当的模型,并将其传递给视图进行渲染。
SpringMVC技术是一种基于Java实现MVC模型的轻量级web框架,与Servlet技术功能等同,均属于web层开发技术。
优点:
- 使用简单,开发便捷(相比于servlet)
- 灵活性强
SpringMVC入门案例
①:使用SpringMVC技术需要先导入SpringMVC坐标与Servlet坐标
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.20</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
②:创建SpringMVC控制器类(等同于Servlet功能)
@Controller public class UserController { @RequestMapping("/save")//设置当前操作的访问路径 @ResponseBody //设置当前操作的返回值类型 public String save(){ System.out.println("user save.."); return "{'module':'springmvc'}"; } }
③:初始化SpringMVC环境(同Spring环境),设定SpringMVC加载对应的bean
@Configuration @ComponentScan("test.controller") public class SpringMvcConfig { }
④:初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理的请求
//定义一个servlet容器启动的配置类,在里面加载spring的配置 public class ServletContainerInitConfig extends AbstractDispatcherServletInitializer { //加载springMVC容器配置 @Override protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.register(SpringMvcConfig.class); return context; } //设置哪些请求归属springMVC处理 @Override protected String[] getServletMappings() { return new String[]{"/"}; } //加载spring容器配置 @Override protected WebApplicationContext createRootApplicationContext() { return null; } }
我配置的时本地Tomcat,如何配置可以查看我之前的Tomcat使用的文章。
(87条消息) JavaWeb自我学习——Tomcat简介&基本使用_未来程序员Lyle的博客-优快云博客
https://blog.youkuaiyun.com/weixin_58035422/article/details/123942795?spm=1001.2014.3001.5501没有下载Tomcat可以参考这篇文章。
成功访问。
相关注解
①
名称:@Controller
类型:类注解
位置:SpringMVC控制器类定义上方
作用:设定SpringMVC的核心控制器bean
范例:@Controller public class UserController {}
②
名称:@RequestMapping
类型:方法注解
位置:SpringMVC控制器方法定义上方
作用:设置当前控制器方法请求访问路径范例:
@RequestMapping("/save") public void save(){ system.out.println( "user save ..." ); }
相关属性:
value(默认):请求访问路径③
名称:@ResponseBody
类型:方法注解
位置:SpringMVC控制器方法定义上方
作用:设置当前控制器方法响应内容为当前返回值,无需解析范例:
@RequestMapping( "/save") @ResponseBody public string save(){ system.out.println("user save ..." ); return "{'module':'springmvc'}"; }
入门案例工作流程分析
启动服务器初始化过程:
- 服务器启动,执行servletContainersInitconfig类,初始化web容器
- 执行createServletApplicationContext方法,创建了WebApplicationContext对象
- 加载SpringMvcConfig
- 执行@ComponentScan加载对应的bean
- 加载UserController,每个@RequestMapping的名称对应一个具体的方法
- 执行getServletMappings方法,定义所有的请求都通过SpringMVC
单次请求过程:
- 发送请求localhost/save
- web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理
- 解析请求路径/save
- 由/save匹配执行对应的方法save()
- 执行save()
- 检测到有@ResponseBody直接将save()方法的返回值作为响应求体返回给请求方
SpringMVC入门程序开发总结(1+N)
一次性工作
- 创建工程,设置服务器,加载工程
- 导入坐标
- 创建web容器启动类,加载SpringMVC配置,并设置SpringMVC请求拦截路径
- SpringMVC核心配置类(设置配置类,扫描controller包,加载Controller控制器bean)
多次工作
- 定义处理请求的控制器类
- 定义处理请求的控制器方法,并配置映射路径(@RequestMapping)与返回json数据(@ResponseBody)
补充AbstractDispatcherServletInitializer知识
AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化web3.0容器的抽象类。
AbstractDispatcherServletInitializer提供三个接口方法供用户实现:
- createServletApplicationContext()方法,创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中,而WebApplicationContext
的作用范围为ServletContext范围,即整个web容器范围protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.register(SpringMvcConfig.class); return context; }
- getServletMappings()方法,设定SpringMVC对应的请求映射路径,设置为"/",表示拦截所有请求,任意请求都将转入到SpringMVC进行处理
protected String[] getServletMappings() { return new String[]{"/"}; }
- createRootApplicationContext()方法,如果创建Servlet容器时需要加载非SpringMVC对应的bean,使用当前方法进行,使用方式同createServletApplicationcontext()
protected WebApplicationContext createRootApplicationContext() { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.register(SpringConfig.class); return context; }
如何避免Spring错误的加载到SpringMVC的bean?
SpringMVC控制相关bean是表现层bean
Spring控制的bean为:
- 业务bean (Service)
- 功能bean (DataSource等)
那么问题来了,因为功能不同,如何避免Spring错误的加载到SpringMVC的bean?
加载Spring控制的bean的时候排除掉SpringMVC控制的bean。
SpringMVC相关bean加载控制:
- SpringMVC加载的bean对应的包均在com.itheima.controller包内
Spring相关bean加载控制:
- 方式一:Spring加载的bean设定扫描范围为com.itheima,排除掉controller包内的bean
@ComponentScan(value = "test" , excludeFilters = @ComponentScan.Filter( type = FilterType.ANNOTATION, classes = Controller.class ) ) public class SpringConfig { }
名称:@ComponentScan
类型:类注解
相关属性:
excludeFilters:排除扫描路径中加载的bean,需要指定类别(type)与具体项(classes)includeFilters:加载指定的bean,需要指定类别(type)与具体项(classes)
- 方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等
@Configuration @ComponentScan({"test.service","test.dao"}) public class SpringConfig { }
- 方式三:不区分Spring与SpringMVC的环境,加载到同一个环境中
最终的bean加载格式
public class ServletContainerInitConfig extends AbstractDispatcherServletInitializer { //加载springMVC容器配置 @Override protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.register(SpringMvcConfig.class); return context; } //设置哪些请求归属springMVC处理 @Override protected String[] getServletMappings() { return new String[]{"/"}; } //加载spring容器配置 @Override protected WebApplicationContext createRootApplicationContext() { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.register(SpringConfig.class); return context; } }
还有简单的格式,改继承AbstractAnnotationConfigDispatcherServletInitializer类
public class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class[]{SpringConfig.class}; } @Override protected Class<?>[] getServletConfigClasses() { return new Class[]{SpringMvcConfig.class}; } @Override protected String[] getServletMappings() { return new String[]{"/"}; } }
该段代码作用与上面的代码(上面的是根,可以知道怎么回事)一样,简化开发。
PostMan工具
Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件
作用:常用于进行接口测试
特征:
- 简单
- 实用
- 美观
- 大方
下载地址:Download Postman (getpostman.com)
https://app.getpostman.com/app/download/win64
结语:
SpringMVC入门学习到此结束,我是Lyle,我们下次继续深入学习SpringMVC。