我的Android进阶之旅------>Android获取服务器上格式为JSON和XML两种格式的信息的小程序
来源:互联网 发布:java运算类型 编辑:程序博客网 时间:2024/05/25 05:38
首先写一个应用服务器端的jsp程序,用jsp和servlet简单实现,如下图所示
[java] view plain copy
- package cn.roco.domain;
- public class News {
- private Integer id;
- private String title;
- private Integer timelength;
- public News() {
- }
- public News(Integer id, String title, Integer timelength) {
- 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;
- }
- }
[java] view plain copy
- package cn.roco.service;
- import java.util.List;
- import cn.roco.domain.News;
- public interface VideoNewsService {
- /**
- * 获取最新视频资讯
- * @return
- */
- public List<News> getLastNews();
- }
[java] view plain copy
- package cn.roco.service.impl;
- import java.util.ArrayList;
- import java.util.List;
- import cn.roco.domain.News;
- import cn.roco.service.VideoNewsService;
- public class VideoNewsServiceBean implements VideoNewsService{
- /**
- * 模拟从服务器中获取数据 返回
- */
- public List<News> getLastNews(){
- List<News> newses=new ArrayList<News>();
- for (int i = 1; i < 30; i++) {
- newses.add(new News(i,"Xili"+i,i+90));
- }
- return newses;
- }
- }
[java] view plain copy
- package cn.roco.servlet;
- 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 cn.roco.domain.News;
- import cn.roco.service.VideoNewsService;
- import cn.roco.service.impl.VideoNewsServiceBean;
- public class ListServlet extends HttpServlet {
- private VideoNewsService newsService=new VideoNewsServiceBean();
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- List<News> videos=newsService.getLastNews();
- String format=req.getParameter("format");
- //返回JSON格式
- if ("json".equals(format)) {
- StringBuilder builder=new StringBuilder();
- builder.append('[');
- for (News news : videos) {
- builder.append('{');
- builder.append("id:").append(news.getId()).append(',');
- //转义 ""双引号
- builder.append("title:\"").append(news.getTitle()).append("\",");
- builder.append("timelength:").append(news.getTimelength());
- builder.append("},");
- }
- builder.deleteCharAt(builder.length()-1);//去掉最后的','
- builder.append(']');
- req.setAttribute("json", builder.toString());
- req.getRequestDispatcher("/WEB-INF/page/jsonvideonews.jsp").forward(req, resp);
- }else{
- //返回XML格式
- req.setAttribute("videos", videos);
- req.getRequestDispatcher("/WEB-INF/page/videonews.jsp").forward(req, resp);
- }
- }
- protected void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- doGet(req, resp);
- }
- }
如果要返回XML文件 就forward到videonews.jsp页面
[html] view plain copy
- <%@ page language="java" contentType="text/xml; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><?xml version="1.0" encoding="UTF-8"?>
- <videonews>
- <c:forEach items="${videos}" var="video">
- <news id="${video.id}">
- <title>${video.title}</title>
- <timelength>${video.timelength}</timelength>
- </news>
- </c:forEach>
- </videonews>
如果要返回XML文件 就forward到videonews.jsp页面 如果要返回JSON文件 就forward到jsonvideonews.jsp页面
[html] view plain copy
- <%@ page language="java" contentType="text/plain; charset=UTF-8" pageEncoding="UTF-8"%>
- ${json}
web.xml
[html] view plain copy
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.5"
- 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_2_5.xsd">
- <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>ListServlet</servlet-name>
- <servlet-class>cn.roco.servlet.ListServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>ListServlet</servlet-name>
- <url-pattern>/ListServlet</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- </web-app>
服务器端写好之后,就开始写Android应用
架构如下图所示:
[java] view plain copy
- package cn.roco.news.domain;
- public class News {
- private Integer id;
- private String title;
- private Integer timelength;
- public News() {
- }
- public News(Integer id, String title, Integer timelength) {
- 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;
- }
- }
[java] view plain copy
- package cn.roco.utils;
- import java.io.ByteArrayOutputStream;
- import java.io.InputStream;
- public class StremTools {
- /**
- * 读取输入流中的数据
- * @param inputStream 输入流
- * @return 二进制的流数据
- * @throws Exception
- */
- public static byte[] read(InputStream inputStream) throws Exception {
- ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
- byte[] buffer=new byte[1024];
- int length=0;
- while((length=inputStream.read(buffer))!=-1){
- outputStream.write(buffer,0,length);
- }
- inputStream.close();
- return outputStream.toByteArray();
- }
- }
[java] view plain copy
- package cn.roco.news.service;
- import java.io.InputStream;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.util.ArrayList;
- import java.util.List;
- import org.json.JSONArray;
- import org.json.JSONObject;
- import org.xmlpull.v1.XmlPullParser;
- import android.util.Xml;
- import cn.roco.news.domain.News;
- import cn.roco.utils.StremTools;
- public class VideoNewsService {
- /**
- * 获取最新的视频资讯
- * 采用JSON格式
- * @param path
- * @return
- * @throws Exception
- */
- public static List<News> getJSONLastNews(String path) throws Exception {
- URL url = new URL(path);
- HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 基于HTTP协议连接对象
- connection.setConnectTimeout(5000);
- connection.setRequestMethod("GET");
- if (connection.getResponseCode() == 200) {
- InputStream inputStream = connection.getInputStream();
- return parseJSON(inputStream);
- }else{
- throw new RuntimeException("服务器响应失败");
- }
- }
- /**
- * 解析服务器返回的JSON数据
- *
- * @param inputStream
- * @return
- * @throws Exception
- */
- private static List<News> parseJSON(InputStream inputStream) throws Exception {
- List<News> newses=new ArrayList<News>();
- byte[] data=StremTools.read(inputStream);
- String jsonData=new String(data,"UTF-8");
- JSONArray array=new JSONArray(jsonData);
- for (int i = 0; i < array.length(); i++) {
- JSONObject jsonObject= array.getJSONObject(i);
- News news=new News( jsonObject.getInt("id"), jsonObject.getString("title"),jsonObject.getInt("timelength"));
- newses.add(news);
- }
- return newses;
- }
- /**
- * 获取最新的视频资讯
- * 采用XML格式
- * @param path
- * @return
- * @throws Exception
- */
- public static List<News> getLastNews(String path) throws Exception {
- URL url = new URL(path);
- HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 基于HTTP协议连接对象
- connection.setConnectTimeout(5000);
- connection.setRequestMethod("GET");
- if (connection.getResponseCode() == 200) {
- InputStream inputStream = connection.getInputStream();
- return parseXML(inputStream);
- }
- return null;
- }
- /**
- * 解析服务器返回的XML数据
- *
- * @param inputStream
- * @return
- */
- private static List<News> parseXML(InputStream inputStream) throws Exception {
- List<News> newses = new ArrayList<News>();
- News news = null;
- XmlPullParser parser = Xml.newPullParser();
- parser.setInput(inputStream, "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())) {
- newses.add(news);
- news = null;
- }
- break;
- }
- event = parser.next();
- }
- return newses;
- }
- }
[java] view plain copy
- package cn.roco.news;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import cn.roco.news.domain.News;
- import cn.roco.news.service.VideoNewsService;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.ListView;
- import android.widget.SimpleAdapter;
- import android.widget.Toast;
- public class MainActivity extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- ListView listView = (ListView) findViewById(R.id.listView);
- try {
- //采用XML格式
- // String xmlPath="http://192.168.15.58:8080/Hello/ListServlet";
- // List<News> videos = VideoNewsService.getLastNews();
- //采用JSON格式
- String jsonPath="http://192.168.15.58:8080/Hello/ListServlet?format=json";
- List<News> videos = VideoNewsService.getJSONLastNews(jsonPath);
- 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",
- getResources().getString(R.string.timelength)
- + news.getTimelength()
- + getResources().getString(R.string.min));
- 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) {
- Toast.makeText(getApplicationContext(), "有错", 1);
- e.printStackTrace();
- }
- }
- }
item.xml
[html] view plain copy
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal" android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TextView android:id="@+id/title" android:layout_width="200dp"
- android:layout_height="wrap_content"/>
- <TextView android:id="@+id/timelength" android:layout_width="fill_parent"
- android:layout_height="wrap_content"/>
- </LinearLayout>
main.xml
[html] view plain copy
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <LinearLayout android:orientation="horizontal"
- android:layout_width="wrap_content" android:layout_height="wrap_content">
- <TextView android:text="@string/title" android:layout_width="200dp"
- android:layout_height="wrap_content" />
- <TextView android:text="@string/details" android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- </LinearLayout>
- <ListView android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:id="@+id/listView" />
- </LinearLayout>
string.xml
[html] view plain copy
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="hello">Hello World, MainActivity!</string>
- <string name="app_name">视频资讯</string>
- <string name="timelength">时长:</string>
- <string name="min">分钟</string>
- <string name="title">标题</string>
- <string name="details">详情</string>
- </resources>
[html] view plain copy
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="cn.roco.news"
- android:versionCode="1"
- android:versionName="1.0">
- <uses-sdk android:minSdkVersion="8" />
- <!-- 访问Internet权限 -->
- <uses-permission android:name="android.permission.INTERNET"/>
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".MainActivity"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- </manifest>
运行效果如图所示:
0 0
- 我的Android进阶之旅------>Android获取服务器上格式为JSON和XML两种格式的信息的小程序
- 我的Android进阶之旅------>Android获取服务器上格式为JSON和XML两种格式的信息的小程序
- 我的Android进阶之旅------>android如何将List<NameValuePair>请求参数列表转换为json格式
- Android之从网络中获取数据并返回客户端的两种方式:XML格式返回与Json格式返回
- Android之从网络中获取数据并返回客户端的两种方式:XML格式返回与Json格式返回
- Android之从网络中获取数据并返回客户端的两种方式:XML格式返回与Json格式返回
- Android之从网络中获取数据并返回客户端的两种方式:XML格式返回与Json格式返回
- JSON和XML:两种常见的web信息传送格式,数据交换语言
- Android 开发实践 解析XML和JSON格式的数据
- XML和JSON两种数据交换格式的比较
- XML和JSON两种数据交换格式的比较
- XML和JSON两种数据交换格式的比较
- XML和JSON两种数据交换格式的比较
- XML和JSON两种数据交换格式的比较
- XML和JSON两种数据交换格式的比较
- XML和JSON两种数据交换格式的比较
- XML和JSON两种数据交换格式的比较
- XML和JSON两种数据交换格式的比较
- python中scrapy点击按钮
- Zend Studio 12.5.1汉化
- android调用系统相机拍照
- as编译报错"Task '' not found in root project '***'."
- C++基础--拷贝构造函数
- 我的Android进阶之旅------>Android获取服务器上格式为JSON和XML两种格式的信息的小程序
- C#实现一个最简单的HTTP服务器
- HTML+CSS基础 不会随着滚动条变化的固定在右下角的div块
- ubuntu系统中安装editplus的方法
- 读入优化模板
- MyEclipse 运行时突然报错
- DebugConsole
- 设计模式之代理模式(静态代理、JDK动态代理和cglib动态代理)
- Android六大基本布局详解