【Android開發】XML傳送網絡信息
簡述
此技術結合JSP技術,在JSP上的數據,可以用XML傳輸到安卓客戶端,然後用戶用手機查詢到WEB應用上的信息(可以看到數據庫保存的訊息)
學到的東西:
如何從網絡中得到自定義的數據,得到自定義數據後,又如何完成對它的解析,然後顯示出來
WEB應用部分
首先是WEB應用部分,寫的是一個視屏網站中視頻的信息,為了方便看,沒有加入數據庫數據,隻是自己定義了一些數據來測試:
采用JSP寫的WEB應用:
Servlet代碼:
package deu.hpu.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import deu.hpu.servise.dima.News; import deu.hpu.servise.impl.VideoNewsService; import deu.hpu.servise.impl.VideoNewsServiceImpl; public class ListServlet extends HttpServlet { private VideoNewsService service=new VideoNewsServiceImpl(); public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //得到所有的視頻信息 List<News> videos=service.getLastNews(); //把視頻信息放在request上 request.setAttribute("videos", videos); //轉發至videonews.jsp界麵(一個XML) request.getRequestDispatcher("/WEB-INF/Page/videonews.jsp").forward(request, response); } }
JSP界麵(其實是一個XML)
//注意<?xml version="1.0" encoding="UTF-8"?>一定要寫在第一行
//此處采用了jstl標簽解析技術(詳情請看https://blog.csdn.net/acmman/article/details/38750809)
//用jstl標簽解析技術必須導入jstl.jar與standard.jar
<%@ page language="java" import="java.util.*" contentType="text/xml; charset=UTF-8" pageEncoding="UTF-8"%><?xml version="1.0" encoding="UTF-8"?><%@ taglib uri="https://java.sun.com/jsp/jstl/core" prefix="c" %> <videonews><c:forEach items="${videos}" var="video"> <news > <title>${video.title}</title> <timelength>${video.timelength}</timelength> </news> </c:forEach> </videonews>
業務類VideoNewsService 接口
package deu.hpu.servise.impl; import java.util.List; import deu.hpu.servise.dima.News; public interface VideoNewsService { /* * 獲取最新視頻資訊 * */ public abstract List<News> getLastNews(); } 業務類VideoNewsServiceImpl實現類 package deu.hpu.servise.impl; import java.util.ArrayList; import java.util.List; import deu.hpu.servise.dima.News; public class VideoNewsServiceImpl implements VideoNewsService { public List<News> getLastNews(){ List<News> newses=new ArrayList<News>(); newses.add(new News(12,"古劍奇譚",90)); newses.add(new News(45,"萬萬沒想到",45)); newses.add(new News(89,"超驗駭客",120)); return newses; } }
News的類
package deu.hpu.servise.dima; public class News { private Integer id; private String title; private Integer timelength; public News(){} public News(Integer id, String title, Integer timelength) { super(); 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; } }
一個簡單的WEB應用出來了,在瀏覽器訪問Servlet效果:
Android客戶端部分
主界麵布局:
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andro android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:layout_width="fill_parent" android:layout_height="wrap_content" android: /> </LinearLayout>
列表元素ListView的布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andro android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="230dp" android:layout_height="wrap_content" android: /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android: /> </LinearLayout>
MainActivity.java
package com.example.vedionewses; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.widget.ListView; import android.widget.SimpleAdapter; import deu.hpu.servise.dima.News; import en.deu.service.VideoService; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ListView listview=(ListView) findViewById(R.id.listView); try { List<News> videos=VideoService.getLastNews(); 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", news.getTimelength()); 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) { // TODO Auto-generated catch block e.printStackTrace(); } } }
上麵出現的VideoService類以及其方法(其中用XML解析器解析傳來的XML文件)
package en.deu.service; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import android.util.Xml; import deu.hpu.servise.dima.News; public class VideoService { /* * 獲取最新的視頻資訊 * */ public static List<News> getLastNews() throws Exception{ String path="https://10.20.124.72:8080/videonews/ListServlet"; URL url=new URL(path); HttpURLConnection conn=(HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); if(conn.getResponseCode()==200){ InputStream instream=conn.getInputStream(); return parseXML(instream); } return null; } /* * 解析服務器返回的XML數據 * */ //parser.getName()得到字段的名稱,parser.getText()得到字段的內容 /*如<news > <title>古劍奇譚</title> <timelength>90</timelength> </news> parser.getName()可以得到news、title、timelength parser.getText()可以得到title、timelength中的“古劍奇譚”和90 */ private static List<News> parseXML(InputStream instream) throws Exception{ List<News> newses=new ArrayList<News>(); News news=null; //par技術,通過安卓提供的工具類new一個XML破解器 XmlPullParser parser=Xml.newPullParser(); parser.setInput(instream, "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())){ //把這一組的new給添加到ArrayList<News>容器中 newses.add(news); //將news清空,準備下一組 news=null; } break; default: break; } event=parser.next(); } return newses; } }
這裏也有一個News類,和WEB應用中的一模一樣,就不再寫了
最後要在配置文件AndroidMainifest.xml中加入訪問internet的權限,不然手機訪問不了網絡:
<uses-permission android:name="android.permission.INTERNET"/>
運行虛擬機,效果如下:
最後更新:2017-04-03 05:40:00