转:SpringMVC 4.1 新特性(二)内容协商视图
SpingMVC的内容协商支持三种方式:
- 使用后缀,如
json
、xml
后缀和处理类型的关系可以自己定义 - 前面说的使用
Accept
头 - 在访问时
request
请求的参数,比如每次请求request都会加format=xml
参数,表示要求返回XML格式数据,默认参数名是format
,可以修改。
SpingMVC规定,如果同时开启了上面的部分或全部方式,解析顺序是后缀
、参数
、Accept头
。对我来说,还是比较喜欢用Accept头
,用的时间长,比较适应。
SpingMVC文件中的配置方式如下:
<!-- Make this available across all of Spring MVC -->
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" />
<!-- Total customization - see below for explanation. -->
<bean id="contentNegotiationManager"
class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="true" />
<property name="favorParameter" value="false" />
<property name="parameterName" value="format" />
<property name="ignoreAcceptHeader" value="false"/>
<property name="useJaf" value="false"/>
<property name="defaultContentType" value="text/html" />
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</map>
</property>
</bean>
favorPathExtension
参数表示是否开启后缀,默认true。(使用形如/account/a.json
、/account/a.xml
的方式)favorParameter
参数表示是否开启request
参数识别,默认false
。(使用形如/account/a?format=json
、/account/?format=xml
的方式)parameterName
参数表示使用参数的名字,默认format
,如果配置为mediaType
,则请求格式变为/account/a?mediaType=json
ignoreAcceptHeader
表示是否关闭accept
头识别,默认false
,即默认开启accept
头识别。defaultContentType
表示服务器默认的MediaType
类型。
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order" value="0"/>
<property name="contentNegotiationManager" ref="contentNegotiationManager"/><!-- 如已配置过管理器,这里可以不配置 -->
<property name="viewResolvers"><!-- 这里也可以配置viewResolver -->
<list>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</list>
</property>
<property name="defaultViews">
<list>
<!-- 不加配置返回 {"account":{"username":"admin","password":"123456"}} -->
<!-- 加配置返回 {"username":"admin","password":"123456"}-->
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
<property name="extractValueFromSingleKeyModel" value="true" />
</bean>
<bean class="org.springframework.web.servlet.view.xml.MarshallingView">
<property name="marshaller">
<bean class="org.springframework.oxm.xstream.XStreamMarshaller"/>
</property>
</bean>
</list>
</property>
</bean>
在Spring4.1
之后提供了视图解析器标签,可以用如下方式
<mvc:view-resolvers>
<mvc:content-negotiation>
<mvc:default-views>
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
<property name="jsonpParameterNames">
<set>
<value>jsonp</value>
<value>callback</value>
</set>
</property>
<!-- 不加配置返回 {"account":{"username":"admin","password":"123456"}}
加配置返回 {"username":"admin","password":"123456"} -->
<property name="extractValueFromSingleKeyModel" value="true" />
</bean>
<bean class="org.springframework.web.servlet.view.xml.MarshallingView">
<property name="marshaller">
<bean class="org.springframework.oxm.xstream.XStreamMarshaller">
<!-- 启用annotation -->
<property name="autodetectAnnotations" value="true" />
</bean>
</property>
</bean>
</mvc:default-views>
</mvc:content-negotiation>
<mvc:jsp prefix="/WEB-INF/views/" suffix=".jsp" />
</mvc:view-resolvers>
mvc:content-negotiation
用于定义内容协商的视图解析器,且内部可以定义默认视图;然后我们又定义了mvc:velocity
和mvc:groovy
两个视图解析器;它们会按照顺序进行解析。另外几个视图解析器是:
mvc:freemarker
mvc:bean-name
mvc:jsp
@Controller
public class AccountController {
/**
* <p>.json结尾返回json</p>
* <p>.xml结尾返回xml</p>
*/
@GetMapping(value="viewResolver")
public ModelAndView viewResolver(){
ModelAndView mv = new ModelAndView();
Account account = new Account(WebUtil.getRequest().getParameter("username"),
WebUtil.getRequest().getParameter("password"));
mv.addObject(account);
mv.setViewName("viewResolver");
return mv;
}
@GetMapping(value="viewResolver2")
public String viewResolver2(Model model){
Account account = new Account(WebUtil.getRequest().getParameter("username"),
WebUtil.getRequest().getParameter("password"));
model.addAttribute(account);
return "viewResolver";
}
@XStreamAlias("account")
public static class Account{
private String username;
private String password;
public Account(){}
public Account(String username, String password) {
super();
this.username = username;
this.password = password;
}
//getter setter
@Override
public String toString() {
return "account:{"+username+"|"+password+"}";
}
}
}
转:SpringMVC 4.1 新特性(二)内容协商视图的更多相关文章
- HTML5 十大新特性(二)——表单新特性
H5的表单新特性可以分为两大类. 一.10个input的type值 1.email:邮件输入域,在表单提交时提供简单的邮箱格式验证,并弹出一个提示窗口. 2.url:地址输入域,在表单提交时提供简单的 ...
- JAVA 8 主要新特性 ----------------(二)JDK1.8优点概括
一.JDK1.8优点概括 1.速度更快 由于底层结构和JVM的改变,使得JDK1.8的速度提高. 2.代码更少(增加了新的语法 Lambda 表达式) 增加新特性Lambda表达式的 ...
- 深入理解java虚拟机---jdk8新特性(二)
1.jdk8新特性 1.新特性 2.lambda函数表达式的作用 A: 替换内部类 B:对集合的操作并行化
- 类的加载、时机、反射、模板设计、jdk7/jdk8新特性(二十六)
1.类的加载概述和加载时机 * A:类的加载概述 * 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. * 加载 * 就是指将class文 ...
- JDK8新特性(二) 流式编程Stream
流式编程是1.8中的新特性,基于常用的四种函数式接口以及Lambda表达式对集合类数据进行类似流水线一般的操作 流式编程分为大概三个步骤:获取流 → 操作流 → 返回操作结果 流的获取方式 这里先了解 ...
- 010-jdk1.8版本新特性二-Optional类,Stream流
1.5.Optional类 1.定义 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个 ...
- C# 6.0 新特性 (二)
自动属性初始化表达式 有过正确实现结构经验的所有 .NET 开发人员无疑都为一个问题所困扰:需要使用多少语法才能使类型固定不变(为 .NET 标准建议的类型).此问题实际上是只读属性存在的问题: 定义 ...
- C++2.0新特性(二)——<一致性初始化、Initializer_list 、for循环、explicit>
一.一致性初始化(uniform initialization) 之前初始化时存在多个版本,让使用者使用时比较混乱,现在提供一种万用的初始化方法,就是使用大括号. 原理解析:当编译器看到大括号包起来的 ...
- JAVA 8 主要新特性 ----------------(二)版本中数据结构的修改浅析
一.版本中数据结构的修改浅析1.HashMap.HashSet.ConcurrentHashMap的数据结构发生变化 (1)HashMap简介(结构:哈希表+链表) HashMap存储的数据是无序的, ...
随机推荐
- shell脚本基础编写
shell脚本的格式 名称:Shell 脚本文件的名称可以任意,但为了避免被误以为是普通文件,建议将 .sh 后缀加上,以表示是一个脚本文件. shell 脚本中一般会出现三种不同的元素: 第一行的脚 ...
- table 随着内容自动适应宽度
td { white-space: nowrap; } 给td加个属性就可以了,如果有th则可以 td,th 本文来自:https://blog.csdn.net/liuhongwei_study/a ...
- Linux学习日志(一)
1 .Ubuntu 自带python 2 和 python 3的版本,切换方法如下: shell里执行: sudo update-alternatives --install /usr/bin/pyt ...
- 队列BlockingQueue的简单例子
队列,当进行多线程编程的时候,很多时候可能会用到,队列是先进先出的,我们可以将要执行的任务放置在队列内缓存起来,当线程池中线程可以使用的时候,我们就从队列中获取一个任务执行.. 当前是一个队列的简单例 ...
- 题解 [BZOJ4886] 叠塔游戏
题面 解析 这是个有趣的建图题啊. 首先我们可以发现,宽度严格递增是没什么用的. 因为实际上我们在旋转完以后, 矩形的顺序是可以随便排的. 因此只要保证宽度互不相同就行了. 然后,我们对长和宽离散化, ...
- siblings([expr])
siblings([expr]) 概述 取得一个包含匹配的元素集合中每一个元素的所有唯一同辈元素的元素集合.可以用可选的表达式进行筛选.大理石平台维修 参数 exprStringV1.0 用于筛选 ...
- [Linux]虚拟机无法安装deepin15.9的解决方案
虚拟机deepin15.9无法安装 sda assuming drive cache write through 显示内存不行,重启仍然无法安装 解决方案: 选择全盘安装方式 如果有全屏问题,需安装v ...
- nuxt使用教程
1 引言 Nuxt 是基于 Vue 的前端开发框架,这次我们通过 Introduction toNuxtJS 视频了解框架特色以及前端开发框架的基本要素. nuxt 与 next 结构很像,可以结合在 ...
- 7.RabbitMQ--消息确认机制(confirm)
RabbitMQ--消息确认机制(confirm) Confirm模式 RabbitMQ为了解决生成者不知道消息是否真正到达broker这个问题,采用通过AMQP协议层面为我们提供了事务机制方案,但是 ...
- python itern机制的
这些变量很可能在许多程序中使用. 通过池化这些对象,Python可以防止对一致使用的对象进行内存分配调用. 1.介于数字-5和256之间的整数 2.字符串仅包含字母.数字或下划线