Spring Mvc 输出 Json

来源:互联网 发布:中国书画网络展览馆 编辑:程序博客网 时间:2024/06/06 09:13

http://blog.csdn.net/liuxiit/article/details/6618573

************************************************************服务器端代码**************************************************************************

Spring Web MVC(Servlet)  具体细节就不说了,比较不一样的地方,下面会注明!

1. web.xml 的内容如下:

     

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  
  3.   <display-name>FCAS</display-name>  
  4.      <servlet>  
  5.         <servlet-name>foodcenter</servlet-name>  
  6.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  7.         <load-on-startup>1</load-on-startup>  
  8.     </servlet>  
  9.   
  10.     <servlet-mapping>  
  11.         <servlet-name>foodcenter</servlet-name>  
  12.         <url-pattern>*.json</url-pattern>  
  13.     </servlet-mapping>  
  14.   
  15. </web-app>  

2. foodcenter-servlet.xml 的内容如下:

  

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"   
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:p="http://www.springframework.org/schema/p"   
  5.     xmlns:context="http://www.springframework.org/schema/context"  
  6.     xsi:schemaLocation="  
  7.         http://www.springframework.org/schema/beans   
  8.         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  9.         http://www.springframework.org/schema/context   
  10.         http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
  11.   
  12.     <context:annotation-config/>   
  13.       
  14.     <!-- Controller 类的注解标识-->  
  15.     <context:component-scan base-package="com.liuxi.foodcenter.controller"/>  
  16.      
  17.    <!--这个ViewResolver 的具体原来没细究,不过CV战士们 中的一员,这样用是没问题的(参考官文) -->  
  18.    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">  
  19.       <property name="mediaTypes">  
  20.         <map>  
  21.           <entry key="json" value="application/json"/>   <!-- 告诉视图解析器 返回的类型为json 格式 -->  
  22.         </map>  
  23.       </property>  
  24.       <property name="defaultViews">  
  25.         <list>  
  26.           <!-- 这个 View 比较重要,ModelAndView 里的数据变成JSON -->  
  27.           <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">  
  28.           </bean>  
  29.         </list>  
  30.       </property>  
  31.     </bean>  
  32.   
  33.     <!--真正的项目,业务Bean 有专门对应的配置文件,这里为了简单起见,就写在这里了 -->  
  34.     <bean id="foodService" class="com.liuxi.food.service.FoodServiceImpl"/>  
  35.   
  36. </beans>  

3. 子控制器FindFoodListController.java

[html] view plaincopy
  1. package com.liuxi.foodcenter.controller;  
  2. import java.util.HashMap;  
  3. import java.util.List;  
  4. import java.util.Map;  
  5.   
  6. import org.springframework.beans.factory.annotation.Autowired;  
  7. import org.springframework.beans.factory.annotation.Qualifier;  
  8. import org.springframework.stereotype.Controller;  
  9. import org.springframework.web.bind.annotation.RequestMapping;  
  10. import org.springframework.web.bind.annotation.RequestParam;  
  11. import org.springframework.web.servlet.ModelAndView;  
  12.   
  13. import com.liuxi.bean.Food;  
  14. import com.liuxi.food.service.IFoodService;  
  15.   
  16. @Controller  
  17. public class FindFoodListController {  
  18.       
  19.     @Autowired @Qualifier("foodService")  
  20.     private IFoodService foodService;  
  21.   
  22.     /** 根据餐菜的类别返回 该类别下的所有菜*/  
  23.     @RequestMapping("/findFoodList")  
  24.     public ModelAndView queryFoodList(@RequestParam("typeId") int typeId){  
  25.           
  26.         List<Food> list=foodService.getFoodListByType(typeId);  
  27.         ModelAndView modelView=new ModelAndView();  
  28.         Map<String,Object> modelMap=new HashMap<String,Object>();  
  29.         modelMap.put("FOOD_LIST", list);  
  30.         modelMap.put("TYPE_ID", typeId);  
  31.         modelView.addAllObjects(modelMap);  
  32.         return modelView;  
  33.     }  
  34. }  

4. FoodServiceImpl.java 

