我的Android进阶之旅------>Android获取服务器上格式为JSON和XML两种格式的信息的小程序

简介:     首先写一个应用服务器端的jsp程序,用jsp和servlet简单实现,如下图所示     package cn.roco.domain;public class News { private Integer id; private...

 

 

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

 

 

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>

 

运行效果如图所示:
 


==================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址http://blog.csdn.net/ouyang_peng

==================================================================================================


 
相关文章
|
6月前
|
JSON 算法 vr&ar
目标检测笔记(五):查看通过COCOEvaluator生成的coco_instances_results.json文件的详细检测信息,包含AP、AR、MR和DR等
本文介绍了如何使用COCO评估器通过Detectron2库对目标检测模型进行性能评估,生成coco_instances_results.json文件,并利用pycocotools解析该文件以计算AP、AR、MR和DR等关键指标。
418 1
目标检测笔记(五):查看通过COCOEvaluator生成的coco_instances_results.json文件的详细检测信息,包含AP、AR、MR和DR等
|
19天前
|
JSON JavaScript 前端开发
怎么安装JSON服务器?JSON服务器最新安装教程
JSON Server是一款轻量级工具,基于Node.js运行,可通过单个JSON文件快速模拟RESTful API,适用于开发与测试场景。其支持CRUD操作、自定义路由及高级功能如排序、搜索、分页等,同时允许通过中间件扩展功能。为确保安全性,建议在受控环境中使用,并避免处理敏感数据。此外,还有Mirage JS、Mockoon、WireMock和Postman等替代方案,可根据项目需求选择合适的工具。
46 0
|
4月前
|
人工智能 JSON Linux
利用阿里云GPU加速服务器实现pdf转换为markdown格式
随着AI模型的发展,GPU需求日益增长,尤其是个人学习和研究。直接购置硬件成本高且更新快,建议选择阿里云等提供的GPU加速型服务器。
利用阿里云GPU加速服务器实现pdf转换为markdown格式
|
4月前
|
XML Java 数据格式
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
本文介绍了在使用Spring框架时,如何通过创建`applicationContext.xml`配置文件来管理对象。首先,在resources目录下新建XML配置文件,并通过IDEA自动生成部分配置。为完善配置,特别是添加AOP支持,可以通过IDEA的Live Templates功能自定义XML模板。具体步骤包括:连续按两次Shift搜索Live Templates,配置模板内容,输入特定前缀(如spring)并按Tab键即可快速生成完整的Spring配置文件。这样可以大大提高开发效率,减少重复工作。
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
|
8月前
|
XML SQL 数据格式
XML动态sql查询当前时间之前的信息报错
XML动态sql查询当前时间之前的信息报错
81 2
|
6月前
|
Java Unix Linux
Android Studio中Terminal运行./gradlew clean build提示错误信息
遇到 `./gradlew clean build`命令执行出错时,首先应检查错误信息的具体内容,这通常会指向问题的根源。从权限、环境配置、依赖下载、版本兼容性到项目配置本身,逐一排查并应用相应的解决措施。记住,保持耐心,逐步解决问题,往往复杂问题都是由简单原因引起的。
612 2
|
5月前
|
存储 JSON 监控
公司用什么软件监控电脑:JSON 在监控信息交互中的应用探索
在现代企业管理中,电脑监控软件广泛应用于保障信息安全和提升工作效率。JSON(JavaScript Object Notation)因其简洁和易读性,在监控信息的收集、传输和处理中扮演着关键角色。本文介绍了 JSON 在监控数据结构、信息传输及服务器端处理中的具体应用,展示了其在高效监控系统中的重要性。
64 0
|
6月前
|
XML JSON 前端开发
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
1194 0
|
8月前
|
JSON API 数据格式
基于服务器响应的实时天气数据进行JSON解析的详细代码及其框架
【8月更文挑战第25天】这段资料介绍了一个使用Python从服务器获取实时天气数据并解析JSON格式数据的基本框架。主要分为三个部分:一是安装必要的`requests`库以发起HTTP请求获取数据,同时利用Python内置的`json`库处理JSON数据;二是提供了具体的代码实现,包括获取天气数据的`get_weather_data`函数和解析数据的`parse_weather_data`函数;三是对代码逻辑进行了详细说明,包括如何通过API获取数据以及如何解析这些数据来获取温度和天气描述等信息。用户需要根据实际使用的天气API调整代码中的API地址、参数和字段名称。
148 0
|
8月前
|
Java
Java模拟文件发送给服务器,服务器将文件转发给其他用户,并保存到服务器本地,其他用户可以接收,并保存到本地磁盘,支持各种文件格式,并解决通信中服务器怎么区分客户端发来的文件类型
Java模拟文件发送给服务器,服务器将文件转发给其他用户,并保存到服务器本地,其他用户可以接收,并保存到本地磁盘,支持各种文件格式,并解决通信中服务器怎么区分客户端发来的文件类型