springMVC4(13)视图解析器分类详解

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: <div class="markdown_views"><p>在<a href="http://blog.csdn.net/qwe6112071/article/details/51044414"> 《springMVC4(7)模型视图方法源码综合分析》 </a>一文中,我们介绍了ModelAndView的用法,它会在控制层方法调用完毕后作为返回值返回,里面封装好了我们的业务

《springMVC4(7)模型视图方法源码综合分析》 一文中,我们介绍了ModelAndView的用法,它会在控制层方法调用完毕后作为返回值返回,里面封装好了我们的业务逻辑数据和视图对象或视图名
。下一步,视图对象往往会对模型进一步渲染,再由视图解析器进一步解析并向前端发出响应。在下面,我们详细介绍视图和视图解析器的各种分类。
在View接口中,定义了一个核心方法是:

void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;

它的作用主要是渲染模型数据,整合web资源,并以特定形式响应给客户,这些形式可以是复杂JSP页面,也可以是简单的json、xml字符串。
针对不同的响应形式,spring为我们设计了不同的View实现类:

这里写图片描述

针对不同的视图对象,我们使用不同的视图解析器来完成实例化工作。我们可以在Spring上下文配置多个视图解析器,并通过order属性来指定他们之间的解析优先级顺序,order 越小,对应的 ViewResolver 将有越高的解析视图的权利。当一个 ViewResolver 在进行视图解析后返回的 View 对象是 null 的话就表示该 ViewResolver 不能解析该视图,这时候就交给优先级更低的进行解析,直到解析工作完成,如果所有视图解析器都不能完成将解析,则会抛出异常。
类似于视图,Spring也为我们提供了众多的视图解析器实现类:
这里写图片描述

1. AbstractCachingViewResolver

这是一个抽象类,这种视图解析器会把它曾经解析过的视图保存起来,然后每次要解析视图的时候先从缓存里面找,如果找到了对应的视图就直接返回,如果没有就创建一个新的视图对象,然后把它放到一个用于缓存的 map 中,接着再把新建的视图返回。使用这种视图缓存的方式可以把解析视图的性能问题降到最低。

2. UrlBasedViewResolver

继承了AbstractCachingViewResolver ,通过prefix、suffix**拼接 URL** 的方式来解析视图,支持返回的视图名称中包含 redirect: 、forward等前缀进行重定向或转发。使用 UrlBasedViewResolver 的时候必须指定属性 viewClass ,表示解析成哪种视图,一般使用较多的就是 InternalResourceView ,利用它来展现 jsp ,但是当我们使用 JSTL 的时候我们必须使用 JstlView 。下面是一段 UrlBasedViewResolver 的实例定义:

<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
   <property name="prefix" value="/WEB-INF/" />
   <property name="suffix" value=".jsp" />
   <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView"/>
</bean>

3. InternalResourceViewResolver

它是 URLBasedViewResolver 的子类,所以 URLBasedViewResolver 支持的特性它都支持. InternalResourceViewResolver 会把返回的视图名称都解析为 InternalResourceView 对象, InternalResourceView 会把 Controller 处理器方法返回的模型属性都存放到对应的 request 属性中,然后通过 RequestDispatcher 在服务器端把请求 forword 重定向到目标 URL 。下面是一个配置实例:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       <property name="prefix" value="/WEB-INF/"/>
       <property name="suffix" value=".jsp"></property>
    </bean>

如果我们需要使用JstlView,则需指定vlewClass属性为JstlView。
在前面的测试实例中,我们一直在使用这种视图解析器,所以不再举例。

4. BeanNameViewResolver

根据它的名字,我们将视图在spring容器中注册为Bean,Bean的id即为视图名。在我们控制层返回视图时,BeanNameViewResolver会自动根据我们的试图名找到对应的视图Bean进行解析,下面我们看一个实例:

1. 配置视图解析器和视图

<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
   <property name="order" value="1"/><!-- 设置优先级最高,最先开始解析-->
</bean>

<bean id="hello" class="org.springframework.web.servlet.view.InternalResourceView">
   <property name="url" value="/WEB-INF/views/hello.jsp"/><!--访问对应的jsp文件-->
</bean>

2. 配置控制器

配置好视图和视图解析器后,我们可以在控制层通过如下方法访问视图:

@Controller
public class ViewController {
    @RequestMapping("view1")
    public String view1(){
        return "hello";//返回字符串直接为视图名称,解析器会找到名称对应的视图Bean解析视图
    }
}

我们在游览器访问view1即会跳转到对应的hello.jsp视图。

3. XmlViewResolver

