Springmvc返回json数据

SpringMvc返回json类型数据有以下几种方式(个人都使用过):

1、在方法上使用@ResponseBody注解

     需要引入jackson依赖包。


    com.fasterxml.jackson.core
    jackson-databind
    2.4.4


    com.fasterxml.jackson.core
    jackson-core
    2.4.4


    com.fasterxml.jackson.core
    jackson-annotations
    2.4.4

2、直接在控制器方法中使用HttpServletResponse reponse 直接打印json格式数据

3、ModelAndView返回json。(重点说明)

【1】自定义实现:

 (1)自定义一个ModelView中的View类。该View继承org.springframework.web.servlet.view.AbstractView抽象类,并重写renderMergedOutputModel方法。

(2)改变ModelAndView中的View。通过构造函数参数或者调用setView方法,将自定义View传入即可。

 代码实现如下:

 <1>继承org.springframework.web.servlet.view.AbstractView抽象类,重写renderMergedOutputModel方法。

import com.alibaba.fastjson.JSONObject;
import org.springframework.web.servlet.view.AbstractView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.util.Map;

/**
 * 重写视图
 * @author 陈嘉豪
 */
public class MyView extends AbstractView {
    @Override
    protected void renderMergedOutputModel(Map map, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {

        //转json
        JSONObject jsonObject = new JSONObject();
        jsonObject.putAll(map);

        ByteArrayOutputStream bas = new ByteArrayOutputStream();
        bas.write(jsonObject.toJSONString().getBytes("utf-8"));
        httpServletResponse.setContentType("application/json;charset=UTF-8");
        httpServletResponse.setContentLength(bas.size());
        OutputStream os = httpServletResponse.getOutputStream();
        bas.writeTo(os);
        os.flush();
    }
}

<2>将自定义的View设置到ModelAndView中的View。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 陈嘉豪
 */
@Controller
@RequestMapping("cjh")
public class MyController {

    @RequestMapping("toJson")
    public ModelAndView toJson(){

        List list = Arrays.asList("陈嘉豪","32fjadjfi24mk3mk4m3k2a");
        return toJson(list);
    }
    
    private ModelAndView toJson(Object res){
        ModelAndView modelAndView = new ModelAndView(new MyView());
        Map data = new HashMap<>();
        data.put("success",true);
        data.put("message","成功");
        data.put("res",res);
        modelAndView.addAllObjects(data);
        return modelAndView;
    }
}

返回数据效果:

{"res":["陈嘉豪","32fjadjfi24mk3mk4m3k2a"],"success":true,"message":"成功"}

完成以上就可实现该效果了。第三种方式中ModelAndView即可以返回到一个页面,也可以返回json数据。更好的统一编码规范。

【2】直接使用Spring提供的org.springframework.web.servlet.view.json.MappingJackson2JsonView,自己查看了该类 的源码,同样该类集成了AbstractView,该View和上面自定义View作用相同,这样我们可以不用自己实现了。


更多>>>自己网上还了解到一种实现方式,同样是MappingJackson2JsonView,参考如下:


		
			
				
					
					
				
			
		
		
			
				
				
			
		
	

上面的ContentNegotiationManager 只用了两个解析策略,首先根据请求的 urlpath 的后缀(例如  /***/*.json,后缀为json,该请求的mediatype为   application/json)来匹配mediatype,若找不到,则使用 http 协议请求头Accept字段判断请求的 mediatype。

InternalResourceViewResolver 用来渲染jsp视图,MappingJackson2JsonView 用来解析json请求就行。

只要你把访问的地址加上 .json 后缀,或者把 请求头 Accept 设置成 application/json (可直接使用jquery的$.getJson())  就能匹配到默认视图MappingJackson2JsonView 。

同样的,只要你把访问的地址加上 .html 后缀,或者把 请求头 Accept 设置成 text/html 就可以匹配到

InternalResourceViewResolver 视图解析器。

ContentNegotiationManager 还可以可以自定义url 后缀 和 mediatype的对应关系,Accept 头 和 mediatype的对应关系等等,但是 ContentNegotiationManager 字段的作用不仅仅是这些。

你可能感兴趣的:(spring)