学习Android有一段时间了。对server端有非常深的好奇,决定对server端的实现进行一些研究,这里实现了一个简单的小样例,用于获取server端的json数据,样例非常easy,适合刚開始学习的人学习使用。

server端

首先我们搭建server端,server端使用struct2架构,对该架构不熟悉的人能够花一点时间看看慕课网上的相关视频,这里用myeclipse实现server端。

新建一个webproject。这里要引入struct2相关,方法是:点击新建的webproject邮件-》myeclipse选项-》project facets->选择安装struct2相关就可以。

看一下相关代码:

struts.xml:

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<package name="struts2" extends="struts-default" namespace="/">
<action name="getjson" class="com.shao.action.JSONAction" method="json">
<result name="success">index.jsp</result>
</action>
</package>
</struts>

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>Test2</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
</web-app>

以下是JSONAction.java:

package com.shao.action;  

import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware; import com.google.gson.Gson;
import com.opensymphony.xwork2.ActionSupport;
import com.shao.domain.Music; public class JSONAction extends ActionSupport implements ServletRequestAware,
ServletResponseAware { /**
*
*/
private static final long serialVersionUID = -3604892179657815531L;
private HttpServletRequest request;
private HttpServletResponse response;
private String format;
public String getFormat() {
return format;
} public void setFormat(String format) {
this.format = format;
} @Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
} @Override
public void setServletResponse(HttpServletResponse response) {
this.response = response;
} public void json(){
List<Music> list = new ArrayList<Music>();
Gson gson = new Gson();
Music m1 = new Music();
m1.setId(1);
m1.setAuthor("周杰伦");
m1.setName("外婆");
m1.setTime("04:04");
list.add(m1);
Music m2 = new Music();
m2.setId(2);
m2.setAuthor("周杰伦");
m2.setName("半兽人");
m2.setTime("04:05");
list.add(m2);
Music m3 = new Music();
m3.setId(3);
m3.setAuthor("周杰伦");
m3.setName("乌克丽丽");
m3.setTime("02:55");
list.add(m3);
java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<List<Music>>() {
}.getType(); //指定type
String beanListToJson = gson.toJson(list,type); //list转换成json字符串
System.out.println("GSON-->"+beanListToJson);
try {
response.setCharacterEncoding("UTF-8");
this.response.getWriter().write(beanListToJson);
} catch (IOException e) {
e.printStackTrace();
}
}
}

最后是Music类:(这个类在Android程序中也须要)

package com.shao.domain;  

public class Music {  

        private Integer id;
private String name;
private String time;
private String author;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}

好了,以下选择project右键:run as->myeclipse server application:

 

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

注意,本项目的端口选择的是8888,yayun表示本机。

这时在浏览器地址栏输入:http://yayun:8888/Test2/getjson.action

出现例如以下 :

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

说明server端搭建成功。

另外,本系统json解析用到了Gson的jar包,要自己导入哦,下载Gson引入到项目中,Android端也须要这个jar包。

移动端

移动端用eclipse实现

首先是JsonClientActivity:

package com.test.demo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import com.example.testandroid.R; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter; public class JsonClientActivity extends Activity {
private Button update;
private ListView listView;
private String jsonResult;
private Handler handler=new Handler(){
public void handleMessage(android.os.Message msg) {
jsonResult=(String) msg.obj;
};
}; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
update = (Button) findViewById(R.id.update);
listView = (ListView) findViewById(R.id.list);
update.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
String urlStr = "http://192.168.0.103:8888/Test2/getjson.action"; getJson(urlStr);
String jString=jsonResult;
List<Music> list = GsonUtil.getListFromJson(jString);
System.out.println(list);
if (list != null) {
System.out.println(list);
List<Map<String, Object>> data = getAdapterData(list); SimpleAdapter adapter = new SimpleAdapter(JsonClientActivity.this, data, R.layout.list,
new String[] { "name", "author", "time" }, new int[] { R.id.name, R.id.author, R.id.time });
listView.setAdapter(adapter);
} }
});
} private List<Map<String, Object>> getAdapterData(List list) {
List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
for (int i = 0; i < list.size(); i++) {
Map<String, Object> map = new HashMap<String, Object>();
Music music = (Music) list.get(i);
map.put("name", music.getName());
map.put("author", music.getAuthor());
map.put("time", music.getTime());
data.add(map);
}
return data;
}
/**
* 异步获取json字符串
* @param url
*/ public void getJson(final String url){ new Thread(new Runnable() { @Override
public void run() {
URL urlString;
try {
urlString = new URL(url);
HttpURLConnection httpURLConnection=(HttpURLConnection) urlString.openConnection();
httpURLConnection.setConnectTimeout(5000);
httpURLConnection.setDoInput(true);
httpURLConnection.setRequestMethod("GET");
httpURLConnection.connect(); InputStream inputStream=httpURLConnection.getInputStream();
InputStreamReader inputStreamReader=new InputStreamReader(inputStream); BufferedReader bufferedReader=new BufferedReader(inputStreamReader);
StringBuilder stringBuilder=new StringBuilder();
String line;
while ((line=bufferedReader.readLine())!=null) {
stringBuilder.append(line);
}
System.out.println(new String());
Message message=new Message();
message.obj=new String(stringBuilder.toString());
handler.sendMessage(message); } catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
}).start(); }
}

然后是工具类:

package com.test.demo;  

import java.util.List;

import com.google.gson.Gson;  

public class GsonUtil {  

   public  static  List<Music>  getListFromJson(String json){
java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<List<Music>>() {
}.getType();
Gson gson = new Gson();
List<Music> list = gson.fromJson(json, type);
return list;
}
}

布局类非常easy就不写了。能够自行下载源代码。执行Android程序:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

执行不成功的注意网络权限。

源代码下载:

server端

Android端

 

欢迎关注我和我的微信平台,谢谢

 

 

Android实战简易教程-第六十六枪(server端搭建和server端Json数据交互)的更多相关文章

  1. Android实战简易教程-第三十九枪(第三方短信验证平台Mob和验证码自己主动填入功能结合实例)

    用户注冊或者找回password时通常会用到短信验证功能.这里我们使用第三方的短信平台进行验证实例. 我们用到第三方短信验证平台是Mob,地址为:http://mob.com/ 一.注冊用户.获取SD ...

  2. Android实战简易教程-第四十九枪(两种方式实现网络图片异步加载)

    加载图片属于比较耗时的工作,我们需要异步进行加载,异步加载有两种方式:1.通过AsyncTask类进行:2.通过Handler来实现,下面我们就来看一下如何通过这两种方式实现网络图片的异步加载. 一. ...

  3. Android实战简易教程-第四十五枪(SlideSwitch-好看又有用的开关button)

    开关button也是在项目中经经常使用到的控件,github上有开源的项目,我们研究下它的用法: 1.SlideButton.java: /* * Copyright (C) 2015 Quinn C ...

  4. Android实战简易教程-第四十枪(窃听风云之短信监听)

    近期在做监听验证码短信自己主动填入的功能,无意间想到了一个短信监听的办法. 免责声明:短信监听本身是一种违法行为,这里仅仅是技术描写叙述.请大家学习技术就可以.(哈哈) 本实例是基于bmob提供的后台 ...

  5. Android实战简易教程-第三十四枪(基于ViewPager和FragmentPagerAdapter实现滑动通用Tab)

    上一段时间写过一篇文章<基于ViewPager实现微信页面切换效果> 里面实现了相似微信Tab的页面.可是这样的实现方法有个问题.就是以后全部的代码逻辑都必须在MainActivity中实 ...

  6. Android实战简易教程-第二十八枪(Uri转String型实例)

    接上一篇文章.我们能够轻易的获取所选图片的uri,那么我们考虑怎样将获取的uri转换成String型的地址呢? 接下来我们通过实例来研究.布局文件和上篇(二十七枪)一致,我们就不再列出,直接看Main ...

  7. Android实战简易教程-第二十六枪(基于ViewPager实现微信页面切换效果)

    1.头部布局文件top.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout x ...

  8. Android实战简易教程-第二十五枪(基于Baas的数据表查询下拉刷新和上拉载入实现!)

    上一节我们实现了数据表的载入,可是,当数据表数据非常多时.我们就要考虑数据的分页.这里我们选用了PullToRefreshListView控件,先看一下该控件的说明: 效果图:            ...

  9. Android实战简易教程-第二十八枪(基于Bmob实现头像图片设置和网络上传功能!)

    上一篇我们介绍了怎样由uri转换成String ,本文就用到了上篇文章的方法.以下我们介绍一下怎样设置头像后将头像图片上传到云端的方法,本文基于Bmob提供的服务. 看一下代码:(布局文件和前两篇文章 ...

随机推荐

  1. 使用idea2.5建立maven项目

    使用idea的步骤: 1.建立一个新的maven项目 2.选中maven项目 3.点击next,输入groupID和artifactid 4.点击next  选择projectlocation 5.选 ...

  2. MAC软连接

    在mac上不设置环境变量有的时候也可以直接就访问到了某些文件.这个是为什么呢?答案是用了软连接. 1 查看加载文件 可以使用cat命令查看paths文件 cat etc/paths /usr/loca ...

  3. A - High School: Become Human

    Problem description Year 2118. Androids are in mass production for decades now, and they do all the ...

  4. D - Garden

    Problem description Luba thinks about watering her garden. The garden can be represented as a segmen ...

  5. Java中数组要点总结

    1.数组是基本数据类型和字符串类型的容器(引用数据类型),而集合是类数据类型的容器: 2.数组定义的格式: (1)一般格式: 元素类型[] 数组名 = new 元素类型[元素个数或者数组长度]: 其中 ...

  6. RPC与REST

    RPC与REST (摘自网络,个人理解)

  7. 使用maven搭建SSH框架实现登陆、列表查询分页

    SSH框架:struts2 + spring + hibernate web层:struts2+jsp service层:javaBean dao层:hibernate spring:管理Action ...

  8. Java 判断字符串的存储长度

    判断前台输入项的长度应该都会碰到String.length()  判断出来没有超出最大长度,存到数据库就超出长度的问题,oracle字符集是gbk的不太清楚,如果是UTF-8,中文是占三个字符的,所以 ...

  9. ★Java语法(七)——————————循环语句

    package 自我总结; public class 循环语句 { public static void main(String[] args) { // while 循环 // 用法: // whi ...

  10. C# 判断字符串是否左包含

    //测试字符串 左包含 //string str = "AAABBBCCC"; //char[] ss = str.ToArray(); //0-8 字符数组 //char[] s ...