`
muqingren
  • 浏览: 32376 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

@ResponseBody分析【转】

阅读更多
http://ttaale.iteye.com/blog/803127

在SpringMVC中可以在Controller的某个方法上加@ResponseBody注解,表示该方法的返回结果直接写入HTTP response body中。

但是实际使用中发现最后生成的response中"Content-Type"的值不正确。

Spring使用AnnotationMethodHandlerAdapter来处理@ResponseBody,该类再使用一些HttpMessageConverter来具体处理信息。

AnnotationMethodHandlerAdapter使用request header中"Accept"的值和messageConverter支持的MediaType进行匹配,然后会用"Accept"的第一个值写入 response的"Content-Type"。

一般的请求都是通过浏览器进行的,request header中"Accept"的值由浏览器生成。

Chrome生成的值为application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5

IE8生成的值为application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*

所以最后写入response中"Content-Type"的值为"application/xml"或"application/x-ms-application"。

但我们一般会在标注@ResponseBody的方法上返回String或byte[]类型的结果,期望的"Content-Type"的值应为"text/plain"或"application/octet-stream"。

这样导致了浏览器不能正确处理返回的内容。

实际上Spring在用HttpMessageConverter处理的过程中首先会判断response header中有没有写入"Content-Type",如果没有写入的话才会使用request header中"Accept"的第一个值。

但是由于Spring对HttpServletResponse进行了封装,实际上使用的是ServletServerHttpResponse,这个类有一个对真正的HttpServletResponse的引用。

判断response header的过程中使用的是ServletServerHttpResponse的getHeaders()方法,但该方法并没有返回真正的HttpServletResponse中的header。(这应该有问题吧?)

所以我们虽然可以在Controller的方法中加入对HttpServletResponse的引用,然后设置"Content-Type"的值,但是并不会起作用。

通过上面的分析,@ResponseBody看来是无法使用了。

分享到:
评论
4 楼 muqingren 2014-05-29  
yongjian1092 写道
搞了大半天 飘出一句没法使用。。。



现在是可以使用的了,很方便
在方法上加上这个注释,在jsp页面调用结束后能直接处理返回的结果,结果一般均为json对象的形式
3 楼 yongjian1092 2013-11-19  
搞了大半天 飘出一句没法使用。。。
2 楼 ayxiaogang 2013-05-08  
好文必须顶。转的也要顶
1 楼 muqingren 2011-03-24  
,球乱码问题,搞了我半天........

相关推荐

    关于@ResponseBody 默认输出的误区的解答

    "@ResponseBody 默认输出的误区的解答" ...本文通过详细的示例代码和源码分析,帮助读者深入了解 @ResponseBody 的工作机理和默认输出格式。希望本文能够帮助读者更好地理解 @ResponseBody 并应用于实际开发中。

    浅析@ReponseBody和@RequestBody注解

    下面我们将详细分析这两个注解的作用和Spring MVC内部是如何对他们进行解析的。 @RequestBody注解 @RequestBody注解主要用于将HTTP请求体中的数据绑定到controller方法的参数上。它可以处理各种类型的请求体数据,...

    使用 Spring 3 MVC HttpMessageConverter 功能构建 RESTful web 服务

    8. **案例分析** 创建一个 RESTful 控制器,比如处理用户信息的 CRUD 操作,可以创建如下方法: ```java @RequestMapping(value = "/users", method = RequestMethod.POST) public @ResponseBody User create...

    基于注解SpringMVC框架

    SpringMVC的源码分析有助于深入理解其工作原理。例如,`HandlerMapping`和`HandlerAdapter`接口,它们分别负责映射请求到处理器和执行处理器。通过阅读源码,可以了解Spring如何通过注解解析URL映射,以及如何调用...

    spring mvc rest 小例子

    由于具体代码未给出,这里无法详细分析。但在实际开发中,"MainRest"可能是主类,其中包含了Spring Boot的main方法,用于启动应用并加载配置。 总结来说,这个“Spring MVC REST小例子”涵盖了如何使用Spring MVC...

    Spring3MVC+ajax

    **四、SProject压缩包文件分析** SProject文件很可能是包含一个完整的Spring3 MVC + Ajax的项目实例。其中可能包括了Spring配置文件、Java源代码(Controller、Service、DAO等)、HTML页面以及JavaScript脚本等。...

    SSM框架及数据库

    分析和学习这个文件,有助于理解SSM框架的实际运用。 总的来说,这个压缩包提供了SSM框架的基础知识和实际操作案例,包括Spring的IoC和AOP、SpringMVC的MVC设计模式、MyBatis的SQL映射以及数据库操作,还有如何利用...

    spring-mvc-jsonview源代码

    三、源代码分析 1. pom.xml:项目依赖管理文件,包含了Spring MVC、Jackson库和其他相关依赖。例如,添加以下依赖可启用JSON支持: ```xml <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-...

    vb utf8转Unicode

    ### vb utf8转Unicode知识点详解 #### 一、引言 在编程中,字符串编码转换是常见的需求之一,尤其是在处理多种语言文字时。Visual Basic(简称VB)作为一款广泛使用的编程语言,在处理文本数据时也需要面对不同的...

    springMVC增改查.zip_springmvc

    通过分析这个压缩包中的示例,开发者可以学习到如何在SpringMVC环境中进行数据的增删查改操作,了解SpringMVC的流程和关键组件。同时,这也为实际项目开发提供了参考,有助于提升对SpringMVC框架的理解和应用能力。

    springMVC 注解版

    源码分析 理解SpringMVC注解的处理,我们需要关注`HandlerMapping`和`HandlerAdapter`两个接口。`HandlerMapping`负责找到处理请求的控制器方法,而`HandlerAdapter`则负责执行这个方法。SpringMVC通过`...

    springmvc-base-output-03.rar

    6. **ModelAndView** 或 **@ResponseBody**:在控制器方法中,可以返回 `ModelAndView` 对象来指定视图和模型数据,或者使用 `@ResponseBody` 将结果直接写入响应体,常用于 JSON 或 XML 输出。 7. **视图解析器**...

    jackson解析json字符串,首字母大写会自动转为小写的方法

    问题 楼主碰到的问题是,在实体类和表中定义的某个字段为RMBPrice,首字母大写,sql查询出来的列名也是大写的RMBPrice...接口返回的是一个@ResponseBody对象,在代码中打断点,一直到接口的返回值都是大写的,所以只可

    Spring MVC与Ajax交互源码

    通过以上分析,我们可以看到Spring MVC和Ajax的结合使用能够有效地提升Web应用的用户体验,使得页面交互更加平滑和快速。在实际项目中,我们需要熟练掌握这两种技术,以及相关的JSON序列化和反序列化,以实现高效的...

    SpringMVC 3.1 体验

    SpringMVC是Spring框架的一部分,专门用于处理Web应用程序的请求-响应模型。...实践操作是理解框架的最佳方式,尝试运行并分析`TestSpringMVC`项目,将有助于你深入理解SpringMVC 3.1的核心概念和工作原理。

    spring3.0 源码

    总之,Spring 3.0源码的深度分析有助于我们理解Spring框架的设计理念,掌握其核心功能的实现原理,从而更好地利用Spring进行软件开发。通过学习源码,我们可以学到如何优雅地实现IoC、AOP、MVC等设计模式,以及如何...

    restful webservice in springMVC Demo

    在IT行业中,RESTful Web服务已经成为构建现代Web应用程序的标准方式...通过分析这个示例项目,你可以更深入地理解Spring MVC和RESTful服务的结合,学习如何将理论应用于实践。这将对你的开发技能和项目经验大有裨益。

    SpringCloudZgs.rar

    7. **Spring Cloud Sleuth**:分布式跟踪解决方案,支持Zipkin和ELK(Elasticsearch、Logstash、Kibana)等日志收集和分析工具,帮助理解微服务间的调用链路。 RESTEasy作为JAX-RS的实现,使得在Spring Cloud微服务...

Global site tag (gtag.js) - Google Analytics