springMVC:

一:创建第一个项目
01.引入需要的jar包
web webmvc context context-support
02.在web.xml文件中 配置我们需要的核心控制器 DispatcherServlet
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

注意点:
<servlet-name>springmvc</servlet-name>
那么我们springmvc的核心配置文件名称 必须是 springmvc-servlet.xml
因为底层明确了文件的名称是 <servlet-name>-servlet.xml
这个文件的位置 现阶段 只能在web-inf 下面

03.在web-inf文件下创建需要的核心配置文件 springmvc-servlet.xml
头部信息增加
xmlns:mvc="http://www.springframework.org/schema/mvc"

http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
04.书写一个controller(其实就是我们的servlet) 继承 AbastractController

二:第一个项目的整体流程

01.用户在index.jsp页面中点击Hello超链接
02.点击之后请求路径是 /hello <a href="hello">Hello</a>
03.会被我们web.xml文件中配置的DispatcherServlet拦截
04.默认执行doDispatch()
HandlerExecutionChain mappedHandler = null; 处理器执行链
mappedHandler = this.getHandler(processedRequest); 根据用户的请求获取处理器执行链
4.1.跟进getHandler()看到了
for (HandlerMapping hm : this.handlerMappings)
handlerMappings是一个List<HandlerMapping>

HandlerExecutionChain handler = hm.getHandler(request);
hm是List<HandlerMapping>是集合中的一个元素===》HandlerMapping
根据用户的请求在处理器映射器中查询Handler
4.2.跟进getHandler()看到了
Object handler = getHandlerInternal(request); 获取需要执行的Handler

HandlerExecutionChain executionChain = getHandlerExecutionChain(handler, request);

4.3.跟进getHandlerExecutionChain
发现方法中有处理器拦截器
for (HandlerInterceptor interceptor : this.adaptedInterceptors)

所以mappedHandler(处理器执行链)中包含一个即将执行的handler和一些列的interceptor(拦截器)

05.HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
获取处理器适配器
跟进 getHandlerAdapter()
for (HandlerAdapter ha : this.handlerAdapters)
handlerAdapters是一个List<HandlerAdapter>
ha就是List<HandlerAdapter>其中一个元素 就是HandlerAdapter

if (ha.supports(handler)) {
return ha;
}
5.1:跟进supports
进入了HandlerAdapter====》是一个接口!
接口有5个实现类!默认执行3个!

在webmvc的jar包中的根目录下找到DispatcherServlet.properties

默认的处理器映射器的配置
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

默认的处理器适配器的配置
org.springframework.web.servlet.HandlerAdapter
=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
5.2:回到doDispatch()
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
跟进handle()发现 HandlerAdapter====》是一个接口的handle()有5个实现
首先进入HttpRequestHandlerAdapter,我们的HelloController和HttpRequestHandler没关系,继续执行下一个Adapter
进入SimpleControllerHandlerAdapter,我们的HelloController继承了AbstractController,
AbstractController实现了Controller! 产生了关系!

5.3:跟进SimpleControllerHandlerAdapter类中的handler()

return ((Controller) handler).handleRequest(request, response);
只有转换成Controller才有handleRequest这个方法!
关键是我们的HelloController中的方法名称是handleRequestInternal()

001.只有转换成Controller才有handleRequest这个方法!
002.AbstractController重写了Controller的handleRequest
003.但是返回的是一个handleRequestInternal()
004.我们的HelloController中的方法名称是handleRequestInternal()
005.所以执行Controller的handleRequest就是执行HelloController中的handleRequestInternal()

三:配置视图解析器
为什么?
01.我们controller中肯定会返回很多页面
02.页面的前缀/WEB-INF ==>安全
03.后缀都是以.jsp结尾

我们现在统一把所有的前缀和后缀写在一个地方!
只要是后台有返回页面,我会自动的给页面加前缀和后缀!
这时候就需要我们配置视图解析器

有疑问?
通关观察dispatcherServlet.properties文件我们看到了有默认的试图解析器
就是InternalResourceViewResolver!
那为什么我们还需要设置?
因为我们需要对InternalResourceViewResolver视图解析器中的属性赋值!

InternalResourceViewResolver的父类中 UrlBasedViewResolver的属性没有值

private String prefix = "";
private String suffix = "";

四:静态资源的访问
问题的引入:

01.我们在web.xml文件中配置核心控制器的url-pattern是什么? 是 /
02./ 不能匹配 .jsp .js .css .png....后缀路径
03.如果我们项目中需要这些文件,是不能使用的!

所以需要设置允许静态资源的访问!

解决方式3种

01.去tomcat服务器中找到conf/web.xml中有如下配置
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern> 不会匹配静态文件
</servlet-mapping>

在web.xml文件中配置
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>

问题?
如果我们的图片后缀比较多!那么我们的web.xml文件中的节点是不是很多!

02.在springmvc核心配置文件中配置 推荐使用
注释掉web.xml文件中的配置

03.在springmvc核心配置文件中配置
<mvc:default-servlet-handler/>

五、springmvc的流程图:

(1)

工作yuanl

(2)

