数据传递--------博客-----------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操作,接下来我们介绍一下返回值的处理操作.同样返回值的操作操作也 ...
随机推荐
- 2015山东信息学夏令营 Day4T3 生产
2015山东信息学夏令营 Day4T3 生产 [题目描述] 工厂为了生产一种复杂的产品,给各个生产部门制定了详细的生产计划.那么,就经常会有生产部门要把产品送到另一个生产部门作为原料.这是一个注重产品 ...
- linux 常见名词及命令(五)
计划任务服务之一次性任务: at <时间> 安排一次性任务 atq 或at -l 查看任务列表 at -c 序号 预览任务与设置环境 atrm 序号 删除任务 安排任务示例: 在23:30 ...
- android中后一个activity传值给前一个activity的实现
前一个activity跳转到后一个activity设置code: Intent intent=new Intent(MainActivity.this,ActivityTwo.class); star ...
- P2910 [USACO08OPEN]寻宝之路Clear And Present Danger 洛谷
https://www.luogu.org/problem/show?pid=2910 题目描述 Farmer John is on a boat seeking fabled treasure on ...
- IOS程序崩溃报告管理解决方案(Crashlytics 在2014-09-24)
预研Crashlytics 在2014-09-241:实现原理在原理上,Crashlytics通过以下2步完成崩溃日志的上传和分析:(1)提供应用SDK,你需要在应用启动时调用其SDK来设置你的应用 ...
- Port forwarding with xinetd Ask
https://stackoverflow.com/questions/21716673/port-forwarding-with-xinetd --------------------------- ...
- 【剑指Offer学习】【面试题65:滑动窗体的最大值】
题目:给定一个数组和滑动窗体的大小,请找出全部滑动窗体里的最大值. 举例说明 比如,假设输入数组{2,3,4,2,6,2,5,1}及滑动窗体的大小.那么一共存在6个滑动窗体,它们的最大值分别为{4,4 ...
- HDUOJ Number Sequence 题目1005
/*Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- git 在一台机器上配置多个账户
前提: 必须知道怎样配置git账户,请參考git官方教程:https://help.github.com/articles/generating-ssh-keys 这个教程能教你怎样生成ssh-key ...
- MATLAB——matlab特殊符号表【转载】
链接来源: matlab特殊符号表 http://blog.sina.com.cn/s/blog_4a09187801014xg9.html Character Sequence Symbol Cha ...