Android获取服务器上格式为JSON和XML两种格式的信息的小程序

jopen 12年前

首先写一个应用服务器端的jsp程序,用jsp和servlet简单实现,如下图所示

Android获取服务器上格式为JSON和XML两种格式的信息的小程序

 

 

package cn.roco.domain;    public class News {   private Integer id;   private String title;   private Integer timelength;     public News() {   }     public News(Integer id, String title, Integer timelength) {    this.id = id;    this.title = title;    this.timelength = timelength;   }     public Integer getId() {    return id;   }     public void setId(Integer id) {    this.id = id;   }     public String getTitle() {    return title;   }     public void setTitle(String title) {    this.title = title;   }     public Integer getTimelength() {    return timelength;   }     public void setTimelength(Integer timelength) {    this.timelength = timelength;   }    }

 

 

package cn.roco.service;    import java.util.List;    import cn.roco.domain.News;    public interface VideoNewsService {     /**    * 获取最新视频资讯    * @return    */   public List<News> getLastNews();    }



 

package cn.roco.service.impl;    import java.util.ArrayList;  import java.util.List;    import cn.roco.domain.News;  import cn.roco.service.VideoNewsService;    public class VideoNewsServiceBean implements VideoNewsService{   /**    * 模拟从服务器中获取数据  返回    */   public List<News> getLastNews(){    List<News> newses=new ArrayList<News>();    for (int i = 1; i < 30; i++) {     newses.add(new News(i,"Xili"+i,i+90));    }    return newses;   }  }


 
 

