您的位置:首页 > 理论基础 > 计算机网络

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

2013-06-24 23:15 597 查看
最近比较忙,没什么时间写博客,现在以后多补补吧,这次写的是安卓客户端上传和下载网络数据

原理很简单,使用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;
}

}






                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: