1. 程式人生 > >Springmvc返回json資料

Springmvc返回json資料

SpringMvc返回json型別資料有以下幾種方式(個人都使用過):

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

     需要引入jackson依賴包。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.4.4</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.4.4</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.4.4</version>
</dependency>

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<String, Object> 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<String> list = Arrays.asList("陳嘉豪","32fjadjfi24mk3mk4m3k2a");
        return toJson(list);
    }
    
    private ModelAndView toJson(Object res){
        ModelAndView modelAndView = new ModelAndView(new MyView());
        Map<String, Object> 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,參考如下:

<bean
		class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
		<property name="viewResolvers">
			<list>
				<bean
					class="org.springframework.web.servlet.view.InternalResourceViewResolver">
					<property name="prefix" value="/WEB-INF/jsp/"></property>
					<property name="suffix" value=".jsp"></property>
				</bean>
			</list>
		</property>
		<property name="defaultViews">
			<list>
				<bean
					class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
				</bean>
			</list>
		</property>
	</bean>

上面的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 欄位的作用不僅僅是這些。