springmvc DispatchServlet初始化九大加载策略(三)

7. initRequestToViewNameTranslator 请求视图名

它主要与视图解析有关,如果对ViewResolvers、ModelAndView、View等没有多大印象,可以先看第8节。

RequestToViewNameTranslator主要是获取请求中的viewName,然后可以根据这个viewName获取ModelAndView对象。

RequestToViewNameTranslator接口定义:

public interface RequestToViewNameTranslator {

	// Strategy interface for translating an incoming HttpServletRequest into a logical view name when no view name is explicitly supplied.
	String getViewName(HttpServletRequest request) throws Exception;

}

简单的来说就是根据request请求获取来组装视图名称,仅此而已。

在DispatcherServlet的doDispatch函数中会设置默认的视图名:

// 设置默认的视图名称
applyDefaultViewName(processedRequest, mv);
applyDefaultViewName中会判断ModelAndView的hasView为空时,就设置viewName:

if (mv != null && !mv.hasView()) {
    mv.setViewName(getDefaultViewName(request));
}

  

8. initViewResolvers 视图解析器

ViewResolvers是一个List<ViewResolver>类型数据,视图解析是链式的,如果一个视图解析器根据viewName和local参数没有找到对应的View,则开始使用第二的解析器来进行查询,直到找到为止。默认的ViewResolvers为InternalResourceViewResolver:

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

ViewResolver的作用就是通过解析viewName返回一个View对象:

public interface ViewResolver {
    View resolveViewName(String viewName, Locale locale) throws Exception;
}

前文指出HandlerAdapter处理Handler请求,会返回一个视图对象ModelAndView。如果这个MdoelAndView Object类的View对象是String实例,则通过ViewResolver接口实现类的resolveViewName方法来转换为View类型,如果MdoelAndView Object类的View对象是Viwe实例,通过getter方法就可以获取View对象。

ModelAndView类的属性定义如下:

public class ModelAndView {
    // 两种设置方式,1:String类型  2:View类型。通过isReference()来区分
    // 如果view是String类型,则通过ViewResolver接口实现类的resolveViewName方法来转换为View类型
    private Object view;
    // LinkedHashMap<String, Object>类型
    private ModelMap model;
    private HttpStatus status;
    private boolean cleared = false;
    ...

}

获取到View对象之后,调用View的render方法进行页面渲染。

具体的过程如下:

当请求到达doDispatch后HandlerAdapte处理请求,返回一个MdoelAndView对象mv,然后调用:

this.processDispatchResult(processedRequest, response, mappedHandler, mv, (Exception)dispatchException);

该方法中主要调用render(mv, request, response),它会检查view是什么类型,如果是String类型,则通过ViewResolver接口实现类的resolveViewName方法来转换为View类型,总之最后要获取View实例对象, 调用View接口实现类的render方法,实现页面渲染:

public interface View {
    String RESPONSE_STATUS_ATTRIBUTE = View.class.getName() + ".responseStatus";
    String PATH_VARIABLES = View.class.getName() + ".pathVariables";
    String SELECTED_CONTENT_TYPE = View.class.getName() + ".selectedContentType";

    String getContentType();

    // @param model Map with name Strings as keys and corresponding model
    void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;
}

常用的View实现类有:

如果想看一个View渲染的具体流程可以参考《InternalResourceView源码分析(待写)》

ps:不同视图对应不同的视图解析器,如FreeMarkerView就需要FreeMarkerViewResolver来完成解析。

9. initFlashMapManager 重定向属性存储

官方文档中指出:FlashMapManager用于检索和保存FlashMap实例的策略界面

那FlashMap是什么呢?

看看官方文档描述:

/**
 * A FlashMap provides a way for one request to store attributes intended for
 * use in another. This is most commonly needed when redirecting from one URL
 * to another -- e.g. the Post/Redirect/Get pattern. A FlashMap is saved before
 * the redirect (typically in the session) and is made available after the
 * redirect and removed immediately.
 *
 * <p>A FlashMap can be set up with a request path and request parameters to
 * help identify the target request. Without this information, a FlashMap is
 * made available to the next request, which may or may not be the intended
 * recipient. On a redirect, the target URL is known and a FlashMap can be
 * updated with that information. This is done automatically when the
 * {@code org.springframework.web.servlet.view.RedirectView} is used.
 *
 * <p>Note: annotated controllers will usually not use FlashMap directly.
 * See {@code org.springframework.web.servlet.mvc.support.RedirectAttributes}
 * for an overview of using flash attributes in annotated controllers.
 *
 * @author Rossen Stoyanchev
 * @since 3.1
 * @see FlashMapManager
 */
@SuppressWarnings("serial")
public final class FlashMap extends HashMap<String, Object> implements Comparable<FlashMap> {
    ...
}

简单翻译:

FlashMap为一个请求提供了一种存储属性的功能,用于另一个请求中使用这些属性。这种方式通常在 一个URL重定向到另一个URL时最常需要 - 例如Post / Redirect / Get模式。FlashMap在重定向之前保存(通常在会话中),并在重定向后可用并立即删除。

可以使用请求路径和请求参数来设置FlashMap,以帮助识别目标请求。如果没有此信息,FlashMap将可用于下一个请求(该请求可能是也可能不是预期)。在一个重定向中,目标URL是已知的,可以使用该信息更新FlashMap,这个过程是自动完成的,它通过org.springframework.web.servlet.view.RedirectView完成此操作。

注意:带注释的控制器通常不会直接使用FlashMap。 有关在带注释的控制器中使用Flash属性的概述,请参阅org.springframework.web.servlet.mvc.support.RedirectAttributes。

