SpringMVC:是基于spring的一个框架,实际上就是spring的一个模块,专门是做web开发的
理解为servlet的一个升级

web开发底层是servlet,框架是在servlet基础上面加入一些功能,让你做web开发更方便

SpringMVC就是一个Spring,Spring就是容器,ioc能够管理对象,使用<bean> ,@Componet,@Repository
@Service,@Controller,SpringMVC能够创建对象,放入到容器中(springMVC容器)
SpringMVC容器中放的是控制器对象

我们要做的是使用@Controller创建控制器对象,把对象放入到springMVC容器中, 把创建的对象作为控制器使用
这个控制器对象能接收用户的请求,显示处理结果,就当做是一个servlet使用

使用@Controller注解创建的是一个普通类的对象, 不是Servlet,springmvc赋予了控制器对象一些额外的功能+

web开发底层是servlet,springMVC中有一个对象是Servlet:DispatherServlet(中央调度器)
DispatherServlet:负责接收用户的所有请求,用户把请求给了DispatherServlet,之后DispatherServlet把请求转发给
我们的Controller对象,最后是Controller对象处理请求

index.jsp-----DispatherServlet(Servlet)---转发,分配给----Controller对象(@Controller注解创建的对象)
main.jsp MainController
addUser.jsp UserController

=====================================================================

springmvc请求的处理流程

1.发起some.do
2.tomcat(web.xml---url---pattern)知道*.do的请求给DispatcherServlet
3.DispatcherServlet(根据springmvc.xml配置知道some.do----doSome())
4.DispatcherServlet把some.do转发给MyController.doSome()方法
5.框架执行doSome()把得到的ModelAndView进行处理,转发给show.jsp

上面过程简化的方法
some.do----DispatcherServlet----MyController
==========================================================================

springmvc执行过程源代码分析

1.tomcat启动,创建容器的过程

通过load-on-start标签指定的1,创建DispatcherServlet对象
DispatcherServlet它的父类是继承HttpServlet的,他是一个Servlet ,在被创建时,会执行init()方法
在init()方法中
//创建容器,读取配置文件
WebApplicationContext ctx=new ClassPathXmlApplicationContext("springmvc.xml");
//把容器对象放入到ServletContext中
getServletContext().setAttribute(key,ctx);

上面创建容器作用:创建@Controller注解所在类的对象, 创建MyController对象
这个对象放入到springmvc的容器中,容器是map,类似map.put("myController",MyController对象)

2.请求的过程

1)执行servlet的service()

protected void service(HttpServletRequest request,HttpservletResponse response)

protected void doService(HttpServletRequest request,HttpservletResponse response)

调用MyController的.doSome()方法

doDispatch:springmvc中的DispatcherServlet的核心方法,所有请求都在这个方法中完成的

springmvc,controller类中的处理方法返回Object对象
没有加入注解驱动标签时的状态
org.springframework.http.converter.ByteArrayHttpMessageConverter
org.springframework.http.converter.StringHttpMessageConverter
org.springframework.http.converter.xml.SourceHttpMessageConverter
org.springframework.http.converter.AllEncompassingFormHttpMessageConverter

加入注解驱动标签时的状态
org.springframework.http.converter.ByteArrayHttpMessageConverter
org.springframework.http.converter.StringHttpMessageConverter
org.springframework.http.converter.xml.SourceHttpMessageConverter
org.springframework.http.converter.AllEncompassingFormHttpMessageConverter
org.springframework.http.converter.ResourceHttpMessageConverter
org.springframework.http.converter.ResourceRegionHttpMessageConverter
org.springframework.http.converter.xml.JaxbRootElementHttpMessageConverter
org.springframework.http.converter.json.MappingJacksonHttpMessageConverter

============================================================================================

发起的请求是由哪些服务器程序处理的

http://localhost:8080/ch05_url_pattern/html/test.html :tomcat(jsp会转为servlet)
http://localhost:8080/ch05_url_pattern/js/jquery-3.4.1.js: tomcat
http://localhost:8080/ch05_url_pattern/images/p1.jpg: tomcat
http://localhost:8080/ch05_url_pattern/some.do :DispatcherServlet(springmvc框架处理的)

tomcat本身能处理静态资源的访问,像html,图片,js文件都是静态资源

tomcat的web.xml文件有一个servlet名称是default,在服务器启动是创建的。
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern> 表示静态资源和未映射的请求都由这个default处理
</servlet-mapping>

default这个servlet作用:
The default servlet for all web applications, that serves static
resources. It processes all requests that are not mapped to other
servlets with servlet mappings (defined either here or in your own
web.xml file).

1.处理静态资源
2.处理为映射到其他servlet的请求

================================================================================

在jsp,html中使用的地址,都是在前端页面中的地址,都是相对地址

地址分类:
1.绝对地址,带有协议名称的是绝对地址,http://www.baidu.com, ftp://202.122.23.1
2.相对地址,没有协议开头的,例如 user/some.do, /user/some.do
相对地址不能独立使用,必须有一个参考地址,通过参考地址+相对地址本身才能指定资源

