Android网络编程之获取网络上的XML

Android网络编程之获取网络上的XML

请尊重他人的劳动成果,转载请注明出处:Android网络编程之获取网络上的XML

为要获取网络上的XML所以需要服务器端提供的支持。

一、创建服务器端:

服务器端项目结构:

服务器端运行效果图:

第一步:创建业务所需的JavaBean

package com.jph.server.model;

import java.util.Date;

/**
 * 新闻实体类
 * @author jph
 * Date:2014.09.26
 */
public class News {
	private Integer id;
	private String title;
	private Date publishDate;

	public News(Integer id, String title, Date publishDate) {
		this.id = id;
		this.title = title;
		this.publishDate = publishDate;
	}
	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 Date getPublishDate() {
		return publishDate;
	}
	public void setPublishDate(Date publishDate) {
		this.publishDate = publishDate;
	}
}

第二步:创建业务逻辑接口和具体实现类

业务接口:

package com.jph.server.service;
import java.util.List;

import com.jph.server.model.News;

public interface XMLService {
	/**
	 * 获取最新的资讯
	 * @return
	 */
	public List<News> getLastNews();

}

业务接口的实现类:

package com.jph.server.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.jph.server.model.News;
import com.jph.server.service.XMLService;

public class XMLServiceBean implements XMLService {
	/**
	 * 获取最新的视频资讯
	 * @return
	 */
	public List<News> getLastNews(){
		List<News> newes = new ArrayList<News>();
		newes.add(new News(1, "jph", new Date(System.currentTimeMillis()+100002)));
		newes.add(new News(2, "admin",new Date(System.currentTimeMillis()+330002)));
		newes.add(new News(3, "tom", new Date(System.currentTimeMillis()+180002)));
		return newes;
	}
}

第三步:创建控制器Servlet

package com.jph.server.xml;

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 com.jph.server.model.News;
import com.jph.server.service.XMLService;
import com.jph.server.service.impl.XMLServiceBean;

/**
 * 负责响应客户端的请求:http://xxx/ServerForXML/ServletForXMLServlet
 */
public class ServletForXML extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private XMLService newsService = new XMLServiceBean();

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		List<News> newes = newsService.getLastNews();//获取最新的视频资讯
			request.setAttribute("newes", newes);
			//将客户端的请求转向news.jsp页面
			request.getRequestDispatcher("/WEB-INF/page/news.jsp").forward(request, response);
	}
}

第四步:使用jstl标签生成XML文件

因此需要使用jstl标签所以需要将jstl.jar与standard.jar两个jar包导入项目中。

使用jstl标签在jsp页面生成XML:

news.jsp页面:

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

至此服务器端项目已经完成。下面开始创建Android端项目。

二、创建Android端:

Android端项目结构:

第一步:创建业务所需的JavaBean

提示:因为服务器端和Android端项目都是用Java语言实现的,所以一些组件可以共用,JavaBean便是其中之一。此时我们在搭建Android端项目的时候,完全可以将服务器端项目中JavaBean拿来用。

第二步:创建Android端项目的业务逻辑层

核心代码:GetXmlAndParse.java:

package com.jph.gxfi.service;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import com.jph.gxfi.model.News;
import android.os.Handler;
import android.os.Message;
import android.util.Xml;

/**
 * 获取网络上的xml,并解析
 * @author jph
 * Date:2014.09.26
 */
