数据传递--------博客-----------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操作,接下来我们介绍一下返回值的处理操作.同样返回值的操作操作也 ...
随机推荐
- 网页js粘贴截图
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- cogs——1001. [WZOI2011 S3] 消息传递
1001. [WZOI2011 S3] 消息传递 ★★ 输入文件:messagew.in 输出文件:messagew.out 简单对比时间限制:1 s 内存限制:128 MB Prob ...
- commons-lang常用工具类StringEscapeUtils
原文:https://my.oschina.net/mousai/blog/88832 在apache commons-lang(2.3以上版本)中为我们提供了一个方便做转义的工具类,主要是为了防止s ...
- Django学习系列之django restframework
曾几何时,Ajax已经统治了Web开发中的客户端,而REST成为web世界中最流行的架构风格(architecture style).所以我们的选择变得很简单:前端ajax访问后端的RESTful A ...
- android的ndk学习(1)
android的ndk学习(1) 之前学了一段时间ndk,总认为要总结一下.ndk使得很方便地实现java和C与C++代码的相互沟通.合理地掌握使用ndk能够提高应用程序的运行效率.所以对于学习a ...
- java之Map源代码浅析
Map是键值对.也是经常使用的数据结构. Map接口定义了map的基本行为.包含最核心的get和put操作,此接口的定义的方法见下图: JDK中有不同的的map实现,分别适用于不同的应用场景.如线程安 ...
- hdu 1565 方格取数(1)(状态压缩dp)
方格取数(1) Time Limit: 10000/5000 MS (J ...
- 【树形dp小练】HDU1520 HDU2196 HDU1561 HDU3534
[树形dp]就是在树上做的一些dp之类的递推,由于一般须要递归处理.因此平庸情况的处理可能须要理清思路.昨晚開始切了4题,作为入门训练.题目都很easy.可是似乎做起来都还口以- hdu1520 An ...
- 向海量用户发送数据哪家最强?上QDN下载LTE Broadcast SDK!
情境一: 在一个数万人的体育场内.作为一名观众你非常难看清运动员的面容.假设有了4G手机.你能够非常easy的打开直播应用.一边看直播讲解,一边体验现场气氛.但令人尴尬的是,现场几万人同一时候须要观看 ...
- 【C++&爬虫】C++实现网络爬虫&socket初级教程
2019年了,发现以前的很多教程都不能用了. 我自己写的socket发给服务器总是返回301错误——资源永久转移.很多教程都是这样,困扰了我很久. 终于我发现了一篇能用的爬虫代码,参考MSDN以及众多 ...