[html] view plaincopy
  1. package com.liuxi.food.service;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import com.liuxi.bean.Food;  
  7.   
  8. public class FoodServiceImpl  implements IFoodService{  
  9.   
  10.     @Override  
  11.     public List<Food> getFoodListByType(int typeId) {  
  12.         //这里本来要调DAO层接口的,这边暂时写死  
  13.           
  14.         Food food1=new Food(1,1,"鱼香肉丝", 12.00,"好吃的不得了-鱼香肉丝",4.5,5.0);  
  15.         Food food2=new Food(2,1,"农家小炒肉", 15.00,"好吃的不得了-农家小炒肉",3.7,4.3);  
  16.         Food food3=new Food(3,1,"韭菜炒蛋", 10.00,"好吃的不得了-韭菜炒蛋",2.6,3.0);  
  17.         Food food4=new Food(4,1,"回锅肉", 13.00,"好吃的不得了-回锅肉",3.1,3.8);  
  18.         Food food5=new Food(5,1,"宫保鸡丁", 14.00,"好吃的不得了-宫保鸡丁",3.7,5.0);  
  19.         Food food6=new Food(6,1,"苦瓜炒蛋", 9.00,"好吃的不得了-宫保鸡丁",4.9,4.7);  
  20.         Food food7=new Food(7,1,"莴笋肉片", 10.00,"好吃的不得了-莴笋肉片",2.6,3.9);  
  21.           
  22.         List<Food> list=new ArrayList<Food>();  
  23.         list.add(food1);  
  24.         list.add(food2);  
  25.         list.add(food3);  
  26.         list.add(food4);  
  27.         list.add(food5);  
  28.         list.add(food6);  
  29.         list.add(food7);  
  30.           
  31.         return list;  
  32.           
  33.     }  
  34.   
  35. }  

5.IFoodService.java

[html] view plaincopy
  1. package com.liuxi.food.service;  
  2. import java.util.List;  
  3.   
  4. import com.liuxi.bean.Food;  
  5. public interface IFoodService {  
  6.     List<Food>  getFoodListByType(int typeId);  
  7. }  

6.Food.java

  

[html] view plaincopy
  1. package com.liuxi.bean;  
  2.   
  3. public class Food {  
  4.   
  5.     private int id; // ID  
  6.     private String name; // 菜名  
  7.     private double price; // 价格  
  8.     private String notes; // 菜的简要介绍  
  9.     private int foodTypeId; // 菜所属的类别  
  10.   
  11.     private double kouWeiScore; // 口味的分值  
  12.     private double hotLevel; // 星级别  
  13.   
  14.     public Food(int id, int foodTypeId, String name, double price,  
  15.             String notes, double kouWeiScore, double hotLevel) {  
  16.         this.id = id;  
  17.         this.name = name;  
  18.         this.price = price;  
  19.         this.notes = notes;  
  20.         this.foodTypeId = foodTypeId;  
  21.         this.kouWeiScore = kouWeiScore;  
  22.         this.hotLevel = hotLevel;  
  23.   
  24.     }  
  25.   
  26.     public Food() {  
  27.   
  28.     }  
  29.   
  30.     public int getId() {  
  31.         return id;  
  32.     }  
  33.   
  34.     public void setId(int id) {  
  35.         this.id = id;  
  36.     }  
  37.   
  38.     public String getName() {  
  39.         return name;  
  40.     }  
  41.   
  42.     public void setName(String name) {  
  43.         this.name = name;  
  44.     }  
  45.   
  46.     public double getPrice() {  
  47.         return price;  
  48.     }  
  49.   
  50.     public void setPrice(double price) {  
  51.         this.price = price;  
  52.     }  
  53.   
  54.     public String getNotes() {  
  55.         return notes;  
  56.     }  
  57.   
  58.     public void setNotes(String notes) {  
  59.         this.notes = notes;  
  60.     }  
  61.   
  62.     public int getFoodTypeId() {  
  63.         return foodTypeId;  
  64.     }  
  65.   
  66.     public void setFoodTypeId(int foodTypeId) {  
  67.         this.foodTypeId = foodTypeId;  
  68.     }  
  69.   
  70.     public double getKouWeiScore() {  
  71.         return kouWeiScore;  
  72.     }  
  73.   
  74.     public void setKouWeiScore(double kouWeiScore) {  
  75.         this.kouWeiScore = kouWeiScore;  
  76.     }  
  77.   
  78.     public double getHotLevel() {  
  79.         return hotLevel;  
  80.     }  
  81.   
  82.     public void setHotLevel(double hotLevel) {  
  83.         this.hotLevel = hotLevel;  
  84.     }  
  85.   
  86.     public String toString() {  
  87.         return id + "--" + name + "--" + price + "--" + notes + "--"  
  88.                 + foodTypeId + "--" + kouWeiScore + "--" + hotLevel;  
  89.   
  90.     }  
  91.   
  92. }  

7.Spring Web MVC 中 将ModelAndView 中的数据自动转换成json ,靠的是jackjson 中 连个jar 包  (这个下载大本营里有下,花了我2积分哦)

     jackson-core-asl-1.4.2.jar

    jackson-mapper-asl-1.4.2.jar


*************************************以上是服务器端代码,已全部贴完!**********************************************

