返回类型
ModelAndView
适用于将请求转发给一个JSP
页面进行渲染 , 是视图和放置在Request
域中的数据的封装。
String
请求如果仅仅是希望某些处理后做些页面跳转工作,则使用String是最方便的。String
即可代表
视图解析器中的逻辑视图,或者是没有配置视图解析器的视图的完整路径。
// 已经配置视图解析器 : 前缀为 /WEB-INF/view/ ; 后缀为 ''.jsp'
// 视图解析器方式
@RequestMapping(value = "/returnTypeString.do", method = RequestMethod.GET)
public String testReturnTypeString() {
return "returnTypeString"; // 此处是逻辑视图名称,配置逻辑视图解析器即可。
}
// 完整路径形式 : 此时不能配置视图解析器
@RequestMapping(value = "/returnTypeString.do", method = RequestMethod.GET)
public String testReturnTypeString() {
return "/WEB-INF/view/returnTypeString.jsp"; // 此处是逻辑视图名称,配置逻辑视图解析器即可。
}
void
在处理Ajax
请求的时候可以使用void
。使用HttpServletResponse
向流中写入
Json字符串即可。这个的Json
解析方式自行选择。但是框架提供了更好的选择 返回对象的方式, 避免每次书写转Json
和 获取响应对象的输出流向其输出的操作。。
Object(重点)
Spring
默认使用jackson
来对Object
转成json
, 因此需要自己引入Jar
。 同时还需要配置注解驱动,让框架创建能够处理Object
返回类型的Converter
。
配置工作
引入jackson
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.11.1</version>
</dependency>
注解驱动
配置注解驱动:其实现的功能完成Java到Json,xml,文本,二进制的转换。当配置到配置文件后会创建
HttpMessageConveter
接口的多个实现类的对象到容器中,为了完成对象到不同响应类型的转换。框架会轮询创建出来的MessageConvert的数组当中的每个实现类,调用其canWrite方法进行检测是否能转换到需要的请求体类型。
<!-- 配置注解驱动,选后缀是MVC的那一个 -->
<mvc:annotation-driven/>
@RequestBody
将其放置到控制器方法上,告诉框架不做跳转而是写入到响应体返回操作。具体写入什么内容,看具体的返回类型。
List
按照Object
方式配置完毕后书写如下代码,即可获得Json
的数组。
@ResponseBody
@RequestMapping("/returnTypeList.do")
public List<Student> testRetunTypeList() {
Student student1 = new Student("张三", "北京");
Student student2 = new Student("王五", "湖北");
List<Student> stus = new ArrayList<>();
stus.add(student1);
stus.add(student2);
return stus;
}
String
根据Object
的方式配置完毕后, String
表示的是个文本了就不再是视图了。主要区分的依据
是否有@RequestBody
。produces
能解决返回字符串当中包含中文字符的编码问题。
其实现的原理是调用HttpMessageConveter
的实现类StringHttpMessageConveter
的write
方法将字符串按照指定的编码进行输出,这个类当中包含一个默认字符集ISO-8859-1
的编码。
@ResponseBody
@RequestMapping(value = "/returnTypeObjectString.do", produces = "text/plain;charset=utf-8")
public String testReturnTypeObjectString() {
return "你好, this is a String";
}