(3)--------------------------------------------------------------------------------------------------------------------------------------------------

(4)底层代码实现图:

六、springMVC的工作原理:

SpringMVC的工作原理:

  1. SpringMVC所有的请求都提交给DispatcherServlet,它会委托应用系统的其它模块负责对请求进行真正的处理工作。
  2. DispatcherServlet查询一个或多个HandleMapping,找到处理请求的Controller.
  3. DispatcherServlet提交到目标Controller.
  4. Controller进行业务逻辑处理后,会返回一个ModelAndView
  5. Dispatcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
  6. 视图对象负责渲染返回给客户端。

转载于:https://www.cnblogs.com/laosunlaiye/p/7717407.html

--------------springMVC的开篇,以及底层执行流程,配置视图解析器,静态资源的访问,流程图,工作原理...相关推荐

  1. Spring Boot配置视图解析器

    2019独角兽企业重金招聘Python工程师标准>>> 在SpringBoot中,视图解析器的配置可以参考 Spring Boot数据源配置 #方式一:直接在属性文件中,加入 spr ...

  2. springboot项目配置视图解析器无效的问题

    springboot项目配置视图解析器无效的问题 今天springboot尝试配置视图解析器的时候,如图: 一切正常,视图解析器却始终无效.后面发现问题. 在控制器的注解要使用:@Controller ...

  3. springBoot配置视图解析器

    1.直接写一个配置类继承WebMvcConfigurerAdapter即可 具体代码如下: package com.boot.zhiyi.config;import org.springframewo ...

  4. 视图解析器中配置前缀和后缀---SpringMVC学习笔记(五)

    springmvc.xml中配置的视图解析器中增加jsp路径的前缀和后缀配置: <!-- 配置视图解析器 --><bean class="org.springframewo ...

  5. jsp springmvc 视图解析器_springMVC配置jsp/html视图解析器

    1.maven项目引入freemark相关jar包 freemaker是以个模板引擎,可以根据提供的数据和创建好的模板,去自动的创建html静态页面.所以在返回html视图时可以用这个引擎结合数据生成 ...

  6. springMVC视图解析器的配置和使用

    在spring-servlet.xml中配置视图解析器 <!-- 配置视图解析器 --> <bean class="org.springframework.web.serv ...

  7. SpringMVC(一)视图解析器

    springMVC是一个基于spring的一个框架,实际上 就是spring的一个模块,专门做web开发. 是servlet的一个升级. web开发的底层是servlet,框架是再servlet基础上 ...

  8. SpringMvc及三大组件(适配器、映射器、视图解析器)

    文章目录 1 SpringMvc三大组件 适配器 映射器 视图解析器 1 @RequestMapping和@Controller **1. 什么是mvc** 2. SpringMvc三大组件及其作用 ...

  9. SpringMVC——视图和视图解析器

    一.概念  SpringMVC用于处理视图最重要的两个接口是ViewResolver(视图解析器)和View(视图).ViewResolver的主要作用是把一个逻辑上的视图名解析为一个真正的视图,解析 ...

最新文章

  1. pandas删除数据行中的重复数据行、基于dataframe所有列删除重复行、基于特定数据列或者列的作何删除重复行、删除重复行并保留重复行中的最后一行、pandas删除所有重复行(不进行数据保留)
  2. 温习 SQL 01(Z)
  3. Eigen密集矩阵求解 2 - 求解最小二乘系统
  4. 前端学习(1895)vue之电商管理系统电商系统之组件的分页显示
  5. php 文章列表,ThinkPHP初学者:主页,获取一个文章列表
  6. js正则函数match、exec、test、search、replace、split使用集合
  7. google python代码规范_Python代码这样写才规范优雅! (二)
  8. 块层介绍 第一篇: bio层
  9. 使用GoldWave为音频添加特效
  10. 荣誉背后的故事:达内到底有多强?
  11. 硬件接口之Camera DVP
  12. android自定义4级联动,使用Android如何实现四级联动地址选择器
  13. 餐饮业实施5S管理的效益及实施方案
  14. 【详解】MD5加密真的安全吗?不安全有什么解决办法?
  15. 美国音乐学院计算机音乐专业排名2015年,美国音乐学院排名前100
  16. “兴趣爱好”,蜜糖or砒霜?
  17. 双十一峰值流量_“双十一”的九个底层逻辑:流量补刀、透支消费等
  18. 苹果处理器排行_最新 iOS 性能排行榜,你的设备落伍了吗?
  19. 小米 红米NOTE5 解BL锁教程 申请BootLoader解锁教程
  20. 无人驾驶技术入门(一)| 百度无人驾驶的引路人

热门文章

  1. Spark常规性能调优一:最优资源配置
  2. linux 产生0~100内的随机数
  3. Rancher添加主机docker命令
  4. redis sorted_set数据类型常用命令及跳表skip_list原理
  5. Quartz分布式实现
  6. Object类、常用API
  7. QML和C ++之间的数据类型转换---枚举
  8. Android传感器-开发指南
  9. 一文搞定哈希(六种构建、四种冲突解决方法、查找算法总结)
  10. html外边距的复合属性是,margin