`
Mr_Tank_
  • 浏览: 21313 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Android 获取并解析网络XML与数据上传

 
阅读更多

最近比较忙,没什么时间写博客,现在以后多补补吧,这次写的是安卓客户端上传和下载网络数据

原理很简单,使用JDBC读取数据库数据,并在网页输出XML文件;安卓客户端获取XML文件进行解析(这里使用的是PULL方式)

先看下后台和Android客户端代码的结构:


Web后台代码:

1、Model

package com.homework.schoolnews;

public class Schoolnews {
	private int id;  
	private String title;
	private String content;    //内容
	private String shareDate;    //分享时间
	private String pictureuri; //图片路径
	private String shareperson;//分享人
	
	public Schoolnews(int id, String title,String content, String shareDate,
			String pictureuri, String shareperson) {
		super();
		this.id = id;

		this.title = title;
		this.content = content;
		this.shareDate = shareDate;
		this.pictureuri = pictureuri;
		this.shareperson = shareperson;
	}
	public Schoolnews() {
		// TODO Auto-generated constructor stub
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getShareDate() {
		return shareDate;
	}
	public void setShareDate(String shareDate) {
		this.shareDate = shareDate;
	}
	public String getPictureuri() {
		return pictureuri;
	}
	public void setPictureuri(String pictureuri) {
		this.pictureuri = pictureuri;
	}
	public String getShareperson() {
		return shareperson;
	}
	public void setShareperson(String shareperson) {
		this.shareperson = shareperson;
	}
	
	

}

2、JDBC

package myservice;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class JDBCService {
	

	private java.sql.Connection connection=null;
	private java.sql.Statement statement=null;
	private PreparedStatement preparedStatement=null;
	private ResultSet resultSet=null;
	private String className="com.mysql.jdbc.Driver";
	
	//MySQL数据库链接
	private String url="jdbc:mysql://localhost:3306/schoolnews?user=root&password=123456";
	
	//取得数据库连接
	public java.sql.Connection getConnection(){
		try {
			Class.forName(className).newInstance();
			connection=DriverManager.getConnection(url);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return connection;
	}
	
	//关闭数据库
	public void close(){
		try {
			//注意关闭顺序
			if (resultSet!=null) resultSet.close();
			if (statement!=null) statement.close();
			if (preparedStatement!=null) preparedStatement.close();
			if (connection!=null) connection.close();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	//查询并返回结果集
	public ResultSet query(String sql){
		try {
			connection=getConnection();
			statement=connection.createStatement();
			resultSet=statement.executeQuery(sql);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return resultSet;
	}
	
	public void add(String sql){
		try {
			connection=getConnection();
			statement=connection.createStatement();
			statement.execute(sql);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}	
	}

}

3、获取数据库数据

package myservice;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import model.Schoolnews;

public class SchoolNewsXML {

	public List<Schoolnews> getSchoolNews() throws SQLException {
		JDBCService jDBCService = new JDBCService();
		List<Schoolnews> snews = new ArrayList<Schoolnews>();
		Schoolnews schoolnews = null;
		ResultSet resultSet = jDBCService.query("select * from t_snews");
		while (resultSet.next()) {
			schoolnews = new Schoolnews();
			schoolnews.setTitle(resultSet.getString(2));
			schoolnews.setContent(resultSet.getString(3));
			schoolnews.setShareDate(resultSet.getString(4));
			schoolnews.setShareperson(resultSet.getString(5));
			schoolnews.setPictureuri(resultSet.getString(6));
			snews.add(schoolnews);
		}
		return snews;
	}

}

4、ServletForXML

package snewsservlet;

import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;



import model.Schoolnews;
import myservice.SchoolNewsXML;

public class ServletForXML extends HttpServlet {

	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private  SchoolNewsXML  schoolNewsXML=new  SchoolNewsXML();

	public ServletForXML() {
		super();
	}

	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}


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


	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		List<Schoolnews> snews = null;
		try {
			snews = schoolNewsXML.getSchoolNews();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		request.setAttribute("snews", snews);
		
		String path="/index.jsp";
		request.getRequestDispatcher(path);
		ServletContext application =this.getServletContext();
		RequestDispatcher rd=application.getRequestDispatcher(path);
			
		//跳转
		rd.forward(request,response);
		
	
	}

	public void init() throws ServletException {
		// Put your code here
	}

}

5、网页输出XML

<%@ 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"?>
<Schoolnewses><c:forEach items="${snews}"var="Schoolnews">
<Schoolnews id="${Schoolnews.id}">
<title>${Schoolnews. title}</title>
<content>${Schoolnews.content}</content>
<sharedate>${Schoolnews.shareDate}</sharedate>
<shareperson>${Schoolnews.shareperson}</shareperson>
<pictureuri>${Schoolnews.pictureuri}</pictureuri>
</Schoolnews>
</c:forEach> 
</Schoolnewses>

6、Servlet配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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_3_0.xsd">
	<display-name></display-name>
	<servlet>

		<servlet-name>ServletForXML</servlet-name>
		<servlet-class>snewsservlet.ServletForXML</servlet-class>
	</servlet>
	<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>AddsnewsServlet</servlet-name>
		<servlet-class>snewsservlet.AddsnewsServlet</servlet-class>
	</servlet>


	<servlet-mapping>
		<servlet-name>ServletForXML</servlet-name>
		<url-pattern>/servlet/ServletForXML</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>AddsnewsServlet</servlet-name>
		<url-pattern>/servlet/AddsnewsServlet</url-pattern>
	</servlet-mapping>
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>

7、请求:http://localhost:8080/androidHomework/servlet/ServletForXML时得到的效果:


接下来是在Android里面获取并解析xml,以下是主要代码,Activity那些就不贴出来了,主要核心是获取xml和解析xml

8、SchoolNewsService

package com.homework.schoolnews;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.util.Xml;

public class SchoolNewsService {

	public static List<Schoolnews> getSchoolNews()
			throws MalformedURLException, IOException, XmlPullParserException {
		String path = "http://172.19.55.121:8080/androidHomework/servlet/ServletForXML";
		HttpURLConnection con = (HttpURLConnection) new URL(path)
				.openConnection();
		con.setConnectTimeout(15000);
		con.setRequestMethod("GET");
		int i=con.getResponseCode();
		if(i==200){
			InputStream in = con.getInputStream();
			return parseXML(in);
		}
		return null;

	}

	/*
	 * pull方法解析xml
	 */
	
	
	private static List<Schoolnews> parseXML(InputStream in)
			throws XmlPullParserException, IOException {

		List<Schoolnews> snews = null;
		Schoolnews schoolnews = null;
		XmlPullParser pullParser = Xml.newPullParser();
		pullParser.setInput(in, "UTF-8");
		int event = pullParser.getEventType();
		while (event != XmlPullParser.END_DOCUMENT) {
			switch (event) {
			case XmlPullParser.START_DOCUMENT:
				snews = new ArrayList<Schoolnews>();
				break;
			case XmlPullParser.START_TAG:
				if ("Schoolnews".equals(pullParser.getName())) {
					int id = new Integer(pullParser.getAttributeValue(0));
					schoolnews = new Schoolnews();
					schoolnews.setId(id);
				}
				
				if ("title".equals(pullParser.getName())) {
					schoolnews.setTitle(pullParser.nextText());
				}
				if ("content".equals(pullParser.getName())) {
					schoolnews.setContent(pullParser.nextText());
				}
				if ("sharedate".equals(pullParser.getName())) {
					schoolnews.setShareDate(pullParser.nextText());
				}

				if ("shareperson".equals(pullParser.getName())) {
					schoolnews.setShareperson(pullParser.nextText());
				}
				
				if ("pictureuri".equals(pullParser.getName())) {
					schoolnews.setPictureuri(pullParser.nextText());
				}

				break;
			case XmlPullParser.END_TAG:
				if ("Schoolnews".equals(pullParser.getName())) {
					snews.add(schoolnews);
					schoolnews = null;
				}
				break;

			}
			event = pullParser.next();
		}
		return snews;

	}
}
安卓获取并显示数据://2013-08-09 添加-Mr_Tank_
package com.homework.schoolnews;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.homew.shouldnews.R;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.*;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		ImageButton bt_add = (ImageButton) this.findViewById(R.id.snews_add);
		find();
		
		//添加校园新鲜事
		bt_add.setOnClickListener(new ImageButton.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent = new Intent();
				intent.setClass(MainActivity.this, AddsnewsActivity.class);
				startActivity(intent);
			}
		});
		

	}

	private void find(){
		final ListView lv = (ListView) this.findViewById(R.id.snews_listView);
		try {
			List<Schoolnews> snews = SchoolNewsService.getSchoolNews();
			List<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
			for (Schoolnews schoolnews : snews) {
				HashMap<String, Object> item = new HashMap<String, Object>();
				item.put("id", schoolnews.getId());
				item.put("title", schoolnews.getTitle());
				item.put("content", schoolnews.getContent());
				item.put("sharedate", schoolnews.getShareDate());
				item.put("shareperson", schoolnews.getShareperson());
				item.put("pictureuri", schoolnews.getPictureuri());
				data.add(item);
			}

			SimpleAdapter adapter = new SimpleAdapter(MainActivity.this, data,
					R.layout.snews, new String[] { "title", "sharedate",
							"shareperson", "content" }, new int[] {
							R.id.snews_title, R.id.snews_shareTime,
							R.id.snews_writer, R.id.snews_content });
			lv.setAdapter(adapter);

		} catch (Exception ex) {
		}

	}

	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}



效果:
数据上传:
package com.homework.schoolnews;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

public class AddsnewsService {

	// 静态方法
	public static boolean save(String title, String content, String shareperson)
			throws MalformedURLException, IOException {
		String path = "http://172.19.55.121:8080/androidHomework/servlet/AddsnewsServlet?title="
			+URLEncoder.encode(title, "UTF-8")+"&snewscontent="
			+URLEncoder.encode(content, "UTF-8")+"&shareperson="+URLEncoder.encode(shareperson, "UTF-8");
		
/*bug
 *用以下方法装配path里有点问题 ,shareperson,上传到服务器的时候为null.
 */		
//		Map<String, String> params = new HashMap<String, String>();
//
//		params.put("title", title);
//		params.put("snewscontent", content);
//		params.put("shareperson", shareperson);
//
//		StringBuilder sb = new StringBuilder(path);

		// 装配path
//		for (Map.Entry<String, String> entry : params.entrySet()) {
//			// 获取键
//			sb.append(entry.getKey()).append("=");
//			sb.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
//			sb.append("&");
//		}
		// 删除装配path时多装配的&字符
		//sb.deleteCharAt(sb.length() - 1);

		HttpURLConnection con = (HttpURLConnection) new URL(path)
				.openConnection();
		con.setConnectTimeout(15000);
		con.setRequestMethod("GET");
		con.setDoOutput(true);// 允许对外传输数据

		byte[] pathdata = path.toString().getBytes();

		// 设置通用的请求属性
//		con.setRequestProperty("accept", "*/*");
//		con.setRequestProperty("connection", "Keep-Alive");
//		con.setRequestProperty("user-agent",
//				"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
//		
//		con.setRequestProperty("Content-Length", pathdata.length + "");
//		con.connect();
		OutputStream out = con.getOutputStream();
		out.write(pathdata);
		out.flush();
		if (con.getResponseCode() == 200) {
			return true;
		}
		return false;
	}

}







分享到:
评论

相关推荐

    集成目前Android主流优秀第三方组件

    LOG相关工具类(ToolLog.java) 功能待续--&gt;切入记录异常日志,并存储文件或上传至服务器 已封装/收集自定义控件: 兼容低版本的SwitchButton 追加自定义属性Value的CheckBox/RadioButton/RadioGroup/SingleSpinner...

    Android集成主流优秀第三方组件框架

    LOG相关工具类(ToolLog.java) 功能待续--&gt;切入记录异常日志,并存储文件或上传至服务 器 已封装/收集自定义控件: 兼容低版本的SwitchButton 追加自定义属性Value的CheckBox/RadioButton/RadioGroup/...

    黎活明android教程的全程PPT

    第五天 1&gt; 网络--通过HTTP协议发送XML数据,并调用webservice实现手机号归属地查询 2&gt; 网络--通过HTTP协议实现多线程断点续传下载 3&gt; 为应用添加新的Activity与参数传递 4&gt; 意图 第六天 1&gt; Activity的生命周期 ...

    传智播客Android视频教程-课程源码.rar

    第五天 1&gt; 网络--通过HTTP协议发送XML数据,并调用webservice实现手机号归属地查询 2&gt; 网络--通过HTTP协议实现多线程断点续传下载 3&gt; 为应用添加新的Activity与参数传递 4&gt; 意图 第六天 1&gt; Activity的生命周期 2&gt; ...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    Android例子源码集成安卓主流优秀第三方组件框架.zip

    切入记录异常日志,并存储文件或上传至服务器 已封装/收集自定义控件: 兼容低版本的SwitchButton 追加自定义属性Value的CheckBox/RadioButton/RadioGroup/SingleSpinner 圆角提示信息TipsView 圆角图片...

    精通ANDROID 3(中文版)1/2

    5.3.6 将Intent解析为组件的规则  5.4 练习使用ACTION_PICK  5.5 练习使用GET_CONTENT操作  5.6 挂起的Intent  5.7 资源  5.8 小结  第6章 构建用户界面和使用控件  6.1 Android中的UI开发  6.1.1 ...

    Google Android SDK开发范例大全(第3版) 1/5

    完整的手机数据存取功能:铃声模式设置、震动控制、WiFi服务、屏幕旋转、电池计量、温度测量、电信网络信息、SIM卡信息、拨打电话、短信解析、通讯录联系人、电子罗盘、屏幕手写等手机控制功能。 系统服务及研发的...

    Google Android SDK开发范例大全(第3版) 4/5

    完整的手机数据存取功能:铃声模式设置、震动控制、WiFi服务、屏幕旋转、电池计量、温度测量、电信网络信息、SIM卡信息、拨打电话、短信解析、通讯录联系人、电子罗盘、屏幕手写等手机控制功能。 系统服务及研发的...

    Google Android SDK开发范例大全(第3版) 3/5

    完整的手机数据存取功能:铃声模式设置、震动控制、WiFi服务、屏幕旋转、电池计量、温度测量、电信网络信息、SIM卡信息、拨打电话、短信解析、通讯录联系人、电子罗盘、屏幕手写等手机控制功能。 系统服务及研发的...

    OkHttp库封装

    如果后台返回xml数据,需要参照response包下的类进行扩展) 2.提交数据(表单类型数据、String类型数据、json类型数据) 3.带进度的上传和下载文件 4.将请求保存(保存大小可设置),支持以不同的形式取消单个、多个或...

    Android典型技术模块开发详解

    11.3.2 获取网络上的图片 11.3.3 文件下载 11.3.4 文件上传 11.4 HttpClient 11.4.1 HttpGet请求 11.4.2 HttpPost请求 11.5 本章小结 第12章 数据解析 12.1 XML 12.1.1 DOM 12.1.2 SAX 12.1.3 PULL 12.2 JSON格式 ...

    精通Android 3 (中文版)2/2

    第1章 Android计算平台简介  1.1 面向新PC的全新平台  1.2 Android的历史  1.3 Dalvik VM剖析  1.4 理解Android软件栈  1.5 使用Android SDK开发最终用户应用程序  1.5.1 Android模拟器  1.5.2 ...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--xml文件的pull解析与序列化写入 |--xml的封装序列化 |--任务循环之只在Activity显示时执行 |--修改文件的最后修改时间 |--偏好设置(回显) |--内存优化之各种方法 |--内容提供者之短信的序列化对象读写 |--内容...

    集成安卓主流优秀第三方组件框架.zip

    切入记录异常日志,并存储文件或上传至服务器 已封装/收集自定义控件: 兼容低版本的SwitchButton 追加自定义属性Value的CheckBox/RadioButton/RadioGroup/SingleSpinner 圆角提示信息TipsView 圆角图片...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    微信公众平台应用开发:方法、技巧与案例.(机械工业.柳峰)

    他还是一位资深的Java软件开发工程师和Android/iOS移动应用开发工程师,活跃于CocoaChina、开源中国、CSDN等社区,CSDN博客专家,在CSDN博客撰写了系列微信公众平台二次开发的教程,深受欢迎并被广泛传播,也因此...

    Java资源包01

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解...可以将网络图导出为 GIF, JPEG, PNG, PPM, ARP and PNML (XML based)文件格式。使用了优秀的JHotDraw 5.2 框架。 activemq...

Global site tag (gtag.js) - Google Analytics