当前位置: 代码迷 >> JavaScript >> spring MVC 3.1 诠注:@ResponseBody 返回json数据
  详细解决方案

spring MVC 3.1 诠注:@ResponseBody 返回json数据

热度:529   发布时间:2013-08-01 15:23:18.0
spring MVC 3.1 注解:@ResponseBody 返回json数据

pring mvc如何返回json 数据的,大概有如下几种:

?

Spring MVC 3.0 返回JSON数据的方法
1. 直接 PrintWriter 输出
2. 使用 JSP 视图
3. 使用Spring内置的支持

以下为3.1之前的配置:

?

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
 <property name="messageConverters">
  <list>
   <bean
    class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
  </list>
 </property>
</bean>

?

重点来了!

以下为3.1的配置:

spring mvc 3.1之后使用RequestMappingHandlerMappingRequestMappingHandlerAdapter

替代了原有的DefaultMethodHandlerMappingAnnotationMethodHandlerAdapter

所以,3.1的返回json配置可以使用如下配置:

<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"
		p:ignoreDefaultModelOnRedirect="true" >
			<property name="messageConverters">
				<list>
					<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
				</list>
			</property>
		</bean>

?

// WEB-INF/lib 中添加
jackson-mapper-asl-1.6.4.jar
jackson-core-asl-1.6.4.jar
// Controller 中 使用:@ResponseBody 标注方法,该方法返回 Java对象(支持复杂对象),

如:

public  @ResponseBody   User getUser(User u){
	return u;
}

?

MappingJacksonHttpMessageConverter 会将对象转换为 JSON 输出

?

注意:当springMVC-servlet.xml中使用<mvc:annotation-driven />时,如果是3.1之前已经默认注入AnnotationMethodHandlerAdapter,3.1之后默认注入RequestMappingHandlerAdapter只需加上上面提及的jar包即可!

注意:默认情况下MappingJacksonHttpMessageConverter 会设置content为application/json,在IE9下返回会出现提示下载的现象,出现这种情况可以手动指定头信息为"text/html",或者"*/*"(所有,不确定就设这个)

如果是手动注入RequestMappingHandlerAdapter 可以这样设置

	<bean
		class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"
		p:ignoreDefaultModelOnRedirect="true">
		<property name="messageConverters">
			<list>
				<bean
					class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"
					p:supportedMediaTypes="*/*" />
			</list>
		</property>
	</bean>


如果是采用mvc:annotation-driven标签 可以这样注入信息

?

<mvc:annotation-driven>
		<mvc:message-converters register-defaults="true">
			<bean
					class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"
					p:supportedMediaTypes="*/*" />
		</mvc:message-converters>
	</mvc:annotation-driven>

4. 自定义

?

// 配置 BeanNameViewResolver
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
 <property name="order" value="1" />
</bean>
<bean id="jsonView" class="test.TestJsonView" />

?

// 实现 TestJsonView
public class TestJsonView extends AbstractView {
 @Override
 protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,
         HttpServletResponse response) throws Exception {
  JsonBuilder jb = new JsonBuilder();
  PrintWriter out = response.getWriter();
  out.print(jb.encode(model));
 }
}

?

// Controller 中可以这样写:
ModelAndView mav = new ModelAndView("jsonView");
// mav.addObject ...
return mav;



来源:http://yjflfliulei.iteye.com/blog/1755134

  相关解决方案