学习SpringMVC必知必会(2)~走近Spring MVC
一、Spring 基本介绍
1.什么是 Spring MVC?
SpringMVC 是 Spring-Frame 框架的子集(Spring-Frame包含了Spring MVC)
, MVC 框架,(类比javaWeb)它解决 WEB 开发中常见的问题(参数接收
、文件上传
、表单验证
、国际化等等),而且使用简单,与 Spring 无缝集成。支持 RESTful 风格的 URL 请求 ,非常容易与其他视图技术集成,如 Velocity、FreeMarker。 采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。
Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架 (更安全,性能更好,更简单)。
2.Spring WebFlux
- Spring WebFlux 是 Spring 另一个 Web 框架,基于异步非阻塞的。
- SpringMVC 是同步阻塞的 IO 模型,资源浪费相对来说比较严重,当我们在处理一个比较耗时的任务时, 比如上传文件,服务器的线程一直在等待接收文件,而 Spring WebFlux 可以做到异步非阻塞。
✿ SpringMVC 是单例的,提高性能:
SpringMVC 是单例的, 基于方法设计
;是单例的,避免线程安全问题,不定义成员变量、不使用成员变量
,
尤其是需要共享数据的变量,作为局部变量,不要作为共享字段。
- servlet 单例,一般不使用成员变量,不安全,除非是要共享数据,才作为成员变量。
二、Spring 基本使用
▷ 基于xml配置
0.建立web项目
1、依赖[细节版本一致性]:
- commons-logging-1.2.jar
- servlet-api.jar
- spring-aop-5.2.8.RELEASE.jar
- spring-beans-5.2.8.RELEASE.jar
- spring-context-5.2.8.RELEASE.jar
- spring-core-5.2.8.RELEASE.jar
- spring-expression-5.2.8.RELEASE.jar
- spring-web-5.2.8.RELEASE.jar
- spring-webmvc-5.2.8.RELEASE.jar
2、配置前端控制器
<!-- 配置前端控制器 -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化参数,告诉DispatcherServlet去哪里找mvc配置文件 -->
<!--
默认是去WEB-INF 目录中寻找
默认寻找的文件名是<servlet-name>元素的文本内容-servlet.xml
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mvc.xml</param-value>
</init-param>
<!-- 在Tomcat启动的时就初始化SpringMVC容器 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3、开发一个处理器类 HelloController,实现接口Controller,覆盖handlerRequest方法
//处理器---目的是处理请求【具体包含要跳转的界面和共享的数据】
public class HelloController implements Controller{
//处理请求
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("hello...");
//封装模型(共享数据)和视图(跳转的界面)
ModelAndView mv = new ModelAndView();
//设置视图名称
mv.setViewName("/WEB-INF/views/welcome.jsp");
//设置共享数据
mv.addObject("msg", "你好,easyMVC");
return mv;
}
}
4、配置MVC框架[mvc.xml]:
配置处理器映射器
:BeanNameUrlHandlerMapping [目的是寻找匹配的处理器]配置处理器适配器
:SimpleControllerHandlerAdapter [目的是调用处理器的handlerRequest方法]配置视图解析器
:InternalResourceViewResolver [目的是处理视图,使之支持jsp、jstl]配置处理器
:HelloController [我们自己开发的处理类]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 1:处理器映射器 -->
<!-- 目的:选择哪个处理器(Controller)来处理当前请求
BeanNameUrlHandlerMapping: 根据请求的url去选择对应的bean【根据bean的id/name 进行匹配】 举例:/hello 去匹配id/name 为/hello 的bean
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 2:处理器适配器 -->
<!-- 目的:调用处理器(Controller)的处理请求方法
1)所有哦的适配器 实现HandlerAdapter接口
2)处理器(Controller) 类必须实现org.springframework.web.servlet.mvc.Controller接口
-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!-- 3:视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
<!-- 4:处理器 -->
<bean id="/hello" class="com.shan.hello.HelloController"/>
</beans>
✿ 总结,站在开发者角度:
1、配置前端控制器
2、配置框架提供的: 处理器映射器、处理器适配器、视图解析器
3、需要开发:
1)先开发Controller处理器,再配置
2)开发jsp等视图
三、SpringMVC执行流程
四、SpringMVC 核心组件分析:
1、前端控制器 DispatcherServlet(不需开发),由框架提供,在 web.xml 中配置。
- 作用:接收请求,响应结果,
相当于转发器,中央处理器。
2、处理器映射器 HandlerMapping(不需开发),由框架提供。
- 作用:
匹配处理器
,根据请求的 url 查找 Handler(处理器),可以通过 XML 和注解方式来映射。
3、处理器适配器 HandlerAdapter(不需开发),由框架提供。
- 作用:按照特定规则(HandlerAdapter 要求的规则)
去执行 Handler
。
4、处理器 Handler(也称之为 Controller,需要开发)
- 注意:编写 Handler 时按照 HandlerAdapter 的要求去做[实现Controller接口,重写handlerRequest方法],这样适配器才可以去正确执行 Handler。
- 作用:
相当于Servlet
,接受用户请求信息,调用业务方法处理请求,控制界面跳转,也称之为后端控制器。
5、视图解析器 ViewResolver(不需开发),由框架提供
- 作用:
进行视图解析
,把逻辑视图名解析成真正的物理视图。 - SpringMVC 框架支持多种 View 视图技术,包括:JstlView、FreemarkerView、pdfView 等。
6、视图 View(需要开发)
- 作用:把数据展现给用户的页面 View 是一个接口,实现类支持不同的 View 技术(jsp、freemarker、pdf 等).
五、 debug的方式阅读springmvc 的执行流程的思路:
1、发送请求-》前端控制器,所以第一步是到前端控制器,看前端控制器的什么呢?---service方法【理由:前端控制器是基于servlet,可以把它的职责看成servlet的职责,所以核心方法-service】----快捷键ctr+o,搜索service方法,发现没有----》父类中查找service方法,在service方法第一步打个断点
2、开始debug:按正常流程走,先启动tomcat服务器,然后在浏览器发送请求-》
https://www.cnblogs.com/shan333/p/15983643.html
六、使用注解开发
1、使用xml配置springMVC的缺点:
① 配置繁琐
② Controller 必须实现Controller接口,只有一个处理器请求的方法,若是要处理多个请求,得开发多个Controller
■ 企业中用得最多的方式:注解开发
2、注解开发步骤:
(1)贴标签:@Controller、@RequestMapping("hello")
(2)第三方注解驱动(赋予注解功能):
先配置命名空间(约束内容) 某某.xsd
<!-- IoC注解解析器 -->
<context:component-scan base-package="com.shan"/>
<!-- MVC注解解析器 -->
<mvc:annotation-driven/>
■ springmvc 的配置:处理器的映射器、处理器的适配器、视图解析器 在jar包:spring-webmvc.jar包下的文件 DispatcherServlet.properties 中有相应的配置了。
■ MVC注解解析器: <mvc:annotation-driven/> :会自动去注册RequestMappingHandlerMapping,RequestMappingHandlerAdapter,ExceptionHandlerExceptionResolver 三个bean。
除此之外,SpringMVC中几乎所有的注解,都需要该注解解析器来解析:
- 支持类型转换ConversionService
- @NumberFormat,DateTimeFormate注解
- @Validdate JSR303 校验
- @RequestBody @ResponseBody 等等。
3、RequestMapping注解详解:
用来处理请求地址url映射的注解,可以贴在类上和方法上。
贴在类上:表示类中的所有请求方法的url都必须把类上的url地址作为父路径。
■ 窄化路径映射:
■ RequestMapping 的子注解(常用
):
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
■ RequestMapping 的六大属性讲解:
① value 和 method
value: 和 path 是一样的,指定请求的url。
method:指定请求方式的类型,请求方式的类型:GET\POST\HEAD\PUT\PATCH\DELETE\OPTIONS\TRACE
② 指定请求和响应的mediaType
consumes:指定请求内容格式, 例如:Content-Type=application/json
produces: 指定响应内容格式,例如:application/json;charset=UTF-8
③ params 和 headers:
params:指定request中必须包含某些参数值,包含该方法才处理
headers:指定request中必须包含指定的header,包含才能处理
4、前端控制器的url-pattern 配置:
- 静态资源:图片、html、css、js等
第一种方式:*.拓展名
,比如 *.do 古老的方式,不会导致静态资源文件被拦截问题,但是不支持restfull编码风格。
第二种方式:/
,支持restfull 风格,但是会导致静态资源文件被拦截,解决问题--
第三种方式:/* ,是错误的,可以请到Controller方法,但是跳转到jsp时会被拦截,jsp不能正常显示。
■ 解释和解决第二种方式 /
解释:因为tomcat中处理静态资源的servlet叫default,而default的映射路径就是/
启动项目的时候:
1)启动tomcat,加载tomcat的web.xml文件
2)启动项目,加载项目的web.xml文件
项目中的web.xml所映射的/会覆盖tomcat中web.xml配置的映射规则。
(
常用
)解决1:在springmvc的框架配置中添加:<!-- 处理静态资源文件请求 -->
<mvc:default-servlet-handler/>
原理:将springmvc上下文[环境] 中定义的一个DefaultServletHttpRequestHandler,对所有经过前端控制器的请求做筛选和盘查,
若是发现没有经过映射请求,则交给tomcat默认的servlet来处理。(将静态资源由springmvc交回给servlet来处理)
(
springboot常用
)解决2:springmvc 自己来处理资源文件,而且还附加了很多功能:在SpringBoot中:
允许把静态资源放在任何地方,比如WEB-INF里面,resoures目录,设置把JS等静态文件打包放在jar中,也能找到.
都可以通过Location去指定静态资源路径,location是Resouce类型,可以使用前缀,如classpath:.
mapping表示映射路径.- **: 包含所有的子集目录
<!-- 资源映射 -->
<mvc:resources location="/" mapping="/**"/>
如果本文对你有帮助的话记得给一乐点个赞哦,感谢!
学习SpringMVC必知必会(2)~走近Spring MVC的更多相关文章
- [ 学习路线 ] 2015 前端(JS)工程师必知必会 (2)
http://segmentfault.com/a/1190000002678515?utm_source=Weibo&utm_medium=shareLink&utm_campaig ...
- 《SQL必知必会》学习笔记二)
<SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...
- 学习《SQL必知必会(第4版)》中文PDF+英文PDF+代码++福达BenForta(作者)
不管是数据分析还是Web程序开发,都会接触到数据库,SQL语法简洁,使用方式灵活,功能强大,已经成为当今程序员不可或缺的技能. 推荐学习<SQL必知必会(第4版)>,内容丰富,文字简洁明快 ...
- 《MySQL必知必会》学习笔记——前言
前言 MySQL已经成为世界上最受欢迎的数据库管理系统之一.无论是用在小型开发项目上,还是用来构建那些声名显赫的网站,MySQL都证明了自己是个稳定.可靠.快速.可信的系统,足以胜任任何数据存储业务的 ...
- 《SQL必知必会》学习笔记整理
简介 本笔记目前已包含 <SQL必知必会>中的所有章节. 我在整理笔记时所考虑的是:在笔记记完后,当我需要查找某个知识点时,不需要到书中去找,只需查看笔记即可找到相关知识点.因此在整理笔记 ...
- 《SQL必知必会》学习笔记(一)
这两天看了<SQL必知必会>第四版这本书,并照着书上做了不少实验,也对以前的概念有得新的认识,也发现以前自己有得地方理解错了.我采用的数据库是SQL Server2012.数据库中有一张比 ...
- mysql学习--mysql必知必会1
例如以下为mysql必知必会第九章開始: 正則表達式用于匹配特殊的字符集合.mysql通过where子句对正則表達式提供初步的支持. keywordregexp用来表示后面跟的东西作为正則表達式 ...
- mysql学习--mysql必知必会
上图为数据库操作分类: 下面的操作參考(mysql必知必会) 创建数据库 运行脚本建表: mysql> create database mytest; Query OK, 1 row ...
- 数据库学习之中的一个: 在 Oracle sql developer上执行SQL必知必会脚本
1 首先在開始菜单中打开sql developer: 2. 创建数据库连接 点击左上角的加号 在弹出的对话框中填写username和password 測试假设成功则点击连接,记得角色要写SYSDBA ...
随机推荐
- 在这个插件帮助下,终于用上免费的Https协议外链的图床了
前天,强哥发了一篇推文,讲述了应该如何免费且快速的生成自己的博客网站: 期间也有提到一点就是我们在写博客的时候,因为使用的是Markdown格式的文件,而如果想要Markdown格式的文件在图片上传 ...
- Solution -「LOCAL」「cov. 牛客多校 2020 第五场 C」Easy
\(\mathcal{Description}\) Link.(完全一致) 给定 \(n,m,k\),对于两个长度为 \(k\) 的满足 \(\left(\sum_{i=0}^ka_i=n\r ...
- pytest(9)-标记用例(指定执行、跳过用例、预期失败)
pytest中提供的mark模块,可以实现很多功能,如: 标记用例,即打标签 skip.skipif标记跳过,skip跳过当前用例,skipif符合情况则跳过当前用例 xfail标记为预期失败 标记用 ...
- Dubbo源码剖析六之SPI扩展点的实现之Adaptive功能实现原理
接Dubbo源码剖析六之SPI扩展点的实现之getExtensionLoader - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)继续分析Adaptive功能实现原理.Adaptive的主 ...
- 解决:阿里云服务器被植入挖矿程序后修改密码失败的问题(报错:passwd: Authentication token manipulation error)
如下图,在修改密码的时候会报错 原因: 通常不能修改密码都是/etc/passwd文件或者/etc/shadow文件被锁住了 解决: 检查/etc/passwd文件和/etc/shadow文件是否被锁 ...
- NSSCTF-[SWPU 2020]找找吧
下载附件得到一个rar的压缩包,解压是需要密码的,直接丢尽winhex(菜狗经验),在最下面可以看到一个KEY is 得到第一个压缩包的密码,解压第一个压缩包得到一个mp3文件和另一个rar压缩包,将 ...
- “百度杯”CTF比赛 九月场 类型:Web 题目名称:SQLi ---不需要逗号的注入技巧
今天在i春秋做题的时候遇到了一道非常好的题目,于是在参考了wp的基础上自己复现了一遍,算作一种技巧的学习与收藏吧. 题目i春秋连接:https://www.ichunqiu.com/battalion ...
- [题解]UVA11027 Palindromic Permutation
链接:http://vjudge.net/problem/viewProblem.action?id=19602 描述:给出一个字符串,求重新排列后第n个回文串,若没有则输出"XXX&quo ...
- 报表工具为什么我推荐用Smartbi,数据分析师和初学者都能灵活运用
在很多人入门数据分析师或者投身大数据行业的时候,肯定会接触到报表工具,很多人这时候就会去使用一些Excel插件的报表工具,但是很多报表工具都是需要下载一系列的软件,配置各种复杂的环境.尤其是一些数据分 ...
- 说出来你可能不信,我用excel就能做一张高端的统计报表
统计报表是指各级企事业.行政单位按规定的表格形式.内容.时间要求报送程序,自上而下统一布置,提供统计资料的一种统计调查方式.统计报表具有来源可靠.回收率高.方式灵活等特点,是各个基层企业或事业单位填报 ...