<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    3G 手機開發網

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

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

    今天也夠郁悶的,論壇一直上不去,不過也好,稱這下有時間,把Wap Explorer的核心部件剝離出來,給大家一個思路。

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

    做Wap的最重要的解釋解釋引擎了,不管是wml ,html,還是經過服務中轉的數據也好,最后來到
    手機客戶端的時候都是要經過一個解釋引擎,說白了就是手機客戶端可以識別的數據。
    據我所知道下面主流的Wap手機瀏覽器的做法是:
    1. oprea mini 是通過服務器中轉的。
    2. UCWeb 也是通過服務中轉,不過有一小部分是解釋wml的,特別是解釋html的是一定要通過服務器中轉。
    3. 3GExplorer同上
    4. 航海家,以前主要是解釋WML,不過最近新版本好像也是通過服務器中轉
    5. Wap Explorer 全部解釋wml引擎。
    6. 其他一些非主流的瀏覽器,基本上也是通過解釋wml的,因為他們自己本身沒有實力架構服務器吧

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

    下面是一段核心代碼

    /********************************************************************
     * 項目名稱                :<b>j2me學習 J2me Wap Explorer</b>            <br/>
     *
     * Copyright 2005-2006 Wuhua. All rights reserved </br>
     *
     * 本程序只用于學習目的,不能用于商業目的。如有需要請聯系作者
     ********************************************************************/
    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/> 變更說明 :<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; //記錄當前的URL

        /**
         * 當前標記,通過當前標記來創建Wap UI.
         */
        private String currentTag;

        /**
         * 創建當前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">首頁</a> 則對于的生成一個
         * HyperLink;
         *
         * @see WAPGUIFactory.createHyperLink(String text, String url, String algin) ;
         * @param in --
         *            通過Net獲取InputStream, 或者是本地文件解釋WML
         * @return -- 返回一個Vector集,里面包含了,Wap GUI
         * @throws XmlPullParserException --
         *             解釋出錯的時候拋出異常
         * @throws IOException --
         *             讀取數據的時候拋出異常
         */
        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();
            }

        }

        /**
         * 此方法是處理各個標記 但是有一個問題,就是會出現兩次標記 比如 <a> </a>的時候就會處理兩次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 內容 ");
                //paserStringPart(Style.PLAIN_SMALL, align, true);
            }

            currentTag = WmlTag.UNKNOW;

        }

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

        }

        private void parserOptionTag() {

        }

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

        }

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

        }

        private void parserEmTag() {

        }

        private void parserUTag() {

        }

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

        }

        private void parserCardTag() {

        }

        /**
         * 處理<br/>標記 比如: -----<br/> <br/> ------ 則創建StringPart("---------")并且設計換行<br/>
         * 換行的實現是:Part.setNextRow(true);
         *
         * @param parser2
         */
        private void parserBrImpl() {

        }

        /**
         * 處理String的顯示 paintMainform();這個必須放在當text,或者是UI存在的時候才可以進行更新
         *
         * @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() {

        }

        /**
         * 解釋Wap標記,并把屬性保存到attr
         *
         * @param parser
         */
        private void parserStartTagImpl(KXmlParser parser) {

        }

        public Object getResult() {
            return null;
        }

    }


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





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

    Feedback

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

    # re: Wap Explorer的核心部件 WML解釋引擎 2007-08-22 16:45 boboo
    可能是每年的這個時候項目開始增多吧。  回復  更多評論
      

    # re: Wap Explorer的核心部件 WML解釋引擎 2008-06-13 16:42 瑋哥
    viagar@hotmail.com 我是無線互聯網的從業者
    希望和你交流:)  回復  更多評論
      

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

    主站蜘蛛池模板: 无码中文在线二区免费| 一个人免费视频在线观看www| 日韩在线免费电影| 美女黄网站人色视频免费国产| 国产精品公开免费视频| 国产亚洲精午夜久久久久久| 亚洲AV无码码潮喷在线观看 | 可以免费观看的国产视频| 国产成人精品亚洲精品| 亚洲美女在线观看播放| 国产精品自拍亚洲| 国内精品久久久久影院免费| 亚洲AV中文无码字幕色三| 日韩免费无码视频一区二区三区| 午夜免费福利网站| 日本亚洲欧美色视频在线播放| 国产黄在线观看免费观看不卡| 蜜臀98精品国产免费观看| 亚洲国产精品尤物yw在线| 亚洲制服丝袜精品久久| 亚洲av最新在线观看网址| 最近免费最新高清中文字幕韩国 | 亚洲毛片基地4455ww| 中文字幕在线视频免费| 国产色爽女小说免费看| 一本岛v免费不卡一二三区| 最近2019中文字幕mv免费看| 亚洲不卡av不卡一区二区| 美女被羞羞网站免费下载| 日本zzzzwww大片免费| 亚洲精品高清无码视频| 国产亚洲精品美女久久久久久下载| 亚洲av午夜成人片精品电影| 中文字幕乱码免费看电影| 国产亚洲精品a在线观看| 午夜视频在线免费观看| 亚洲一区二区三区在线观看精品中文 | 四虎成人免费观看在线网址| 亚洲五月综合网色九月色| 国产国产人免费视频成69大陆| 99久久免费国产精品热|