閱讀763 返回首頁    go 阿裏雲 go 技術社區[雲棲]


【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.jarstandard.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

  上一篇:go C# 關於類型轉換 麵試題
  下一篇:go C# 關於類型轉換 麵試題