学习Android有一段时间了,对服务器端有很深的好奇,决定对服务器端的实现进行一些研究,这里实现了一个简单的小例子,用于获取服务器端的json数据,例子很简单,适合初学者学习使用。

服务器端

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

新建一个web工程,这里要引入struct2相关,方法是:点击新建的web工程邮件-》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;
}
} 

好了,下面选择工程右键:run as->myeclipse server application:

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

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

出现如下 :

说明服务器端搭建成功。另外,本系统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;
}
} 

布局类很简单就不写了,可以自行下载源码。运行Android程序:

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

源码下载:

服务器端

Android端

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

Android实战简易教程-第六十六枪(服务器端搭建和服务器端Json数据交互)相关推荐

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

    用户注册或者找回密码时一般会用到短信验证功能,这里我们使用第三方的短信平台进行验证实例. 我们用到第三方短信验证平台是Mob,地址为:http://mob.com/ 一.注册用户.获取SDK 大家可以 ...

  2. Android实战简易教程-第三十六枪(监听短信-实现短信验证码自动填入)

    一般用户喜欢用手机号作为用户名注册APP账号,这时一般都是通过手机验证码的方式进行验证,下面我们就研究一个非常实用的方法,通过监听短信-实现短信验证码的自动填入,提高用户体验. 首先我们看一下如何监听 ...

  3. Android实战简易教程-第七十五枪(WIFI直连工具类)

    设置指定的WIFI用户名密码和加密方式,可以进行WIFI直连. 1.工具类-WifiUtil.java: package demo.androidwar.com.myapplication;impor ...

  4. Android实战简易教程-第五十一枪(ListView实现子控件的动态显示和隐藏、checkbox全选和反选)

    前段时间写过一篇文章:Android实战简易教程-第四十七枪(ListView多选-实现点餐系统)有的同学留言建议,可不可以动态控制checkbox的显示和全选反选功能,我研究了一下,发现实现也比较容 ...

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

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

  6. Android实战简易教程-第五十枪(工具类的测试)

    在开发中,为了提高开发效率,我们一般会自定义自己的工具类.为了保证项目的可靠性,在将工具类引入项目之前,我们一般都会对工具类进行单元测试,下面我们通过一个实例看一下如何搭建测试环境. 1.首先自定义一 ...

  7. Android实战简易教程-第六十枪(分享一个城市选择功能模块)

    在做一些APP的时候可能会用到城市选择模块的功能,本实例可以提供位置自定定位和手动选择的功能,非常好用,大家可以修改后加入自己的项目中. 首先看一下效果: 1.进入有的手机可能会提示权限要求,这时我们 ...

  8. Android实战简易教程-第六十五枪(自定义控件实现数字液晶时钟Demo)

    下面我们研究一下如何实现一个数字液晶时钟,本质属于特效一种哈. 首先创建一个布局文件: <?xml version="1.0" encoding="utf-8&qu ...

  9. Android实战简易教程-第五十七枪(分享小米手电筒源码)

    手电筒功能实现简单很实用,下面我们就来研究一下如何自制一款手电筒小程序,初学者可以通过实例了解原理,提高学习android技术的热情和动力. 首先我们了解一下手电筒要调用哪些android权限: &l ...

最新文章

  1. mysql中的 explain 关键字学习笔记
  2. Spark 写出MySQL报错,java.sql.BatchUpdateException
  3. Numpy自定义dtype的一个使用误区
  4. 商战特训营 竞合赛场显英才
  5. 常见的Java审计代码函数关键字_转载:Java代码审计汇总系列(一)——SQL注入
  6. 15 张图阅尽人工智能现状
  7. c# 批量mqtt_C#使用 MQTTnet 快速实现 MQTT 通信(文末有完整Demo下载)
  8. 一个C/S结构的优秀例子: 延迟补偿在C/S架构游戏协议设计和优化中的应用
  9. 计算机中职生毕业鉴定评语,中职学生毕业鉴定评语
  10. EasyUI:datagrid重置排序按钮状态
  11. 通过telegram 传递变量_Docker随时随地玩转变量
  12. 【Unity】12.2 导航网格寻路简单示例
  13. php计算macd,MT4里的MACD和平常所用的MACD计算公式是什么?
  14. 广州高清卫星地图 用百度卫星地图server下载 含标签、道路数据叠加 可商用
  15. UI设计师未来的发展趋势
  16. 位,字,字节,字地址,字节单元,字存储单元等区别
  17. [ElasticSearch] 空间搜索 (一)
  18. 【平面设计基础】12:ACR调色
  19. 去百度,还是去创新工场
  20. 2008.06.01 读华为前执行副总裁李玉琢的《我与商业领袖的合作与冲突》有感(二)

热门文章

  1. 步进电机两相和三相/五相的区别
  2. android米思奇打地鼠源代码,打地鼠 - 源码下载|游戏|源代码 - 源码中国
  3. 中国温室灌溉系统市场趋势报告、技术动态创新及市场预测
  4. 即插即用的PC红外遥控接收器
  5. 数据结构与算法 ~ 查找 ~ 散列查找(哈希~线性探查法和二次探查法)
  6. 实测通过,懒人专用,苹果手机投屏电脑快捷办法
  7. typescript中函数_如何在TypeScript中合成Canvas动画
  8. 某外包程序员吐槽:石乐志,又不是正式工,你拿阿里价值观压我
  9. spyder pyecharts不显示_速度、精准、便捷-Datacolor SpyderX 红蜘蛛显示器校色仪|大家测503...
  10. Keras —— 序贯模型和函数式模型