文档章节

Android入门:通过XML数据与服务器进行通信

mickelfeng
 mickelfeng
发布于 2014/01/04 00:03
字数 732
阅读 23
收藏 0

一、与服务器通信


类似于浏览器与服务器通信,Android应用也可以与Web服务器通信,比如Android应用可以访问Servlet、JSP、图片等等;

Web服务器通过指定Content-Type可以指定返回的数据的类型,比如text/html表示网页,text/xml表示XML数据,image/jpeg为图片;


二、通过XML让客户端和服务器交流数据


比如Android客户端打开相亲网,则返回的是多个人的序列,包含人的姓名、年龄等信息,而怎么组织这些数据返回给客户端呢?用XML很方便;

三、代码实现

服务器使用了dom4j组织XML数据,并返回给客户端;

代码结构如下:


[java] view plaincopy

  1. package org.xiazdong.servlet;  

  2.   

  3. import java.io.IOException;  

  4. import java.util.ArrayList;  

  5. import java.util.List;  

  6.   

  7. import javax.servlet.ServletException;  

  8. import javax.servlet.annotation.WebServlet;  

  9. import javax.servlet.http.HttpServlet;  

  10. import javax.servlet.http.HttpServletRequest;  

  11. import javax.servlet.http.HttpServletResponse;  

  12.   

  13. import org.dom4j.Document;  

  14. import org.dom4j.DocumentHelper;  

  15. import org.dom4j.Element;  

  16. import org.xiazdong.domain.Person;  

  17.   

  18.   

  19. @WebServlet("/ListServlet")  

  20. public class ListServlet extends HttpServlet {  

  21.     private static final long serialVersionUID = 1L;  

  22.   

  23.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  

  24.         doPost(request,response);  

  25.     }  

  26.   

  27.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  

  28.         List<Person> list = new ArrayList<Person>();  

  29.         for(int i=0;i<4;i++){  

  30.             Person person = new Person(i,"xiazdong-"+i,20+i);  

  31.             list.add(person);  

  32.         }  

  33.         Document document = DocumentHelper.createDocument();  

  34.         Element persons = DocumentHelper.createElement("persons");  

  35.         document.add(persons);  

  36.         for(int i=0;i<4;i++){  

  37.             persons.addElement("person").addAttribute("id", list.get(i).getId()+"");  

  38.             persons.addElement("name").addText(list.get(i).getName());  

  39.             persons.addElement("age").addText(list.get(i).getAge()+"");  

  40.         }  

  41.         String xml = document.asXML();  //用dom4j组织一个XML字符串  

  42.         response.setContentType("text/xml; charset=UTF-8"); //设置返回值的类型  

  43.         response.getOutputStream().write(xml.getBytes("UTF-8"));    //设置返回值  

  44.     }  

  45.   

  46. }  



如果让浏览器访问,效果如下:

(注:Chrome打开总是显示不出XML声明。请用IE打开)


接下来,我们可以开发客户端,目标是用列表显示这些数据;

在AndroidManifest.xml中加入:

[html] view plaincopy

  1. <uses-permission android:name="android.permission.INTERNET" />  

每个item的布局如下:

[html] view plaincopy

  1. <?xml version="1.0" encoding="utf-8"?>  

  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  

  3.     android:layout_width="match_parent"  

  4.     android:layout_height="match_parent"  

  5.     android:orientation="horizontal" >  

  6.   

  7.     <TextView  

  8.         android:layout_width="50dp"  

  9.         android:layout_height="wrap_content"   

  10.         android:id="@+id/id"  

  11.         />  

  12.     <TextView  

  13.         android:layout_width="100dp"  

  14.         android:layout_height="wrap_content"   

  15.         android:id="@+id/name"  

  16.         /><TextView  

  17.         android:layout_width="50dp"  

  18.         android:layout_height="wrap_content"   

  19.         android:id="@+id/age"  

  20.         />  

  21.   

  22. </LinearLayout>  



MainActivity.java

