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看来是无法使用了。
分享到:
相关推荐
"@ResponseBody 默认输出的误区的解答" ...本文通过详细的示例代码和源码分析,帮助读者深入了解 @ResponseBody 的工作机理和默认输出格式。希望本文能够帮助读者更好地理解 @ResponseBody 并应用于实际开发中。
下面我们将详细分析这两个注解的作用和Spring MVC内部是如何对他们进行解析的。 @RequestBody注解 @RequestBody注解主要用于将HTTP请求体中的数据绑定到controller方法的参数上。它可以处理各种类型的请求体数据,...
8. **案例分析** 创建一个 RESTful 控制器,比如处理用户信息的 CRUD 操作,可以创建如下方法: ```java @RequestMapping(value = "/users", method = RequestMethod.POST) public @ResponseBody User create...
SpringMVC的源码分析有助于深入理解其工作原理。例如,`HandlerMapping`和`HandlerAdapter`接口,它们分别负责映射请求到处理器和执行处理器。通过阅读源码,可以了解Spring如何通过注解解析URL映射,以及如何调用...
由于具体代码未给出,这里无法详细分析。但在实际开发中,"MainRest"可能是主类,其中包含了Spring Boot的main方法,用于启动应用并加载配置。 总结来说,这个“Spring MVC REST小例子”涵盖了如何使用Spring MVC...
**四、SProject压缩包文件分析** SProject文件很可能是包含一个完整的Spring3 MVC + Ajax的项目实例。其中可能包括了Spring配置文件、Java源代码(Controller、Service、DAO等)、HTML页面以及JavaScript脚本等。...
分析和学习这个文件,有助于理解SSM框架的实际运用。 总的来说,这个压缩包提供了SSM框架的基础知识和实际操作案例,包括Spring的IoC和AOP、SpringMVC的MVC设计模式、MyBatis的SQL映射以及数据库操作,还有如何利用...
三、源代码分析 1. pom.xml:项目依赖管理文件,包含了Spring MVC、Jackson库和其他相关依赖。例如,添加以下依赖可启用JSON支持: ```xml <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-...
### vb utf8转Unicode知识点详解 #### 一、引言 在编程中,字符串编码转换是常见的需求之一,尤其是在处理多种语言文字时。Visual Basic(简称VB)作为一款广泛使用的编程语言,在处理文本数据时也需要面对不同的...
通过分析这个压缩包中的示例,开发者可以学习到如何在SpringMVC环境中进行数据的增删查改操作,了解SpringMVC的流程和关键组件。同时,这也为实际项目开发提供了参考,有助于提升对SpringMVC框架的理解和应用能力。
源码分析 理解SpringMVC注解的处理,我们需要关注`HandlerMapping`和`HandlerAdapter`两个接口。`HandlerMapping`负责找到处理请求的控制器方法,而`HandlerAdapter`则负责执行这个方法。SpringMVC通过`...
6. **ModelAndView** 或 **@ResponseBody**:在控制器方法中,可以返回 `ModelAndView` 对象来指定视图和模型数据,或者使用 `@ResponseBody` 将结果直接写入响应体,常用于 JSON 或 XML 输出。 7. **视图解析器**...
问题 楼主碰到的问题是,在实体类和表中定义的某个字段为RMBPrice,首字母大写,sql查询出来的列名也是大写的RMBPrice...接口返回的是一个@ResponseBody对象,在代码中打断点,一直到接口的返回值都是大写的,所以只可
通过以上分析,我们可以看到Spring MVC和Ajax的结合使用能够有效地提升Web应用的用户体验,使得页面交互更加平滑和快速。在实际项目中,我们需要熟练掌握这两种技术,以及相关的JSON序列化和反序列化,以实现高效的...
SpringMVC是Spring框架的一部分,专门用于处理Web应用程序的请求-响应模型。...实践操作是理解框架的最佳方式,尝试运行并分析`TestSpringMVC`项目,将有助于你深入理解SpringMVC 3.1的核心概念和工作原理。
总之,Spring 3.0源码的深度分析有助于我们理解Spring框架的设计理念,掌握其核心功能的实现原理,从而更好地利用Spring进行软件开发。通过学习源码,我们可以学到如何优雅地实现IoC、AOP、MVC等设计模式,以及如何...
在IT行业中,RESTful Web服务已经成为构建现代Web应用程序的标准方式...通过分析这个示例项目,你可以更深入地理解Spring MVC和RESTful服务的结合,学习如何将理论应用于实践。这将对你的开发技能和项目经验大有裨益。
7. **Spring Cloud Sleuth**:分布式跟踪解决方案,支持Zipkin和ELK(Elasticsearch、Logstash、Kibana)等日志收集和分析工具,帮助理解微服务间的调用链路。 RESTEasy作为JAX-RS的实现,使得在Spring Cloud微服务...