使用@Controller 注解的处理器的处理器方法,其返回值常用的有四种类型:
● 第一种:ModelAndView
● 第二种:String
● 第三种:无返回值 void
● 第四种:返回自定义类型对象
根据不同的情况,使用不同的返回值。
返回 ModelAndView(掌握)
若处理器方法处理完后,需要跳转到其它资源,且又要在跳转的资源间传递数据,此时 处理器方法返回 ModelAndView 比较好。当然,若要返回 ModelAndView,则处理器方法中 需要定义 ModelAndView 对象。
在使用时,若该处理器方法只是进行跳转而不传递数据,或只是传递数据而并不向任何 资源跳转(如对页面的 Ajax 异步响应),此时若返回 ModelAndView,则将总是有一部分多 余:要么 Model 多余,要么 View 多余。即此时返回 ModelAndView 将不合适。
处理器方法返回的字符串可以指定逻辑视图名,通过视图解析器解析可以将其转换为物理视图地址,返回内部资源逻辑视图名,若要跳转的资源为内部资源,则视图解析器可以使用 InternalResourceViewResolver 内部资源视图解析器。此时处理器方法返回的字符串就是要跳转页面的文件名去掉文件扩展名后的部分。这个字符串与视图解析器中的 prefix、suffix 相结合,即可形成要访问的 URI。
项目:returnString-viewName。在 receiveParameters-object 基础上修改。直接修改处理器类 MyController
当然,也可以直接返回资源的物理视图名。不过,此时就不需要再在视图解析器中再配 置前辍与后辍了。
对于处理器方法返回 void 的应用场景,AJAX 响应
若处理器对请求处理后,无需跳转到其它任何资源,此时可以让处理器方法返回 void。
例如,对于 AJAX 的异步请求的响应。
项目:returnVoid-ajax。在 primary-annotation 基础上进行修改。
Step1:导入 Jar 包
由于本项目中服务端向浏览器传回的是 JSON(JavaScript Object Notation,JS 对象符号)数据,需要使用一个工具类将字符串包装为 JSON 格式,所以需要导入 JSON 的 Jar 包。
Step2:引入 jQuery 库
由于本项目要使用 jQuery 的 ajax()方法提交 AJAX 请求,所以项目中需要引入 jQuery 的库。在 WebRoot 下新建一个 Folder(文件夹),命名为 js,并将 jquery-1.11.1.js 文件放入其中。
当然,该 jQuery 库文件,需要在使用 ajax()方法的 index 页面中引入。
Step3:定义index页面
index页面由两部分内容构成:一个是<button/>,用于提交AJAX请求;一个是<script/>,用于处理 AJAX 请求。
点击按钮发起请求
Step4:定义对象Student
Step5:修改处理器类MyController
处理器对于AJAX请求中所提交的参数,可以使用逐个接收的方式,也可以以对象的方式整体接收。只要保证AJAX请求参数与接收的对象类型属性同名。
以逐个方式接收参数:
Step6:删除视图页面
由于是服务端直接向浏览器发回数据,所以也就无需视图页面了,所以需要删除WEB-INF中的jsp目录及其中的show页面。
JSON(JavaScript Object Notation)(官网:http://www.json.org/是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON 采用完全独立于语言的文本格式,这些特性使JSON 成为理想的数据交换语言。
JSON 的两种结构
● “名称/值”对的集合。
例如{ name:”张三”, age : 23 }
● 值的有序列表,它被理解为数组。例如:[{ name:”张三”, age : 23 } , { name:”李力”, age : 28 }]
在JSON-Lib中“名称/值”对的集合用JSONObject对象表示,数组用JSONArray对象表示。
常用的的json库:json-lib , Jackson , google公司的gson和阿里巴巴的fastjson
处理器方法也可以返回Object对象。这个Object可以是Integer,String,自定义对象,Map,List等。但返回的对象不是作为逻辑视图出现的,而是作为直接在页面显示的数据出现的。
返回对象,需要使用@ResponseBody注解,将转换后的JSON数据放入到响应体中。
A、导入Jar包
由于返回Object数据,一般都是将数据转化为了JSON对象后传递给浏览器页面的。而这个由Object转换为JSON,是由Jackson工具完成的。所以需要导入Jackson的相关Jar包。
B、注册注解驱动
将Object数据转化为JSON数据,需要由消息转换器HttpMessageConverter完成。而转换器的开启,需要由来完成。
SpringMVC使用消息转换器实现请求数据和对象,处理器方法返回对象和响应输出之间的自动转换。
当Spring容器进行初始化过程中,在处创建注解驱动时,默认创建了七个HttpMessageConverter对象。也就是说,我们注册,就是为了让容器为我们创建HttpMessageConverter对象。
HttpMessageConverter接口: HttpMessageConverter 是Spring3.0 新添加的一个接口,负责将请求信息转换为一个对象(类型为T),将对象(类型为T)输出为响应信息
HttpMessageConverter接口定义的方法:
boolean canRead(Class clazz,MediaType mediaType): 指定转换器可以读取的对象类型,即转换器是否可将请求信息转换为clazz 类型的对象,同时指定支持MIME 类型(text/html,applaiction/json等)
boolean canWrite(Class clazz,MediaType mediaType):指定转换器是否可将clazz 类型的对象写到响应流中,响应流支持的媒体类型在MediaType 中定义。
LIst getSupportMediaTypes():该转换器支持的媒体类型。
T read(Class clazz,HttpInputMessage inputMessage):将请求信息流转换为T 类型的对象。
void write(T t,MediaType contnetType,HttpOutputMessgae outputMessage):将T类型的对象写到响应流中,同时指定相应的媒体类型为contentType
加入注解驱动后适配器类的messageConverters属性值
若要返回非中文字符串,将前面返回数值型数据的返回值直接修改为字符串即可。但若返回的字符串中带有中文字符,则接收方页面将会出现乱码。此时需要使用@RequestMapping的produces属性指定字符集。
produces,产品,结果,即该属性用于设置输出结果类型。
项目:returnObject-String。
直接修改处理器即可。
返回自定义类型对象时,不能以对象的形式直接返回给客户端浏览器,而是将对象转换为JSON格式的数据发送给浏览器的。
由于转换器底层使用了Jackson转换方式将对象转换为JSON数据,所以需要导入Jackson的相关Jar包。
项目:returnObject-custom。在returnObject-string基础上进行修改。
Step1:定义VO类
Step2:修改处理器MyController
Step3:修改index页面
项目:returnObject-list。在returnObject-custom基础上进行修改。
Step1:修改处理器MyController
Step2:修改 index 页面