资讯专栏INFORMATION COLUMN

spring MVC -- controller参数的解析

suemi / 3170人阅读

摘要:是提供的类,为了在容器中建立容器而服务的。主要处理的请求分发,对进行管理。接收到请求由进行匹配,匹配成功后交由进行业务逻辑的处理,业务逻辑处理完成后交由进行数据的解析同时找到对应的,最终由将的结果到浏览器进行解析。

spring给我们带来了什么?

spring IoC、AOP、Transaction这些都是很重要的特性,但是这篇这些都不是主角,主要来谈谈springMVC是如何对请求参数进行解析封装的,以及简单的介绍spring是怎么进行http请求路由的。

0x01 springMVC工程的建立

本篇就不过多介绍springMVC的工程的新建过程,此次调试springMVC源码新建的工程目录如下,通过maven管理的工程:

0x02 spring是如何接入web容器的

在进行springMVC的开发过程中我们都会在web.xml文件中进行下面一些配置,但是这些配置都是用来干嘛的呢?



    
    
        contextConfigLocation
        classpath:config/applicationContext.xml
    
    
        org.springframework.web.context.ContextLoaderListener
    

    
    
        logbackConfigLocation
        classpath:logconfig/logback.xml
    
    
        ch.qos.logback.ext.spring.web.LogbackConfigListener
    

    
    
        springMvc
        org.springframework.web.servlet.DispatcherServlet
        
            contextConfigLocation
            classpath:config/applicationMvcContext.xml
        
    
    
        springMvc
        /
    
 

这里着重介绍ContextLoaderListener和DispatcherServlet。

ContextLoaderListener是spring提供的类,为了在web容器中建立IoC容器而服务的。它实现了ServletContextListener这个接口,通过这个接口的方法实现servlet生命周期的回调,在这个过程中会通过XmlWebApplicationContext去加载bean的配置创建IoC容器。

DispatcherServlet作为一个前端控制器,他会去加载另一个bean的配置形成一个IoC容器,这个IoC会将ContextLoaderListener加载的IoC容器作为父容器,这样的好处是从DispatcherServlet容器中getBean也能取到父容器中的bean,他会先去父容器中看有没有,如果找到直接返回了。DispatcherServlet 主要处理HTTP的请求分发(HandlerMapping),对controller、viewresolver、view进行管理。DispatcherServlet接收到请求由HandlerMapping进行匹配,匹配成功后交由controller进行业务逻辑的处理,业务逻辑处理完成后交由viewresolver进行数据的解析同时找到对应的view,最终由DispatcherServlet将view的结果render到浏览器进行解析。

0x03 controller的参数是如何被解析的

在开发过程中遇到下面这样的controller方法怎么也得到不到us值,

public String printWelcome(ModelMap model,ArrayList us){}

如果改成下面这样就可以正常得到us的值

public String printWelcome(ModelMap model,String us){}

这是为什么?怎么解决?

搜索后发现这样可以解决问题,但是sowhat?

public String printWelcome(ModelMap model,@RequestParam("us[]") List us){}

所以需要来剖析下springMVC的源代码了,发现spring是通过下面这个方法进行controller参数解析的。

org.springframework.web.bind.annotation.support.HandlerMethodInvoker#resolveHandlerArguments

解析参数值的代码(里面好多if else啊):

从这个图片可以看到通过if去判断paramName对应controller方法中的@RequestParam,pathVarName对应@PathVariable,没有加任何修饰会进入到attrName这个分支里面去解析参数。在解析的过程中会通过函数的参数类型去组装对象传递到RequestMapping类的方法中。

如果是下面这样的方法参数又会怎样

public String printWelcome(ModelMap model,@RequestParam("us[]") List us){}

User是自定义的参数,spring会对这种参数进行一个特殊的处理处理方法如下:

org.springframework.beans.TypeConverterDelegate#convertIfNecessary

在这个方法中有一段处理的代码,会根据List内部元素类型去判断类型是不准确并赋值。

到这里应该和controller相关的注解可以随便用了吧?

0x04 感想

在学校期间一直用着C、C++进行开发,其实也没怎么开发,只是作为装逼的一种手段,如今踏入工作岗位开始离C、C++很远了,又开始了0基础JAVA开发。作为一个门外汉来观望spring。
spring的东西太多了,也很权威大家基本上都用,所以后面还学要加强这方面的探索和学习,期待后面自己还能将spring的学习感想记录下来。这篇是在进行开发的过程中遇到上面提到的一个问题所以想深入了解其背后的实现方式,未来继续spring。

0x05 参考

在学习spring的过程中可以参考计文柯著的spring技术内幕,里面结合代码讲解了spring的各个重要的技术,需要一定的基础再去看比较好,值得推荐。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65948.html

相关文章

  • Spring之旅第八站:Spring MVC Spittr舞台搭建、基本控制器、请求输入、表

    摘要:请求旅程的第一站是的。的任务是将请求发送控制器控制器是一个用于处理请求的组件。处理映射器根据请求携带的信息来进行决策。这样的结果就是,只能找到显示声明在配置类中的控制器。 构建Spring Web应用 说明 如果你有幸能看到。 1、本文参考了《Spring 实战》重点内容,参考了GitHub上的代码 2、本文只为记录作为以后参考,要想真正领悟Spring的强大,请看原书。 3、在一次...

    maybe_009 评论0 收藏0
  • Spring实战5-基于Spring构建Web应用

    摘要:的框架用于解决上述提到的问题,基于模型,可以帮助开发人员构建灵活易扩展的应用。在这一章中,将专注于构建该应用的层,创建控制器和显示,以及处理用户注册的表单。类有两个静态接口,代表两种模拟服务的方式独立测试和集成测试。 主要内容 将web请求映射到Spring控制器 绑定form参数 验证表单提交的参数 写在前面:关于Java Web,首先推荐一篇文章——写给java web一年左右...

    sourcenode 评论0 收藏0
  • SpringMVC学习笔记

    摘要:是目前最流行的一种互联网软件架构。协议,是一个无状态协议,即所有的状态都保存在服务器端。而这种转化是建立在表现层之上的,所以就是表现层状态转化。具体说,就是协议里面,四个表示操作方式的动词。 一、SpringMVC概述 Spring为展现层提供的基于MVC设计理念的优秀的Web框架,是目前最主流的MVC框架之一 Spring3.0之后全面超越Struts2,成为最优秀的MVC框架 S...

    roundstones 评论0 收藏0
  • SpringMVC之源码分析--HandlerMapping(一)

    摘要:接口接口作用是将请求映射到处理程序,以及预处理和处理后的拦截器列表,映射是基于一些标准的,其中的细节因不同的实现而不相同。该参数是类型,作用是检查所有的映射解析器或使用或为的,默认为,即从上下文中检查所有的。 概述 在Spring MVC启动章节https://segmentfault.com/a/1190000014674239,介绍到了DispatcherServlet的onRef...

    ralap 评论0 收藏0
  • Learn Spring - Spring MVC

    摘要:例如,将请求信息中的字符串格式参数转换为对应方法中的类类型入参可通过的属性注册自定义转换器。 1. 处理流程 请求提交给DispatchServlet 查找HandlerMapping 调用由HandlerAdapter封装后的Handler 返回ModelAndView到DispatcherServlet 借由ViewResolver完成逻辑视图到真实视图的转换 返回响应 2. ...

    DesGemini 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<