参考来源: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. [bzoj1188][HNOI2007]分裂游戏_博弈论

    分裂游戏 bzoj-1188 HNOI-2007 题目大意:题目链接. 注释:略. 想法: 我们发现如果一个瓶子内的小球个数是奇数才是有效的. 所以我们就可以将问题变成了一个瓶子里最多只有一个球球. ...

  2. Mysql五大引擎之间的区别和优劣之分

    数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和HEAP.另 ...

  3. Cisco网络设备命名规则

      1. CISCO 开头的产品都是路由器:2. RSP 开头的都是CISCO7500 系列产品的引擎:3. VIP 开头的产品都是CISCO 7500系列产品的多功能接口处理器模块:4. PA 开头 ...

  4. neutron dhcp

    neutron dhcp 采用dnsmasq服务来实现.和传统的 dhcp 一样, dhcp请求也分为4步 The client sends a discover ("I'm a clien ...

  5. Installation error: INSTALL_FAILED_VERSION_DOWNGRADE Android

    我们在安装新的 APk 的时候.会出现 Installation error: INSTALL_FAILED_VERSION_DOWNGRADE 原因:  是由于 androidversionCode ...

  6. Redis学习笔记3-Redis5个可运行程序命令的使用

    在redis安装文章中,说到安装好redis后,在/usr/local/bin下有5个关于redis的可运行程序.以下关于这5个可运行程序命令的具体说明. redis-server Redisserv ...

  7. linux一些硬件详情查看的高级方法(网卡,内存,硬盘,cpu)

    网卡-lspci内存大小和个数—— dmidecode|grep -A16 "Memory Device$"查看硬盘型号——smartctl -a /dev/sda查看硬盘大小—— ...

  8. Eclipse插件开发中的选择监听机制(Selection Provider-Listener)

    Eclipse插件开发中的选择监听机制(Selection Provider-Listener) 监听机制是eclipse插件开发或rcp应用开发中经常使用的技术,比方点击TableViewer或Tr ...

  9. TypeError: db.addUser is not a function : @(shell):1:1 ——mongoDB创建新用户名密码的方法

    不多说,旧版本使用 db.addUser("root","root") 新版本使用这句会出现这个错误提示 TypeError: db.addUser is no ...

  10. Cannot change version of project facet Dynamic Web Module to 3.1 (Eclipse Maven唯一解决方式)

    If you want to use version 3.1 you need to use the following schema: http://xmlns.jcp.org/xml/ns/jav ...