springmvc的InternalResourceViewResolver自我理解

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

from:https://blog.csdn.net/wwzuizz/article/details/78268007

org.springframework.web.servlet.view.InternalResourceViewResolver

他的作用是在Controller返回的时候进行解析视图

prefix 这个表示目录
suffix 这个表示后缀
 
  1. @RequestMapping("/advertising")

  2. public String advertising(Model model ) {

  3. return "ta";

  4. }

  5. }

如上 ta就是查找到ta.jsp 然后往WEB-INF目录进行查找。而WEB-INF是对web来说是安全目录,是不能直接访问里面的资源的
 

这个是一个springmvc的视图解析器

通常是用来配置jsp的

 
  1. <bean id="jsp" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >

  2. <property name="order" value="44" />

  3. <property name="contentType" value="text/html"/>

  4. <property name="prefix" value="/WEB-INF/"/>

  5. <property name="suffix" value=".jsp"/>

  6. </bean>


但是我先除了配置jsp还想配置html的时候就会出现问题。

如:

我WEB-INF下面有ta.html和tas.jsp

 
  1. <mvc:view-controller path="/" view-name="ta"/>//注意是以这个为重点

  2. <mvc:annotation-driven />

  3. <mvc:default-servlet-handler/>

  4. <!-- 自动扫描(自动注入) -->

  5. <context:component-scan base-package="com.wwzuizz.**.controller"/>

  6. <mvc:resources mapping="/WEB-INF/**" location="/WEB-INF/"/>

  7. <bean id="html" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >

  8. <property name="order" value="3344" />

  9. <property name="prefix" value="/WEB-INF/"></property>

  10. <property name="suffix" value=".html"/>

  11. <property name="contentType" value="text/html"></property>

  12. </bean>

  13. <bean id="jsp" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >

  14. <property name="order" value="44" />

  15. <property name="contentType" value="text/html"/>

  16. <property name="prefix" value="/WEB-INF/"/>

  17. <property name="suffix" value=".jsp"/>

  18. </bean>


进行如上配置的时候,根据优先级它会先取jsp,然后在html。可是发现它只是检查一次而已,如如果是jsp的order比较低,则只会解析jsp,如果找不到就直接异常了。

如果是html的order比较低,则只会解析html,如果找不到也会直接报异常。

我想要的效果是优先解析jsp,找不到再解析htnl。

查看源码UrlBasedViewResolver(InternalResourceViewResolver的父类)

 
  1. protected View loadView(String viewName, Locale locale) throws Exception {

  2. AbstractUrlBasedView view = this.buildView(viewName);

  3. View result = this.applyLifecycleMethods(viewName, view);

  4. return view.checkResource(locale)?result:null;

  5. }


发现这个方法,AbstractUrlBasedView.checkResource()是永远返回true的,也就是如果找不到,也会返回一个result,但是这个result是找不到的。

 
  1. public boolean checkResource(Locale locale) throws Exception {

  2. return true;

  3. }


为此只需要重写AbstractUrlBasedView这个类

 
  1. <mvc:view-controller path="/" view-name="ta"/>

  2. <mvc:annotation-driven />

  3. <mvc:default-servlet-handler/>

  4. <!-- 自动扫描(自动注入) -->

  5. <context:component-scan base-package="com.wwzuizz.**.controller"/>

  6. <mvc:resources mapping="/WEB-INF/**" location="/WEB-INF/"/>

  7. <bean id="html" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >

  8. <property name="order" value="3344" />

  9. <property name="viewClass" value="com.wwzuizz.common.DefaultJstlView"/>

  10. <property name="prefix" value="/WEB-INF/"></property>

  11. <property name="suffix" value=".html"/>

  12. <property name="contentType" value="text/html"></property>

  13. </bean>

  14. <bean id="jsp" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >

  15. <property name="order" value="44" />

  16. <property name="viewClass" value="com.wwzuizz.common.DefaultJstlView"/>

  17. <property name="contentType" value="text/html"/>

  18. <property name="prefix" value="/WEB-INF/"/>

  19. <property name="suffix" value=".jsp"/>

  20. </bean>

com.wwzuizz.common.DefaultJstlView

 
  1. public class DefaultJstlView extends JstlView {

  2. @Override

  3. public boolean checkResource(Locale locale) throws Exception {

  4. File file = new File(this.getServletContext().getRealPath("/") + getUrl());

  5. return file.exists();//判断该jsp页面是否存在

  6. }

  7. }


这样子如果不存在就传递给下一个InternalResourceViewResolve;其实我很好奇order是在哪里实现的代码,我带入tomcat源码页找不到是哪里的

这样子就可以做到

<mvc:view-controller path="/" view-name="ta"/>

ta如果jsp解析不到,就作为html解析

补充:

org.springframework.web.servlet.DispatcherServlet

如下视图解析的时候会for的去找 所以如果不为空就直接返回

 
  1. @Nullable

  2. protected View resolveViewName(String viewName, @Nullable Map<String, Object> model,

  3. Locale locale, HttpServletRequest request) throws Exception {

  4. if (this.viewResolvers != null) {

  5. for (ViewResolver viewResolver : this.viewResolvers) {

  6. View view = viewResolver.resolveViewName(viewName, locale);

  7. if (view != null) {

  8. return view;

  9. }

  10. }

  11. }

  12. return null;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值