Android+Tomcat实现html解析基础

来源:互联网 发布:淘宝微商代理能挣钱吗? 编辑:程序博客网 时间:2024/05/22 02:20

   前几天写了几篇博客和大家分享了Android开发中的一些经验。今天我们来看看另一个非常有实用价值的Android工具实例:Android端实现html网页的解析。

   由于javaEE中继承了动态WEB类的开发环境,所以我们直接使用轻量级服务器Tomcat来完成网页部署,然后在安卓端上对页面内容进行获取。这个例子虽小,却是Android实现网络访问、数据获取与提交、流与字节相互转换等许多知识的基础。堪称经典范例。现在我们就来实现它。


【一】服务器端部署Web页面

首先先在eclipse的javaEE界面中新建一个Dynamic Web project,在WebContent目录中新建一个jsp的文件。


接着Run as---》 把工程部署在tomcat服务器上(此时若没有启动tomcat服务器也没有关系,新版本的jvaEE中,程序在部署时会发送开启命令)

这时,确定一下是否可以正常访问该页面:

 

我们还可以在箭头标注位置设置具体地址。成功后现在我们重点来看Android端的实现

PS:我们还可以再页面代码中修改charset值来选择页面编码,否则有可能显示乱码,这里我们采用UTF-8编码




【二】Android的数据流转换类的实现

首先理清思路后,我们发现,我们需要获取一个HTTP的连接池,然后得到一个inputstream的输入流,并把他转换为一个Byte数组。然后才能显示在界面上。为此,我们开发一个新类,实现上述功能。

*(当以后用到html解析时,这个类仍然有用,可以直接拷贝在工具类下作为常用方法)

以下是代码实现:

public class StreamTool {/** * 把一个inputstream里面的内容转化成一个byte[]  */public static byte[] getBytes(InputStream is) throws Exception{ByteArrayOutputStream bos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while((len = is.read(buffer))!=-1){bos.write(buffer, 0, len);}is.close();bos.flush();byte[] result = bos.toByteArray();System.out.println(new String(result));return  result;}}

我们声明了一个静态方法,方法接受InputStream的参数,然后利用新建的byte[] buffer,将InputStream中的内容读取到其中。之后再用write方法获取出buffer中的数据,传入到ByteArrayOutStream中,调用该类对象的toByteArray()方法,就能得到一个byte类型的数组了。




【三】建立连接,传递参数获取回传值

我们再新建一个工具类,在类中实现参数的传递与获取:

public class NetUtil {public static String getHtml(String address) throws Exception {URL url = new URL(address);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setReadTimeout(5000);conn.setRequestMethod("GET");int code = conn.getResponseCode();if (code == 200) {InputStream is = conn.getInputStream();byte[] result = StreamTool.getBytes(is);String temp = new String(result);// 简单描述原理// 真实的代码需要解析meta里面的信息if (temp.contains("gbk")) {return new String(result, "gb2312");} else {return temp;}} else {throw new IllegalStateException("访问网络失败");}}}

方法getHtml得到一个网络地址,然后建立连接,设置GET请求,由于连接返回的值是InputStream类型,所以我们正好可以使用上一步实现的getByte方法。

代码中的if语句的作用,是判断网页代码的编码格式,从而实现最佳的浏览体验。当然,这只是一个简单的实现范例,并没有仔细考虑效率和开销。不过大家有没有发现一些解码灵感~ XD



【四】交互前端的实现


很简单的一个线性布局,注册点击时间后就可以访问网络了:


public void onClick(View v) {switch (v.getId()) {case R.id.bt_view://按钮对应的点击事件 String address = mEtAddress.getText().toString().trim();if("".equals(address)){Toast.makeText(this, "地址不能为空", Toast.LENGTH_SHORT).show();return;}try {String html = NetUtil.getHtml(address);mTvView.setText(html);} catch (Exception e) {e.printStackTrace();Toast.makeText(this, "获取数据失败", 0).show();}break;}}

*注意:填写网页地址时,由于我们是Android的真实网络环境,不能写Localhost,而要用自己的IP地址代替。不知道本机IP的朋友,可以在命令控制中输入  -ipconfig 就能获取到ipv4的地址。



ok了!,一个网页查看器就做成功了。在此基础上,大家还可以做许多扩展,例如图片查看、音乐下载...








源码已上传,地址见回复~

 








原创粉丝点击