《
Spring學習筆記-MVC》系列文章,講解返回json數據的文章共有3篇,分別為:
- 【Spring學習筆記-MVC-3】SpringMVC返回Json數據-方式1:http://www.cnblogs.com/ssslinppp/p/4528892.html
- 【Spring學習筆記-MVC-4】返回Json數據-方式2:http://www.cnblogs.com/ssslinppp/p/4530002.html
- 【Spring學習筆記-MVC-3.1】SpringMVC返回Json數據-方式1-擴展:http://www.cnblogs.com/ssslinppp/p/4675495.html
文章的內容主要如下:
- 方式1:講解如果返回單個對象的json;==>使用@ResponseBody來實現;注解方式
- 方式2:講解如果返回多個對象的json;==>使用MappingJacksonJsonView來實現;xml配置方式
- 方式1-擴展:講解如果返回多個對象的json;==>使用@ResponseBody來實現;注解方式
個人認為,使用
@ResponseBody方式來實現json數據的返回比較方便,推薦使用。
摘要
本文講解另外一種利用spring MVC返回json數據的方法。
前文回顧
在《【Spring學習筆記-MVC-3】返回Json數據-方式1》中介紹了通過:
- @ResponseBody聲明返回值;
- 配置<mvc:annotation-driven />;
來返回json數據。效果如下:


從上面的效果看,只能返回一個對象,不能返回多個對象,不能做到形如下圖的返回結果,

下面介紹的方式2,利用spring mvc返回json數據,可以實現同時返回多個對象的json數據
特別說明:
使用@ResponseBody可以實現同樣的效果,實現同時返回多個對象的Json數據,而且使用@
ResponseBody方式更簡潔。具體請參考《
【Spring學習筆記-MVC-4】返回Json數據-方式1-kuozh
》。
spring mvc實現json數據返回
具體步驟:
- 引入額外jar包:
;
- 使用bean視圖解析器: org.springframework.web.servlet.view.BeanNameViewResolver;
- 使用 org.springframework.web.servlet.view.json.MappingJacksonJsonView配置需要返回的對象;
- 聲明:<mvc:annotation-driven />; 經測試,不添加這個聲明,將出錯;
說明:
spring mvc默認的最常用的視圖解析器為
org.springframework.web.servlet.view.InternalResourceViewResolver
,

它的優先級默認是最低的,spring mvc還提供了許多其他類型的視圖解析器,比如bean視圖解析器

等,每個視圖解析器的優先級都是可以手動設置的。在進行視圖解析時,按照視圖解析器優先級的順序去解析視圖,直到有視圖解析器可以進行解析,解析過程就停止。
項目結構

配置web.xml

<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Spring Web MVC Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
配置mvc-dispatcher-servlet.xml




<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="com.ll.controller" />
<mvc:annotation-driven />
<!-- bean視圖解析器 -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"
p:order="10" />
<!-- XMl及JSON視圖解析器配置 -->
<!-- <bean id="userListJson"
class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"
p:renderedAttributes="userList" /> -->
<bean id="userListJson"
class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
<property name="renderedAttributes">
<set>
<value>userList</value>
<value>School</value>
<value>Work</value>
</set>
</property>
</bean>
</beans>
說明:
如果僅僅返回一個對象的json數據,可以使用簡寫配置:

JSONController.java

執行過程解析
1. 在mvc-dispatcher-servlet.xml文件中我們配置了bean視圖解析器,並設置器優先級為10,
,

它的優先級是高於

2.邏輯視圖返回值為:u
serListJson
,

它首先會被bean視圖解析器解析,解析發現
u
serListJson
對應的bean為:userListJson,其對應的視圖為:
MappingJacksonJsonView;

這樣,便將userlist、School和work轉化為json數據,並返回前台。
運行
瀏覽器: http://localhost:8080/SpringMVCQs/rest/kfc/brands/showUserListByJson

完整程序
JSONController.java
package com.ll.controller;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ll.model.Person;
import com.ll.model.Shop;
@Controller
@RequestMapping("/kfc/brands")
public class JSONController {
@RequestMapping(value="/getShopInJson", method = RequestMethod.GET)
public @ResponseBody Shop getShopInJSON() {
System.out.println("-----請求json數據--------");
Shop shop = new Shop();
shop.setName("zhangsan");
shop.setStaffName(new String[]{"mkyong1", "mkyong2"});
return shop;
}
@RequestMapping(value = "/showUserListByJson")
public String showUserListInJson(ModelMap mm) {
List<Person> userList = new ArrayList<Person>();
Person user1 = new Person();
user1.setUsername("tom");
user1.setPasswd("湯姆");
Person user2 = new Person();
user2.setUsername("john");
user2.setPasswd("約翰");
userList.add(user1);
userList.add(user2);
mm.addAttribute("userList", userList);
mm.addAttribute("School","SuZhou");
mm.addAttribute("Work","YanFa");
return "userListJson";
}
}
附件列表