[java] view plaincopy

  1. package org.xiazdong.personlist;  

  2.   

  3. import java.io.InputStream;  

  4. import java.net.HttpURLConnection;  

  5. import java.net.URL;  

  6. import java.util.ArrayList;  

  7. import java.util.HashMap;  

  8. import java.util.List;  

  9. import java.util.Map;  

  10.   

  11. import org.xiazdong.domain.Person;  

  12. import org.xmlpull.v1.XmlPullParser;  

  13.   

  14. import android.app.Activity;  

  15. import android.os.Bundle;  

  16. import android.util.Log;  

  17. import android.util.Xml;  

  18. import android.widget.ListView;  

  19. import android.widget.SimpleAdapter;  

  20.   

  21. public class MainActivity extends Activity {  

  22.     private ListView listView;  

  23.   

  24.     @Override  

  25.     public void onCreate(Bundle savedInstanceState) {  

  26.         super.onCreate(savedInstanceState);  

  27.         setContentView(R.layout.main);  

  28.         listView = (ListView) this.findViewById(R.id.listview);  

  29.         List<Person> persons = null;  

  30.         try {  

  31.             persons = getXMLData();  

  32.         } catch (Exception e) {  

  33.             e.printStackTrace();  

  34.         }  

  35.         List<Map<String, Object>> maps = new ArrayList<Map<String, Object>>();  

  36.         for (Person person : persons) {  

  37.             HashMap<String, Object> map = new HashMap<String, Object>();  

  38.             map.put("id", person.getId());  

  39.             map.put("name", person.getName());  

  40.             map.put("age", person.getAge());  

  41.             maps.add(map);  

  42.         }  

  43.         SimpleAdapter adapter = new SimpleAdapter(this, maps, R.layout.item,  

  44.                 new String[] { "id""name""age" }, new int[] { R.id.id,  

  45.                         R.id.name, R.id.age });  

  46.         listView.setAdapter(adapter);  

  47.     }  

  48.   

  49.     //读取XML数据并转为List<Person>  

  50.     private List<Person> getXMLData() throws Exception {  

  51.         List<Person> persons = new ArrayList<Person>();  

  52.         Person person = null;  

  53.         URL url = new URL("http://192.168.0.103:8080/Server/ListServlet");  

  54.         HttpURLConnection conn = (HttpURLConnection) url.openConnection();  

  55.         conn.setRequestMethod("GET");  

  56.         if (conn.getResponseCode() == 200) {  

  57.             InputStream in = conn.getInputStream();  

  58.             XmlPullParser parser = Xml.newPullParser();  

  59.             parser.setInput(in, "UTF-8");  

  60.             int event = parser.getEventType();  

  61.             while (event != XmlPullParser.END_DOCUMENT) {  

  62.                 Log.i("start_document""start_document");  

  63.                 switch (event) {  

  64.                 case XmlPullParser.START_TAG:  

  65.                     if ("person".equals(parser.getName())) {  

  66.                         person = new Person();  

  67.                         person.setId(Integer.parseInt(parser.getAttributeValue(0)));  

  68.                     }  

  69.                     if (("name").equals(parser.getName())) {  

  70.                         person.setName(parser.nextText());  

  71.                     }  

  72.                     if ("age".equals(parser.getName())) {  

  73.                         person.setAge(Integer.parseInt(parser.nextText()));  

  74.                     }  

  75.                     break;  

  76.                 case XmlPullParser.END_TAG:  

  77.                     if ("person".equals(parser.getName())) {  

  78.                         persons.add(person);  

  79.                         Log.i("person", person.toString());  

  80.                     }  

  81.                     break;  

  82.                 }  

  83.                 event = parser.next();  

  84.             }  

  85.         }  

  86.         return persons;  

  87.   

  88.     }  

  89. }  


效果如下:


本文转载自:http://blog.csdn.net/xiazdong/article/details/7720483

共有 人打赏支持
mickelfeng

mickelfeng

粉丝 234
博文 2762
码字总数 596815
作品 0
成都
高级程序员
私信 提问
Android零基础入门第78节:四大组件的纽带——Intent

前面学习Activity时己经多次使用了 Intent,当一个Activity需要启动另一个Activity时, 程序并没有直接告诉系统要启动哪个Activity,而是通过Intent来表达自己的意图:需要启动哪个Activity。...

鑫鱻
2017/10/18
0
0
android程序和服务器端(mysql)怎么通信呢?

android程序和服务器端(mysql)怎么通信呢? 突然想开发个android应用。之前没有接触过android,只有web开发经历。 然后百度一番,可能需要这样通信, 1,通过http,如php作为中介进行通信,...

落舞者
2013/01/20
4.8K
6
关于使用adb建立pc端与设备的通信问题

大家好,情况描述是这样的,android设备开启USB调试模式,使用USB数据线连接至PC,与PC之间建立通信。 Andorid提供了一个工具---adb adb有一个forward使用方法,但是始终还未能弄清楚,这个f...

大王叫我来巡山
2012/09/25
919
0
Android 推送通知指南

在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相对比...

鉴客
2011/10/16
32.7K
35
Android推送通知指南

在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户 端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相对...

LiSteven
2013/03/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C++ vector和list的区别

1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。 因此能高效的进行随机存取,时间复杂度为o(1); 但因为内存空间是连续的,所以在进行插入和删除操作时,会造...

shzwork
今天
3
0
Spring之invokeBeanFactoryPostProcessors详解

Spring的refresh的invokeBeanFactoryPostProcessors,就是调用所有注册的、原始的BeanFactoryPostProcessor。 相关源码 public static void invokeBeanFactoryPostProcessors(Configu......

cregu
昨天
4
0
ibmcom/db2express-c_docker官方使用文档

(DEPRECIATED) Please check DB2 Developer-C Edition for the replacement. What is IBM DB2 Express-C ? ``IBM DB2 Express-C``` is the no-charge community edition of DB2 server, a si......

BG2KNT
昨天
3
0
Ubuntu 18.04.2 LTS nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic)

平台:Ubuntu 18.04.2 LTS nvidia-docker2 版本:2.0.3 错误描述:在安装nvidia-docker2的时候报dpkg依赖错误 nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) 先看一下依......

Pulsar-V
昨天
4
0
学习笔记1-goland结构体(struct)

写在前面:若有侵权,请发邮件by.su@qq.com告知。 转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉! 本文永久更新地址:https://my.oschina.net/bysu/blog/3036...

不最醉不龟归
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部