它继承自 AbstractCachingViewResolver 抽象类,所以它也是支持视图缓存的。 XmlViewResolver 需要给定一个 xml 配置文件来定义视图的 bean 对象。在该文件中定义的每一个视图的 bean 对象都给定一个名字,然后 XmlViewResolver 将根据 Controller 处理器方法返回的逻辑视图名称到 XmlViewResolver 指定的配置文件中寻找对应名称的视图 bean 用于处理视图。该配置文件默认是 /WEB-INF/views.xml 文件,如果不使用默认值的时候可以在 XmlViewResolver 的 location 属性中指定它的位置。
这里需要明确的是,使用XmlViewResolver最终不一定需要输出xml视图
以下是使用 XmlViewResolver 的一个示例:

1. 在 SpringMVC 的配置文件中加入 XmlViewResolver 的 bean 定义。

使用 location 属性指定其配置文件所在的位置, order 属性指定当有多个 ViewResolver 的时候其处理视图的优先级。

<bean class="org.springframework.web.servlet.view.XmlViewResolver">
   <property name="location" value="/WEB-INF/views.xml"/>
   <property name="order" value="1"/>
</bean>

2. 在 XmlViewResolver 对应的配置文件中配置好所需要的视图定义。

在下面的代码中我们就配置了一个名为 hello 的 InternalResourceView ,其 url 属性为“ /index.jsp ”。

<bean id="hello" class="org.springframework.web.servlet.view.InternalResourceView">
   <property name="url" value="/WEB-UBF/view/hello.jsp"/>
</bean>

3. 配置web层控制器

@Controller
public class ViewController {
    @RequestMapping("view2")
    public String view2(){
        return "hello";//返回字符串直接为视图名称,解析器会找到名称对应的视图Bean解析视图
    }
}

类似于BeanNameViewResolver的实例,我们访问view2,XmlViewResolver会到/WEB-INF/views.xml中寻找相应id的视图完成解析。

5. ResourceBundleViewResolver

它继承自 AbstractCachingViewResolver ,但是它缓存的不是视图.和 XmlViewResolver 一样它也需要有一个配置文件定义逻辑视图名称和真正的 View 对象的对应关系,不同的是 ResourceBundleViewResolver 的配置文件是一个属性文件,而且必须是放在 classpath 路径下面的,默认情况下这个配置文件是在* classpath 根目录下的 views.properties 文件,如果不使用默认值的话,则可以通过属性 baseName 或 baseNames 来指定*。 baseName 只是指定一个基名称, Spring 会在指定的 classpath 根目录下寻找以指定的 baseName 开始的属性文件进行 View 解析,如指定的 baseName 是 base ,那么 base.properties 、 baseabc.properties 等等以 base 开始的属性文件都会被 Spring 当做 ResourceBundleViewResolver 解析视图的资源文件。 ResourceBundleViewResolver 使用的属性配置文件的内容类似于这样:

resourceBundle.(class)=org.springframework.web.servlet.view.InternalResourceView
resourceBundle.url=/index.jsp
test.(class)=org.springframework.web.servlet.view.InternalResourceView
test.url=/test.jsp

对应与上述配置,spring会将其解析成如下Bean定义:

<bean id="resourceBundle" class="org.springframework.web.servlet.view.InternalResourceView">
   <property name="url" value="/index.jsp"/>
</bean>

<bean id="test" class="org.springframework.web.servlet.view.InternalResourceView">
   <property name="url" value="/test.jsp"/>
</bean>

接下来讲讲 Spring 通过 properties 文件生成 bean 的规则。它会把 properties 文件中定义的属性名称按最后一个点“ . ”进行分割,把点前面的内容当做是 bean 名称点后面的内容当做是 bean 的属性。这其中有几个特别的属性, Spring 把它们用小括号包起来了,这些特殊的属性一般是对应的 attribute ,但不是 bean 对象所有的 attribute 都可以这样用。其中 (class) 是一个,除了 (class) 之外,还有 (scope) 、 (parent) 、 (abstract) 、 (lazy-init) 。而除了这些特殊的属性之外的其他属性, Spring 会把它们当做 bean 对象的一般属性进行处理,就是 bean 对象对应的 property 。所以根据上面的属性配置文件将生成如下两个 bean 对象:

从 ResourceBundleViewResolver 使用的配置文件我们可以看出,它和 XmlViewResolver 一样可以解析多种不同类型的 View ,因为它们的 View 是通过配置的方式指定的,这也就意味着我们可以指定 A 视图是 InternalResourceView , B 视图是 JstlView 。

