电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

SpringBoot與SpringMVC中參數傳遞的原理解析

瀏覽:5日期:2023-02-22 09:00:27
目錄一:普通參數與基本注解二:復雜參數一:普通參數與基本注解

HandlerMapping中找到能處理請求的Handler(Controller,method())為當前Handler找一個適配器HandlerAdapter:RequestMappingHandlerAdapter

SpringBoot與SpringMVC中參數傳遞的原理解析

1.HandlerAdapter

SpringBoot與SpringMVC中參數傳遞的原理解析

0-支持方法上標注@RequestMapping1-支持函數式編程的xxxx

2.執行目標方法

SpringBoot與SpringMVC中參數傳遞的原理解析SpringBoot與SpringMVC中參數傳遞的原理解析

3.參數解析器:確定要執行的目標方法每一個參數的值是什么

SpringBoot與SpringMVC中參數傳遞的原理解析

SpringBoot與SpringMVC中參數傳遞的原理解析

boolean supportsParameter(MethodParameter parameter);Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,先判斷是否支持該參數類型, 如果支持, 就調用resolveArgument解析方法

4.返回值處理器

SpringBoot與SpringMVC中參數傳遞的原理解析

5.挨個判斷所有參數解析器哪個支持這個參數:HandlerMethodArgumentResolver: 把控著支持的方法參數類型

SpringBoot與SpringMVC中參數傳遞的原理解析

請求進來后, 首先從handlerMapping中查找是否有對應的映射處理, 得到映射適配器Adapter,再通過適配器,查找有哪些方法匹配請求,首先判斷方法名,以及參數類型是否匹配,首先獲得方法中聲明的參數名字, 放到數組里,循環遍歷27種解析器判斷是否有支持處理對應參數名字類型的解析器,如果有的話,根據名字進行解析參數,根據名字獲得域數據中的參數, 循環每個參數名字進行判斷, 從而為每個參數進行賦值.

對于自定義的POJO類參數:ServletRequestMethodArgumentResolver 這個解析器用來解析: 是通過主要是通過判斷是否是簡單類型得到的

