`
alexlikeask
  • 浏览: 10252 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

J2ME平台解析WAP网页

阅读更多

  

  做了两年多的J2ME平台手机应用开发,从刚入行的一个菜鸟,到现在对新项目的驾轻就熟,过程即苦涩,又幸福。想必每个开发人员都有着深刻的体会。

 

  每个新的项目都伴随着新的领域和新的问题,大家在遇到这些问题也是习惯性的通过WEB网页Google一下。其实对于Java平台的一些知识点上网查资料还是很方便就能查到的,毕竟这是一个开源的平台。虽然网上有着很多优秀的资源可以利用,但是每个项目的不同,也造就了“具体问题,具体分析”。并且,也有很多的技术点由于受到公司的知识产权的问题也无法做到开源。

 

  今天,我就把一个自己写的WAP解析器给大家做个开源,目的就是希望起到一个抛砖引玉的作用,启发大家的逻辑思维能力。

 

  本解析器是基于sax原理(不知道的上网查查就清楚了)

private int reciveWapData() {

 synchronized(this){

InputStream is = null;

 int responseCode = 0;

 try {

responseCode = wapConnection.getResponseCode();

} catch (IOException e) {

 // TODO Auto-generated catch block

e.printStackTrace();

}

switch (responseCode) {

case HttpConnection.HTTP_OK:

 try {

 is = wapConnection.openInputStream();

mimeType = getMimeType(wapConnection);

if (mimeType != null && mimeType.length() > 0) {

while (isParser) {

if (parserHtml(is)) {

 parserTag(is);

}

}

}

} catch (IOException e) {

// TODO Auto-generated catch block

 e.printStackTrace(); } break;

case HttpConnection.HTTP_MOVED_PERM:

case HttpConnection.HTTP_MOVED_TEMP:

try {

 wapUrl = wapConnection.getHeaderField("location");

} catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }

break;

}

return responseCode;

 }

}


 

 

 

   上面这段代码,是在获得HttpConnection对象以后,通过int code = getResponseCode();方法获得服务器返回的连接信息,通过这个code我们可以判断连接成功还是失败,或者是URL地址重新定向。如果服务器返回的信息是200的话,我们就可以进行解析WAP网页了。

 

    在贴下一段代码之前,我先讲解一下解析的逻辑,这有助于更好的读懂代码。

  

  客户端接收到的WAP页面,都是有多个不同的标签所组成的,所以解析页面就要从这些标签入手,

   例;

        <html>

               <head>

                     <title>百度一下,你就知道</title>

               </head>

        <html>

 上面这段代码,是一个比较简单的HTML的结构,那么我们大家可以看所有的标签都有一对尖括号 < 和 > 。好的,我们就从这个括号入手,对页面进行解析。 tagNameEndChars.put(new Character('>'), new Character('>')); tagNameEndChars.put(new Character(' '), new Character(' '));


 

 首先,把停止读取的字符放入到一个table中去,

 

 

 

 

while (isParser) { if (parserHtml(is)) { parserTag(is); } }

 

 


 

 

上面代码中的这一部分,就是一个循环解析标签的过程,isParser是整个解析过程的停止标志,只有读到-1的时候,isParser = false;

 

boolean parserHtml(InputStream is) { int i = 0; try { do { i = is.read(); char c = (char) i; if (c == '<') { endChar = c; return true; }else { if (i <= 32 && i > 0) { return false; } else { endInt = i; endChar = c; if(readCssTagValue(is, '<')){ return true; } } } } while (i != -1); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(i<0){ isParser = false; } return false; }

 

 


 

   这一部分,是解析开始标签的方法,其中,endChar是最后读取的字符,这个变量非常重要,所以要用一个全局变量来进行控制,其他的逻辑已经很清楚,就不在多讲了。

 

void parserTag(InputStream is) { String tagData = null;//标签 String hyperLink = null;//超链接 boolean isTagEnd = false; int i = readOneChar(is); char c = (char)i; if(endChar == '<'){ if(c == '/'){ try { isTagEnd = true; tagData = readUntil(is, tagNameEndChars); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } setEndTag(tagData); System.out.println("结束标签:"+tagData); }else if(c == '!'){ try{ skipComment(is); return ; }catch(Exception e){ e.printStackTrace(); } }else{ try { isTagEnd = false; tagData = c + readUntil(is, tagNameEndChars); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } setStartTag(tagData); System.out.println("开始标签:"+tagData); if(endChar == CssTag.BLANK){ link = hyperLink = readUntil(is, CssTag.BRACKET_RIGHT); System.out.println("超链接:"+hyperLink); } } } byte tagId = CssTag.symbolAsInt(tagData); // System.out.println("标签类型======================================"+tagId); if(tagId == 0) { if(endChar != '>') { skipUntil(is, ">"); //skip rest of tag } WmlTag tag = new WmlTag(tagId); tag.setStartTag(isTagEnd); onTagReceived(tag,hyperLink,link); }

 

 


 

   这段代码就是解析结束标签,以及标签属性的方法,

 

   大家也看到了,就是这些方法当中都将InputStream这个对象传入到了方法中,这个输入流结合endChar还有tagNameEndChars,来控制要读取字符的长度。方法中的skipUntil();和onTagreceived();是跳过一定长度字符的方法和将标签转为可视的对象的方法,这些我就不贴代码了,因为这些不是解析器的关键。

 

  好了,到现在一个解析器就完成了,虽然说代码不是很全,不过只要能够理解其中的原理,在通过自己的动手,一个属于你自己的WAP解析器也会孕育而生。

 

第一次发表文章,所以代码贴的不太规范,请大家见谅,自己做一些整理。

1
0
分享到:
评论

相关推荐

    J2me 实现 wap 1.0 的解析

    通过j2me实现的wap 1.0的解析,能够解析基于wap1.0的wap网站,例如开心网,163等,解析是基于xmlpull 开源实现的

    j2me版wap浏览器源码

    j2me开发的wap浏览器,采用kxml解析

    j2me 解析wapv11src.zip browser

    1. Extract the files, they will be in sourceforge\j2wap\* directorys. Make sure you keep the directory strucuture. 2. For the PALM, edit the batch file makeme.bat to suit your local machine. 3. For ...

    KXML2 使用介绍

    能够让你快速上手KXML2,要知道j2me平台上的xml解析跟j2ee上的解析是不一样的,小生不才,研究一个下午终于搞定,你不看是你的损失。

    3G移动终端嵌入式浏览器的设计与实现

    介绍了开发中采用的一系列技术路线和关键技术:J2ME技术、WAP技术和DOM技术。介绍了系统体系结构的设计、各个功能模块的详细设计,并且详细介绍程序的详细设计,3G移动终端嵌入式浏览器系统包括四个 模块:用户界面...

    手机java浏览器源码

    这是一个Eclipse下的工程,解压缩后放到工作区里面,在eclipse里面刷新一下就可以看到工程了,可以直接编译运行,上WAP网站。应该不会有什么问题。 我以前也是一直在网上找j2me的浏览器源码,但感觉不好找,大部分也...

    JAVA上百实例源码以及开源项目

    此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...

    JAVA上百实例源码以及开源项目源代码

    J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理 这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失...

    新版Android开发教程.rar

    也有分析认为,谷歌并不想做一个简单的手机终端制造商或者软件平台开发商,而意在一统传统互联网和 移 动互联网。----------------------------------- Android 编程基础 4 Android Android Android Android 手机新...

Global site tag (gtag.js) - Google Analytics