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 接口的任务就是接受模型以及 Servlet 的 request 和 response 对象,并将输出结果渲染到 response 中。
通常我们不需要再自己实现 ViewResolver 和 View 接口,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。我们只需要额外在配置一下 InternalResourceViewResolver 的 viewClass 属性即可。
resolver.setViewClass(JstlView.class);
xml:
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
集成 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);
}
}
Spring学习之旅(七)--SpringMVC视图的更多相关文章
- Spring学习之旅(六)--SpringMVC集成
对大多数 Java 开发来说,基于 web 的应用程序是我们主要的关注点. Spring 也提供了对于 web 的支持,基于 MVC 模式的 Spring MVC 能够帮助我们灵活和松耦合的完成 we ...
- Spring学习之旅(八)--SpringMVC请求参数
现在我们已经完成了一个无参的接口了,但是应用中有很多需要携带参数的场景,我们来看看 ** SpringMVC** 对它的支持. 参数绑定 SpringMVC 提供了一种绑定机制,通过这个机制可以从请求 ...
- Spring学习之旅(九)--SpringMVC高级技术
文件上传 在 Web 应用中,允许用户上传文件是很常见的需求.文件上传通常是采用 multipart 格式,而 DispatcherServlet 并没有任何解析 multipart 请求数据的功能, ...
- Spring学习之旅(十)--MockMvc
在之前的 Spring学习之旅(八)--SpringMVC请求参数 我们是通过在控制台输出来验证参数是否正确,但是这样做实在是太耗时间了,我们今天来学习下 MockMvc,它可以让我们不需要启动项目就 ...
- Spring学习之旅(八)Spring 基于AspectJ注解配置的AOP编程工作原理初探
由小编的上篇博文可以一窥基于AspectJ注解配置的AOP编程实现. 本文一下未贴出的相关代码示例请关注小编的上篇博文<Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AO ...
- 【Spring学习笔记-MVC-4】SpringMVC返回Json数据-方式2
<Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...
- 【Spring学习笔记-MVC-9】SpringMVC数据格式化之日期转换@DateTimeFormat
作者:ssslinppp 1. 摘要 本文主要讲解Spring mvc数据格式化的具体步骤: 并讲解前台日期格式如何转换为java对象: 在之前的文章<[Spring学习笔记-MVC ...
- 【Spring学习笔记-MVC-3】SpringMVC返回Json数据-方式1
<Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...
- Spring学习笔记(七)模拟实际开发过程的调用过程XML版-Setter方式注入
模拟实际开发过程的调用过程XML版-Setter方式注入 源码获取github [TOC] 1.项目结构 2.jar包跟上个一样 3.重写set方法 UserServiceImpl.java 1234 ...
随机推荐
- c语言进阶10-算法
一. 数据结构和算法关系 为什么要学数据结构和算法? 通常,计算机解决问题的步骤如下: 在数学模型中,计算机处理的对象之间通常存在着一种最简单的线性关系,这类数学模型就是线性的数据结构.著名计算机科 ...
- C#2.0新增功能03 匿名方法
连载目录 [已更新最新开发文章,点击查看详细] 在 2.0 之前的 C# 版本中,声明委托的唯一方式是使用命名方法. C# 2.0 引入匿名方法,在 C# 3.0 及更高版本中,Lambda 表 ...
- [leetcode] 17. Letter Combinations of a Phone Number (medium)
递归DFS class Solution { Map<Character, String> mapping = new HashMap<>(); public List< ...
- 【Java中级】(五)异常处理
1.什么是异常 异常定义:导致程序的正常流程被中断的事件,叫做异常. 2.异常处理 try catch finally throws package exception; import java.io ...
- 关于keil警告/错误问题的解释和修正
- 版权声明:本文为博主 **乔勇刚-** 一字一句敲出来的原创作品,未经博主允许不得转载,多谢支持.- 本系列博客仅做经验交流分享,不能用作任何商业用途.本文中如有不足之处,请您留言,本人将及时更改 ...
- django第一次(转自刘江大佬)
下面的模型定义了一个“人”,它具有first_name和last_name字段: from django.db import models class Person(models.Model): fi ...
- idea中写servlet时报错--关于405错误
将super方法注释掉 原因:super是调用了此类继承父类doget和dopost方法的, 如果此类中没有这个方法,就会报错The specified HTTP method is not allo ...
- Linux学习笔记03
一.Linux常见命令 file:查看文件类型(windows用扩展名识别文件类型) 语法:file [options] [args] -b:显示结果时,不显示文件名 -c:显示执行file命令的执行 ...
- K8S 部署 Web UI
在早期的版本中 Kubernetes可以在 Dashboard 中看到 heapster 提供的一些图表信息, 在后续的版本中会陆续移除掉 heapster,现在更加流行的监控工具是 promethe ...
- hdoj 3732 Ahui Writes Word (多重背包)
之前在做背包的题目时看到了这道题,一看,大喜,这不是裸裸的01背包吗!! 然后华丽丽的超时,相信很多人也和我一样没有考虑到数据量的大小. 时隔多日,回过头来看这道题,依旧毫无头绪....不过相比之前 ...