Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程

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

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

1. web.xml 的内容如下:

[html] view plain copy print ?
  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. <servlet-mapping>
  10. <servlet-name>foodcenter</servlet-name>
  11. <url-pattern>*.json</url-pattern>
  12. </servlet-mapping>
  13. </web-app>

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

[html] view plain copy print ?
  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. <context:annotation-config/>
  12. <!-- Controller 类的注解标识-->
  13. <context:component-scan base-package="com.liuxi.foodcenter.controller"/>
  14. <!--这个ViewResolver 的具体原来没细究,不过CV战士们 中的一员,这样用是没问题的(参考官文) -->
  15. <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
  16. <property name="mediaTypes">
  17. <map>
  18. <entry key="json" value="application/json"/> <!-- 告诉视图解析器 返回的类型为json 格式 -->
  19. </map>
  20. </property>
  21. <property name="defaultViews">
  22. <list>
  23. <!-- 这个 View 比较重要,ModelAndView 里的数据变成JSON -->
  24. <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
  25. </bean>
  26. </list>
  27. </property>
  28. </bean>
  29. <!--真正的项目,业务Bean 有专门对应的配置文件,这里为了简单起见,就写在这里了 -->
  30. <bean id="foodService" class="com.liuxi.food.service.FoodServiceImpl"/>
  31. </beans>

3. 子控制器FindFoodListController.java

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

4. FoodServiceImpl.java

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

5.IFoodService.java

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

6.Food.java

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

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


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

上述程序输出的是:

{"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 去做后面的项目。继续挖矿。。。。

你可能感兴趣的:(spring,android,json,mvc,api,服务器)