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