其中view可以是字符串类型也可以是View类型,如果是字符串类型,则表示逻辑视图名,如果是View类型,则其即为我们要转换的目标view;这里model是一个Map类型的对象,其保存了渲染视图所需要的属性...在进行视图解析时,如果ModelAndView中的view是字符串类型的,那么要解析的视图存储位置就通过“prefix + (String)view + suffix”的格式生成要解析的文件路径,并且将其封装为一个..., // 则每次请求时都会重新解析生成视图对象 if (!...request中pathVariable,staticAttribute与用户返回的model属性 // 合并为一个Map对象,以供给后面对视图的渲染使用 Map视图的渲染主要分为了三步:①合并用户返回的model数据和request中的pathVariable与staticAttribute等数据;②判断当前是否为文件下载类型的视图解析,如果是,则设置
在获得了ModelAndView对象之后,SpringMVC就需要把该View渲染给用户,即返回给浏览器。...当Handler返回的ModelAndView中不包含真正的视图,只返回一个逻辑视图(比如返回一个字符串)名称的时候,ViewResolver就会把该逻辑视图名称解析为真正的视图View对象。...View是真正的进行视图渲染(对response里写东西),把结果返回给浏览器的 ViewResolver SpringMVC 用于处理视图最重要的两个接口是 ViewResolver 和 View...View 接口的主要作用是用于处理视图,然后返回给客户端。...视图、渲染方面,而本文就做了一个非常好的铺垫作用~~~
ViewResolver 视图解析器能够通过viewName视图名和locale用户区域获取View对象,从而渲染视图。...代码第7行会调用getCandidateViews方法获取所有返回的View。实际上,除了根据viewName获取View外,还会给viewName加上一些后缀名再去获取。...UrlBasedViewResolver 允许设置prefix和suffix,使得开发者返回viewName时,只用返回特征值即可。...内部资源视图解析器?干什么的呢?实际上,这是一个利用jstl标准标签库实现模板渲染的视图解析器。...最后是将合并后的model交给子类渲染。
6、Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View。...PS:这么我们需要注意的是:当preHandler返回false时,当前的请求将在执行完afterCompletion后直接返回,handler也将不会执行。...设计 如果handler兑现返回了ModelAndView对象,那么说明Handler需要传一个Model实例给view去渲染模版。...除了渲染页面需要model实例,在业务逻辑层通常也有Model实例。...ViewResolver:主要是根据用户请求的viewName创建适合的模版引擎来渲染最终的页面,ViewResolver会根据viewName创建一个view对象,调用view对象的Void render
从⽅法的定义可以看出,Controller层返回的String类型视图名viewName 最终会在这⾥被解析成为View。...View是⽤来渲染⻚⾯的,也就是说,它会将程序返回的参数和数据填⼊模板中,⽣成html⽂件。...因为重定向时么有传递参数这⼀功能的,如果不想把参数写进URL(不推荐),那么就可以通过 FlashMap 来传递。...并返回真正的view 给DispatcherServlet 9、DispatcherServlet 将得到的视图进行渲染,填充到request域中 10、返回给客户端响应结果。...要将逻辑视图名解析为物理视图名 4、封装View视图对象之后,调⽤了view对象的render⽅法 5、渲染数据 6、把modelMap中的数据暴露到request域中,这也是为什么后台model.add
)提供的数据结合视图模板进行渲染我们需要的格式(通常是HTML)。...控制器(Controller)再将渲染的结果返回给请求的客户端。 在 ASP.NET Core MVC框架中,提供了视图引擎:Razor。 Razor提供了后缀为.cshtml的视图模板。...这是因为按照 ASP.NET Core MVC框架的约定,当我们在控制器(Controller)返回一个视图(return View();)时,如果只指定了视图名称(ViewName),并没有指定视图的完成路径...TestAbc(){ return View("abc"); } } 分别手动指定了视图名;ViewName=”Test”、ViewName=”abc”; 框架将按照约定顺序查找视图文件...ViewModel,我们可以在return View();时指定视图参数/对象。
viewName) public ModelAndView(String viewName,Map model) public ModelAndview(String viewName,String...ModelAndView内部提供的属性有下面三个: //保存view对象或者视图名 private Object view; //存放模型数据 private ModelMap model;...中的视图信息 ModelAndView可以返回逻辑视图名,或者View实例,如果直接返回了具体的View实例,那么,DispathcerServlet将直接从ModelAndView中获取该View实例并渲染视图...,DispatcherServlet将寻求ViewResolver的帮助,根据ModelAndView中的逻辑视图名称获取一个可用的View实例,然后再渲染视图: View view=null; ,,,...至于ModelMap中保持的模型数据将会在视图渲染阶段,由具体的View实现类来获取并使用。
通过引入该策略抽象接口, 我们可以极具灵活servlet中的视图渲染逻辑得以剥离出来的关键组件。通过引入该策略抽象接口,我们可以极具灵活性地支持各种视图渲染技术。...render(⋯)方法中实现最终的视图渲染工作,但这些对Dispatcherservlet来说是透明的, Dispatcherservlet只是直接接触ViewResolver所返回的view接口, 获得相应引用后把视图渲染工作转交给返回的...---- View实现原理回顾 总地来说,当前绝大多数的视图渲染技术都是构建在模板的原理之上。我们回想一下,这种基于模板视图生成方式在我们的生活中到处可见。...createView(String viewName, Locale locale) throws Exception { //判断当前视图解析器能否解析当前视图名,如果不能直接返回null,表示无法解析...viewName映射到具体某个页面的场景已然不多,而是被返回JSON字符串所替代,上面给出的自定义View实现其实就是返回JSON字符串的场景应用,但是使用过SpringMVC的小伙伴都知道,只要我们在
2、在需要返回 Json 数据的方法上追加注解 @ResponseBody,并且配置对应的 Json 消息转换器。此时将不会使用指定的 ViewResolver 渲染页面,而是返回 Json 数据。...一个返回Json数据,一个渲染Jsp页面: @Controller @Slf4j public class MyController { /** * 这个接口将会返回json数据...从现象上来看,@ResponseBody 似乎把响应数据的渲染路径改变了,之前明明要渲染页面,现在硬生生改成了返回 Json 数据。 没错,就是这样。...只要加了 @ResponseBody 注解,就会直接把接口返回的数据通过Json写到响应中,后续的视图解析器将不会被执行,也就不存在视图渲染一说了。...提示:会根据返回值的类型落到对应的处理器中,对于我们的例子来说,会由 ModelAttributeMethodProcessor 处理器执行:寻找 WEB-INF/view/toJson.jsp 页面尝试渲染
7 RequestToViewNameTranslator 从请求中获取ViewName 8 ViewResolvers 主要作用是将String类型的视图名和Locale解析为View类型的视图 9...因为ViewResolver根据ViewName查找View,但有的Handler处理完成之后,没有设置View,也没有设置ViewName,便要通过这个组件来从请求中查找ViewName。...这个组件的主要作用是将String类型的视图名和Locale解析为View类型的视图,只有一个resolveViewName()方法。...从方法的定义可以看出,Controller层返回的String类型的视图名viewName最终会在这里被解析成为View。...View是用来渲染页面的,也就是说,它会将程序返回的参数和数据填入模板中,生成HTML文件。
(this.getViewClass());//获得一个视图类 有继承关系 view.setUrl(this.getPrefix() + viewName + this.getSuffix...= null) { view.setContentType(contentType);//视图类型 } return view;//返回我们的视图...,最后把构成的视图返回构成了一个 InternalResourceView视图。...2、然后通过视图解析器(ViewResolver)对ModelAndView对象中的View对象进行解析,将该逻辑视图View对象解析为一个物理视图View对象; 3、最后调用物理视图View对象的render...()方法进行视图渲染,得到响应结果。
Handler执行完成后返回的是逻辑视图,也就是视图名字,一个String ,还有一个Model就是数据模型,封装成ModelAndView。...View用来渲染视图,也就是负责把Handler返回的数据模型model,填充到模板(jsp;ftl)形成html格式的静态内容。...//调用视图解析器,解析viewName,得到View对象 view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale...with name '" + getServletName() + "'"); } //【重要】调用view.render渲染视图 view.render(mv.getModelInternal...View的render方法渲染视图,见:org.springframework.web.servlet.view.AbstractView#render public void render(Map<String
model和视图view相关信息.。...是否忽略defaultModel 默认值是false:不忽略 private boolean ignoreDefaultModelOnRedirect = false; // 此视图可能是个View...mavContainer.getStatus()); // 真正的View 可见ModelMap/视图名称、状态HttpStatus最终都交给了Veiw去渲染 if (!...HttpEntity的方法 // 看一看到,这种返回值的都会标注为已处理,这样就不再需要视图(渲染)了 @Override public void handleReturnValue(@Nullable...如果返回值是后三者,又是如何找到view完成渲染的呢? 这个问题我抛出来,本文不给答案。因为都聊到这了,此问题应该不算难的了,建议小伙伴必须自行弄懂缘由(请不要放过有用的知识点)。
进入processDispatchResult这个方法,看到这么一段 // Did the handler return a view to render? 返回一个view 去渲染 if (mv !...view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);//获取来渲染页面的view if (...(String viewName, Map model, Locale locale, HttpServletRequest request) throws Exception...(viewName, locale); //创建根据viewName(其实就是controller里返回的url,比如/wiew/test.ftl)创建view //那随便一个url都能有相应的...//以上都没找到视图,只有获取一个默认的。
的后缀 prefix 1.8、View:视图 负责将结果展示给用户,View 接口源码如下,render 方法根据指定的模型数据(model)渲染视图,即 render 方法负责将结果输出给客户端。...返回值为 Callable 类型时的解析器,表示异步请求 ModelMethodProcessor 返回值为 Model 类型时的解析器 ModelAndViewMethodReturnValueHandler...View 对象 ⑦-2-2:调用视图的 render 方法渲染视图,将结果输出到客户端 下面进去细看一下 ⑦-2-1:调用视图解析器解析视图名称得到视图 View 对象 //⑦-2-1:调用视图解析器解析视图名称得到视图...,遍历视图解析器,解析视图名称,得到视图对象 View protected View resolveViewName(String viewName, @Nullable Map视图解析,根据 Model 和 View,来渲染视图 10、渲染视图完毕执行拦截器的 afterCompletion(…)方法【逆向】 11
当然在MVC 4、5的时代,我们也使用过如RazorEngine这样的第三方的视图引擎,那时候MVC中的Razor与框架耦合的比较紧密,第三方开源组件帮我们实现了在任意项目中使用Razor渲染视图为文本的方式...二、实现视图渲染器 其实在ASP.NET Core MVC中给我们提供了这样的方法,只是用起来不太方便,我们来对它进行一下封装。 ...框架早已经为我们提供了视图渲染的接口 IRazorViewEngine 通过它的FindView方法来查找视图及.cshtml文件,当然查找方法也与MVC中的视图路径规则是对应的,本来就是一个东西嘛:)...(string viewName, object model); } 然后是实现类了,代码很简单一看就懂了: public class ViewRenderService : IViewRenderService...ArgumentNullException($"{viewName} does not match any available view"); }
有了前面的小铺垫,现在我们来唠唠这视图解析器的事儿 视图解析器 这里主要通过调试源代码看看spring mvc的handler是如何利用视图解析器找到并返回实际的物理视图的,别眨眼 1....: protected View resolveViewName(String viewName, Map model, Locale locale, HttpServletRequest...而真正的渲染视图在DispatcherServlet的view.render(mv.getModelInternal(), request, response);点击进入这里的render方法,我们选择...同时发现这里返回的view就是/WEB-INF/views/success.jsp ? ...(点赞不迷路,博主带你上高速~~~)
本文就教你用一个@RequestMapping也能返回多个View~ 注意:我这里指的是返回的是View视图,对于消息体的这种返回方式,不是本处讨论的范畴,它属于case 1。...: @Nullable protected View resolveViewName(String viewName, @Nullable Map model, Locale...第一个最先解析到不返回null的 就是最终返回的view视图 for (ViewResolver viewResolver : this.viewResolvers) { View view...useNotAcceptableStatusCode = false; // 当无法获取到具体的视图时,会走defaultViews @Nullable private ListView> defaultViews...= null) { // 很显然,找到了最佳的就返回渲染吧 return bestView; } } ... // useNotAcceptableStatusCode
业务处理器调用模型层处理完用户请求后,把结果数据存储在该类的model属性中,把要返回的视图信息存储在该类的view属性中,然后让该ModelAndView返回该Spring MVC框架。..., serif; line-height: 18px;”>该属性用来存储返回的视图信息 [java] view plain copy /** Model Map */ private...构造ModelAndView对象当控制器处理完请求时,通常会将包含视图名称或视图对象以及一些模型属性的ModelAndView对象返回到DispatcherServlet。...(1)当你只有一个模型属性要返回时,可以在构造器中指定该属性来构造ModelAndView对象: [java] view plain copy package com.apress.springrecipes.court.web...(String viewName, Map model),Map对象中设定好key与value值,之后可以在视图中取出,如果您只是要返回一个Model对象,则可以使用下面这个 ModelAndView版本
ViewResolver 也算一种策略,根据不 同的请求选择不同的模板引擎来进行页面的渲染。...> model; public GPModelAndView(String viewName, Map model) { this.viewName = viewName; this.model = model; } public GPModelAndView...> getModel() { return model; } } 7.GPViewResolver 视图解析器 通过在 Serlvet 中调用 resolveViewName()...在 render()方 法中完成对模板的渲染,最终返回浏览器能识别的字符串,通过 Response 输出。
领取专属 10元无门槛券
手把手带您无忧上云