Android網(wǎng)絡(luò)編程之獲取網(wǎng)絡(luò)上的XML
來(lái)源:程序員人生 發(fā)布時(shí)間:2014-09-30 00:36:50 閱讀次數(shù):2670次
Android網(wǎng)絡(luò)編程之獲取網(wǎng)絡(luò)上的XML
請(qǐng)尊重他人的勞動(dòng)成果,轉(zhuǎn)載請(qǐng)注明出處:Android網(wǎng)絡(luò)編程之獲取網(wǎng)絡(luò)上的XML
為要獲取網(wǎng)絡(luò)上的XML所以需要服務(wù)器端提供的支持。
一、創(chuàng)建服務(wù)器端:
服務(wù)器端項(xiàng)目結(jié)構(gòu):

服務(wù)器端運(yùn)行效果圖:

第一步:創(chuàng)建業(yè)務(wù)所需的JavaBean
package com.jph.server.model;
import java.util.Date;
/**
* 新聞實(shí)體類(lèi)
* @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;
}
}
第二步:創(chuàng)建業(yè)務(wù)邏輯接口和具體實(shí)現(xiàn)類(lèi)
業(yè)務(wù)接口:
package com.jph.server.service;
import java.util.List;
import com.jph.server.model.News;
public interface XMLService {
/**
* 獲取最新的資訊
* @return
*/
public List<News> getLastNews();
}
業(yè)務(wù)接口的實(shí)現(xiàn)類(lèi):
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;
}
}
第三步:創(chuàng)建控制器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;
/**
* 負(fù)責(zé)響應(yīng)客戶端的請(qǐng)求: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);
//將客戶端的請(qǐng)求轉(zhuǎn)向news.jsp頁(yè)面
request.getRequestDispatcher("/WEB-INF/page/news.jsp").forward(request, response);
}
}
第四步:使用jstl標(biāo)簽生成XML文件
因此需要使用jstl標(biāo)簽所以需要將jstl.jar與standard.jar兩個(gè)jar包導(dǎo)入項(xiàng)目中。
使用jstl標(biāo)簽在jsp頁(yè)面生成XML:
news.jsp頁(yè)面:
<%@ 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>
至此服務(wù)器端項(xiàng)目已經(jīng)完成。下面開(kāi)始創(chuàng)建Android端項(xiàng)目。
二、創(chuàng)建Android端:
Android端項(xiàng)目結(jié)構(gòu):

第一步:創(chuàng)建業(yè)務(wù)所需的JavaBean
提示:因?yàn)榉?wù)器端和Android端項(xiàng)目都是用Java語(yǔ)言實(shí)現(xiàn)的,所以一些組件可以共用,JavaBean便是其中之一。此時(shí)我們?cè)诖罱?/span>Android端項(xiàng)目的時(shí)候,完全可以將服務(wù)器端項(xiàng)目中JavaBean拿來(lái)用。
第二步:創(chuàng)建Android端項(xiàng)目的業(yè)務(wù)邏輯層
核心代碼: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;
/**
* 獲取網(wǎng)絡(luò)上的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;
}
/**
* 獲取網(wǎng)絡(luò)上的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);//設(shè)置連接超時(shí)
conn.setRequestMethod("GET");
if (conn.getResponseCode()==200) {
InputStream inputStream=conn.getInputStream();
List<News> listNews=pullXml(inputStream);
if (listNews.size()>0) {//如果解析結(jié)果不為空則將解析出的數(shù)據(jù)發(fā)送給UI線程
Message msg=new Message();
msg.obj=listNews;
msg.what=PARSESUCCWSS;
handler.sendMessage(msg);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//和服務(wù)器建立連接
}
}).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的開(kāi)始節(jié)點(diǎn)
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的結(jié)束節(jié)點(diǎn)
listNews.add(news);
}
break;
}
eventCode=pullParser.next();//解析下一個(gè)節(jié)點(diǎn)(開(kāi)始節(jié)點(diǎn),結(jié)束節(jié)點(diǎn))
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return listNews;
}
}
第三步:創(chuàng)建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;
/**
* 獲取網(wǎng)絡(luò)上的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端項(xiàng)目已經(jīng)完成了。下面就讓我們看一下APP運(yùn)行效果吧:
Android運(yùn)行效果圖:

生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)