张三同学,1班有张三,2班有张三
3.参考地址
1)在你的页面中,访问地址不加“/”

访问的是: http://localhost:8080/ch06_path/index.jsp
路径: http:localhost:8080/ch06_path/
资源: index.jsp

在index.jsp发起user/some.do请求,访问地址变为http://localhost:8080/ch06_path/user/some.do
当你的地址没有斜杠开头,例如user/some.do,当你点击链接时,访问地址是当前页面的地址
加上链接的地址
http://localhost:8080/ch06_path/ + user/some.do

===================================================================================
index.jsp访问user/some.do,返回的地址: http://localhost:8080/ch06-path/user/some.do

http://localhost:8080/ch06-path/user/some.do
路径: http://localhost:8080/ch06-path/user/
资源: some.do

在index.jsp访问user/some.do,就变成 http://localhost:8080/ch06-path/user/user/some.do

解决方案:
1.加入${pageContext.request.contextPath}
2.加入一个base标签,就是html 语言中的标签,表示当前页面中访问地址的基地址
你的页面中所有没有'/'开头的地址,就是以base标签中的地址为参考地址
使用base中的地址,+user/some.do


2)在你的页面中,访问地址加“/”
访问的是: http://localhost:8080/ch06_path/index.jsp
路径: http://localhost:8080/ch06_path/
资源: index.jsp

点击/user/some.do,访问地址变为 http://localhost:8080/user/some.do
参考地址是 你服务器地址,也就是 http://localhost:8080

如果你的资源不能访问,加入${pageContext.request.contextPath}
<a href="${pageContext.request.contextPath}/user/some.do">发起user/some.do的get请求</a>

====================================
forward:表示转发
redirect:表示重定向
forward和redirect都是关键字,有一个共同的特点不和视图解析器一同 工作

扩展:
forward和redirect都可以访问视图文件,比如某个jsp,html
forward:/hello.jsp, redirect:/main.html

forward和redirect都可以访问其他的controller
forward:/some.do redirect:/other.do

处理器方法可以返回ModelAndView,String void 都可以使用forward,redirect

===========================================================================

异常处理:springmvc框架采用的是统一,全局的异常处理。把controller中的所有异常都集中到一个地方,采用的是aop的思想,把业务逻辑和异常处理代码分开,解耦合

使用两个注解
1.@ExceptionHandler
2.@ControllerAdvice

拦截器:
1)拦截器是springmvc中的一种,需要实现HandlerInterceptor接口
2)拦截器和过滤器类似,功能方向侧重点不同,过滤器是用来过滤请求参数,设置编码字符集等工作。
拦截器是拦截用户的请求,做请求做判断处理的
3)拦截器是全局的,可以对多个Controller做拦截
一个项目中可以有0个或者多个拦截器,他们在一个拦截用户的请求
拦截器常用在:用户登录处理,权限检查,记录日志。

拦截器的使用步骤:
1)定义类实现HandlerInterceptor接口
2)在springmvc配置文件中,声明拦截器,让框架知道拦截器的存在。

拦截器的执行时间
1.在请求处理之前,也就是Controller类中的方法执行之前先被拦截
2.在控制器方法处理之后也会执行拦截器
3.在请求处理完成之后也会执行拦截器

拦截器:看做是多个Controller中公用的功能,集中到拦截器统一处理,使用的是aop的思想

===========================================================================================

多个拦截器第一个拦截器preHandle=true,第二个拦截器preHandle=true

1111==拦截器的MyInterceptor的preHandle()
2222==拦截器的MyInterceptor的preHandle()
===controller的处理方法执行===
2222==拦截器的MyInterceptor的postHandle()
1111==拦截器的MyInterceptor的postHandle()
2222==拦截器的MyInterceptor的afterCompletion()
1111==拦截器的MyInterceptor的afterCompletion()

================================================
第一个拦截器preHandle=true,第二个拦截器preHandle=false
1111==拦截器的MyInterceptor的preHandle()
2222==拦截器的MyInterceptor的preHandle()
1111==拦截器的MyInterceptor的afterCompletion()

====================================================
第一个拦截器preHandle=false,第二个拦截器preHandle=true|false
1111==拦截器的MyInterceptor的preHandle()

===========================================================
过滤器和拦截器的区别
1.过滤器是servlet中的对象,拦截器是框架中的对象
2.过滤器实现Filter接口的对象,拦截器是实现HandlerInterceptor
3.拦截器是用来验证请求的,能截断请求
过滤器使用来设置request,response,的参数,属性的,侧重于数据过滤
4.过滤器是在拦截器之前执行的
5.过滤器是tomcat服务器创建的对象
拦截器是springmvc容器中创建的对象
6.过滤器是一个执行时间点
拦截器有是三个执行时间点
7.拦截器是侧重于拦截对Controller的对象,如果你的请求不能被DispatcherServlet接收,这个请求不会执行拦截器内容
过滤器可以处理jsp,js,html等等
8.拦截器拦截普通类方法执行,过滤器过滤servlet请求的响应。