通过上面的描述可知,FlashMap和FlashMapManager主要用于重定向数据保存。重定向就不得不提到RedirectView,RedirectView跳转时会将跳转之前的请求中的参数保存到FlashMap中,然后通过FlashManager保存起来:

//获取原请求所携带的数据
FlashMap flashMap = RequestContextUtils.getOutputFlashMap(request); 

//将数据保存起来,作为跳转之后请求的数据使用
flashMapManager.saveOutputFlashMap(flashMap, request, response);

当重定向的请求在浏览器中重定向之后会再次会被DispathcerServlet进行拦截,在DispatcherServlet的doService方法中,有一步会从FlashManager中获取保存的FlashMap中的值:

FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);

这样重定向的请求就可以使用以前的一些属性值了。

总结:

FlashMap简单来说就是一个HashMap,用于数据保存,主要作用于重定向,springMVC中默认的FlashMapManager为SessionFlashMapManager

org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

(全文完)

原文地址:https://www.cnblogs.com/chenjunjie12321/p/9357678.html

时间: 2024-10-05 03:09:37

springmvc DispatchServlet初始化九大加载策略(三)的相关文章

springmvc DispatchServlet初始化九大加载策略(一)

SpringMVC 容器初始化时, protected void onRefresh(ApplicationContext context) { this.initStrategies(context); } protected void initStrategies(ApplicationContext context) { this.initMultipartResolver(context); this.initLocaleResolver(context); this.initTheme

springmvc DispatchServlet初始化九大加载策略(二)

4. initHandlerMappings 请求分发 HandlerMappings是一个List<HandlerMapping>类型数据,也就是说初始化可以存放多种Mapping,和其他几种组件加载方式一样,如果用户没有在配置文件选择 HanderMapping则会到DispatcherServlet.properties文件获取: org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.

【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李志刚 导语 Http 缓存机制作为 web 性能优化的重要手段,对从事 Web 开发的小伙伴们来说是必须要掌握的知识,但最近我遇到了几个缓存头设置相关的题目,发现有好几道题答错了,有的甚至在知道了正确答案后依然不明白其原因,可谓相当的郁闷呢!!为了确认下是否只是自己理解不深,我特意请教了其他几位小伙

如何解决网站因图片过大加载慢的问题?

图片过大加载慢?而不是图片太多加载慢? 首先要尽可能的压缩,看用户的忍受程度.jpg 可以用很多方法压缩,png 推荐使用 TinyPNG 工具(不过正文图片,显然要选择 jpg 格式的). 然后 1,不太"在乎"用户体验的省事方法: 图片保存成渐进式的,加载会慢慢变清晰,而不是从上往下依次加载,然后放在 CDN,设置缓存之类. 2,比较"在乎"用户体验的高端方案: 判断用户的设备(主要用在移动端).网络等,分别加载不同质量的图片(例如高端 iPhone wifi

教你写Android ImageLoader框架之图片加载与加载策略

在教你写Android ImageLoader框架之初始配置与请求调度中,我们已经讲述了ImageLoader的请求配置与调度相关的设计与实现.今天我们就来深入了解图片的具体加载过程以及加载的策略(包括按顺序加载和逆序加载) ,在这其中我会分享我的一些设计决策,也欢迎大家给我提建议. 图片的加载 Loader与LoaderManager的实现 在上一篇文章教你写Android ImageLoader框架之初始配置与请求调度中,我们聊到了Loader与LoaderManager. ImageLoa

彻底弄懂 HTTP 缓存机制 —— 基于缓存策略三要素分解法

导语 Http 缓存机制作为 web 性能优化的重要手段,对从事 Web 开发的小伙伴们来说是必须要掌握的知识,但最近我遇到了几个缓存头设置相关的题目,发现有好几道题答错了,有的甚至在知道了正确答案后依然不明白其原因,可谓相当的郁闷呢!!为了确认下是否只是自己理解不深,我特意请教了其他几位小伙伴,发现情况也或多或少和我类似. 为了不给大家卖关子,下面我贴出2道题,大家可以尝试解答下: 以下为 page.html 内容: <!DOCTYPE html><html xmlns="h

cocos creator基础-(二十四)cc.Director与资源加载策略

1: 了解creator场景切换; 2: 了解director基本的一些接口; 3: 理解资源加载的策略; cc.Director对象 1:游戏里面控制管理整个游戏全局对象,包括了场景切换等,为cc.Director对象; 2:导演对象全局只有一个cc.director,大写的为类, 小写的cc.director为全局的导演对象; 3: cc.director来获取导演对象实例; 4: 游戏中各种管理对象都可以通过cc.director获取,比如物理引擎管理,Action管理, 碰撞检测管理等;

Solr4.8.0源码分析(22)之 SolrCloud的Recovery策略(三)

Solr4.8.0源码分析(22)之 SolrCloud的Recovery策略(三) 本文是SolrCloud的Recovery策略系列的第三篇文章,前面两篇主要介绍了Recovery的总体流程,以及PeerSync策略.本文以及后续的文章将重点介绍Replication策略.Replication策略不但可以在SolrCloud中起到leader到replica的数据同步,也可以在用多个单独的Solr来实现主从同步.本文先介绍在SolrCloud的leader到replica的数据同步,下一篇

SpringMVC轻松学习-注解的使用(三)

根据上一讲的例子,我们下面就注解的使用进行详细说明. 我们采用sprng MVC开发项目时,通常都会采用注解的方式,这样可以大大提高我们的开发效率.实现零配置.下面我们从零开始重新做一个spring MVC的配置.这个项目完全采用注解的方式开发.同时,我们以后的spring MVC项目也都会采用注解的方式. 修改web.xml,文件内容如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <?xml version=