处理器方法的返回值
使用@Controller 注解的处理器的处理器方法,其返回值常用的有四种类型:
第一种:ModelAndView 第二种:String
第三种:无返回值 void 第四种:返回自定义类型对象
根据不同的情况,使用不同的返回值。
一、返回ModelAndView
若处理器方法处理完后,需要跳转到其他资源,且又要在跳转的资源间传递数据,此时返回ModelAndView比较好。若要返回ModelAndView,处理器方法需要定义ModelAndView对象。
若该处理器方法只是进行跳转而不传递数据,或只是传递数据而并不像任何资源跳转(如对Ajax异步响应),此时若返回ModelAndView,则将总是有一部分多余;要么Model多余,要么View多余。此时返回ModelAndView不合适。
一般用在同步请求,Model就是request域中的数据,View就是要跳转的视图或者其他处理器方法
视图View是一个forward的转发行为,只需要跳转,不需要向request域中存储数据
只需要跳转,不需要向request域中存储数据return new ModelAndView(“/视图页面”);
二、返回String
处理器方法返回的字符串可以指定逻辑视图名,通过视图解析器解析可以将其转换为物理视图地址
返回内部资源逻辑视图名:若要跳转的资源为内部资源,则视图解析器可以使用 InternalResourceViewResolver 内部资源视图解析器。此时处理器方法返回的字符串就是要跳转页面的文件名去掉文件扩展名后的部分。这个字符串与视图解析器中的 prefix、suffix 相结合,即可形成要访问的 URI。
返回View对象名:就是处理ajax请求,holle是逻辑视图名称,项目中配置了视图解析器,框架对视图执行forward
区分返回值String是数据还是视图,只需要观察方法上面是否有@ResponseBody注解。如果有@ResponseBody注解,那么返回的就是数据,反之返回的就是视图。
三、返回void(了解)
对于处理器方法返回void的应用场景,主要有两种:
1.通过ServletAPI 传递数据并完成跳转
2.AJAX 响应:若处理器对请求处理后,无需跳转到其它任何资源,此时可以让处理器方法返回 void。例如,对于 AJAX 的异步请求的响应。
同时处理器对于 AJAX 请求中所提交的参数,可以使用逐个接收的方式,也可以以对象的方式整体接收。只要保证 AJAX 请求参数与接收的对象类型属性同名。
四、返回Object
Object:例如String、Integer、Map、List、Student等等都是对象,对象有属性,属性就是数据。
所以返回Object对象,表示数据,和视图无关。此时就可以使用对象表示的数据来响应ajax的请求。
因为返回的对象不是作为逻辑视图出现的,而是作为直接在页面显示的数据出现的。返回对象,需要使用@ResponseBody 注解,将转换后的 JSON 数据放入到响应体中
实现步骤:
1.加入处理json的工具库的依赖,springmvc默认使用的jackson。
2.在springmvc的配置文件中,加入一个标签<mvc:annotation-driven>来声明注解驱动。
将 Object 数据转化为 JSON 数据,需要由消息转换器 HttpMessageConverter 完成。而转换器的开启,需要由<mvc:annotation-driven/>来完成。
SpringMVC 使用消息转换器实现请求数据和对象,处理器方法返回对象和响应输出之间的自动转换 当 Spring 容器进行初始化过程中,在<mvc:annotation-driven/>处创建注解驱动时,注解驱动实现的功能是完成Java对象到json、xml、二进制等数据格式的转换。<mvc:annotation-driven>加入到springmvc配置文件之后,会自动创建HttpMessageConverter接口的七个实现类对象。包括MappingJackson2HttpMessageConverter,这个类是使用jackson工具库中的ObjectMapper实现java对象转为json字符串的。
HttpMessageConverter 接口 : HttpMessageConverter<T>是 Spring3.0 新添加的一个接口,负责将请求信息转换为一个对象(类型为 T),将对象(类型为 T)输出为响应信息
boolean canRead(Class<?> clazz,MediaType mediaType): 指定转换器可以读取的对象类型,即转换器是否可将请求信息转换为 clazz 类型的对象,同时指定支持 MIME 类型(text/html,applaiction/json 等)
boolean canWrite(Class<?> clazz,MediaType mediaType):指定转换器是否可将 clazz 类型的对象写到响应流中,响应流支持的媒体类型在 MediaType 中定义。
LIst<MediaType> getSupportMediaTypes():该转换器支持的媒体类型。
T read(Class<? extends T> clazz,HttpInputMessage inputMessage):将请求信息流转换为 T 类型的对象。
void write(T t,MediaType contnetType,HttpOutputMessgae outputMessage):将 T 类型的对象写到响应流中,同时指定相应的媒体类型为 contentType
3.在处理器方法的上面加入@ResponseBody注解
返回自定义类型对象时,不能以对象的形式直接返回给客户端浏览器,而是将对象转换为 JSON 格式的数据发送给浏览器的。@ResponseBody 放在处理器上面,通过HttpServletResponse输出数据,响应ajax请求的。
注:记住需要使用jackson jar包,为什么JSONObject 不可以呢?因为SpringMVC会自动去调jackson,是配套的,而不会自己去调用JSONObject 返回Object的类型可以有很多,自己可以动手实践一下,返回自定义类型对象,返回Map集合,返回List 集合,返回字符串对象等等。同时注意返回字符串对象若带有中文字符,接收方页面将会出现乱码,需要使用@RequestMapping 的 produces 属性指定字符集,限制输出结果的类型。