public class GetXmlAndParse {
	private String url="http://10.219.61.117:8080/ServerForXML/ServletForXML";
	public static final int PARSESUCCWSS=0x2001;
	private Handler handler;
	public GetXmlAndParse(Handler handler) {
		// TODO Auto-generated constructor stub
		this.handler=handler;
	}
	/**
	 * 获取网络上的XML
	 */
	public void getXml(){
		new Thread(new Runnable() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				try {
					HttpURLConnection conn=(HttpURLConnection)new
							URL(url).openConnection();
					conn.setConnectTimeout(5000);//设置连接超时
					conn.setRequestMethod("GET");
					if (conn.getResponseCode()==200) {
						InputStream inputStream=conn.getInputStream();
						List<News> listNews=pullXml(inputStream);
						if (listNews.size()>0) {//如果解析结果不为空则将解析出的数据发送给UI线程
							Message msg=new Message();
							msg.obj=listNews;
							msg.what=PARSESUCCWSS;
							handler.sendMessage(msg);
						}
					}
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}//和服务器建立连接
			}
		}).start();
	}
	/**
	 * 解析Xml,并将其封装成
	 * @param inputStream
	 */
	protected List<News> pullXml(InputStream inputStream) {
		List<News>listNews=new ArrayList<News>();
		try {
			XmlPullParser pullParser=Xml.newPullParser();
			News news=null;
			pullParser.setInput(inputStream, "utf-8");
			int eventCode=pullParser.getEventType();
			while (eventCode!=XmlPullParser.END_DOCUMENT) {
				String targetName=pullParser.getName();
				switch (eventCode) {
				case XmlPullParser.START_TAG:
					if ("news".equals(targetName)) {//处理news的开始节点
						news =new News();
						news.setId(new Integer(pullParser.getAttributeValue(0)));
					}else if ("title".equals(targetName)) {
						news.setTitle(pullParser.nextText());
					}else if ("publishDate".equals(targetName)) {
						news.setPublishDate(new Date(pullParser.nextText()));
					}
					break;
				case XmlPullParser.END_TAG:
					if ("news".equals(targetName)) {//处理news的结束节点
						listNews.add(news);
					}
					break;

				}
				eventCode=pullParser.next();//解析下一个节点(开始节点,结束节点)
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return listNews;
	}
}

第三步:创建Activity

package com.jph.gxfi.activity;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.jph.gxfi.R;
import com.jph.gxfi.model.News;
import com.jph.gxfi.service.GetXmlAndParse;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.app.Activity;

/**
 * 获取网络上的xml
 * @author jph
 * Date:2014.09.26
 */
public class MainActivity extends Activity {
	private List<News>listNews;
	private ListView list;
	Handler mHandler=new Handler(){
		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			switch (msg.what) {
			case GetXmlAndParse.PARSESUCCWSS:
				listNews=(List<News>) msg.obj;
				initData();
				break;
			}
			super.handleMessage(msg);
		}
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		list=(ListView)findViewById(R.id.list);
		GetXmlAndParse getXmlAndParse=new GetXmlAndParse(mHandler);
		getXmlAndParse.getXml();
	}
	/**
	 * 将解析后的xml填充到ListView
	 */
	protected void initData() {
		// TODO Auto-generated method stub
		List<Map<String, Object>>items=new ArrayList<Map<String,Object>>();
		for (News news:listNews) {
			Map<String, Object>item=new HashMap<String, Object>();
			item.put("id", news.getId());
			item.put("title", news.getTitle());
			item.put("time", convertDate(news.getPublishDate()));
			items.add(item);
		}
		SimpleAdapter adapter=new SimpleAdapter(this, items, R.layout.line, new String[]
				{"id","title","time"}, new int[]{R.id.tvId,R.id.tvTitle,R.id.tvTime});
		list.setAdapter(adapter);
	}
	private String convertDate(Date publishDate) {
		// TODO Auto-generated method stub
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
		return sdf.format(publishDate);
	}
}

至此Android端项目已经完成了。下面就让我们看一下APP运行效果吧:

Android运行效果图:

时间: 2024-10-01 22:00:05

Android网络编程之获取网络上的XML的相关文章

Android网络编程之获取网络上的Json

Android网络编程之获取网络上的Json 请尊重他人的劳动成果,转载请注明出处:Android网络编程之获取网络上的Json 为要获取网络上的Json所以需要服务器端提供的支持. 一.创建服务器端: 服务器端项目结构: 服务器端运行效果图: 第一步:创建业务所需的JavaBean package com.jph.sj.model; import java.util.Date; /** * 新闻实体类 * @author jph * Date:2014.09.26 */ public clas

