做了两年多的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解析器也会孕育而生。
第一次发表文章,所以代码贴的不太规范,请大家见谅,自己做一些整理。
分享到:
相关推荐
通过这样的方式,开发者可以使用J2ME和XMLPull实现对WAP 1.0网站的访问和解析,从而在移动设备上提供类似于桌面浏览器的浏览体验。尽管WAP 1.0现在已被更先进的技术如WAP 2.0(XHTML-MP)所取代,但理解这一过程对于...
在J2ME版WAP浏览器中,KXML用于解析WAP服务器返回的XML数据,这些数据通常包含网页的结构和内容。KXML提供了DOM(Document Object Model)和SAX(Simple API for XML)两种解析方式,前者将整个XML文档加载到内存中...
在J2ME环境下开发的WAP浏览器,能够使用户在这些设备上浏览基于WAP格式的网页。 **J2ME基础** J2ME包含几个关键组件,包括配置(Configurations)、 profiles(Profiles)和可下载的Java应用包(MIDlets)。配置...
总结来说,J2ME和WAP提供了解析和执行电话呼叫的不同途径。在J2ME中,主要依赖于JSR-120或JSR-253,而在WAP中,可以利用WML链接或WAP Push技术。理解并熟练运用这些方法,将有助于开发出具备拨打电话功能的高效、...
郭克华的《J2ME移动开发》PDF版是一份重要的学习资源,它专注于Java Micro Edition(J2ME)技术,这是Java平台的一个版本,主要用于嵌入式设备和移动电话的开发。J2ME为开发者提供了在小型设备上构建应用程序的能力...
《J2ME开发大全》是一本专为Java开发者设计的权威指南,全面解析了Java Micro Edition(J2ME)的各个方面。J2ME是Java平台的一个子集,主要用于嵌入式设备、移动设备和消费电子产品的应用程序开发。本书旨在帮助...
源码中的"网页源码"可能指的是使用WML(Wireless Markup Language)或者XHTML Mobile Profile(XHTML-MP)编写的小型适应移动设备的网页,这些通常用于早期的J2ME应用,因为它们可以被MIDP的`WAPBrowser`类解析显示...
Java 2 Micro Edition(J2ME)是Java平台的一个子集,主要用于嵌入式设备和移动设备,如手机和智能家电。MIDP(Mobile Information Device Profile)2.0是J2ME中的一个重要配置,它提供了在这些小型设备上开发应用...
J2ME是Java平台的一个子集,专门用于资源有限的设备,如移动电话、嵌入式系统和智能家电等。它提供了丰富的API,使得开发者能够构建跨平台的应用程序,具有高度的可移植性和灵活性。 1. **基本概念与环境搭建**:...
【J2ME贪吃蛇游戏源代码解析】 J2ME,全称为Java 2 Micro Edition,是Java平台的一个子集,主要用于开发移动设备、嵌入式设备上的应用程序。这款“贪吃蛇”游戏源代码是基于J2ME编写的,旨在提供一个在手机客户端上...
Java 2 Micro Edition(J2ME)是Java平台的一个子集,主要用于嵌入式系统和移动设备,如早期的智能手机、功能手机和一些家用电器。J2ME提供了轻量级的运行环境和开发框架,使得开发者能够创建在小型设备上运行的应用...
《Java J2ME手机网络版象棋游戏源码解析》 在移动设备上开发游戏,尤其是在早期智能手机时代,Java J2ME(Java Micro Edition)是一个非常流行的选择。本篇文章将深入探讨一个基于J2ME平台的手机网络版象棋游戏,...
《J2ME游戏编程》源码是一份专为学习J2ME(Java 2 Micro Edition)游戏开发设计的资源集合,旨在帮助开发者深入理解J2ME平台上的游戏编程原理和实践技巧。J2ME是Java平台上针对嵌入式设备和移动设备的一个子集,它在...
3. **XML处理**:学习如何在J2ME环境中解析和生成XML数据,可能涉及JSR-172(Java XML Pack)。 4. **图形和动画**:掌握低级的Graphics类,创建自定义图形和简单的动画效果。 5. **游戏开发**:探讨使用J2ME开发...
3. **WAP之家资源站.COM.url** 和 **WAP之家.COM.url**:这两个URL可能是提供j2ME开发资源或教程的网站链接,尤其是针对MMS相关的技术讨论、示例代码或者开发者社区。它们可以帮助开发者获取更多的学习材料和社区...
《J2ME飞机游戏源码解析与学习指南》 J2ME,全称为Java 2 Micro Edition,是Java平台的一个子集,主要用于嵌入式设备和移动设备的开发,如手机游戏、应用等。本篇将围绕“j2me飞机游戏源码”这一主题,深入探讨J2ME...
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 ...
**企业级J2ME源码解析** J2ME(Java 2 Micro Edition)是Java平台的一个子集,专为资源有限的嵌入式设备而设计,如移动电话、PDA和家用电器。在2000年代初期,J2ME在移动开发领域占据着重要地位,许多企业级应用都...
Java即时通信(J2ME即时通信)是一种基于Java平台,特别是Java 2 Micro Edition (J2ME) 技术实现的移动设备间的实时通讯技术。J2ME是Oracle公司为嵌入式设备和移动设备设计的Java编程环境,它允许开发者创建在小型...