概述
-
功能需求:Android客户端解析和显示云服务器返回的xml文件。
-
思路:涉及到Android端应用和Java ee端web应用的编码实现。
-
示例:Android客户端获取腾讯云服务器上的视频资讯
步骤:
1、开发环境部署
Java ee部分:
java+apache-tomcat-8.5.9-windows-x64+Eclipse(for javaEE Developers版本)
android部分
android studio集成开发工具
2、web应用部分开发
① 在Java ee下(安装在本地笔记本端)新建“Dynamic Web Project”
②然后新建一个servlet,同时注意web.xml中的相关配置情况
截图如下:
注:servlet是放在HTTP Web服务器上面运行的Java程序。当用户通过客户端和服务器交互时,请求(request)会送给web服务器。如果请求需要Java的servlet时,服务器会执行或调用已经执行的servlet程序代码。servlet只是在服务器上运行的程序代码,执行用户发出请求所要的结果。
其中servlet核心代码如下
public class ListServelet extends HttpServlet {
private static final long serialVersionUID = 1L;
private VideoNewsService service=new VideoNewsServiceBean();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<News> videos = service.getLastNews();
request.setAttribute("videos", videos);
request.getRequestDispatcher("/WEB-INF/page/videonews.jsp").forward(request, response);
}
}
当用户请求该路径http://www.服务器公网IP:8080/web项目名称/ListServlet,其中ListServlet为创建的Servlet的名称,这个servlet就要从数据库中得到最新的视频资讯,并且把数据封装成一个xml数据返回给android客户端。
④先写一个业务bean,这个业务bean用于从数据库中得到最新的视频资讯,在方法中不打算真正的访问数据库,这里模拟一些测试数据进行返回
新建一个javabean,代码如下:资讯id+标题+时长
public class VideoNewsServiceBean implements VideoNewsService {
public List<News> getLastNews(){
List<News> newes = new ArrayList<News>();
newes.add(new News(90, "喜羊羊与灰太狼全集", 78));
newes.add(new News(10, "实拍舰载直升东海救援演习", 28));
newes.add(new News(56, "喀麦隆VS荷兰", 70));
return newes;
}
}
在业务bean中定义一个方法返回一个集合,例如:News,集合存放了数据库最新的视频资讯,集合里的元素类型采用一个javabean描述每一条视频资讯。
public class News {
private Integer id;
private String title;
private Integer timelength;
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 ee是面向接口编程,将业务bean中的方法进行接口抽取,同时继承实现这个接口中的方法。接口代码如下:
public interface VideoNewsService {
/**
* 获取最新的视频资讯
* @return
*/
public List<News> getLastNews();
}
⑤ 另外在表现层构造xml数据,在WebContent-WEB-INF下新建一个“page”文件夹,然后再新建一个jsp文件,名称“videonews”。
contentType=“text/xml” ,代码如下:
<%@ page language="java" contentType="text/xml; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><?xml version="1.0" encoding="UTF-8"?>
<videonews><c:forEach items="${videos}" var="video">
<news>
<id>${video.id}</id>
<title>${video.title}</title>
<timelength>${video.timelength}</timelength>
</news></c:forEach>
</videonews>
其中xml数据的呈现形式可以在jsp文件中进行定义,同时需要在lib文件下添加第三方类库jstl,如下:
⑥在servlet中需要引入新建的jsp文件,这样才能自定义xml格式文件
如下:
其中集合中的视频资讯对象传递给jsp文件,把对象放在request范围给定key,接着把请求内部转发给jsp。指定jsp文件路径。
⑦在javaee下把应用部署到tomcat服务器之后,在浏览器中输入路径:http://localhost:8080/videonews/ListServlet出现xml数据格式,证明web应用没问题了,即从服务器端返回了xml格式的数据并且显示在屏幕上。
⑧将web项目部署到腾讯云服务器上
- 第一步,在java ee中将web项目导出,导出为war格式;
- 第二步,将第一步导出的war文件放入腾讯云服务器Tomcat的webAPP目录下,然后从bin—startup.bat启动Tomcat,先在服务器试试http://localhost:8080/项目名称/ListServelet能否成功运行,可以的话,不要关闭服务器的Tomcat,回到自己笔记本,在浏览器输入http://服务器公网IP:8080/项目名称/ListServelet即可访问云服务器web项目.
3、Android部分开发
- 引入OkHttp来发送HTTP请求方式,在build.gradle添加OkHttp依赖文件,如下:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.0.1'
testCompile 'junit:junit:4.12'
compile 'com.squareup.okhttp3:okhttp:3.4.1'
}
- 此外,android部分的核心是对xml数据进行解析,代码如下:
class VideoNewsService {
/**
* 获取视频资讯
*
* @return
* @throws Exception
*/
static List<News> newses = new ArrayList<>();
static List<News> sendRequestWithOkHttp() {
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
// 指定访问的服务器地址是电脑本机
.url("http://云服务器公网IP:8080/VideoNews/ListServelet")
.build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
parseXML(responseData);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
return newses;
}
private static List<News> parseXML(String xmlData) throws Exception {
News news = null;
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
parser.setInput(new StringReader(xmlData));
int event = parser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_TAG:
if ("id".equals(parser.getName())) {
int id = Integer.valueOf(parser.nextText());
news = new News();
news.setId(id);
} else if ("title".equals(parser.getName())) {
news.setTitle(parser.nextText());
} else if ("timelength".equals(parser.getName())) {
news.setTimelength(Integer.valueOf(parser.nextText()));
}
break;
case XmlPullParser.END_TAG: {
if ("news".equals(parser.getName())) {
newses.add(news);
news = null;
}
break;
}
default:
break;
}
event = parser.next();
}
return newses;
}
}
News.java代码如下:
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;
}
}
MainActivty.class的核心代码如下:
public class MainActivity extends AppCompatActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) this.findViewById(R.id.listView);
try {
List<News> videos = VideoNewsService.sendRequestWithOkHttp();//需修改成你本机的Http请求路径
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) {
e.printStackTrace();
}
}
}
- 最终运行成功的效果图,如下:
最后
以上就是搞怪八宝粥为你收集整理的杂记2:Android客户端与云服务器网络通讯的全部内容,希望文章能够帮你解决杂记2:Android客户端与云服务器网络通讯所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复