除了以上的视图解析器,常用的还有下面两个模板视图解析器:FreeMarkerViewResolver 、 VolocityViewResolver,在后面的文章会专门提到。


参考书籍:《Spring 3.x企业应用开发实战》
参考文章:http://www.tuicool.com/articles/RVb67r

目录
相关文章
|
24天前
|
负载均衡 算法 Java
Spring Cloud全解析:负载均衡算法
本文介绍了负载均衡的两种方式:集中式负载均衡和进程内负载均衡,以及常见的负载均衡算法,包括轮询、随机、源地址哈希、加权轮询、加权随机和最小连接数等方法,帮助读者更好地理解和应用负载均衡技术。
|
8天前
|
Java 对象存储 开发者
解析Spring Cloud与Netflix OSS:微服务架构中的左右手如何协同作战
Spring Cloud与Netflix OSS不仅是现代微服务架构中不可或缺的一部分,它们还通过不断的技术创新和社区贡献推动了整个行业的发展。无论是对于初创企业还是大型组织来说,掌握并合理运用这两套工具,都能极大地提升软件系统的灵活性、可扩展性以及整体性能。随着云计算和容器化技术的进一步普及,Spring Cloud与Netflix OSS将继续引领微服务技术的发展潮流。
21 0
|
3月前
|
设计模式 监控 Java
解析Spring Cloud中的断路器模式原理
解析Spring Cloud中的断路器模式原理
|
3月前
|
安全 Java 数据安全/隐私保护
解析Spring Security中的权限控制策略
解析Spring Security中的权限控制策略
|
22天前
|
XML 监控 Java
Spring Cloud全解析:熔断之Hystrix简介
Hystrix 是由 Netflix 开源的延迟和容错库,用于提高分布式系统的弹性。它通过断路器模式、资源隔离、服务降级及限流等机制防止服务雪崩。Hystrix 基于命令模式,通过 `HystrixCommand` 封装对外部依赖的调用逻辑。断路器能在依赖服务故障时快速返回备选响应,避免长时间等待。此外,Hystrix 还提供了监控功能,能够实时监控运行指标和配置变化。依赖管理方面,可通过 `@EnableHystrix` 启用 Hystrix 支持,并配置全局或局部的降级策略。结合 Feign 可实现客户端的服务降级。
100 23
|
6天前
|
存储 缓存 Java
在Spring Boot中使用缓存的技术解析
通过利用Spring Boot中的缓存支持,开发者可以轻松地实现高效和可扩展的缓存策略,进而提升应用的性能和用户体验。Spring Boot的声明式缓存抽象和对多种缓存技术的支持,使得集成和使用缓存变得前所未有的简单。无论是在开发新应用还是优化现有应用,合理地使用缓存都是提高性能的有效手段。
13 1
|
2月前
|
缓存 Java 开发者
Spring高手之路22——AOP切面类的封装与解析
本篇文章深入解析了Spring AOP的工作机制,包括Advisor和TargetSource的构建与作用。通过详尽的源码分析和实际案例,帮助开发者全面理解AOP的核心技术,提升在实际项目中的应用能力。
23 0
Spring高手之路22——AOP切面类的封装与解析
|
2月前
|
Java 微服务 Spring
Spring Cloud全解析:配置中心之解决configserver单点问题
但是如果该configserver挂掉了,那就无法获取最新的配置了,微服务就出现了configserver的单点问题,那么如何避免configserver单点呢?
|
2月前
|
XML Java 数据格式
Spring Cloud全解析:注册中心之zookeeper注册中心
使用ZooKeeper作为Spring Cloud的注册中心无需单独部署服务器,直接利用ZooKeeper服务端功能。项目通过`spring-cloud-starter-zookeeper-discovery`依赖实现服务注册与发现。配置文件指定连接地址,如`localhost:2181`。启动应用后,服务自动注册到ZooKeeper的`/services`路径下,形成临时节点,包含服务实例信息。
170 3
|
2月前
|
应用服务中间件 Java Maven
掌控视图的力量!深入解析 JSF 视图管理,揭秘视图生命周期的秘密,让你的应用更高效!
【8月更文挑战第31天】JavaServer Faces (JSF) 是一种强大的框架,用于管理 Web 应用程序的视图。本文通过具体案例介绍 JSF 视图管理的基础知识,包括创建、管理和销毁视图的过程。首先,在 Eclipse 中创建一个新 JSF 项目,并配置 Maven 依赖。接着,在 `WEB-INF` 目录下配置 `web.xml` 文件,设置 JSF servlet。
36 0

推荐镜像

更多
下一篇
无影云桌面