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

分享到:

首先写一个应用服务器端的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两种格式的信息的小程序


 

昵    称:
验证码:

相关文档: