龙空技术网

整合SpringMVC之内容协商视图解析器

千锋IT小助手 94

前言:

眼前我们对“springmvchtml视图解析器”大约比较注意,兄弟们都需要学习一些“springmvchtml视图解析器”的相关资讯。那么小编在网摘上网罗了一些对于“springmvchtml视图解析器””的相关文章,希望各位老铁们能喜欢,姐妹们快快来学习一下吧!

我们在上一章节中,讲解了ContentNegotiating内容协商的使用及简单原理分析,上一章节主要是讲解内容协商在HttpMessage上的作用。

其实内容协商不仅仅可以作用在HttpMessage上,还可以作用在View视图上,本章节我讲解该内容。

一.内容协商视图解析器1.概述

ContentNegotiatingViewResolver自己并不解析视图,而是委派给其他的视图处理器。

为了使这个解析器正常工作,order序号需要设置成比其他的视图处理器高的优先级(默认就是最高的)。

2. ContentNegotiatingViewResolver细节:ContentNegotiationManager用于内容协商的策略可以手动设置指定,也可以通过FactoryBean自动生成;viewResolvers默认是去容器内找到所有的,当然你也可以手动set进来;使用request的媒体类型,根据扩展名选择不同的view输出不同的格式;不是自己处理view,而是代理给不同的ViewResolver来处理不同的view;默认是支持Accept和后缀的协商方式的。并且还支持 逻辑视图名.后缀的视图解析方式;依据View.getContentType匹配MediaType来完成的最佳匹配。二.ContentNegotiatingViewResolver使用

在默认情况下,Spring MVC并没有开启ContentNegotiatingViewResolver内容协商视图解析器,因此如果有同一接口资源,要用多视图展示的需求,我们是需要自己手动配置来实现的。

所以接下来我带大家,对同一个接口资源,返回多个View。

1. 需求介绍

我们要对同一个RESTful风格的URL,根据请求的不同,可以得到一个PDF视图,一个JSON视图,一个Html视图。

2. 创建web项目(略)

参照之前的案例,我们创建一个新的web项目,过程略去。

3. 创建View视图3.1 创建PdfViewResolver类

package com.yyg.boot.resolver;import org.springframework.http.MediaType;import org.springframework.web.servlet.View;import org.springframework.web.servlet.ViewResolver;import org.springframework.web.servlet.view.ContentNegotiatingViewResolver;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.util.Map;/** * @Description Description * @Author 一一哥Sun * @Date Created in 2020/3/22 */public class PdfViewResolver implements View {    @Override    public String getContentType() {        return MediaType.APPLICATION_PDF_VALUE;    }    @Override    public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {        response.getWriter().write("<html><body style='color:red'>This is [PDF] view</body></html>");    }}
3.2 创建ExcelViewResolver类
package com.yyg.boot.resolver;import org.springframework.http.MediaType;import org.springframework.web.servlet.View;import org.springframework.web.servlet.view.ContentNegotiatingViewResolver;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.util.Map;/** * @Description Description * @Author 一一哥Sun * @Date Created in 2020/3/22 */public class ExcelViewResolver implements View {    @Override    public String getContentType() {        return MediaType.APPLICATION_JSON_UTF8_VALUE;    }    @Override    public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {        response.getWriter()                .write("<html><body style='color:blue'>This is [JSON] view!</body></html>");    }}
3.3 创建HtmlViewResolver类
package com.yyg.boot.resolver;import org.springframework.http.MediaType;import org.springframework.web.servlet.View;import org.springframework.web.servlet.view.ContentNegotiatingViewResolver;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.util.Map;/** * @Description Description * @Author 一一哥Sun * @Date Created in 2020/3/22 */public class HtmlViewResolver implements View {    @Override    public String getContentType() {        return MediaType.TEXT_HTML_VALUE;    }    @Override    public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {        response.getWriter()                .write("<html><body style='color:green'>This is [HTML] view!</body></html>");    }}
4. 进行视图配置

将上面创建的视图注册到内容协调视图解析器中,开启Spring MVC在视图上对ContentNegotiation内容协商的支持。

package com.yyg.boot.config;import com.yyg.boot.resolver.ExcelViewResolver;import com.yyg.boot.resolver.HtmlViewResolver;import com.yyg.boot.resolver.PdfViewResolver;import org.springframework.context.annotation.Configuration;import org.springframework.http.MediaType;import org.springframework.web.servlet.View;import org.springframework.web.servlet.ViewResolver;import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;import org.springframework.web.servlet.view.ContentNegotiatingViewResolver;import org.springframework.web.servlet.view.InternalResourceViewResolver;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.util.Locale;import java.util.Map;/** * @Description Description * @Author 一一哥Sun * @Date Created in 2020/3/22 */@Configurationpublic class WebMvcConfig extends WebMvcConfigurationSupport {    @Override    public void configureViewResolvers(ViewResolverRegistry registry) {        registry.enableContentNegotiation(new PdfViewResolver());        registry.enableContentNegotiation(new ExcelViewResolver());        registry.enableContentNegotiation(new HtmlViewResolver());        // 上面三个注册方法必须在此方法之上执行        registry.enableContentNegotiation(false);    }}
5. 创建Controller测试接口
package com.yyg.boot.web;import lombok.extern.slf4j.Slf4j;import org.springframework.http.MediaType;import org.springframework.stereotype.Controller;import org.springframework.util.MimeType;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.ResponseBody;/** * @Description 内容协商视图解析器 * @Author 一一哥Sun * @Date Created in 2020/3/21 */@Slf4j@Controllerpublic class NegotiationController {    @GetMapping(value = "/show/{type}")    public String showUser(@PathVariable("type") String type) {        log.warn("type={}", type);        return "跟一一哥学习ContentNegotiatingViewResolver!";    }}
6. 启动程序,运行测试

我们在浏览器中输入地址:可以看到如下效果:

我们在浏览器中输入地址:可以看到如下效果:

我们在浏览器中输入地址:可以看到如下效果:

而在没有后缀名的情况下,以Accept的规则为准。

所以可见扩展名的规则优先级高于Accept,符合我们上一章节中的理论知识。若没有指定请求的扩展名,则Accept就会生效!

三.内容协调视图解析器工作原理图

标签: #springmvchtml视图解析器