数据传递--------博客-----------springMVC源码分析--RequestToViewNameTranslator请求到视图名称的转换
参考来源:http://blog.csdn.net/qq924862077/article/details/54286976?utm_source=gold_browser_extension
RequestToViewNameTranslator可以在处理器返回的View为空时使用它根据Request获取viewName。RequestToViewNameTranslator提供的实现类只有一个DefaultRequestToViewNameTranslator。
接口RequestToViewNameTranslator中定义的如下:提供了getViewName抽象方法,其实就是根据request请求获取来组装视图名称。
- public interface RequestToViewNameTranslator {
- /**
- * Translate the given {@link HttpServletRequest} into a view name.
- * @param request the incoming {@link HttpServletRequest} providing
- * the context from which a view name is to be resolved
- * @return the view name (or {@code null} if no default found)
- * @throws Exception if view name translation fails
- */
- String getViewName(HttpServletRequest request) throws Exception;
- }
其实现类DefaultRequestToViewNameTranslator中的实现如下:其实其简单实现就是将请求名称作为视图名称返回,逻辑还是比较简单的。
- @Override
- public String getViewName(HttpServletRequest request) {
- String lookupPath = this.urlPathHelper.getLookupPathForRequest(request);
- return (this.prefix + transformPath(lookupPath) + this.suffix);
- }
接下来我们看看RequestToViewNameTranslator在springMVC中的具体运行流程:
首先在DispatcherServlet的doDispatch函数中会设置默认的视图名
- protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
- ......
- //设置默认的视图名称
- applyDefaultViewName(processedRequest, mv);
- ......
- }
在applyDefaultViewName中会判断ModelAndView的hasView为空时,就设置viewName
- private void applyDefaultViewName(HttpServletRequest request, ModelAndView mv) throws Exception {
- if (mv != null && !mv.hasView()) {
- mv.setViewName(getDefaultViewName(request));
- }
- }
getDefaultViewName的实现逻辑还是在ViewNameTranslator中。
- protected String getDefaultViewName(HttpServletRequest request) throws Exception {
- return this.viewNameTranslator.getViewName(request);
- }
在DefaultViewNameTranslator中实现的getViewName的逻辑如下,其实就是将请求路径作为ViewName
- @Override
- public String getViewName(HttpServletRequest request) {
- String lookupPath = this.urlPathHelper.getLookupPathForRequest(request);
- return (this.prefix + transformPath(lookupPath) + this.suffix);
- }
实现类DefaultViewNameTranslator的完整源码如下:
- public class DefaultRequestToViewNameTranslator implements RequestToViewNameTranslator {
- private static final String SLASH = "/";
- private String prefix = "";
- private String suffix = "";
- private String separator = SLASH;
- private boolean stripLeadingSlash = true;
- private boolean stripTrailingSlash = true;
- private boolean stripExtension = true;
- private UrlPathHelper urlPathHelper = new UrlPathHelper();
- public void setPrefix(String prefix) {
- this.prefix = (prefix != null ? prefix : "");
- }
- public void setSuffix(String suffix) {
- this.suffix = (suffix != null ? suffix : "");
- }
- public void setSeparator(String separator) {
- this.separator = separator;
- }
- public void setStripLeadingSlash(boolean stripLeadingSlash) {
- this.stripLeadingSlash = stripLeadingSlash;
- }
- public void setStripTrailingSlash(boolean stripTrailingSlash) {
- this.stripTrailingSlash = stripTrailingSlash;
- }
- public void setStripExtension(boolean stripExtension) {
- this.stripExtension = stripExtension;
- }
- public void setAlwaysUseFullPath(boolean alwaysUseFullPath) {
- this.urlPathHelper.setAlwaysUseFullPath(alwaysUseFullPath);
- }
- public void setUrlDecode(boolean urlDecode) {
- this.urlPathHelper.setUrlDecode(urlDecode);
- }
- public void setRemoveSemicolonContent(boolean removeSemicolonContent) {
- this.urlPathHelper.setRemoveSemicolonContent(removeSemicolonContent);
- }
- public void setUrlPathHelper(UrlPathHelper urlPathHelper) {
- Assert.notNull(urlPathHelper, "UrlPathHelper must not be null");
- this.urlPathHelper = urlPathHelper;
- }
- //根据请求获取视图名称
- @Override
- public String getViewName(HttpServletRequest request) {
- String lookupPath = this.urlPathHelper.getLookupPathForRequest(request);
- return (this.prefix + transformPath(lookupPath) + this.suffix);
- }
- protected String transformPath(String lookupPath) {
- String path = lookupPath;
- if (this.stripLeadingSlash && path.startsWith(SLASH)) {
- path = path.substring(1);
- }
- if (this.stripTrailingSlash && path.endsWith(SLASH)) {
- path = path.substring(0, path.length() - 1);
- }
- if (this.stripExtension) {
- path = StringUtils.stripFilenameExtension(path);
- }
- if (!SLASH.equals(this.separator)) {
- path = StringUtils.replace(path, SLASH, this.separator);
- }
- return path;
- }
- }
数据传递--------博客-----------springMVC源码分析--RequestToViewNameTranslator请求到视图名称的转换的更多相关文章
- springMVC源码分析--RequestToViewNameTranslator请求到视图名称的转换
RequestToViewNameTranslator可以在处理器返回的View为空时使用它根据Request获取viewName.RequestToViewNameTranslator提供的实现类只 ...
- springMVC源码分析--DispatcherServlet请求获取及处理
在之前的博客springMVC源码分析--容器初始化(二)DispatcherServlet中我们介绍过DispatcherServlet,是在容器初始化过程中出现的,我们之前也说过Dispatche ...
- springMVC源码分析--访问请求执行ServletInvocableHandlerMethod和InvocableHandlerMethod
在之前一篇博客中springMVC源码分析--RequestMappingHandlerAdapter(五)我们已经简单的介绍到具体请求访问的执行某个Controller中的方法是在RequestMa ...
- springMVC源码分析--FlashMap和FlashMapManager重定向数据保存
在上一篇博客springMVC源码分析--页面跳转RedirectView(三)中我们看到了在RedirectView跳转时会将跳转之前的请求中的参数保存到fFlashMap中,然后通过FlashMa ...
- springMVC源码分析--HandlerInterceptor拦截器调用过程(二)
在上一篇博客springMVC源码分析--HandlerInterceptor拦截器(一)中我们介绍了HandlerInterceptor拦截器相关的内容,了解到了HandlerInterceptor ...
- springMVC源码分析--页面跳转RedirectView(三)
之前两篇博客springMVC源码分析--视图View(一)和springMVC源码分析--视图AbstractView和InternalResourceView(二)中我们已经简单的介绍了View相 ...
- springMVC源码分析--视图AbstractView和InternalResourceView(二)
上一篇博客springMVC源码分析--视图View(一)中我们介绍了简单介绍了View的结构实现及运行流程,接下来我们介绍一下View的实现类做的处理操作. AbstractView实现了rende ...
- springMVC源码分析--视图View(一)
之前的博客springMVC源码分析--HttpMessageConverter数据转化(一)中我们已经介绍了数据返回值的处理,在博客springMVC源码分析--ViewResolver视图解析器( ...
- springMVC源码分析--HttpMessageConverter写write操作(三)
上一篇博客springMVC源码分析--HttpMessageConverter参数read操作中我们已经简单介绍了参数值转换的read操作,接下来我们介绍一下返回值的处理操作.同样返回值的操作操作也 ...
随机推荐
- mysql计算两个日期之间的天数
MYSQL自带函数计算给定的两个日期的间隔天数 有两个途径可获得 1.利用TO_DAYS函数 select to_days(now()) - to_days('20120512') 2 ...
- seajs入门使用
使用 Sea.js 进行模块化开发还能够带来非常多优点: 模块的版本号管理. 通过别名等配置,配合构建工具,能够比較轻松地实现模块的版本号管理. 提高可维护性.模块化能够让每一个文件的职责单一,很有利 ...
- 踩坑录-利用Apche-POI.XSSFWorkbook.write,处理excel文件,通过response.outputstram下载文件,预览乱码。
问题概要 利用Apche-POI.XSSFWorkbook.write,处理excel文件,通过response.outputstram导出文件,预览乱码. 解决办法 1.检查设置response,代 ...
- day4-hdfs的核心工作原理\写数据流程 \读数据流程
namenode元数据管理要点 1.什么是元数据? hdfs的目录结构及每一个文件的块信息(块的id,块的副本数量,块的存放位置<datanode>) 2.元数据由谁负责管理? namen ...
- python uzip
import zipfile import osdef un_zip(file_name): """unzip zip file""" zi ...
- Java:String和Date、Timestamp之间的转换【转】
原文地址:http://yunnick.iteye.com/blog/1074495 一.String与Date(java.util.Date)互转 1.1 String -> Date Str ...
- 使用MyBatis Generator自动生成MyBatis的代码
这两天需要用到MyBatis的代码自动生成的功能,由于MyBatis属于一种半自动的ORM框架,所以主要的工作就是配置Mapping映射文件,但是由于手写映射文件很容易出错,所以可利用MyBatis生 ...
- XMU 1125 越野车大赛 【三分】
1125: 越野车大赛 Time Limit: 500 MS Memory Limit: 64 MB Special JudgeSubmit: 8 Solved: 4[Submit][Statu ...
- 【HDU2037】今年暑假不AC
http://acm.hdu.edu.cn/showproblem.php?pid=2037 “今年暑假不AC?”“是的.”“那你干什么呢?”“看世界杯呀,笨蛋!”“@#$%^&*%...” ...
- 分布式消息中间件Rabbit Mq的了解与使用
MQ(消息队列)作为现代比较流行的技术,在互联网应用平台中作为中间件,主要解决了应用解耦.异步通信.流量削锋.服务总线等问题,为实现高并发.高可用.高伸缩的企业应用提供了条件. 目前市面比较流行的消息 ...