首页 > 其他分享 >【老王读SpringMVC-5】Controller method 是如何执行的?

【老王读SpringMVC-5】Controller method 是如何执行的?

时间:2023-05-24 20:05:30浏览次数:47  
标签:重定向 Nullable SpringMVC 视图 Controller handler private method

通过前面对 Controller method 参数绑定的分析,我们知道, 被 @RequestMapping 标记 handler method 的执行是通过调用 RequestMappingHandlerAdapter#handle()

RequestMappingHandlerAdapter#handle() 具体的调用过程如下:
RequestMappingHandlerAdapter2.png

参数解析、handler method 的执行 和 对返回值的处理,最终是通过 ServletInvocableHandlerMethod#invokeAndHandle() 来处理的。

ServletInvocableHandlerMethod#invokeAndHandle() 的处理过程如下: ServletInvocableHandlerMethod2.png

// org.springframework.web.method.support.InvocableHandlerMethod#invokeForRequest
public Object invokeForRequest(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer,
        Object... providedArgs) throws Exception {

    Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);
    if (logger.isTraceEnabled()) {
        logger.trace("Arguments: " + Arrays.toString(args));
    }
    return doInvoke(args);
}

1、首先,通过 HandlerMethodArgumentResolver 解析出方法执行所需要的参数,然后通过反射调用 handler method 来执行。
2、如果 handler method 的返回值为空,则看是否跳过返回值处理和视图解析,直接返回
3、通过 HandlerMethodReturnValueHandler 来处理 handler method 的返回值
4、通过 ModelAndViewContainer 对象组装出 ModelAndView 对象进行返回。
(如果 requestHandled=true,则直接返回 null,不经过视图解析)

补充:SpringMVC 相关的对象、实体

ModelAndViewContainer

ModelAndViewContainer 用于记录 HandlerMethodArgumentResolverHandlerMethodReturnValueHandler 在调用 handler method 过程中做出的与模型和视图相关的决策。

public class ModelAndViewContainer {

    // 在重定向的时候是否使用默认 Model 的内容
    private boolean ignoreDefaultModelOnRedirect = false;

    @Nullable
    private Object view;

    // 默认模型在实例化时自动创建
    private final ModelMap defaultModel = new BindingAwareModelMap();

    // 重定向的 Model 
    @Nullable
    private ModelMap redirectModel;

    // 标记是否是重定向的场景
    // 如果是重定向场景,getModel()返回重定向模型而不是默认模型
    private boolean redirectModelScenario = false;

    @Nullable
    private HttpStatus status;

    private final SessionStatus sessionStatus = new SimpleSessionStatus();

    // 用于标记请求已被直接处理,不需要视图解析
    private boolean requestHandled = false;
}

ModelAndView

ModelAndView 是 Spring MVC 框架中模型和视图的持有者,用于表示 handler method 返回的模型和视图,最终会由 DispatcherServlet 解析。

public class ModelAndView {

    /** View instance or view name String. 
     * View 对象 或者 String 类型的 view name。
     * */
    @Nullable
    private Object view;

    /** Model Map. */
    @Nullable
    private ModelMap model;

    /** Optional HTTP status for the response. */
    @Nullable
    private HttpStatus status;
}

View:

视图可以采用 String 类型的视图名称 或者直接指定 View 对象,需要由 ViewResolver 解析。

Model:

模型采用的是 Map 类型,允许使用名称来访问值对象,也就是使用 Map 的形式访问整个模型对象。

Model.png

BindingAwareModelMap 是 SpringMVC 向 handler method 暴露的类。
通常是通过 Model 接口来声明使用的,不需要在用户代码中构建它。

RedirectAttributesModelMap 是重定向属性的 ModelMap 实现。
提供了一个它提供了闪存 mode 属性的地方,这样重定向的model 属性就可以在重定向中生存,而无需嵌入重定向URL中。

标签:重定向,Nullable,SpringMVC,视图,Controller,handler,private,method
From: https://blog.51cto.com/laowang6/6342743

相关文章

  • Maven+Eclipse+SpringMVC+MyBatis整合
    Maven+Eclipse+SpringMVC+MyBatis整合参考:SpringMVC3.0.5+Spring3.0.5+MyBatis3.0.4全注解实例详解(一):[url]http://www.blogjava.net/bolo/archive/2011/05/23/349655.html[/url]Maven最佳实践:版本管理:[url]http://juvenshun.iteye.com/blog/376422[/......
  • Appengine部署springMVC3.1
    参考:[url]http://sikeh.iteye.com/blog/364043[/url]获得springMVC的方法:[url]http://panyongzheng.iteye.com/blog/1759912[/url][b]1.mvnarchetype:create-DgroupId=com.pandy-DartifactId=study[/b][b]2.cdstudy[/b]需要做一些另外的事情,然......
  • 日常问题记录: HP LoadRunner Controller 已停止工作
    环境描述:系统:windowsserver压测工具:Loadrunner11现象描述:Controller在执行一段时间后崩溃,提示:HPLoadRunnerController已停止工作;根据并发用户多少执行时间基本成比例;例如12并发用户3小时,24并发用户1.5小时Windows提示信息:错误应用程序名称:wlrun.exe,版本:11.0.0.......
  • 浅聊springmvc的执行流程
    核心组件是DispatcherServlet,所有的流程都是通过这个组件进行转发的,就好像一个转运中心1、用户发送请求至前端控制器DispatcherServlet。2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生......
  • use SSH to connect to Raspberry Pi methods All In One
    useSSHtoconnecttoRaspberryPimethodsAllInOneRaspberryPiuser@hostname#无需知道RaspberryPi的IPAddress,即可使用SSH连接......
  • SpringMVC响应json数据
    SpringMvc响应json数据@Controller@RequestMapping("/json")publicclassJsonController{@RequestMapping("/js1")@ResponseBody//响应json:将return的值作为文本响应给客户端,而不是转发到对应页面publicStringjs1(){System.out.println("js......
  • springmvc的流程及简单案例
    springmvc概念JavaEE体系结构包括四层,从上到下分别是应用层、Web层、业务层、持久层。Struts和SpringMVC是Web层的框架,Spring是业务层的框架,Hibernate和MyBatis是持久层的框架。SpringMVC是一种轻量级的、基于MVC的Web层应用框架,它属于Spring框架的一部分。SpringMVC说......
  • iOS UITabBarController 典型应用
    -(BOOL)application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions{self.window=[[UIWindowalloc]initWithFrame:[[UIScreenmainScreen]bounds]];//Overridepointforcustomizationafterapplicationlau......
  • controller是单例模式还是多例模式?spring默认的是单例模式,那么如何保证线程安全
    controller是单例模式还是多例模式在Java中,Controller既可以是单例模式,也可以是多例模式,这取决于具体的实现方式。在单例模式中,Controller只会被实例化一次,多个线程共享同一个实例。这样可以节约系统资源,提高系统性能。但是在多线程环境下,如果不加以保护,可能会出现线程安全的问......
  • EndpointController更新endpoint
    因kcm异常而没有更新endpoint停止kube-controller-manager删除Podcoredns后endpoint没有更新kube-proxy没有更新svckube-dns恢复kcm后更新endpoint启动kube-controller-manager后,去掉了异常corednsPodIPpkg/controller/endpoint/endpoints_controller.gosyncService......