Springmvc自出道以来便以其简单易用,功能强大而闻名于java界,借着其亲爹spring的名头迅速流行起来,可怜昔日的老大structs2频频被曝漏洞,加上使用的复杂性,逐渐日暮西山 ,被springmvc所超越。今天我就来带大家探讨一下springmvc的执行过程:

先上图:

下面结合源代码和上图来说明:

一:发送请求到DispatchServlet(中央控制器)

Web.xml配置文件:

dispatcherServlet

org.springframework.web.servlet.DispatcherServlet

dispatcherServlet

/

是不是很熟悉的感觉,没错这里就是servlet的配置,只不过这个servlet是系统已经实现好的中央控制器:DispatcherServlet.

二:DispatcherServlet(中央控制器)调用HandlerMapping(处理器映射器)根据请求url找到需要执行的处理器(此处做了简化实际返回的是执行链)

HandlerMapping是一个接口:

public interface HandlerMapping {

。。。

@Nullable

HandlerExecutionChain getHandler(HttpServletRequest var1) throws Exception;

}

这个接口里面只有一个方法:getHandler,该方法可以通过传入的参数请求对象:HttpServletRequest,得到 :HandlerExecutionChain,这里的HandlerExecutionChain里面包括了处理器对象和拦截器。可以简单的理解为该方法通过request请求对象获得要执行的处理器(每种HandlerMapping实现类返回的处理器不一定相同,有可能是处理器中的方法,也有可能是处理器本身)。

默认的HandlerMapping实现类是BeanNameUrlHandlerMapping,他的getHandler方法返回的是处理器类, 常用的HandlerMapping实现类有:

RequestMappingHandlerMapping:采用注解方式进行映射,使用最广泛,也最简单,只需要在类或方法上加上@RequestMapping()的注解就可以了,它的getHandler方法返回的是处理器类中的方法。

@Controller

public class HelloController {

@RequestMapping("/sayHello")

public String sayHello(){

System.out.println("hello");

return "success";

}

}

SimpleUrlHandlerMapping:采用配置文件的方式进行映射,适用性最强,需要在配置文件里面配置,它的getHandler方法返回的是处理器类。

三:DispatcherServlet(中央控制器)通过HandlerAdapter(处理器适配器)调用处理器

因为不同的HandlerMapping实现类返回的处理器格式不是固定的,所以处理请求时需要HandlerAdapter(处理器适配器)做适配。

public interface HandlerAdapter {

//判断该适配器是否支持传入的handler(处理器) boolean supports(Object handler);

//使用给定的handler处理请求,也就是执行handler @Nullable

ModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object handler) throws Exception;

long getLastModified(HttpServletRequest var1, Object var2);

}

HandlerAdapter也是一个接口,它里面有两个重要的方法:

boolean supports(Object handler) 这个方法可以判断该适配器是否支持传入的handler(处理器)

ModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object handler)throws Exception; 这个方法使用给定的handler处理请求,也就是执行handler.

常用的HandlerAdapter实现类是RequestMappingHandlerAdapter,它是和RequestMappingHandlerMapping配合使用的。

在spring mvc的核心配置文件中加上: 就会自动帮我们注册RequestMappingHandlerMapping和RequestMappingHandlerAdapter

下面是网上看到的一套模拟springmvc适配器的代码:

//定义一个Adapter接口public interface HandlerAdapter {

public boolean supports(Object handler);

public void handle(Object handler);

}

//以下是三种Controller实现public interface Controller {

}

public class HttpController implements Controller{

public void doHttpHandler(){

System.out.println("http...");

}

}

public class SimpleController implements Controller{

public void doSimplerHandler(){

System.out.println("simple...");

}

}

public class AnnotationController implements Controller{

public void doAnnotationHandler(){

System.out.println("annotation...");

}

}

//下面编写适配器类

public class SimpleHandlerAdapter implements HandlerAdapter {

public void handle(Object handler) {

((SimpleController)handler).doSimplerHandler();

}

public boolean supports(Object handler) {

return (handler instanceof SimpleController);

}

}

