参考来源:http://blog.csdn.net/qq924862077/article/details/54286976?utm_source=gold_browser_extension

RequestToViewNameTranslator可以在处理器返回的View为空时使用它根据Request获取viewName。RequestToViewNameTranslator提供的实现类只有一个DefaultRequestToViewNameTranslator。

接口RequestToViewNameTranslator中定义的如下:提供了getViewName抽象方法,其实就是根据request请求获取来组装视图名称。

  1. public interface RequestToViewNameTranslator {
  2. /**
  3. * Translate the given {@link HttpServletRequest} into a view name.
  4. * @param request the incoming {@link HttpServletRequest} providing
  5. * the context from which a view name is to be resolved
  6. * @return the view name (or {@code null} if no default found)
  7. * @throws Exception if view name translation fails
  8. */
  9. String getViewName(HttpServletRequest request) throws Exception;
  10. }

其实现类DefaultRequestToViewNameTranslator中的实现如下:其实其简单实现就是将请求名称作为视图名称返回,逻辑还是比较简单的。

  1. @Override
  2. public String getViewName(HttpServletRequest request) {
  3. String lookupPath = this.urlPathHelper.getLookupPathForRequest(request);
  4. return (this.prefix + transformPath(lookupPath) + this.suffix);
  5. }

接下来我们看看RequestToViewNameTranslator在springMVC中的具体运行流程:

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

  1. protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
  2. ......
  3. //设置默认的视图名称
  4. applyDefaultViewName(processedRequest, mv);
  5. ......
  6. }

在applyDefaultViewName中会判断ModelAndView的hasView为空时,就设置viewName

  1. private void applyDefaultViewName(HttpServletRequest request, ModelAndView mv) throws Exception {
  2. if (mv != null && !mv.hasView()) {
  3. mv.setViewName(getDefaultViewName(request));
  4. }
  5. }

getDefaultViewName的实现逻辑还是在ViewNameTranslator中。

  1. protected String getDefaultViewName(HttpServletRequest request) throws Exception {
  2. return this.viewNameTranslator.getViewName(request);
  3. }

在DefaultViewNameTranslator中实现的getViewName的逻辑如下,其实就是将请求路径作为ViewName

  1. @Override
  2. public String getViewName(HttpServletRequest request) {
  3. String lookupPath = this.urlPathHelper.getLookupPathForRequest(request);
  4. return (this.prefix + transformPath(lookupPath) + this.suffix);
  5. }

实现类DefaultViewNameTranslator的完整源码如下:

    1. public class DefaultRequestToViewNameTranslator implements RequestToViewNameTranslator {
    2. private static final String SLASH = "/";
    3. private String prefix = "";
    4. private String suffix = "";
    5. private String separator = SLASH;
    6. private boolean stripLeadingSlash = true;
    7. private boolean stripTrailingSlash = true;
    8. private boolean stripExtension = true;
    9. private UrlPathHelper urlPathHelper = new UrlPathHelper();
    10. public void setPrefix(String prefix) {
    11. this.prefix = (prefix != null ? prefix : "");
    12. }
    13. public void setSuffix(String suffix) {
    14. this.suffix = (suffix != null ? suffix : "");
    15. }
    16. public void setSeparator(String separator) {
    17. this.separator = separator;
    18. }
    19. public void setStripLeadingSlash(boolean stripLeadingSlash) {
    20. this.stripLeadingSlash = stripLeadingSlash;
    21. }
    22. public void setStripTrailingSlash(boolean stripTrailingSlash) {
    23. this.stripTrailingSlash = stripTrailingSlash;
    24. }
    25. public void setStripExtension(boolean stripExtension) {
    26. this.stripExtension = stripExtension;
    27. }
    28. public void setAlwaysUseFullPath(boolean alwaysUseFullPath) {
    29. this.urlPathHelper.setAlwaysUseFullPath(alwaysUseFullPath);
    30. }
    31. public void setUrlDecode(boolean urlDecode) {
    32. this.urlPathHelper.setUrlDecode(urlDecode);
    33. }
    34. public void setRemoveSemicolonContent(boolean removeSemicolonContent) {
    35. this.urlPathHelper.setRemoveSemicolonContent(removeSemicolonContent);
    36. }
    37. public void setUrlPathHelper(UrlPathHelper urlPathHelper) {
    38. Assert.notNull(urlPathHelper, "UrlPathHelper must not be null");
    39. this.urlPathHelper = urlPathHelper;
    40. }
    41. //根据请求获取视图名称
    42. @Override
    43. public String getViewName(HttpServletRequest request) {
    44. String lookupPath = this.urlPathHelper.getLookupPathForRequest(request);
    45. return (this.prefix + transformPath(lookupPath) + this.suffix);
    46. }
    47. protected String transformPath(String lookupPath) {
    48. String path = lookupPath;
    49. if (this.stripLeadingSlash && path.startsWith(SLASH)) {
    50. path = path.substring(1);
    51. }
    52. if (this.stripTrailingSlash && path.endsWith(SLASH)) {
    53. path = path.substring(0, path.length() - 1);
    54. }
    55. if (this.stripExtension) {
    56. path = StringUtils.stripFilenameExtension(path);
    57. }
    58. if (!SLASH.equals(this.separator)) {
    59. path = StringUtils.replace(path, SLASH, this.separator);
    60. }
    61. return path;
    62. }
    63. }