javaAPI_网络编程基础_网络编程基础1

网络编程基础 1.网络编程概述 (1).计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件 及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统. (2).网络编程 就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换. 2.网络模型概述以及图解 (1).计算机网络之间以何种规则进行通信,就是网络模型研究问题. (2).网络模型一般是指 OSI(Open System Interconnection开放系

网络编程练习 -- 检测网络状态

LWTViewController.m // // LWTViewController.m // 网络编程练习 -- 检测网络状态 // // Created by apple on 14-7-2. // Copyright (c) 2014年 lwt. All rights reserved. // #import "LWTViewController.h" #import "Reachability.h" @interface LWTViewController

Android中网络编程以及与服务器上Web项目的基础交互

该博文中内容通过老师上课的内容对于Android下的网络通信编程等内容进行总结: 1.Android网络编程初识 2.Android实现HTML源码查看 3.Android实现网络图片查看 4.Android实现与服务器上JavaWeb项目交互 1.Android网络编程初识 Android手机终端作为客户端发送Http请求到终端服务器上,并且当发送请求到服务器,如果请求成功,响应码:200:服务器会通过客户端返回请求并且处理后的信息数据,一般情况下,在正式项目中多用JSON,不会使用没有规定格

Delphi For Android 使用Posix函数获取网络信息(MAC, IP...)

安卓中获取系统当前活动的网卡MAC地址和IP地址时,需要使用到java.net.networkinterface库,在Delphi中虽然可以调用java库, 但是如果没有现成的java库(jar.class等),也会比较麻烦,这里使用posix函数实现获取MAC和IP地址,不需要root权限, 但理论上应该需要设置查询网络状态和WIFI状态权限: <!-- 获取网络状态的权限 --> <uses-permission android:name="android.permissi

网络编程模型及网络编程三要素

网络模型 计算机网络之间以何种规则进行通信,就是网络模型研究问题. 网络模型一般是指 OSI(Open SystemInterconnection开放系统互连)参考模型 TCP/IP参考模型 网络模型7层概述: 1.物理层:主要定义物理设备标准,如网线的接口类型.光纤的接口类型.各种传输介质的传输速率等.它的主要作用是传输比特流(就是由1.0转化为电流强弱来进行传输,到达目的地后在转化为1.0,也就是我们常说的数模转换与模数转换).这一层的数据叫做比特. 2. 数据链路层:主要将从物理层接收的数

javaAPI_网络编程基础_网络编程基础2

网络编程基础2 1.TCP协议 (1).实现步骤 A:创建发送端的Socket对象 这一步如果成功,就说明连接已经建立成功了. B:获取输出流,写数据 C:释放资源 连接被拒绝.TCP协议一定要先看服务器. java.net.ConnectException: Connection refused: connect (2).客户端 public static void main(String[] args) throws IOException { // 创建发送端的Socket对象 // So

网络编程 第一部分 网络参考模型

1.ISO(International Organization for Standization),即国际标准化组织制定网络参考模型,自上而下有:应用层.表示层.会话层.传输层.网络层.数据链路层.物理层七层.该模型仅仅是理论上的知道意义,难以投入实际使用.所以出现了TCP/IP网络参考模型. 2.TCP/IP网络参考模型,它是实际意义上的"事实标准".自上而下分为:应用层.传输层.网络互联层.主机-网络层. 其中应用层对应七层模型中的(应用层.表示层.会话层):传输层对应七层模型中

网络编程【Socket网络编程】

java.net.InetAddress类:此类表示互联网协议 (IP) 地址. 静态方法: static InetAddress getLocalHost() 返回本地主机(你自己的使用的电脑). static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址. 非静态方法: String getHostAddress() 返回 IP 地址字符串(以文本表现形式). String getHostName() 获取此 IP 地址的主