public class HttpHandlerAdapter implements HandlerAdapter {

public void handle(Object handler) {

((HttpController)handler).doHttpHandler();

}

public boolean supports(Object handler) {

return (handler instanceof HttpController);

}

}

public class AnnotationHandlerAdapter implements HandlerAdapter {

public void handle(Object handler) {

((AnnotationController)handler).doAnnotationHandler();

}

public boolean supports(Object handler) {

return (handler instanceof AnnotationController);

}

}

//模拟一个DispatcherServletimport java.util.ArrayList;

import java.util.List;

public class DispatchServlet {

public static List handlerAdapters = new ArrayList();

public DispatchServlet(){

handlerAdapters.add(new AnnotationHandlerAdapter());

handlerAdapters.add(new HttpHandlerAdapter());

handlerAdapters.add(new SimpleHandlerAdapter());

}

public void doDispatch(){

//此处模拟SpringMVC从request取handler的对象 //不论实现何种Controller,适配器总能经过适配以后得到想要的结果// HttpController controller = new HttpController();// AnnotationController controller = new AnnotationController(); SimpleController controller = new SimpleController();

//得到对应适配器 HandlerAdapter adapter = getHandler(controller);

//通过适配器执行对应的controller对应方法 adapter.handle(controller);

}

public HandlerAdapter getHandler(Controller controller){

for(HandlerAdapter adapter: this.handlerAdapters){

if(adapter.supports(controller)){

return adapter;

}

}

return null;

}

public static void main(String[] args){

new DispatchServlet().doDispatch();

}

}

四:执行处理器,返回ModelAndView给中央控制器

这里的ModelAndView类指的是执行完处理器以后需要在视图显示的数据和视图,Model数据,View视图这个名字就很清晰的表明了该类的作用。执行处理器后,将数据保存在ModelAndView的Model属性中,将要显示的视图(通常为逻辑视图名)保存在View属性中,然后返回,ModelAndView类可以将处理器和视图渲染之间的紧密联系解耦和。

@RequestMapping("/findModelAndView")

public ModelAndView findModelAndView(){

System.out.println("modelAndView");

ModelAndView md = new ModelAndView();

User u1 = new User();

u1.setUid(1);

u1.setName("zhangsan");

u1.setAge(23);

md.addObject("user",u1);

md.setViewName("aa");

return md;

}

五:中央控制器调用ViewResolver(视图解析器)根据处理器返回的ModelAndView中的逻辑视图名为中央控制器返回一个可用的view实例。

public interface ViewResolver {

@Nullable

View resolveViewName(String viewName, Locale var2) throws Exception;

}

接口ViewResolver里面有一个方法:resolveViewName,可以根据逻辑视图名viewName返回一个View实例。

public interface View {

void render(@Nullable Map model, HttpServletRequest var2, HttpServletResponse var3) throws Exception;

}

View接口里面有一个方法render,可以将数据model渲染到视图。

六:中央控制器根据View渲染视图(将模型填充到视图),并响应给用户。

最后再送你两句话:

1:学习贵在坚持,有付出就会有收获

2:看到有帮助的回答一定记得点个赞,以后在动态随时能查看到回答,不怕找不到了

另外我给你准备了一套最通俗易懂的Java的视频教程,涵盖了零基础到就业的所有内容

关注公众号"极简编程"观看。

java视频教程部分评价:

