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

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>css

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

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

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


二:第一个项目的总体流程tomcat

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);mvc

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

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

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/>

5、springmvc的流程图:

(1)

 工做yuanl

 

 

(2)

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

(4)底层代码实现图:

6、springMVC的工做原理:

SpringMVC的工做原理:

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