SpringMVC的基础知识的更多相关文章

  1. springMVC1 springmvc的基础知识

    springmvc第一天 springmvc的基础知识 springmvc课程安排: 第一天: 基础知识 springmvc框架(重点) mvc在b/s系统中应用方式 springmvc框架原理(Di ...

  2. SpringMvc学习---基础知识考核

    SpringMVC 1.SpringMVC的工作流程 流程 : 1.用户发送请求至前端控制器DispatcherServlet2.DispatcherServlet收到请求调用HandlerMappi ...

  3. SpringMVC(一) 基础知识+入门案例

    SpringMVC基础知识 1.什么是Springmvc 2.springmvc 框架的原理(必须掌握) 前端控制器.处理器映射器.处理器适配器.视图解析器 3.SpringMVC 入门程序 目的:对 ...

  4. Shiro第一篇【Shiro的基础知识、回顾URL拦截】

    Shiro基础知识 在学习Shiro这个框架之前,首先我们要先了解Shiro需要的基础知识:权限管理 什么是权限管理? 只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安 ...

  5. Shiro入门这篇就够了【Shiro的基础知识、回顾URL拦截】

    前言 本文主要讲解的知识点有以下: 权限管理的基础知识 模型 粗粒度和细粒度的概念 回顾URL拦截的实现 Shiro的介绍与简单入门 一.Shiro基础知识 在学习Shiro这个框架之前,首先我们要先 ...

  6. 什么才是java的基础知识?

    近日里,很多人邀请我回答各种j2ee开发的初级问题,我无一都强调java初学者要先扎实自己的基础知识,那什么才是java的基础知识?又怎么样才算掌握了java的基础知识呢?这个问题还真值得仔细思考. ...

  7. SpringCloud(1) 架构演进和基础知识简介

    一.传统架构演进到分布式架构 简介:讲解单机应用和分布式应用架构演进基础知识 (画图) 高可用 LVS+keepalive 1.单体应用:开发速度慢.启动时间长.依赖庞大.等等 2.微服务:易开发.理 ...

  8. java基础知识精华

    转载:https://www.jianshu.com/p/6c078abb720f java基础知识 java内存模型 java运行时数据区域 hashMap 如何解决冲突 存储方式 冲突达到一定数量 ...

  9. Shiro框架 - 【shiro基础知识】

     转载:https://segmentfault.com/a/1190000013875092#articleHeader27  读完需要 63 分钟   前言 本文主要讲解的知识点有以下: 权限管理 ...

  10. .NET面试题系列[1] - .NET框架基础知识(1)

    很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...

随机推荐

  1. CVE-2021-41773 && CVE-2021-42013拆解复现

    CVE-2021-41773 && CVE-2021-42013 参考了这个师傅的WP https://www.jianshu.com/p/3076d9ec68cf CVE-2021- ...

  2. odoo14的qweb打印单样式丢失问题

    问题:在开发odoo14的打印单过程中:Wkhtmltopdf打印插件已安装的情况下,发现样式丢失了,如下图 问题的原因: 1.可能是外网与内网服务转换时候造成的样式丢失,有时候是端口不一致导致的某些 ...

  3. git add 报错The file will have its original line endings in your working directory

    执行如下命令,添加代码到本地仓库 git add . 出现警告信息:The file will have its original line endings in your working direc ...

  4. JavaScript的"数值计算困局":生态缺位下的破局之路

    本文原创首发于公众号[我做开发那些年]与网站[乔文小屋],现同步转载至本平台,点击阅读原文 声明:如需转载本文至其他平台,请注明文章来源及公众号信息,感谢您对原创内容的尊重与支持! *背景*:最近在尝 ...

  5. 用部署的方法安装Project 2016

    公司有Project 2016和Microsoft 365,但这两个不能同时安装,因为安装方式不同(前者MSI,后者即点即用),网上查了资料,发现可以使用部署的方法安装Project 2016,就能成 ...

  6. 免费开源 .NET OpenCV 迷你运行时全平台发布

    免费开源 .NET OpenCV 迷你运行时全平台发布 --Sdcb.OpenCvSharp4 Mini Runtime v4.11.0.35 上线 各位朋友好! 经过数周的持续打磨,我一次性放出了 ...

  7. Xamarin.Android - 防止 AlertDialog 在 PositiveButton 的使用方法

    https://www.coder.work/article/399382 var builder = new AlertDialog.Builder(this); View v = LayoutIn ...

  8. pdf工具类之获取pdf的总页数以及每页的宽度和高度

    没啥可说的,毫无技术的水贴 1 /** 2 * 获取pdf的总页数以及每页的宽度和高度 3 * 4 * @param filePath 5 * @return Map<String, List& ...

  9. Luogu P6815 [PA2009] Cakes 题解

    P6815 [PA2009] Cakes 三元环计数题. 无向图三元环计数分为三步: \(1\) :给所有无向边重定向.记录每个点的度数,度数大的点指向度数小的点.如果度数相同,编号小的点指向编号大的 ...

  10. libsvm matlab 上的安装

    简介windows上matlab安装还是有一些坑的 首先 matlab2016a 安装一个 编译器 tdm64-gcc-4.9.2.exe 然后更改 libsvm 中的matlab make.m 重点 ...