数据传递--------博客-----------springMVC源码分析--RequestToViewNameTranslator请求到视图名称的转换的更多相关文章

  1. springMVC源码分析--RequestToViewNameTranslator请求到视图名称的转换

    RequestToViewNameTranslator可以在处理器返回的View为空时使用它根据Request获取viewName.RequestToViewNameTranslator提供的实现类只 ...

  2. springMVC源码分析--DispatcherServlet请求获取及处理

    在之前的博客springMVC源码分析--容器初始化(二)DispatcherServlet中我们介绍过DispatcherServlet,是在容器初始化过程中出现的,我们之前也说过Dispatche ...

  3. springMVC源码分析--访问请求执行ServletInvocableHandlerMethod和InvocableHandlerMethod

    在之前一篇博客中springMVC源码分析--RequestMappingHandlerAdapter(五)我们已经简单的介绍到具体请求访问的执行某个Controller中的方法是在RequestMa ...

  4. springMVC源码分析--FlashMap和FlashMapManager重定向数据保存

    在上一篇博客springMVC源码分析--页面跳转RedirectView(三)中我们看到了在RedirectView跳转时会将跳转之前的请求中的参数保存到fFlashMap中,然后通过FlashMa ...

  5. springMVC源码分析--HandlerInterceptor拦截器调用过程(二)

    在上一篇博客springMVC源码分析--HandlerInterceptor拦截器(一)中我们介绍了HandlerInterceptor拦截器相关的内容,了解到了HandlerInterceptor ...

  6. springMVC源码分析--页面跳转RedirectView(三)

    之前两篇博客springMVC源码分析--视图View(一)和springMVC源码分析--视图AbstractView和InternalResourceView(二)中我们已经简单的介绍了View相 ...

  7. springMVC源码分析--视图AbstractView和InternalResourceView(二)

    上一篇博客springMVC源码分析--视图View(一)中我们介绍了简单介绍了View的结构实现及运行流程,接下来我们介绍一下View的实现类做的处理操作. AbstractView实现了rende ...

  8. springMVC源码分析--视图View(一)

    之前的博客springMVC源码分析--HttpMessageConverter数据转化(一)中我们已经介绍了数据返回值的处理,在博客springMVC源码分析--ViewResolver视图解析器( ...

  9. springMVC源码分析--HttpMessageConverter写write操作(三)

    上一篇博客springMVC源码分析--HttpMessageConverter参数read操作中我们已经简单介绍了参数值转换的read操作,接下来我们介绍一下返回值的处理操作.同样返回值的操作操作也 ...

随机推荐

  1. Linux下汇编语言学习笔记0 --- 前期准备工作

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  2. POJ 3686_The Windy's

    题意: N个工件要在M个工厂加工,一个工件必须在一个工厂做完,工厂一次只能处理一个工件.给定每个工件在每个工厂加工所需时间,求出每个工件加工结束的最小时间平均值. 分析: 工厂一次只能处理一个工件,那 ...

  3. Linux下搭建maven私服Nexus 3.2.1-01

    1. 私服介绍私服是指私有服务器,是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构建.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库:否则, ...

  4. laravel event

    事件监听 方法一: web.php Event::listen('eloquent.created: App\post',function(){ dump('A post was created'); ...

  5. CentOS 7最小安装后,手动连接网络

    时间:2015-12-12 00:53来源:blog.51cto.com 作者:XD 举报 点击:3679次 CentOS中最小安装,由于默认的网卡没有激活,所以无法连接到网络. 设置如下: sucd ...

  6. android仿qq空间、微信朋友圈图片展示

    废话不多说,先上效果图 由于近期须要做朋友圈功能,所以在此记录一下,事实上非常多人不明确的一点应该是在图片的排列上面吧,不规则的排列,事实上非常easy的.就是一个GridView.然而你xml光光写 ...

  7. Office 佳能MP259打印EXCEL线条歪曲,字迹模糊怎么办

    这大概是墨盒的缘故,判断方法很简单,随便找一个文档,点击打印,属性   在维护选项卡中把清洗和打印头对齐做一遍(一般字迹模糊可以通过清洗解决,线条歪曲可以通过打印头对齐解决),如果你打印的结果是纸张边 ...

  8. AES加密算法的C++实现

    摘要:作为新一代的加密标准,AES 旨在取代 DES(请看<DES加密算法的C++实现>),以适应当今分布式开放网络对数据加密安全性的要求.本文在分析了 AES 加密原理的基础上着重说明了 ...

  9. 【CERC2008】【BZOJ4319】Suffix reconstruction

    Description 话说练习后缀数组时,小C 刷遍 poj 后缀数组题. 各类字符串题闻之丧胆.就在准备对敌方武将发出连环杀时,对方一记无中生有,又一招顺 手牵羊.小C 程序中的原字符数组就被牵走 ...

  10. HDU3367 Pseudoforest 【并查集】+【贪心】

    Pseudoforest Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To ...