`
jinnianshilongnian
  • 浏览: 21434604 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2405078
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2997748
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5631488
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257577
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1593183
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248974
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5847568
Group-logo
跟我学Nginx+Lua开...
浏览量:698167
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:780468
社区版块
存档分类
最新评论

Springmvc中多视图解析器解析问题

 
阅读更多

最近被问到过几次关于springmvc多视图解析器解析的问题;总结一下。

 

1、问题:

假设我有两个jsp:

WEB-INF/html/a.jsp
WEB-INF/report/b.jsp

 

且我配置了视图解析器:

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:order="1">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="contentType" value="text/html"/>
        <property name="prefix" value="/WEB-INF/html/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:order="2">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="contentType" value="text/html"/>
        <property name="prefix" value="/WEB-INF/report/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

 

 

然后呢,我分别返回视图名为a和b;为什么a能找到,而b的时候是404;我配置了两个视图解析器,第一个找不到的话,第二个能找到啊?遇到过这个问题的朋友基本上会有类似的问题;

 

2、分析

此处我们使用了InternalResourceViewResolver,其有一个buildView方法,该方法一定会创建一个View;所以呢View永远不为null(即使该jsp不存在);问题就是出在这;因为我们使用这个的时候默认是使用servlet forward转发的,此时并不知道该jsp是否存在。

 

3、解决方案:

3.1、最简单的办法是使用其viewNames属性,来指定一个是否可以处理的规则;

<property name="viewNames" value="html*"/>
<property name="viewNames" value="report*"/>

 如上两个的意思是对html或report开头的视图名进行处理,比如返回的视图名为html/a 那么会交给viewNames为html*的那个解析器处理;支持的规则可以查看javadoc。

 

 

3.2、内容协商,根据请求时的MediaType来决定使用哪个View;比如根据不同的MediaType决定是JSON/XML/HTML展示时;可以搜索ContentNegotiatingViewResolver了解;

 

以上的方式对于请求的MediaType一样,且视图名没有规则时一点用没有。

 

3.3、如果仅有几个不同的视图需要特殊处理;可以考虑直接返回View对象进行处理;而直接不走ViewResolver;

 

3.4、如果以上都不满足;那只能自己实现自己相应的ViewResolver,可以覆盖两个方法进行处理:

3.4.1、覆盖UrlBasedViewResolver子类的canHandle;来决定哪些视图名不需要当前ViewResolver进行处理;自己可以得到prefix + suffix进行判断具体的视图页面是否存在,当然这个可能会存在性能问题;考虑做缓存。

 

 

7
3
分享到:
评论
2 楼 u010549818 2016-01-21  
<property name="viewNames" value="page*"/> 这个属性只能配置一个啊
1 楼 danyuyingxin1 2014-06-27  
我配置了这样为什么不行?
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
<property name="contentType" value="text/html"/>
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
<property name="viewNames" value="jsp*"/> 
<property name="viewNames" value="page*"/>
<!--
<property name="order" value="1"></property> -->
</bean>

相关推荐

    SpringMVC自定义多视图

    SpringMVC自定义多视图,多视图实现

    Spring MVC--5.视图和视图解析器

    Spring MVC--5.视图和视图解析器

    SpringMVC-5 视图和视图解析器

    理解视图和视图解析器的解析流程、使用常用的InternalResourceView和JstlView、实现自定义视图、实现重定向操作

    SpringMVC及视图解析器

    SpringMVC及视图解析器

    浅谈SpringMVC之视图解析器(ViewResolver)

    本篇文章主要介绍了浅谈SpringMVC之视图解析器(ViewResolver),具有一定的参考价值,有兴趣的可以了解一下

    velocity jsp多视图解析器整合

    整合velocity和jsp 通过不同视图解析器,返回不同视图

    springmvc基础.docx

    前端控制器、处理器映射器、处理器适配器、视图解析器 3. springmvc入门程序 目的:对前端控制器、处理器映射器、处理器适配器、视图解析器学习 非注解的处理器映射器、处理器适配器 注解的处理器映射器、处理器...

    springmvc入门程序(下载后你不会后悔的)

    前端控制器、处理器映射器、处理器适配器、视图解析器 springmvc入门程序 目的:对前端控制器、处理器映射器、处理器适配器、视图解析器学习 非注解的处理器映射器、处理器适配器 注解的处理器映射器、...

    springmvc第一天课堂笔记

    前端控制器、处理器映射器、处理器适配器、视图解析器 springmvc入门程序 目的:对前端控制器、处理器映射器、处理器适配器、视图解析器学习 非注解的处理器映射器、处理器适配器 注解的处理器映射器、...

    Spring SpringMVC 简单整合

    Spring SpringMVC 简单整合(初学者参考) demo项目对应地址说明 :...ViewResolver:通过扩展视图解析器,支持更多类型的视图解析,例如:jsp、freemarker、pdf、excel等。

    springmvc思维导图

    springmvc的概念、springmvc的运行原理(前端控制器、处理器映射器、处理器适配器、处理器、视图解析器)、同步请求的方式(ModelAndView、String、无返回值、默认的绑定值)、异步请求的注解、请求参数的封装(简单...

    springmvc开发资料

    8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。 9、 ViewReslover解析后返回具体View。 10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。 11、 DispatcherServlet...

    SpringMVC讲义大全.docx

    SpringMVC基本原理: 解释SpringMVC框架的工作原理,包括前端控制器、处理器映射器、处理器适配器、视图解析器等核心组件的作用。 控制器开发: 讲解如何编写控制器(Controller),处理用户请求,获取参数,调用...

    0325_SpringMVC.html

    HelloWorld细节: 一:运行流程; ... * 2)、来到tomcat服务器; * 3)、SpringMVC的前端控制器收到所有请求;...用视图解析器进行拼串得到完整的页面地址; * 8)、拿到页面地址,前端控制器帮我们转发到页面;

    springMVC教学视频详解(包括spring和mybatis的整合)

    此视频包含:springmvc入门教程(原理分析、环境搭建、前端控制器配置、Handler编写调试、非注解映射器和适配器、注解映射器和适配器、前端控制器源代码分析、视图解析器配置前缀和后缀);springmvc和mybatis整合;...

    SpringMVC4超权威教程

    1.SpringMVC 概述 2.SpringMVC 的 HelloWorld 3.使用 @RequestMapping 映射请求 ...视图和视图解析器 7.RESTful CRUD • 8.SpringMVC 表单标签 &处理静态资源 • 9.数据转换 & 数据格式化 & 数据校验

    springmvc demo

    应用控制器其实拆为处理器映射器(Handler Mapping)进行处理器管理和视图解析器(View Resolver)进行视图管理;页面控制器/动作/处理器为Controller接口(仅包含ModelAndView handleRequest(request, response) 方法)...

    SpringMvc源码

    应用控制器其实拆为处理器映射器(Handler Mapping)进行处理器管理和视图解析器(View Resolver)进行视图管理;页面控制器/动作/处理器为Controller接口(仅包含ModelAndView handleRequest(request, response) 方法)...

    springmvc的运行原理

    springmvc的工作原理:前端控制器如何在处理器映射器中查找handle,在处理器适配器中处理handle,并且返回modelandview,通过视图解析器进行解析

    SpringMVC项目:ALL

    JavaWeb框架——SpringMVC学习过程前端控制器、视图解析器@Controller@RequestMapping(value、method、params)获取请求参数域对象共享数据视图前缀RESTFul文件上传下载拦截器Interceptor异常处理Excepton

Global site tag (gtag.js) - Google Analytics