@Overridepublic boolean supportsParameter(MethodParameter parameter) {return (parameter.hasParameterAnnotation(ModelAttribute.class) ||(this.annotationNotRequired && !BeanUtils.isSimpleProperty(parameter.getParameterType())));}public static boolean isSimpleValueType(Class<?> type) {return (Void.class != type && void.class != type &&(ClassUtils.isPrimitiveOrWrapper(type) ||Enum.class.isAssignableFrom(type) ||CharSequence.class.isAssignableFrom(type) ||Number.class.isAssignableFrom(type) ||Date.class.isAssignableFrom(type) ||Temporal.class.isAssignableFrom(type) ||URI.class == type ||URL.class == type ||Locale.class == type ||Class.class == type));}public final Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception {Assert.state(mavContainer != null, 'ModelAttributeMethodProcessor requires ModelAndViewContainer');Assert.state(binderFactory != null, 'ModelAttributeMethodProcessor requires WebDataBinderFactory');String name = ModelFactory.getNameForParameter(parameter);ModelAttribute ann = parameter.getParameterAnnotation(ModelAttribute.class);if (ann != null) {mavContainer.setBinding(name, ann.binding());}Object attribute = null;BindingResult bindingResult = null;if (mavContainer.containsAttribute(name)) {attribute = mavContainer.getModel().get(name);}else {// Create attribute instancetry {attribute = createAttribute(name, parameter, binderFactory, webRequest);}catch (BindException ex) {if (isBindExceptionRequired(parameter)) {// No BindingResult parameter -> fail with BindExceptionthrow ex;}// Otherwise, expose null/empty value and associated BindingResultif (parameter.getParameterType() == Optional.class) {attribute = Optional.empty();}else {attribute = ex.getTarget();}bindingResult = ex.getBindingResult();}}if (bindingResult == null) {// Bean property binding and validation;// skipped in case of binding failure on construction.WebDataBinder binder = binderFactory.createBinder(webRequest, attribute, name);if (binder.getTarget() != null) {if (!mavContainer.isBindingDisabled(name)) {bindRequestParameters(binder, webRequest);}validateIfApplicable(binder, parameter);if (binder.getBindingResult().hasErrors() && isBindExceptionRequired(binder, parameter)) {throw new BindException(binder.getBindingResult());}}// Value type adaptation, also covering java.util.Optionalif (!parameter.getParameterType().isInstance(attribute)) {attribute = binder.convertIfNecessary(binder.getTarget(), parameter.getParameterType(), parameter);}bindingResult = binder.getBindingResult();}// Add resolved attribute and BindingResult at the end of the modelMap<String, Object> bindingResultModel = bindingResult.getModel();mavContainer.removeAttributes(bindingResultModel);mavContainer.addAllAttributes(bindingResultModel);return attribute;}

WebDataBinder binder =binderFactory.createBinder(webRequest,attribute,name)WebDataBinder:web數據綁定器,將請求參數的值綁定到指定的javaBean里面WebDataBinder 利用它里面的Converters將請求數據轉成指定的數據類型,通過反射一系列操作,再次封裝到javabean中

GenericConversionService:在設置每一個值的時候,找它里面所有的converter哪個可以將這個數據類型(request帶來參數的字符串)轉換到指定的類型(javabean—某一個類型)

SpringBoot與SpringMVC中參數傳遞的原理解析SpringBoot與SpringMVC中參數傳遞的原理解析

未來我們可以給WebDataBinder里面放自己的Converter

private static final class StringToNumber implements Converter<String, T> {converter總接口:@FunctionalInterfacepublic interface Converter<S, T> {

//自定義轉換器:實現按照自己的規則給相應對象賦值

@Override public void addFormatters(FormatterRegistry registry) { registry.addConverter(new Converter<String, Pet>() {@Overridepublic Pet convert(String source) { if (!StringUtils.isEmpty(source)){Pet pet = new Pet();String[] split = source.split(',');pet.setName(split[0]);pet.setAge(split[1]);return pet; } return null;} }); }二:復雜參數

Map/Model(map/model里面的數據會被放在request的請求域 相當于request.setAttribute)/Errors/BindingResult/RedirectAttributes(重定向攜帶數據)/ServletRespons().SessionStaus.UriComponentsBuilder

6.在上面第五步目標方法執行完成后:將所有的數據都放在ModelAdnViewContainer;包含要去的頁面地址View,還包含Model數據

SpringBoot與SpringMVC中參數傳遞的原理解析

7.處理派發結果

processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);

在頁面進行響應前, 進行視圖渲染的時候:exposeModelAsRequestAttributes(model, request); 該方法將model中所有參數都放在請求域數據中

protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {// Expose the model object as request attributes.exposeModelAsRequestAttributes(model, request);// Expose helpers as request attributes, if any.exposeHelpers(request);// Determine the path for the request dispatcher.String dispatcherPath = prepareForRendering(request, response);// Obtain a RequestDispatcher for the target resource (typically a JSP).RequestDispatcher rd = getRequestDispatcher(request, dispatcherPath);if (rd == null) {throw new ServletException('Could not get RequestDispatcher for [' + getUrl() +']: Check that the corresponding file exists within your web application archive!');}// If already included or response already committed, perform include, else forward.if (useInclude(request, response)) {response.setContentType(getContentType());if (logger.isDebugEnabled()) {logger.debug('Including [' + getUrl() + ']');}rd.include(request, response);}else {// Note: The forwarded resource is supposed to determine the content type itself.if (logger.isDebugEnabled()) {logger.debug('Forwarding to [' + getUrl() + ']');}rd.forward(request, response);}}

通過循環遍歷model中的所有數據放在請求域中

protected void exposeModelAsRequestAttributes(Map<String, Object> model,HttpServletRequest request) throws Exception {model.forEach((name, value) -> {if (value != null) {request.setAttribute(name, value);}else {request.removeAttribute(name);}});}

不管我們在方法形參位置放 Map集合或者Molde 最終在底層源碼都是同一個對象在mvcContainer容器中進行保存

到此這篇關于SpringBoot與SpringMVC中參數傳遞的原理的文章就介紹到這了,更多相關SpringBoot SpringMVC參數傳遞內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 单螺旋速冻机-双螺旋-流态化-隧道式-食品速冻机厂家-广州冰泉制冷 | 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 | 纯水电导率测定仪-万用气体检测仪-低钠测定仪-米沃奇科技(北京)有限公司www.milwaukeeinst.cn 锂辉石检测仪器,水泥成分快速分析仪-湘潭宇科分析仪器有限公司 手术室净化装修-手术室净化工程公司-华锐手术室净化厂家 | 山东风淋室_201/304不锈钢风淋室净化设备厂家-盛之源风淋室厂家 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | 代做标书-代写标书-专业标书文件编辑-「深圳卓越创兴公司」 | 熔体泵|换网器|熔体齿轮泵|熔体计量泵厂家-郑州巴特熔体泵有限公司 | 私人别墅家庭影院系统_家庭影院音响_家庭影院装修设计公司-邦牛影音 | 广州/东莞小字符喷码机-热转印打码机-喷码机厂家-广州瑞润科技 | 自动记录数据电子台秤,记忆储存重量电子桌称,设定时间记录电子秤-昆山巨天 | hc22_hc22价格_hc22哈氏合金—东锜特殊钢 | 禹城彩钢厂_钢结构板房_彩钢复合板-禹城泰瑞彩钢复合板加工厂 | 钢板仓,大型钢板仓,钢板库,大型钢板库,粉煤灰钢板仓,螺旋钢板仓,螺旋卷板仓,骨料钢板仓 | 武汉高低温试验机-现货恒温恒湿试验箱-高低温湿热交变箱价格-湖北高天试验设备 | 蓝米云-专注于高性价比香港/美国VPS云服务器及海外公益型免费虚拟主机 | 冲击式破碎机-冲击式制砂机-移动碎石机厂家_青州市富康机械有限公司 | 蜂窝块状沸石分子筛-吸附脱硫分子筛-萍乡市捷龙环保科技有限公司 | 临朐空调移机_空调维修「空调回收」临朐二手空调| 电子海图系统-电梯检验系统-智慧供热系统开发-商品房预售资金监管系统 | 广东燎了网络科技有限公司官网-网站建设-珠海网络推广-高端营销型外贸网站建设-珠海专业h5建站公司「了了网」 | 中空玻璃生产线,玻璃加工设备,全自动封胶线,铝条折弯机,双组份打胶机,丁基胶/卧式/立式全自动涂布机,玻璃设备-山东昌盛数控设备有限公司 | 石家庄网站建设|石家庄网站制作|石家庄小程序开发|石家庄微信开发|网站建设公司|网站制作公司|微信小程序开发|手机APP开发|软件开发 | 膜结构车棚|上海膜结构车棚|上海车棚厂家|上海膜结构公司 | 可程式恒温恒湿试验箱|恒温恒湿箱|恒温恒湿试验箱|恒温恒湿老化试验箱|高低温试验箱价格报价-广东德瑞检测设备有限公司 | 不锈钢反应釜,不锈钢反应釜厂家-价格-威海鑫泰化工机械有限公司 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 自动螺旋上料机厂家价格-斗式提升机定制-螺杆绞龙输送机-杰凯上料机 | 流量卡中心-流量卡套餐查询系统_移动电信联通流量卡套餐大全 | LNG鹤管_内浮盘价格,上装鹤管,装车撬厂家-连云港赛威特机械 | 挖掘机挖斗和铲斗生产厂家选择徐州崛起机械制造有限公司 | 压片机_高速_单冲_双层_花篮式_多功能旋转压片机-上海天九压片机厂家 | 搪瓷反应釜厂家,淄博搪瓷反应釜-淄博卓耀 | 解放卡车|出口|济南重汽|报价大全|山东三维商贸有限公司 | 高压分散机(高压细胞破碎仪)百科-北京天恩瀚拓 | 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 「银杏树」银杏树行情价格_银杏树种植_山东程锦园林 | 玉米深加工机械,玉米加工设备,玉米加工机械等玉米深加工设备制造商-河南成立粮油机械有限公司 | 托利多电子平台秤-高精度接线盒-托利多高精度电子秤|百科 | 卡诺亚轻高定官网_卧室系统_整家定制_定制家居_高端定制_全屋定制加盟_定制家具加盟_定制衣柜加盟 | 吲哚菁绿衍生物-酶底物法大肠菌群检测试剂-北京和信同通科技发展有限公司 | 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | 阴离子聚丙烯酰胺价格_PAM_高分子聚丙烯酰胺厂家-河南泰航净水材料有限公司 | 代办建筑资质升级-建筑资质延期就找上海国信启航 |