访问链接是: http://192.168.1.104:8088/FCAS/findFoodList.json?typeId=1


***************************************************************************Android 客户端  访问部分************************************************************

下面进入 Android 客户端访问部分(这里暂不贴 界面,用android 的单元测试 来 测试 服务器返回的json 数据是什么样的    

   8. GetFoodListTest.java

  

[java] view plaincopy
  1. package com.liuxi.takeorder.test;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.InputStreamReader;  
  5. import java.util.ArrayList;  
  6.   
  7. import org.apache.http.HttpResponse;  
  8. import org.apache.http.HttpStatus;  
  9. import org.apache.http.NameValuePair;  
  10. import org.apache.http.client.HttpClient;  
  11. import org.apache.http.client.entity.UrlEncodedFormEntity;  
  12. import org.apache.http.client.methods.HttpPost;  
  13. import org.apache.http.impl.client.DefaultHttpClient;  
  14. import org.apache.http.message.BasicNameValuePair;  
  15.   
  16. import android.test.AndroidTestCase;  
  17. import android.util.Log;  
  18.   
  19. public class GetFoodListTest extends AndroidTestCase {  
  20.    
  21.     private static final String TAG="GetFoodListTest";  
  22.     public void testFindFoodList() {  
  23.         String uri="http://192.168.1.104:8088/FCAS/findFoodList.json?typeId=1";  
  24.         try{  
  25.             HttpClient httpClient=new DefaultHttpClient();  
  26.               
  27.             //HttpPost 实现 HttpUriRequest  接口,HttpUriRequest接口 继承 HttpRequest  
  28.             HttpPost httpPostReq=new HttpPost(uri);  
  29.               
  30.             ArrayList<NameValuePair> paramList=new ArrayList<NameValuePair>();  
  31.               
  32.             NameValuePair param1=new BasicNameValuePair("typeId",String.valueOf(1));  
  33.             paramList.add(param1);  
  34.               
  35.             httpPostReq.setEntity(new UrlEncodedFormEntity(paramList));  
  36.               
  37.               
  38.             HttpResponse resp=httpClient.execute(httpPostReq);  
  39.               
  40.             if(resp.getStatusLine().getStatusCode()==HttpStatus.SC_OK){  
  41.                 BufferedReader reader=new BufferedReader(  
  42.                            new InputStreamReader(resp.getEntity().getContent())       
  43.                         );  
  44.                 StringBuffer result=new StringBuffer();  
  45.                 String inputLine=null;  
  46.                 while((inputLine=reader.readLine())!=null){  
  47.                        result.append(inputLine);  
  48.                 }  
  49.                   
  50.               Log.i(TAG, result.toString());  
  51.             }  
  52.               
  53.         }catch(Exception e){  
  54.            Log.i(TAG,e.getMessage());     
  55.         }  
  56.     }  
  57. }  


9. 激动人心的时刻-----> 结果是啥?  

    日志记录为:

     07-19 16:12:53.282: INFO/GetFoodListTest(1287): {"TYPE_ID":1,"FOOD_LIST":[{"name":"鱼香肉丝","id":1,"price":12.0,"notes":"好吃的不得了-鱼香肉丝","foodTypeId":1,"kouWeiScore":4.5,"hotLevel":5.0},{"name":"农家小炒肉","id":2,"price":15.0,"notes":"好吃的不得了-农家小炒肉","foodTypeId":1,"kouWeiScore":3.7,"hotLevel":4.3},{"name":"韭菜炒蛋","id":3,"price":10.0,"notes":"好吃的不得了-韭菜炒蛋","foodTypeId":1,"kouWeiScore":2.6,"hotLevel":3.0},{"name":"回锅肉","id":4,"price":13.0,"notes":"好吃的不得了-回锅肉","foodTypeId":1,"kouWeiScore":3.1,"hotLevel":3.8},{"name":"宫保鸡丁","id":5,"price":14.0,"notes":"好吃的不得了-宫保鸡丁","foodTypeId":1,"kouWeiScore":3.7,"hotLevel":5.0},{"name":"苦瓜炒蛋","id":6,"price":9.0,"notes":"好吃的不得了-宫保鸡丁","foodTypeId":1,"kouWeiScore":4.9,"hotLevel":4.7},{"name":"莴笋肉片","id":7,"price":10.0,"notes":"好吃的不得了-莴笋肉片","foodTypeId":1,"kouWeiScore":2.6,"hotLevel":3.9}]}


我把上面{} 里的东西 放到一个foodlist.json 文件中,格式化后的内容如下:

   

[html] view plaincopy
  1. {  
  2.     "TYPE_ID" : 1,  
  3.     "FOOD_LIST" : [{  
  4.                 "name" : "鱼香肉丝",  
  5.                 "id" : 1,  
  6.                 "price" : 12.0,  
  7.                 "notes" : "好吃的不得了-鱼香肉丝",  
  8.                 "foodTypeId" : 1,  
  9.                 "kouWeiScore" : 4.5,  
  10.                 "hotLevel" : 5.0  
  11.             }, {  
  12.                 "name" : "农家小炒肉",  
  13.                 "id" : 2,  
  14.                 "price" : 15.0,  
  15.                 "notes" : "好吃的不得了-农家小炒肉",  
  16.                 "foodTypeId" : 1,  
  17.                 "kouWeiScore" : 3.7,  
  18.                 "hotLevel" : 4.3  
  19.             }, {  
  20.                 "name" : "韭菜炒蛋",  
  21.                 "id" : 3,  
  22.                 "price" : 10.0,  
  23.                 "notes" : "好吃的不得了-韭菜炒蛋",  
  24.                 "foodTypeId" : 1,  
  25.                 "kouWeiScore" : 2.6,  
  26.                 "hotLevel" : 3.0  
  27.             }, {  
  28.                 "name" : "回锅肉",  
  29.                 "id" : 4,  
  30.                 "price" : 13.0,  
  31.                 "notes" : "好吃的不得了-回锅肉",  
  32.                 "foodTypeId" : 1,  
  33.                 "kouWeiScore" : 3.1,  
  34.                 "hotLevel" : 3.8  
  35.             }, {  
  36.                 "name" : "宫保鸡丁",  
  37.                 "id" : 5,  
  38.                 "price" : 14.0,  
  39.                 "notes" : "好吃的不得了-宫保鸡丁",  
  40.                 "foodTypeId" : 1,  
  41.                 "kouWeiScore" : 3.7,  
  42.                 "hotLevel" : 5.0  
  43.             }, {  
  44.                 "name" : "苦瓜炒蛋",  
  45.                 "id" : 6,  
  46.                 "price" : 9.0,  
  47.                 "notes" : "好吃的不得了-宫保鸡丁",  
  48.                 "foodTypeId" : 1,  
  49.                 "kouWeiScore" : 4.9,  
  50.                 "hotLevel" : 4.7  
  51.             }, {  
  52.                 "name" : "莴笋肉片",  
  53.                 "id" : 7,  
  54.                 "price" : 10.0,  
  55.                 "notes" : "好吃的不得了-莴笋肉片",  
  56.                 "foodTypeId" : 1,  
  57.                 "kouWeiScore" : 2.6,  
  58.                 "hotLevel" : 3.9  
  59.             }]  
  60. }  

10.  OK! 返回数据正确。


************************************************Spring 是用ObjectMapper 将 数据转换成json 数据的*****************************

下面自己写了个转换的例子:

ObjectMapperTest.java

[html] view plaincopy
  1. package com.bean.test;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import org.codehaus.jackson.map.ObjectMapper;  
  9.   
  10. public class ObjectMapperTest {  
  11.   
  12.     /**  
  13.      * @param args  
  14.      */  
  15.     public static void main(String[] args) throws Exception {  
  16.           
  17.         ObjectMapper mapper=new ObjectMapper();  
  18.           
  19.         Map<String,Object> foodListData=new HashMap<String,Object>();  
  20.         List list=new ArrayList();  
  21.           
  22.         Map<String,Object> foodData=new HashMap<String,Object>();  
  23.         foodData.put("id", 1);  
  24.         foodData.put("name", "鱼香肉丝");  
  25.         foodData.put("price", 12.00);  
  26.         foodData.put("notes", "好吃啊,真的!");  
  27.         foodData.put("kouWeiScore", 4.5);  
  28.         foodData.put("hotLevel", 5.0);  
  29.           
  30.         list.add(foodData);  
  31.           
  32.         foodListData.put("foodlist", list);  
  33.   
  34.         String str=mapper.writeValueAsString(foodListData);  
  35.         System.out.println(str);  
  36.     }  
  37.   
  38. }  

上述程序输出的是:

    {"foodlist":[{"id":1,"kouWeiScore":4.5,"price":12.0,"hotLevel":5.0,"name":"鱼香肉丝","notes":"好吃啊,真的!"}]}

format 下:

   {
    "foodlist" : [{
                "id" : 1,
                "kouWeiScore" : 4.5,
                "price" : 12.0,
                "hotLevel" : 5.0,
                "name" : "鱼香肉丝",
                "notes" : "好吃啊,真的!"
            }]
}


好吧,就到这里了。基本架子搭好,接着,就用这个架子来 实现 Android 客户端+Spring MVC 去做后面的项目。继续挖矿。。。。


0 0