Android+Tomcat实现html解析基础

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

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


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

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

Android+Tomcat实现html解析基础_第1张图片

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

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

 Android+Tomcat实现html解析基础_第2张图片

我们还可以在箭头标注位置设置具体地址。成功后现在我们重点来看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



【四】交互前端的实现

Android+Tomcat实现html解析基础_第3张图片

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


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








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

 








你可能感兴趣的:(Android经典示例)