SpringMVC-Return Values返回值
本篇文章,主要讲解SpringMVC的返回值的使用。
Handler-Return Values返回值
@ResponseBody
返回值通过HttpMessageConverters转换并写入响应。 请参阅@ResponseBody。
处理器功能处理方法的返回值作为响应体(通过HttpMessageConverter进行类型转换);
作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
HttpEntity,ResponseEntity
返回值:指定完整响应,包括HTTP标头和正文通过HttpMessageConverters转换并写入响应。 请参阅ResponseEntity。
HttpHeaders
为了返回一个响应头和没有正文。
String
一个视图名称,用ViewResolver解决,并与隐式模型一起使用 - 通过命令对象和@ModelAttribute方法确定。 处理程序方法也可以通过声明一个Model参数来以编程方式丰富模型。
View
用于与隐式模型一起渲染的View实例 - 通过命令对象和@ModelAttribute方法确定。 处理程序方法也可以通过声明一个Model参数来以编程方式丰富模型。
java.util.Map,org.springframework.ui.Model
要通过RequestToViewNameTranslator隐式确定的视图名称添加到隐式模型的属性。
@ModelAttribute
要通过RequestToViewNameTranslator隐式确定的视图名称添加到模型的属性。 请注意@ModelAttribute是可选的。
ModelAndView ,object
要使用的视图和模型属性,以及可选的响应状态。
void
具有void返回类型(或返回值为null)的方法如果还有ServletResponse,OutputStream参数或@ResponseStatus注释,则认为它已完全处理响应。
如果控制器进行了积极的ETag或lastModified时间戳检查(请参阅@Controller缓存了解详细信息),情况也是如此。
如果以上都不是这样,那么void返回类型也可能指示REST控制器的“无响应主体”,或HTML控制器的默认视图名称选择。
DeferredResult
从任何线程异步生成任何上述返回值 - 例如 可能是由于某些事件或回调。
Callable
Produce any of the above return values asynchronously in a Spring MVC managed thread. See Async Requests and Callable.使用异步线程来执行请求,然后返回给handler。
ListenableFuture, java.util.concurrent.CompletionStage, java.util.concurrent.CompletableFuture
在Spring MVC托管线程中异步生成上述任何返回值。
ResponseBodyEmitter, SseEmitter
用HttpMessageConverter’s异步发出一个对象流写入响应; 也支持作为ResponseEntity的主体。
StreamingResponseBody
异步写入响应的OutputStream; 也支持作为ResponseEntity的主体。
Reactive types — Reactor, RxJava, or others via ReactiveAdapterRegistry
具有多值流的DeferredResult(例如Flux,Observable)的替代方法被收集到列表中。
对于流式场景 - 例如 text / event-stream,application / json + stream - 使用SseEmitter和ResponseBodyEmitter,而在Spring MVC托管线程上执行ServletOutputStream阻塞I / O,并在每次写入完成时施加背压。
Any other return value
如果返回值与以上任何一个不匹配,默认情况下它被视为视图名称,如果它是String或void(通过RequestToViewNameTranslator应用的默认视图名称选择); 或者作为要添加到模型的模型属性,除非它是一个简单的类型,由BeanUtils#isSimpleProperty确定,在这种情况下,它仍然未解决。
返回ModelAndView/Model
controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view。
Model与ModelAndView的传递效果是一样的,且传递是数据不能是引用类型。
重定向时,会把数据拼接到Url后面
@返回void
啥也不做 - -
返回字符串
这玩意需要用到@ResponseBody注解
@RestController
public class TestController {
@RequestMapping("/test.action")
public String test( int ids){
System.out.println("id:"+ids);
return "this is test";
}
}
逻辑视图名
这玩意需要你配置视图解析器
INF/jsp/item/editItem.jsp
return "item/editItem";
Redirect重定向
Contrller方法返回结果重定向到一个url地址,如下商品修改提交后重定向到商品查询方法,参数无法带到商品查询方法中.
//重定向到queryItem.action地址,request无法带过去
return "redirect:queryItem.action";
redirect方式相当于“response.sendRedirect()”,转发后浏览器的地址栏变为转发后的地址,因为转发即执行了一个新的request和response。
由于新发起一个request原来的参数在转发时就不能传递到下一个url,如果要传参数可以/item/queryItem.action后边加参数,如下:
/item/queryItem?…&…..
对于model设置的值,重定向会拼接到?key=value…. 版本4.3以后好像改了,记不太清了,你们可以自己去玩一下
forward转发
跟Redirect一样的用法,不同的是 转发可以传递参数
//结果转发到editItem.action,request可以带过去
return "forward:editItem.action";
forward方式相当于“request.getRequestDispatcher().forward(request,response)”,转发后浏览器地址栏还是原来的地址。转发并没有执行新的request和response,而是和转发前的请求共用一个request和response。所以转发前请求的参数在转发后仍然可以读取到。
带域的返回