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

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>

相关推荐

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

    在Spring MVC框架中,视图和视图解析器是实现MVC模式中“V”(View)部分的关键组件。它们负责将处理完的数据转化为用户可以理解的格式,并展示在浏览器上。视图解析器则是连接控制器与视图的桥梁,它负责根据返回的...

    SpringMVC自定义多视图

    自定义多视图的核心在于视图解析器(ViewResolver)。Spring MVC默认提供了一些视图解析器,如InternalResourceViewResolver用于处理JSP视图,而JsonViewResolver可以处理JSON响应。但为了实现自定义多视图,我们...

    SpringMVC及视图解析器

    9. @ResponseBody:表示修饰所有添加 RequestMapping 注解的方法,一旦加了这个注解,表示返回值不会交给视图解析器解析,而是直接返回数据 三、视图解析器 视图解析器是 SpringMVC 中的一个核心组件,用于将 ...

    SpringMVC-5 视图和视图解析器

    在Spring MVC框架中,视图和视图解析器是核心组件,它们负责处理控制器返回的数据并将其呈现给用户。本文将深入探讨视图与视图解析器的工作原理、常用实现及自定义视图的实现方法,同时也会讲解重定向操作。 1. **...

    springMVC 多视图配置(Jsp Freemarket Json)实例

    在这个"springMVC 多视图配置(Jsp Freemarket Json)实例"中,我们将探讨如何在 SpringMVC 中设置多种视图解析器来支持 Jsp、FreeMarker 和 Json 格式的响应。 **1. 视图解析器 (View Resolver)** 在 SpringMVC ...

    springmvc 3.1 多视图

    在Spring MVC中,视图解析器是连接控制器和实际视图的关键组件。3.1版本中,你可以配置不同的视图解析器来处理不同类型的视图。例如,对于JSP,我们可以使用InternalResourceViewResolver,而对于FreeMarker,我们...

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

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

    (代码)SpringMVC第8讲:多视图支持

    在实际应用中,我们可能会有多个视图解析器,以支持不同的视图技术。例如,可以同时配置JSTL视图解析器和Thymeleaf视图解析器。SpringMVC会按照配置的顺序尝试这些解析器,直到找到一个能成功解析视图名的解析器。 ...

    SpringMVC 使用JSON、XML视图

    然后,在`dispatcher.xml`(SpringMVC的配置文件)中,我们需要配置视图解析器,比如`InternalResourceViewResolver`,以处理视图的解析工作。视图解析器的配置中通常包含前缀和后缀,这样视图名称会被解析为完整的...

    velocity jsp多视图解析器整合

    本话题将详细讲解如何在Spring MVC框架中整合Velocity和JSP,实现多视图解析器的功能,从而根据需求返回不同的视图。 **1. Velocity模板引擎** Velocity是一个开源的Java模板引擎,它允许开发者将业务逻辑与展示...

    SpringMVC第8讲:多视图支持

    SpringMVC提供了一个名为ViewResolver的接口,它是视图解析器,用于根据逻辑视图名查找实际的视图对象。 SpringMVC默认支持JSP视图解析,通过InternalResourceViewResolver实现。配置时,我们可以设置前缀和后缀,...

    springmvc视图解析流程代码实例

    2. 视图解析器解析视图名称:视图解析器将视图名称转换为Physic视图对象。 3. 视图对象渲染模型数据:视图对象将模型数据渲染到视图模板中。 4. 视图对象返回渲染结果:视图对象将渲染结果返回给浏览器。 在上面的...

    SSM笔记-SpringMVC自定义视图及重定向视图、语言国际化

    自定义视图解析器可以控制视图如何被创建和渲染,从而满足项目中复杂多变的视图需求。 接着,我们来看重定向视图。在SpringMVC中,当需要将请求从一个处理方法重定向到另一个URL时,可以使用`RedirectView`。例如,...

    SpringMVC+运行流程解析

    7. **视图解析器 ViewResolver**:DispatcherServlet接收到ModelAndView后,使用视图解析器来确定实际的视图。视图解析器会根据视图名查找对应的视图模板(例如JSP、Thymeleaf等)。 8. **渲染视图**:最后,...

    springmvc基础.docx

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

    SpringMVC-Helloworld

    该方法返回一个字符串,这个字符串被视图解析器解析为视图名称。 4. **注解驱动**:SpringMVC支持使用注解来简化配置,例如`@Controller`、`@RequestMapping`、`@GetMapping`、`@PostMapping`等。这些注解可以将...

    springmvc_day02

    在“springmvc_day02”的主题下,我们将深入探讨视图解析器(View Resolver)这一核心组件,它在Spring MVC中扮演着至关重要的角色,简化了控制器(Controller)中的视图逻辑。 视图解析器的主要任务是将逻辑视图名...

    springMVC练手代码

    2. **配置文件**:SpringMVC的配置通常在XML文件(如`servlet-context.xml`)中进行,包括视图解析器、模型-视图映射、拦截器、以及bean的定义。这些配置会指导SpringMVC如何处理请求和响应。 3. **模型(Model)**:...

    springMVC配置好的环境

    9. **视图解析器**:视图解析器负责将控制器返回的逻辑视图名转换为实际的视图资源。例如,可以配置为以 `.jsp` 结尾的文件路径。 10. **MVC 注解**:Spring MVC 提供了丰富的注解,如 @Controller、@...

    SpringMvc主要流程源码解析(1).zip

    在 SpringMvc 主要流程源码解析(1).vep 文件中,可能详细分析了以上各个步骤的源码实现,包括 DispatcherServlet、HandlerMapping、Controller、HandlerAdapter、DataBinder、ViewResolver 和 View 的工作原理。...

Global site tag (gtag.js) - Google Analytics