springmvc的InternalResourceViewResolver自我理解
它的作用是在Controller返回的时候进行解析视图
@RequestMapping("/advertising") public String advertising(Model model ) {
return "ta";
}
}
如上 ta就是查找到ta.jsp 然后往WEB-INF目录进行查找。而WEB-INF是对web来说是安全目录,是不能直接访问里面的资源的
这个是一个springmvc的视图解析器,通常是用来配置jsp的
<bean id="jsp" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="order" value="44" />
<property name="contentType" value="text/html"/>
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
但是我先除了配置jsp还想配置html的时候就会出现问题。
如:
我WEB-INF下面有ta.html和tas.jsp
<mvc:view-controller path="/" view-name="ta"/>//注意是以这个为重点
<mvc:annotation-driven />
<mvc:default-servlet-handler/>
<!-- 自动扫描(自动注入) -->
<context:component-scan base-package="com.wwzuizz.**.controller"/>
<mvc:resources mapping="/WEB-INF/**" location="/WEB-INF/"/>
<bean id="html" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="order" value="3344" />
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".html"/>
<property name="contentType" value="text/html"></property>
</bean>
<bean id="jsp" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="order" value="44" />
<property name="contentType" value="text/html"/>
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
进行如上配置的时候,根据优先级它会先取jsp,然后在html。可是发现它只是检查一次而已,如如果是jsp的order比较低,则只会解析jsp,如果找不到就直接异常了。
如果是html的order比较低,则只会解析html,如果找不到也会直接报异常。
我想要的效果是优先解析jsp,找不到再解析htnl。
查看源码UrlBasedViewResolver(InternalResourceViewResolver的父类)
protected View loadView(String viewName, Locale locale) throws Exception {
AbstractUrlBasedView view = this.buildView(viewName);
View result = this.applyLifecycleMethods(viewName, view);
return view.checkResource(locale)?result:null;
}
发现这个方法,AbstractUrlBasedView.checkResource()是永远返回true的,也就是如果找不到,也会返回一个result,但是这个result是找不到的。
public boolean checkResource(Locale locale) throws Exception {
return true;
}
为此只需要重写AbstractUrlBasedView这个类
<mvc:view-controller path="/" view-name="ta"/>
<mvc:annotation-driven />
<mvc:default-servlet-handler/>
<!-- 自动扫描(自动注入) -->
<context:component-scan base-package="com.wwzuizz.**.controller"/>
<mvc:resources mapping="/WEB-INF/**" location="/WEB-INF/"/>
<bean id="html" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="order" value="3344" />
<property name="viewClass" value="com.wwzuizz.common.DefaultJstlView"/>
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".html"/>
<property name="contentType" value="text/html"></property>
</bean>
<bean id="jsp" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="order" value="44" />
<property name="viewClass" value="com.wwzuizz.common.DefaultJstlView"/>
<property name="contentType" value="text/html"/>
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
com.wwzuizz.common.DefaultJstlView
public class DefaultJstlView extends JstlView { @Override
public boolean checkResource(Locale locale) throws Exception {
File file = new File(this.getServletContext().getRealPath("/") + getUrl());
return file.exists();//判断该jsp页面是否存在
}
}
这样子如果不存在就传递给下一个InternalResourceViewResolve;其实我很好奇order是在哪里实现的代码,我带入tomcat源码页也不到是哪里的
这样子就可以做到
<mvc:view-controller path="/" view-name="ta"/>
ta如果jsp解析不到,就作为html解析
@Nullable
protected View resolveViewName(String viewName, @Nullable Map<String, Object> model,
Locale locale, HttpServletRequest request) throws Exception { if (this.viewResolvers != null) {
for (ViewResolver viewResolver : this.viewResolvers) {
View view = viewResolver.resolveViewName(viewName, locale);
if (view != null) {
return view;
}
}
}
return null;
}
补充:
org.springframework.web.servlet.DispatcherServlet
如下视图解析的时候会for的去找 所以如果不为空就直接返回
- <mvc:view-controller path="/" view-name="ta"/>
ta如果jsp解析不到,就作为html解析
补充:
org.springframework.web.servlet.DispatcherServlet
如下视图解析的时候会for的去找 所以如果不为空就直接返回
- @Nullable
- protected View resolveViewName(String viewName, @Nullable Map<String, Object> model,
- Locale locale, HttpServletRequest request) throws Exception {
- if (this.viewResolvers != null) {
- for (ViewResolver viewResolver : this.viewResolvers) {
- View view = viewResolver.resolveViewName(viewName, locale);
- if (view != null) {
- return view;
- }
- }
- }
- return null;
- }
springmvc的InternalResourceViewResolver自我理解的更多相关文章
- Thread线程join方法自我理解
Thread线程join方法自我理解 thread.join():等待thread线程运行终止,指的是main-thread(main线程)必须等待thread线程运行结束,才能继续thread.jo ...
- SpringMVC:学习笔记(1)——理解MVC及快速入门
SprigMVC-理解MVC及快速入门 说明: 传统MVC-->JSPModel2-->Front Controller + Application Controller + Page C ...
- Spring SpringMVC myBatis(简称SSM)理解
1对Spring的理解 (1)spring是什么? spring是Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架. (2)spring的作用 (a)spring ...
- 面试高频题:说一说对Spring和SpringMvc父子容器的理解?
引言 以前写了几篇关于SpringBoot的文章<面试高频题:springBoot自动装配的原理你能说出来吗>.<保姆级教程,手把手教你实现一个SpringBoot的starter& ...
- 关于C#的委托(delegate)的自我理解
首先描述一个事情,一个老师饿了,他要去买东西填饱肚子,然后他发现他的学生“小李”在玩,没学习,于是就委托“小李”去帮他买吃的. 根据这件事我们来分析: 首先得有个老师(老师饿了是他的方法,老师买东西也 ...
- 谈谈springMVC和Strut2的理解
关于struts2框架原理 执行流程 struts2框架的核心是一个过滤器,我们编写的action类都继承ActionSupport的接口(顶层是一个过滤器filter),用户发送请求,经过核心过滤器 ...
- android 的生命周期自我理解
android的active的生命周期,经过网站的blog学习,加上自己的理解总结如下: 第1种:全新的启动应用程序顺序 onCreate--->onStart---->onResume ...
- Java内部类的自我理解
本文借鉴网络上多位大牛的博客和文章.感谢各位不知名人士的分享. 一.什么事内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的成员,而且依附于外部类而存在的.内部类能够为静态,可用p ...
- 关于 String 自我理解
String 的一些认识: String对象是不可变,所以使用 final 修饰 字符串拼接,合理利用 StringBuilder(线程非安全),StringBuffer 线程安全 常用方法就不详细介 ...
随机推荐
- java 之word转html
jar包 链接: https://pan.baidu.com/s/13o2CZTwM-Igx6wcoyEu_ug 密码: n95q package com.bistu.service; import ...
- C# FTp 上传,下载
public class FtpHelper { string ftpServerIP; string ftpRemotePath; string ftpUserID; string ftpPassw ...
- C++ Primer Plus 6 笔记(3)
第5章 1.cout在显示bool值之前将它们转换为int,但cout.setf(ios:: boolalpha)函数调用设置了一个标记,该标记命令cout显示true和false,而不是1和0 2. ...
- chart 模板【转】
Helm 通过模板创建 Kubernetes 能够理解的 YAML 格式的资源配置文件,我们将通过例子来学习如何使用模板. 以 templates/secrets.yaml 为例: 从结构看,文件的内 ...
- 磁盘空间引起ES集群shard unassigned的处理过程
1.问题描述 早上醒来发现手机有很多ES状态为red的告警,集群就前几天加了几个每天有十多亿记录的业务,当时估算过磁盘容量,应该是没有问题的,但是现在集群状态突然变成red了,这就有点懵逼了. 2.查 ...
- Python 常用的标准库以及第三方库有哪些?
作者:史豹链接:https://www.zhihu.com/question/20501628/answer/223340838来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- hadoop安装文档
一.准备 该准备工作在三台机器上都需要进行,首先使用 vmvare 创建 1 个虚拟机,这台虚拟机是 master,一会需要把 master 克隆出两台 slave 点确定然后开启此虚拟机 然后添加/ ...
- 十、Vue:Vuex实现data(){}内数据多个组件间共享
一.概述 官方文档:https://vuex.vuejs.org/zh/installation.html 1.1vuex有什么用 Vuex:实现data(){}内数据多个组件间共享一种解决方案(类似 ...
- NO11 SSH故障排查思路和netstat命令
本章知识相关考试:1.企业场景面试题:Linux系统如何优化?2.企业场景面试题:SSH服务连不上,如何排查?记住回答技巧: 1 ping 2 telnet 客户端ssh工具:SecureCRT,x ...
- Window Server 2019 配置篇(3)- 建立hyper-v集群并在其上运行win10 pro虚拟机
上次讲到我们的域里有了网关跟DHCP,这次我们要在域中建立hyper-v集群并在其上运行win10 pro虚拟机 那么什么是hyper-v集群呢? 就是两个及两个以上的运行hyper-v服务的服务器建 ...