简述springmvc过程_Springmvc执行流程相关推荐

  1. servlet请求的执行过程_Springmvc执行流程

    Springmvc自出道以来便以其简单易用,功能强大而闻名于java界,借着其亲爹spring的名头迅速流行起来,可怜昔日的老大structs2频频被曝漏洞,加上使用的复杂性,逐渐日暮西山 ,被spr ...

  2. springmvc的执行流程_springmvc执行流程

    springmvc执行流程原理: 入门案例: web.xml: xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi: ...

  3. python的运行过程_python执行流程

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 上篇文章python基础-基础使用我们已经知道了python解释器,python ...

  4. 理解MVC架构模式,SpringMVC原理、执行流程图解

    1.MVC架构模式 说起SpringMVC就不得不说MVC,MVC是一种经典架构模式.MVC架构模式的重点是为了解耦,将软件用户界面和业务逻辑分离以使代码可扩展性.可复用性.可维护性.灵活性加强,很多 ...

  5. 请简述Spring MVC的执行流程

    需要面试文档可S我 今天我给大家介绍一下Spring MVC的详细执行流程.我把Spring MVC的执行流程划分为三个阶段,配置阶段.初始化阶段和运行阶段. 我整理了一张完整的执行流程图,需要高清图 ...

  6. 简述springmvc过程_spring mvc的工作流程是什么?

    展开全部 SpringMVC工作流程描述 向服务器发送HTTP请求,请求被前端控制器 DispatcherServlet 捕获. DispatcherServlet 根据 -servlet.xml 中 ...

  7. java语言执行过程_Java程序的运行过程(执行流程)分析

    万事知其然,要知其所以然,所以本节带大家来详细了解一下 Java 程序的执行过程.从<使用记事本编写运行Java程序>一节的案例可以看出,Java 程序的运行必须经过编写.编译和运行 3 ...

  8. Java教程:Java程序的运行过程(执行流程)分析

    Java教程万事知其然,要知其所以然,所以本节带大家来详细了解一下 Java 程序的执行过程. 本篇文章由 泉州SEO www.234yp.com 整理发布,Java教程 www.234yp.com/ ...

  9. Java程序的运行过程(执行流程)分析

    Java 程序的运行必须经过编写.编译和运行 3 个步骤: 1.编写:是指在 Java 开发环境中进行程序代码的输入,最终形成后缀名为 .java 的 Java 源文件. 2.编译:是指使用 Java ...

  10. SpringMVC执行流程【简单理解举例】

    请选择你们的任意门: 本文介绍 Spring简单执行示例 改造成SpringMVC 程序执行流程分析 SpringMVC架构图以及执行流程(可以直接跳过来) 架构图 名词解释(官方话): 执行流程 自 ...

最新文章

  1. 安装驱动器于当前运行的windows驱动器不能相同_如何预防硬盘故障?5个迹象表明硬盘驱动器即将故障...
  2. SpringBoot与SpringCloud的关系与区别
  3. python对象点方法_python面向对象知识点疏理
  4. 华为云发布【云巢】智慧康养物联网加速器,加入立享多项扶持
  5. pythonmain是什么_Python - __name__=='__main__'是干啥的,以及python -m与python的区别
  6. 笔记本电脑下载python视频-学Python买什么笔记本电脑?
  7. myeclipse 安装svn(subeclipsesite)插件
  8. c语言编程 等边三角形图形,c语言问题 打印图形,菜单包括:直角三角形、等腰三角形,输入图形...,c语言编程 打印图形,菜单包括:矩形,平行四边形,输入图形的...
  9. 问题 C: 神奇的口袋
  10. Python之路【第二十篇】:python项目之旧版抽屉新热榜
  11. 秋招Java岗,心态大崩,今年的面试真的有必要这么卷吗?
  12. 支付网关潜藏黑客!32万多含CVV码的财务信息被盗
  13. IntelliJ IDEA 自动消除行尾空格
  14. 离开,是为了新的开始
  15. Black Hat Europe 2021议题解读:Wi-Fi Mesh中的安全攻击面
  16. ueditor编辑器复制粘贴图片上传
  17. java http异步调用_HttpClient的异步调用,你造吗?
  18. 中小软件开发企业将在云计算时代获新生
  19. 详解usbmon抓取的log各字段的含义
  20. Person Mission Statement

热门文章

  1. 29-3 union的使用
  2. java的IO操作之--RandomAccessFile
  3. C# Log4Net简单使用方法
  4. asp.net开源项目及学习资料
  5. 关于wow(mangos模拟器) 的物品生成器---wowItemEdit 1.0
  6. 小米虚拟键透明方法_小米 6 用户该换机了!小米 6 Pro 曝光
  7. 拓端tecdat|R语言使用HAR-RV预测实际波动率Realized Volatility案例
  8. 拓端tecdat|python图工具中基于随机块模型动态网络社团检测网络图
  9. To use CUDA with multiprocessing, you must use the ‘spawn‘ start method
  10. Caffe傻瓜系列(4):其它常用层及参数