package cn.roco.servlet;    import java.io.IOException;  import java.util.List;    import javax.servlet.ServletException;  import javax.servlet.http.HttpServlet;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletResponse;    import cn.roco.domain.News;  import cn.roco.service.VideoNewsService;  import cn.roco.service.impl.VideoNewsServiceBean;    public class ListServlet extends HttpServlet {      private VideoNewsService newsService=new VideoNewsServiceBean();      protected void doGet(HttpServletRequest req, HttpServletResponse resp)     throws ServletException, IOException {    List<News> videos=newsService.getLastNews();    String format=req.getParameter("format");    //返回JSON格式    if ("json".equals(format)) {     StringBuilder builder=new StringBuilder();     builder.append('[');     for (News news : videos) {      builder.append('{');      builder.append("id:").append(news.getId()).append(',');      //转义 ""双引号      builder.append("title:\"").append(news.getTitle()).append("\",");      builder.append("timelength:").append(news.getTimelength());      builder.append("},");     }     builder.deleteCharAt(builder.length()-1);//去掉最后的','     builder.append(']');     req.setAttribute("json", builder.toString());     req.getRequestDispatcher("/WEB-INF/page/jsonvideonews.jsp").forward(req, resp);    }else{     //返回XML格式     req.setAttribute("videos", videos);     req.getRequestDispatcher("/WEB-INF/page/videonews.jsp").forward(req, resp);    }   }     protected void doPost(HttpServletRequest req, HttpServletResponse resp)     throws ServletException, IOException {    doGet(req, resp);   }  }


 

 如果要返回XML文件  就forward到videonews.jsp页面

<%@ page language="java" contentType="text/xml; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><?xml version="1.0" encoding="UTF-8"?>  <videonews>    <c:forEach items="${videos}" var="video">    <news id="${video.id}">     <title>${video.title}</title>     <timelength>${video.timelength}</timelength>     </news>   </c:forEach>   </videonews>


如果要返回XML文件  就forward到videonews.jsp页面 如果要返回JSON文件 就forward到jsonvideonews.jsp页面

<%@ page language="java" contentType="text/plain; charset=UTF-8" pageEncoding="UTF-8"%>  ${json}

 

web.xml

<?xml version="1.0" encoding="UTF-8"?>  <web-app version="2.5"    xmlns="http://java.sun.com/xml/ns/javaee"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">    <servlet>      <description>This is the description of my J2EE component</description>      <display-name>This is the display name of my J2EE component</display-name>      <servlet-name>ListServlet</servlet-name>      <servlet-class>cn.roco.servlet.ListServlet</servlet-class>    </servlet>      <servlet-mapping>      <servlet-name>ListServlet</servlet-name>      <url-pattern>/ListServlet</url-pattern>    </servlet-mapping>    <welcome-file-list>      <welcome-file>index.jsp</welcome-file>    </welcome-file-list>  </web-app>


 


 

服务器端写好之后,就开始写Android应用

架构如下图所示:

 

package cn.roco.news.domain;  public class News {   private Integer id;   private String title;   private Integer timelength;     public News() {   }     public News(Integer id, String title, Integer timelength) {    this.id = id;    this.title = title;    this.timelength = timelength;   }     public Integer getId() {    return id;   }     public void setId(Integer id) {    this.id = id;   }     public String getTitle() {    return title;   }     public void setTitle(String title) {    this.title = title;   }     public Integer getTimelength() {    return timelength;   }     public void setTimelength(Integer timelength) {    this.timelength = timelength;   }    }


 

package cn.roco.utils;    import java.io.ByteArrayOutputStream;  import java.io.InputStream;    public class StremTools {   /**    * 读取输入流中的数据    * @param inputStream  输入流    * @return   二进制的流数据    * @throws Exception    */   public static byte[] read(InputStream inputStream) throws Exception {    ByteArrayOutputStream outputStream=new ByteArrayOutputStream();    byte[] buffer=new byte[1024];    int length=0;    while((length=inputStream.read(buffer))!=-1){     outputStream.write(buffer,0,length);    }    inputStream.close();    return outputStream.toByteArray();   }    }


 

package cn.roco.news.service;    import java.io.InputStream;  import java.net.HttpURLConnection;  import java.net.URL;  import java.util.ArrayList;  import java.util.List;    import org.json.JSONArray;  import org.json.JSONObject;  import org.xmlpull.v1.XmlPullParser;    import android.util.Xml;    import cn.roco.news.domain.News;  import cn.roco.utils.StremTools;    public class VideoNewsService {      /**    * 获取最新的视频资讯    * 采用JSON格式    * @param path    * @return    * @throws Exception    */   public static List<News> getJSONLastNews(String path) throws Exception {    URL url = new URL(path);    HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 基于HTTP协议连接对象    connection.setConnectTimeout(5000);    connection.setRequestMethod("GET");    if (connection.getResponseCode() == 200) {     InputStream inputStream = connection.getInputStream();     return parseJSON(inputStream);    }else{     throw new RuntimeException("服务器响应失败");    }   }   /**    * 解析服务器返回的JSON数据    *     * @param inputStream    * @return    * @throws Exception     */   private static List<News> parseJSON(InputStream inputStream) throws Exception {    List<News> newses=new ArrayList<News>();    byte[] data=StremTools.read(inputStream);    String jsonData=new String(data,"UTF-8");    JSONArray array=new JSONArray(jsonData);     for (int i = 0; i < array.length(); i++) {      JSONObject jsonObject= array.getJSONObject(i);      News news=new News( jsonObject.getInt("id"), jsonObject.getString("title"),jsonObject.getInt("timelength"));      newses.add(news);    }    return newses;   }     /**    * 获取最新的视频资讯    * 采用XML格式    * @param path    * @return    * @throws Exception    */   public static List<News> getLastNews(String path) throws Exception {    URL url = new URL(path);    HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 基于HTTP协议连接对象    connection.setConnectTimeout(5000);    connection.setRequestMethod("GET");    if (connection.getResponseCode() == 200) {     InputStream inputStream = connection.getInputStream();     return parseXML(inputStream);    }    return null;   }     /**    * 解析服务器返回的XML数据    *     * @param inputStream    * @return    */   private static List<News> parseXML(InputStream inputStream) throws Exception {    List<News> newses = new ArrayList<News>();    News news = null;    XmlPullParser parser = Xml.newPullParser();    parser.setInput(inputStream, "UTF-8");    int event = parser.getEventType();    while (event != XmlPullParser.END_DOCUMENT) {     switch (event) {     case XmlPullParser.START_TAG:      if ("news".equals(parser.getName())) {       int id = new Integer(parser.getAttributeValue(0));       news = new News();       news.setId(id);      } else if ("title".equals(parser.getName())) {       news.setTitle(parser.nextText());      } else if ("timelength".equals(parser.getName())) {       news.setTimelength(new Integer(parser.nextText()));      }      break;     case XmlPullParser.END_TAG:      if ("news".equals(parser.getName())) {       newses.add(news);       news = null;      }      break;     }     event = parser.next();    }    return newses;   }  }

package cn.roco.news;    import java.util.ArrayList;  import java.util.HashMap;  import java.util.List;    import cn.roco.news.domain.News;  import cn.roco.news.service.VideoNewsService;  import android.app.Activity;  import android.os.Bundle;  import android.widget.ListView;  import android.widget.SimpleAdapter;  import android.widget.Toast;    public class MainActivity extends Activity {   /** Called when the activity is first created. */   @Override   public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);      ListView listView = (ListView) findViewById(R.id.listView);    try {     //采用XML格式  //   String xmlPath="http://192.168.15.58:8080/Hello/ListServlet";  //   List<News> videos = VideoNewsService.getLastNews();          //采用JSON格式     String jsonPath="http://192.168.15.58:8080/Hello/ListServlet?format=json";     List<News> videos = VideoNewsService.getJSONLastNews(jsonPath);         List<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();     for (News news : videos) {      HashMap<String, Object> item = new HashMap<String, Object>();      item.put("id", news.getId());      item.put("title", news.getTitle());      item.put(        "timelength",        getResources().getString(R.string.timelength)          + news.getTimelength()          + getResources().getString(R.string.min));      data.add(item);     }     SimpleAdapter adapter = new SimpleAdapter(this, data,       R.layout.item, new String[] { "title", "timelength" },       new int[] { R.id.title, R.id.timelength });     listView.setAdapter(adapter);    } catch (Exception e) {     Toast.makeText(getApplicationContext(), "有错", 1);     e.printStackTrace();    }   }  }


 item.xml

<?xml version="1.0" encoding="utf-8"?>  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   android:orientation="horizontal" android:layout_width="fill_parent"   android:layout_height="fill_parent">   <TextView android:id="@+id/title" android:layout_width="200dp"    android:layout_height="wrap_content"/>   <TextView android:id="@+id/timelength" android:layout_width="fill_parent"    android:layout_height="wrap_content"/>  </LinearLayout>


main.xml

<?xml version="1.0" encoding="utf-8"?>  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   android:orientation="vertical" android:layout_width="fill_parent"   android:layout_height="fill_parent">     <LinearLayout android:orientation="horizontal"    android:layout_width="wrap_content" android:layout_height="wrap_content">    <TextView android:text="@string/title" android:layout_width="200dp"     android:layout_height="wrap_content" />    <TextView android:text="@string/details" android:layout_width="wrap_content"     android:layout_height="wrap_content" />   </LinearLayout>     <ListView android:layout_width="fill_parent"    android:layout_height="wrap_content" android:id="@+id/listView" />  </LinearLayout>

 

string.xml

<?xml version="1.0" encoding="utf-8"?>  <resources>      <string name="hello">Hello World, MainActivity!</string>      <string name="app_name">视频资讯</string>      <string name="timelength">时长:</string>      <string name="min">分钟</string>      <string name="title">标题</string>      <string name="details">详情</string>  </resources>

<?xml version="1.0" encoding="utf-8"?>  <manifest xmlns:android="http://schemas.android.com/apk/res/android"        package="cn.roco.news"        android:versionCode="1"        android:versionName="1.0">      <uses-sdk android:minSdkVersion="8" />     <!-- 访问Internet权限 -->   <uses-permission android:name="android.permission.INTERNET"/>        <application android:icon="@drawable/icon" android:label="@string/app_name">          <activity android:name=".MainActivity"                    android:label="@string/app_name">              <intent-filter>                  <action android:name="android.intent.action.MAIN" />                  <category android:name="android.intent.category.LAUNCHER" />              </intent-filter>          </activity>        </application>  </manifest>

 

运行效果如图所示:
 Android获取服务器上格式为JSON和XML两种格式的信息的小程序