Spring学习之旅(七)--SpringMVC视图

在之前的实例中我们只是在 Controller 中返回了 home 字符类型的值,而没有直接生成可以在浏览器中直接渲染的 HTML,这是因为 SpringMVC 将请求处理的逻辑和视图渲染的实现进行了解偶。 Controller 返回视图名称,视图解析器进行视图的渲染。

SpringMVC 定义了一个名为 ViewResolver 的接口,定义如下:

public interface ViewResolver {
    View resolveViewName(String var1, Locale var2) throws Exception;
}

当给 resolveViewName() 方法传入一个视图名和 Locale 对象时,它会返回一个 View 对象,View 定义如下:

public interface View {
    String RESPONSE_STATUS_ATTRIBUTE = View.class.getName() + ".responseStatus";
    String PATH_VARIABLES = View.class.getName() + ".pathVariables";
    String SELECTED_CONTENT_TYPE = View.class.getName() + ".selectedContentType";

    String getContentType();

    void render(Map<String, ?> var1, HttpServletRequest var2, HttpServletResponse var3) throws Exception;
}

View 接口的任务就是接受模型以及 Servletrequestresponse 对象,并将输出结果渲染到 response 中。

通常我们不需要再自己实现 ViewResolverView 接口,SpringMVC 已经为我们提供了多个内置的实现。

视图解析器 描述
BeanNameViewResolver 将视图解析为 Spring 应用上下文中的 bean,其中 bean 的 ID 和视图的名称相同
ContentNegotiatingViewResolver 通过考虑客户端需要的内容类型来解析视图,委托给另外一个能够产生对应内容类型的视图解析器
FreeMarkeViewResolver 将视图解析为 FreeMarker 模板
InternalResourceViewResolver 将视图解析为 Web 应用的内部资源(一般为 JSP)
JasperReportsViewResolver 将视图解析为 JasperReports 定义
ResourceBundleViewResolver 将视图解析为资源 bundle(一般为属性文件)
TilesViewResolver 将视图解析为 Apache Tile 定义,其中 tile Id 与视图名称相同。注意有两个不同的 TilesViewResolver 实现,分别对应 Tiles 2.0 和 Tiles 3.0
UrlBasedViewResolver 直接根据视图的名称解析视图,视图的名称会匹配一个物理视图的定义
VelocityLayoutViewResolver 将视图解析为 Velocity 布局,从不同的 Velocity 模板中组合页面
VelocityViewResolver 将视图解析为 Velocity 模板
XmlViewResolver 将视图解析为特定 XMl文件中的 bean 定义
XsltViewResolver 将视图解析为 XSLT 转换后的结果

集成 JSP 视图

我们之前在 WebConfig 类中配置的 InternalResourceViewResolver 就已经集成好了,我们再来回顾下:

@Bean
public ViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    // 设置页面文件前缀
    resolver.setPrefix("/WEB-INF/views/");
    // 设置页面文件后缀
    resolver.setSuffix(".jsp");
    // 设置页面允许访问上下文属性
    resolver.setExposeContextBeansAsAttributes(Boolean.TRUE);
    return resolver;
}

也可以使用 XML 来进行配置:

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

解析 JSTL 视图

当我们需要使用 JSTL 标签来处理信息的时候,我们希望 InternalResourceViewResolver 可以将视图解析为 JstlView。我们只需要额外在配置一下 InternalResourceViewResolverviewClass 属性即可。

resolver.setViewClass(JstlView.class);

xml:

 <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>

JSTL 的使用


集成 JSON 视图

现在我们只能返回页面视图,但是有些接口是只有数据而没有页面,这个时候就要用到 JSON 视图了。

1.导入 JSON 依赖

<!-- json -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.56</version>
</dependency>

2.代码形式配置

@Configuration
@EnableWebMvc
@ComponentScan("com.marklogzhu.web")
public class WebConfig extends WebMvcConfigurerAdapter {

	......

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        //自定义配置...
        FastJsonConfig config = new FastJsonConfig();
        config.setSerializerFeatures(SerializerFeature.QuoteFieldNames,
                SerializerFeature.WriteEnumUsingToString,
                /*SerializerFeature.WriteMapNullValue,*/
                SerializerFeature.WriteDateUseDateFormat,
                SerializerFeature.DisableCircularReferenceDetect);
        //处理中文乱码问题
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
        fastJsonHttpMessageConverter.setFastJsonConfig(config);
        converters.add(fastJsonHttpMessageConverter);
    }
}
posted @ 2019-08-23 15:46  MarkLogZhu  阅读(206)  评论(0编辑  收藏  举报