【Android开发】XML传送网络信息

来源:互联网 发布:禁止ip访问http linux 编辑:程序博客网 时间:2024/06/05 08:57

简述

此技术结合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标签解析技术(详情请看http://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="http://java.sun.com/jsp/jstl/core" prefix="c" %><videonews><c:forEach items="${videos}" var="video"><news id="${video.id}"><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:android="http://schemas.android.com/apk/res/android"    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:id="@+id/listView"    /></LinearLayout>


 

列表元素ListView的布局:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:orientation="horizontal" >    <TextView     android:layout_width="230dp"    android:layout_height="wrap_content"    android:id="@+id/title"        />    <TextView     android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:id="@+id/timelength"        /></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 { @Overrideprotected 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 blocke.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="http://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 id="12">     <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"/>

运行虚拟机,效果如下:

 

0 0
原创粉丝点击