饒榮慶 -- 您今天UCWEB了嗎?--http://www.ucweb.com

          3G 手機(jī)開發(fā)網(wǎng)

             :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            99 Posts :: 1 Stories :: 219 Comments :: 0 Trackbacks
          原文地址+源代碼 http://javaeye.5d6d.com/thread-150-1-1.html

          Wap Explorer的核心部件 WML解釋引擎

          今天也夠郁悶的,論壇一直上不去,不過(guò)也好,稱這下有時(shí)間,把Wap Explorer的核心部件剝離出來(lái),給大家一個(gè)思路。

          Wap Explorer的核心部件 WML解釋引擎。

          做Wap的最重要的解釋解釋引擎了,不管是wml ,html,還是經(jīng)過(guò)服務(wù)中轉(zhuǎn)的數(shù)據(jù)也好,最后來(lái)到
          手機(jī)客戶端的時(shí)候都是要經(jīng)過(guò)一個(gè)解釋引擎,說(shuō)白了就是手機(jī)客戶端可以識(shí)別的數(shù)據(jù)。
          據(jù)我所知道下面主流的Wap手機(jī)瀏覽器的做法是:
          1. oprea mini 是通過(guò)服務(wù)器中轉(zhuǎn)的。
          2. UCWeb 也是通過(guò)服務(wù)中轉(zhuǎn),不過(guò)有一小部分是解釋wml的,特別是解釋html的是一定要通過(guò)服務(wù)器中轉(zhuǎn)。
          3. 3GExplorer同上
          4. 航海家,以前主要是解釋W(xué)ML,不過(guò)最近新版本好像也是通過(guò)服務(wù)器中轉(zhuǎn)
          5. Wap Explorer 全部解釋wml引擎。
          6. 其他一些非主流的瀏覽器,基本上也是通過(guò)解釋wml的,因?yàn)樗麄冏约罕旧頉]有實(shí)力架構(gòu)服務(wù)器吧

          下面看看我寫的WML解釋引擎。下面直接運(yùn)行WMLParser,我是采用輸出文本的形式來(lái)解釋的,至于解釋后生成UI以后再慢
          慢詳說(shuō)。
          需要用到的只是,以及包: kxml

          下面是一段核心代碼

          /********************************************************************
           * 項(xiàng)目名稱                :<b>j2me學(xué)習(xí) J2me Wap Explorer</b>            <br/>
           *
           * Copyright 2005-2006 Wuhua. All rights reserved </br>
           *
           * 本程序只用于學(xué)習(xí)目的,不能用于商業(yè)目的。如有需要請(qǐng)聯(lián)系作者
           ********************************************************************/
          package org.fox.wap.parser;

          import java.io.IOException;
          import java.io.Reader;
          import java.util.Hashtable;

          import javax.microedition.lcdui.Choice;
          import javax.microedition.lcdui.Font;
          import javax.microedition.lcdui.TextField;

          import org.kxml2.io.KXmlParser;
          import org.xmlpull.v1.XmlPullParser;
          import org.xmlpull.v1.XmlPullParserException;

          /**
           * <b>類名:WmlParser.java</b> </br> 編寫日期: 2006-12-29 <br/>
           * 程序功能描述:WML的解釋器, 采用Kxml解釋引擎。<br/>
           * 解釋策略是,解釋多少就繪制多少 <br/>
           * Demo: <br/> Bug: <br/>
           *
           * 程序變更日期 :<br/> 變更作者 :<br/> 變更說(shuō)明 :<br/>
           *
           * @author wuhua </br> <a href="mailto:rrq12345@163.com">rrq12345@163.com</a>
           */
          public final class WmlParser implements Parser {

              private Hashtable attr = new Hashtable();

              private String url; //記錄當(dāng)前的URL

              /**
               * 當(dāng)前標(biāo)記,通過(guò)當(dāng)前標(biāo)記來(lái)創(chuàng)建Wap UI.
               */
              private String currentTag;

              /**
               * 創(chuàng)建當(dāng)前Align.
               */
              private String align;

              KXmlParser parser;

              private WmlParser(String url) {
                  parser = new KXmlParser();
                  this.url = url;

              }

              public static WmlParser getWmlParser(String url) {
                  return new WmlParser(url);
              }

              /**
               * 解釋wml,并生成一系列的Wap GUI部件。 比如遇到<a href="index.wml">首頁(yè)</a> 則對(duì)于的生成一個(gè)
               * HyperLink;
               *
               * @see WAPGUIFactory.createHyperLink(String text, String url, String algin) ;
               * @param in --
               *            通過(guò)Net獲取InputStream, 或者是本地文件解釋W(xué)ML
               * @return -- 返回一個(gè)Vector集,里面包含了,Wap GUI
               * @throws XmlPullParserException --
               *             解釋出錯(cuò)的時(shí)候拋出異常
               * @throws IOException --
               *             讀取數(shù)據(jù)的時(shí)候拋出異常
               */
              public final void parser() throws Exception {

                  //logger.debug(System.currentTimeMillis());
                  ;
                  int eventType;

                  eventType = parser.getEventType();
                  while (eventType != XmlPullParser.END_DOCUMENT) {
                      if (eventType == XmlPullParser.START_DOCUMENT) {
                      } else if (eventType == XmlPullParser.END_DOCUMENT) {

                      } else if (eventType == XmlPullParser.START_TAG) {
                          parserStartTagImpl(parser);
                      } else if (eventType == XmlPullParser.END_TAG) {
                          parserEndTagImpl();
                      } else if (eventType == XmlPullParser.TEXT) {
                          parserTextImpl(parser);
                      }
                      eventType = parser.next();
                  }
                  Runtime.getRuntime().freeMemory();

                  //logger.debug(System.currentTimeMillis());
                  // return parts;
              }

              public void setInput(Reader reader) throws XmlPullParserException {

                  parser.setInput(reader);

              }

              private void parserEndTagImpl() {
                  String name = parser.getName();
                  if (name.equals(WmlTag.P_TAG) || name.equals(WmlTag.BR_TAG)
                          || name.equals(WmlTag.CARD_TAG)) {

                      this.parserBrImpl();
                  }

              }

              /**
               * 此方法是處理各個(gè)標(biāo)記 但是有一個(gè)問題,就是會(huì)出現(xiàn)兩次標(biāo)記 比如 <a> </a>的時(shí)候就會(huì)處理兩次br
               *
               * @param parser
               */
              private void parserTextImpl(KXmlParser parser) {
                  parserAlign();
                  //logger.debug("Tag = " + currentTag + "  Text = "
                  //    + this.parser.getText());
                  if (currentTag.equals(WmlTag.P_TAG)) {
                      System.out.println("處理 P Tag ");
                      //paserStringPart(Style.PLAIN_SMALL, align, true);
                  } else if (currentTag.equals(WmlTag.A_TAG)) {
                      System.out.println("處理 A Tag ");
                      //parserHyperLinkImpl(parser);
                  } else if (currentTag.equals(WmlTag.BR_TAG)) {
                      System.out.println("處理 BR Tag ");
                      //paserStringPart(Style.PLAIN_SMALL, align, true);
                  } else if (currentTag.equals(WmlTag.CARD_TAG)) {
                      System.out.println("處理 CARD Tag ");
                      //parserCardTag(parser);
                  } else if (currentTag.equals(WmlTag.BIG_TAG)) {
                      System.out.println("處理 BIG Tag ");
                      //parserBigTag(parser);
                  } else if (currentTag.equals(WmlTag.U_TAG)) {
                      System.out.println("處理 U Tag ");
                      //parserUTag(parser);
                  } else if (currentTag.equals(WmlTag.EM_TAG)) {
                      System.out.println("處理 EM Tag ");
                      //parserEmTag(parser);
                  } else if (currentTag.equals(WmlTag.INPUT_TAG)) {
                      System.out.println("處理 INPUT Tag ");
                      //parserInputTag();
                  } else if (currentTag.equals(WmlTag.SELECT_TAG)) {
                      System.out.println("處理 SELECT Tag ");
                      //parserSelectTag();
                  } else if (currentTag.equals(WmlTag.OPTION_TAG)) {
                      System.out.println("處理 OPTION_TAG ");
                      //parserOptionTag();
                  } else {
                      System.out.println("處理 String 內(nèi)容 ");
                      //paserStringPart(Style.PLAIN_SMALL, align, true);
                  }

                  currentTag = WmlTag.UNKNOW;

              }

              /**
               * 處理圖片顯示問題,這里要處理圖片的相對(duì)路徑問題
               *
               */
              private void parserImgTag() {

              }

              private void parserOptionTag() {

              }

              /**
               * 處理Select標(biāo)記
               *
               */
              private void parserSelectTag() {

              }

              /**
               * 處理InputTag
               *
               */
              private void parserInputTag() {

              }

              private void parserEmTag() {

              }

              private void parserUTag() {

              }

              /**
               * 此方法是繪制,大字體時(shí)候用的。
               *
               * @param parser
               */
              private void parserBigTag() {

              }

              private void parserCardTag() {

              }

              /**
               * 處理<br/>標(biāo)記 比如: -----<br/> <br/> ------ 則創(chuàng)建StringPart("---------")并且設(shè)計(jì)換行<br/>
               * 換行的實(shí)現(xiàn)是:Part.setNextRow(true);
               *
               * @param parser2
               */
              private void parserBrImpl() {

              }

              /**
               * 處理String的顯示 paintMainform();這個(gè)必須放在當(dāng)text,或者是UI存在的時(shí)候才可以進(jìn)行更新
               *
               * @param font
               *            TODO
               * @param align
               *            TODO
               * @param nextRow
               *            TODO
               * @param parser2
               */
              private void paserStringPart(Font font, String align, boolean nextRow) {

                  attr.clear();
              }

              /**
               * 處理HyperLink,并生成HyperLink控件
               *
               * @param parser
               */
              private void parserHyperLinkImpl(KXmlParser parser) {

                  attr.clear();

              }

              private void parserAlign() {

              }

              /**
               * 解釋W(xué)ap標(biāo)記,并把屬性保存到attr
               *
               * @param parser
               */
              private void parserStartTagImpl(KXmlParser parser) {

              }

              public Object getResult() {
                  return null;
              }

          }


          源代碼里面具體可以運(yùn)行main類,就可以看到結(jié)果了
          有不明白的地方到這里討論。





          爬蟲工作室 -- 專業(yè)的手機(jī)軟件開發(fā)工作室
          3G視線 -- 專注手機(jī)軟件開發(fā)
          posted on 2007-08-22 15:45 3G工作室 閱讀(1676) 評(píng)論(4)  編輯  收藏 所屬分類: j2me

          Feedback

          # re: Wap Explorer的核心部件 WML解釋引擎 2007-08-22 16:24 爬蟲工作室
          這里人氣好像不怎么旺了
            回復(fù)  更多評(píng)論
            

          # re: Wap Explorer的核心部件 WML解釋引擎 2007-08-22 16:45 boboo
          可能是每年的這個(gè)時(shí)候項(xiàng)目開始增多吧。  回復(fù)  更多評(píng)論
            

          # re: Wap Explorer的核心部件 WML解釋引擎 2008-06-13 16:42 瑋哥
          viagar@hotmail.com 我是無(wú)線互聯(lián)網(wǎng)的從業(yè)者
          希望和你交流:)  回復(fù)  更多評(píng)論
            

          # re: Wap Explorer的核心部件 WML解釋引擎 2010-11-28 22:08 Cook
          贊!目前我還是外行,正在開始入門J2ME,向樓主學(xué)習(xí)  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 北流市| 清新县| 平凉市| 加查县| 津南区| 房产| 诏安县| 红桥区| 秦皇岛市| 朝阳县| 青田县| 禹州市| 清丰县| 阿拉善左旗| 金乡县| 兴山县| 白城市| 井研县| 塘沽区| 琼海市| 沧源| 阳西县| 山阳县| 霍州市| 乐山市| 乌鲁木齐县| 合作市| 文安县| 南阳市| 荥阳市| 汽车| 绥中县| 临江市| 东明县| 铜陵市| 上犹县| 乌兰察布市| 微山县| 鄂尔多斯市| 滁州市| 平陆县|