Spring_视图解析器

生命的道路上永远没有捷径可言,只有脚踏实地走下去。

视图解析器的作用

  将控制器中请求处理的逻辑和视图中渲染实现解耦是Spring MVC的一个重要特性。在Spring MVC中控制器只通过逻辑视图名来了解视图,而通过视图解析器来渲染模型。

Spring自带的视图解析器

  SpringMVC定义了名为ViewResolver的接口,其中的resolveViewName()方法传入一个视图名和Locale对象时,它会返回一个View实例。

  View是另外一个接口,主要是接受模型以及Servlet的request对象和response对象,并将输出渲染到response对象中。

  我们可通过编写ViewReSolver接口和View接口的实现来自定义视图解析器,实际上Spring自带了13个视图,能够将逻辑视图名转换为物理实现,它们能够适应大多数场景。

  1)BeanNameViewResolver:将试图解析为Spring应用上下文中的bean,其中bean的ID与视图的名字相同。

  2)ContentNegotiatingViewResolver:通过考虑客户端的内容类型来解析视图,委托给另一个能够产生对应内容类型的视图解析器。

  3)FreeMarkerViewResolver:将视图解析为FreeMarker模板。

  4)InternalResourceViewResolver:将视图解析为Web应用的内部资源(一般为JSP)。

  5)JasperReportsViewResolver:将视图解析为JasperReports定义。

  6)ResourceBundleViewResolver:将视图解析为资源bundle(一般为属性文件)。

  7)TilesViewResolver:将视图解析为Apache Tiles定义,其中tile ID与视图名称相同(注意有两个不同的TilesViewResolver实现,分别对应Tiles 2.0 和 Tiles 3.0)。

  8)UrlBasedViewResolver:直接更具视图的名称解析视图,视图的名称会匹配一个物理视图的定义。

  9)VelocityLayoutViewResolver:将视图解析为Velocity布局,从不同的Velocity模板中组合页面。

  10)VelocityViewResolver:将视图解析为Velocity模板。

  11)XmlViewResolver:将视图解析为XML文件中bean的定义(类似于BeanNameViewResolver)。

  12)XsltViewReslover:将视图解析为XSLT转换后的结果。

  13)ThymeleafViewResolver:将逻辑视图名称解析为Thymeleaf模板视图。

  注意:Spring 4 和 Spring 3.2支持以上所有视图解析器,Spring 3.1 支持除Tiles 3 TilesViewResolver之外的所有视图解析器。

配置适用于JSP的视图解析器

  尽管Spring有几个视图解析器都能将视图名映射为JSP文件,但是InternalResourceViewResolver是最简单和最常用的JSP视图解析器。

  如下图,InternalResourceViewResolver解析视图时,它遵循一种约定,会在视图名上添加前缀和后缀,从而确定一个Web应用中视图资源的物理路径。

  

  1)使用Java配置InternalResourceViewResolver

package config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan("study.practice")
public class WebConfig extends WebMvcConfigurerAdapter {
    
    /**
     * 配置JSP视图解析器:InternalResourceViewResolver
     * @return
     */
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver =
                new InternalResourceViewResolver();
        //添加前缀
        resolver.setPrefix("/WEB-INF/views");
        //添加后缀
        resolver.setSuffix(".jsp");
        return resolver;
    }
}

  2)使用XML配置InternalResourceViewResolver

<bean id="resolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
            p:prefix="/WEB-INF/views"
            p:suffix=".jsp"
        />

  注意:如果这些JSP使用JSTL标签来处理格式化和信息的话,那么我们可以设置InternalResourceViewResolver的viewClass属性,便可将视图解析为JstlView,通过解析JstlView,JSTL能够获得Locale对象和Spring中配置的信息资源。

  1)Java配置如下:

package config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

@Configuration
@EnableWebMvc
@ComponentScan("study.practice")
public class WebConfig extends WebMvcConfigurerAdapter {
    
    /**
     * 配置JSP视图解析器:InternalResourceViewResolver
     * @return
     */
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver =
                new InternalResourceViewResolver();
        //添加前缀
        resolver.setPrefix("/WEB-INF/views");
        //添加后缀
        resolver.setSuffix(".jsp");
        resolver.setViewClass(JstlView.class);
        return resolver;
    }
}

  2)XML配置如下:

<bean id="resolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
            p:prefix="/WEB-INF/views"
            p:suffix=".jsp"
            p:viewClass="org.springframework.web.servlet.view.JstlView"
        />

猜你喜欢

转载自www.cnblogs.com/dandelZH/p/9048411.html