posts - 13,  comments - 8,  trackbacks - 0
          J2ME就是Java 2 Platform,micro Edition的縮寫。J2ME是Java 2的一個組成部分,與J2
          SE、J2EE并稱。根據Sun Microsystems,Inc.的定義:J2ME是一種高度優化的Java運行環境,針
          對市面上的大量消費類電子設備,例如Papers、cellular phones(蜂窩電話), screen-phone
          s(可視電話?)、digital set-top boxes(數字機頂盒)、car navigation systems(汽車導航
          系統)等等。
             J2ME技術在1999年的JavaOne Developer Conference大會上推出。J2ME技術將Java語言
          的與平臺無關的特性移植到小型電子設備上,允許移動無線設備之間共享應用程

          為了學習J2ME技術,我需要安裝什么樣的軟件?
          1)、J2ME Wireless Toolkit
          J2ME Wireless Toolkit簡稱J2MEWTK,目前最新的版本就是1.0.3 Beta,J2MEWTK有什么用?打
          一個比方,J2MEWTK之于J2ME程序的開發,就相當于JDK之于Java程序的開發。J2MEWTK是由Sun
          公司開發的,你可以到Sun的網站去下載,這個工具和JDK一樣,是完全免費的。

          2)、J2SE SDK 1.3
          J2SE SDK 1.3亦即JDK 1.3,JDK有什么用?相信學過Java語言的人都知道,我就不多寫了,在安
          裝J2MEWTK之前,你必須確保你的系統已經安裝了一個可用的JDK。建議不要使用JDK 1.2和JD
          K 1.4,前者版本低,后者不穩定。

          3)、Tomcat 3.2.3/4.0
          Tomcat 3.2/4.0用作服務器軟件,為J2ME手機提供服務。由于手機的資源有限,所以我們需要
          盡量將商業計算集中于服務器端完成,減小客戶端的負擔,所以要開發J2ME程序,一個服務器軟
          件是少不了的。我采用JSP作為服務器端的解決技術,所以我選用的Web服務器是Tomcat。但是
          你也可以選用IIS+ASP、Apache+PHP。這個選擇不是唯一的。


          第一步,安裝JDK 1.3.0或者安裝一個包含JDK 1.3.0的軟件。我安裝了Jbuilder 5.0,它所帶
          的JDK是HotSpot 1.3.0_01 Client版。

          第二步,安裝J2MEWTK 1.0.3 Beta,在安裝的過程中,需要選擇系統中JDK的安裝目錄,安裝程序
          一般可以自動查出來JDK的安裝目錄,我們不用操心。

          第三步,安裝Tomcat 3.2.3/4.0,Tomcat 3.2.3是最穩定的3.x系列,推薦使用。Tomcat 4.0剛
          剛發布了正式版,也不妨一試。Tomcat 3.2.3/4.0需要經過配置,才能夠運行。

          第四步,測試Tomcat是否能夠正常運行JSP程序。這一步很重要。

          J2ME開發工具比較:
          1)、J2MEWTK,這個工具在前文已經提到過,它是最基本的J2ME程序開發工具,免費,體積小,速
          度較快,完全遵守J2ME的各種規范。具有簡單的IDE界面,易于上手,開發十分方便快捷,可以和
          Forte 3.0捆綁。J2MEWTK適用于初學者和已經達到很高水平的開發者。竊以為J2MEWTK+JDK+
          Editplus/UltraEdit是絕配。評語:重劍無鋒,大巧不工。

          2)、VisualAge Micro Edition 1.4。這是IBM的產品,號稱是J2ME開發領域的TOP 1,但是我用
          了半天,也沒有看出好在那里。馬上就刪除了。窗口太復雜,不明所以,開發起來很難適應,速
          度和J2MEWTK一樣,比較龐大,裝了這個東西,你的C盤就要小心了,多了很多亂七八糟的文件,還
          注冊了許多COM組件,典型的非綠色軟件。評語:!#$#%$#$%$#%@$@#。

          3)、CodeWarrior for Java 6.0。這是Motolola的產品,功能十分強大,集成度很好,開發,調
          試,發布J2ME程序都很方便(還可以做一般的Java Program)。它的IDE和Visual Studio十分相
          似,很容易上手。CodeWarrior比較適合中等水平的開發者的使用。不過CodeWarrior不是免費
          軟件,你只能夠免費使用30天。評語:摩托羅拉CodeWarrior,隨時隨地J2ME。

          4)、Borland Jbuilder 5.0的Nokia Bobile版。沒用過。評語:缺。

          在開發J2ME應用程序之前,我們必須選擇這些程序運行的平臺,亦即開發出來的J2ME程序
          運行在那一種手機或者是移動設備上面。在開發的過程中,我們需要對J2ME應用程序進行測試
          ,當然了,自己擁有一款支持J2ME的手機是最好的,例如Motolola的i85s,但是這個要求不是每
          一個開發者都能夠滿足(我連手表都沒有,更不用說手機了),因此,大多數的J2ME開發環境都提
          供了各種各樣的手機、移動設備模擬器,你可以首先在手機模擬器上測試你的J2ME程序,開發
          完畢以后,再將程序交給專業的廠商(一般是移動設備提供商),由它們將程序載入手機中進行
          真實的程序測試。模擬器和真實的設備之間有一定的差別,但是你的程序只要在模擬器上通過
          了,那么問題不會很大。
             J2MEWTK提供六種模擬器,分別是:Default Color Phone、Default Gray Phone、Minimu
          m Phone、Motolola i85s、PalmOS Device、RIM Java Handle。這些模擬器雖然外觀不一樣
          ,操作也不太一樣,但是J2ME程序在其上運行的結果是不會有什么區別的,在真實的設備上也是
          沒有什么區別的,這體現了Java的跨平臺特性。你還可以自定義自己的手機模擬器,這在J2ME
          WTK的User Guide中有詳細的描述。
             在開發過程中,選擇何種模擬器是十分重要的,原則上來說,你為那一種設備開發程序
          ,就要使用那一種設備的模擬器。但是J2ME程序在不同的模擬器上的運行效果基本上是一致
          ,所以你也可以采用你自己喜歡的模擬器。我們推薦你選用RIM Java Handle模擬器作為開發
          的首選模擬器,因為它的屏幕很大,看起來很舒服(但是別忘了你的真實設備的屏幕大小)。
             在J2MEWTK中,可以設定缺省的模擬器,怎么設呢?從開始菜單選擇J2MEWTK---->Default
          Device Selection,在下拉列表框中選擇模擬器的名字,然后單擊OK按鈕即可,J2MEWTK就會把
          這種模擬器認為是缺省的模擬器。你也可以在開發環境中每次手動選擇模擬器,不過這樣做顯
          然比較麻煩。J2MEWTK在初始情況下,默認的模擬器是Default Color Phone,說實在話,我從
          來沒有看見過這么難看的手機。

          現在開始嘗試開發J2ME程序。我的選擇是Windows XP 2600 Professional+J2SE SDK 1.3.
          0+Tomcat 4.0+J2MEWTK 1.0.3Beta。從開始菜單中選擇J2MEWTK---->Ktoolbar。Ktoolbar是
          J2MEWTK提供的一個簡陋的IDE工具。
           進入Ktoolbar以后,觀察窗口,在菜單的下面有四個按鈕,分別是:
          New Project:創建一個新的項目。
          Open Project:打開一個項目。
          Setting:對當前項目的環境進行設置。
          Build:編譯項目中的所有Java文件。
          Run:啟動缺省的模擬器,將當前項目載入,運行。
          Clear Console:清除控制臺輸出。
           在上述按鈕的下面,有一個下拉列表框,在這里你可以設置當前項目所使用的模擬器,這個
          設置可以覆蓋缺省的模擬器。在此下拉列表框下面,是一個文本框,這就是所謂的控制臺了。
          所有編譯、運行信息都會在這個控制臺中輸出。你可以使用Clear Console按鈕將控制臺中的
          信息完全清除。
           現在來看看菜單。Ktoolbar的菜單極其簡單,沒有什么可說的。Project菜單的package菜單
          項的作用是將當前項目打包輸出。這個菜單項特別有用,當你完成項目開發之后,使用這個菜
          單項可以產生一個jar文件,這樣就完成的項目的初步發布。
           現在來創建一個新的項目,單擊New Project按鈕,或者是使用File菜單的同名菜單項。出現
          一個新窗口。這個新窗口有兩個文本框,第一個文本框是Project Name,輸入fancy。第二個文
          本框是MIDlet Class Name,輸入fancy.test.HelloWorld。然后單擊OK,又出現一個對話框,要
          你配置項目的環境,不理,單擊OK按鈕關閉該窗口,回到Ktoolbar的主窗口。經過上述步驟,你
          已經創建了一個名為fancy的J2ME項目。

          安裝J2MEWTK以后,你應該仔細瀏覽一下J2MEWTK的目錄結構,這是一個很好的習慣。J2MEWT
          K的目錄結構如下:
          appdb文件夾:里面有duke的一些靚照。
          apps文件夾:里面有J2MEWTK的一些例子程序,我們建立的項目文件也存放在里面。
          bin文件夾:里面全部是exe程序。
          docs文件夾:不用多說了,是地球人都知道。
          lib文件夾:存放MIDP API。
          wtklib文件夾:存放J2MEWTK用到的類庫,以及一些資源文件,比如按鈕的圖標等等。
           在這些文件夾中,apps文件夾特別需要留意,這個文件夾有下列子文件夾:
          example:存放J2MEWTK的例子,側重于圖形方面,例子比較大,復雜,難看懂。
          lib:空,不知道放什么東西。
          tmplib:空,不知道放什么東西。
          UIDemo:存放J2MEWTK的例子,側重于用戶界面設計方面。例子不大,難度中等。
          fancy:這個文件夾原來是沒有的,當我們創建fancy項目的時候,J2MEWTK自動為我們創建的文
          件夾。
           進入fancy文件夾,它里面又有很多子文件夾,如下所示:
          bin:存放項目的打包輸出文件。
          classes:存放編譯器產生的class文件。
          lib:空,不知道有什么用。
          res:存放資源文件,例如項目中用到的圖片。
          src:存放項目的源代碼。
          tmpclasses:存放編譯器產生的class文件,是classes文件夾的鏡像。
          tmplib:空,不知道有什么用,是lib文件夾的鏡像。

          現在該是使用J2ME說Hello World的時候了。選擇你最喜歡的文本編輯器,例如Editplus,
          輸入下面的代碼:
          package fancy.test;

          import javax.microedition.midlet.*;
          import javax.microedition.lcdui.*;

          public class HelloWorld extends MIDlet implements CommandListener
          {
          private Display display;
                  private Form props;
           
          private Command exitCommand = new Command("Exit", Command.EXIT, 1);

          public HelloWorld()
          {
          display = Display.getDisplay(this);
                  }

          public void startApp()
          {
          props = new Form("Hello World");
          props.append("Hello World!\n");

          props.addCommand(exitCommand);
          props.setCommandListener(this);
          display.setCurrent(props);
                  }

          public void commandAction(Command c, Displayable s)
          {
          if (c == exitCommand)
          {
          destroyApp(false);
             notifyDestroyed();
          }
                  }

          public void destroyApp(boolean unconditional)
          {
                   }

          public void pauseApp()
          {
          display.setCurrent(null);
          props = null;
                  }

          }
           然后將該文件保存在J2MEWTK_HOME\apps\fancy\src\fancy\test目錄下面,文件名為Hello
          World.java。注意:你需要在fancy\src目錄下面創建fancy文件夾,然后再在fancy文件夾下面
          創建test文件夾。最后才保存HelloWorld.java文件。
           現在轉到J2MEWTK的主窗口,單擊Build按鈕,編譯整個項目,查看控制臺的輸出信息,一切無
          誤,再單擊Run按鈕,運行此程序。運行效果如下圖所示:


          要停電了,只好寫道這里了。
           1) package fancy.test;
           這行代碼聲明當前類所在的包。這是有必要的。而且這個包名必須和src文件夾中的目錄結
          構對應。

           2)
           import javax.microedition.midlet.*;
           import javax.microedition.lcdui.*;
           這兩行代碼導入必要的Java包,這兩個包的作用在后面會提及,這里就不多說了。

          3)
           public class HelloWorld extends MIDlet implements CommandListener
           J2ME程序一般應該繼承MIDlet,實現CommandListener。就如Applet必須繼承Applet,可能實
          現Runnable接口一樣。

          4)
           private Display display;
           private Form props;
           定義兩個私有對象,Display代表屏幕,顯示區域。Form是容器的一種。在J2ME程序中,不但
          有容器的概念,還有畫布(Canvas)的概念。這個程序在Form容器中顯示文本。

          5)
           private Command exitCommand = new Command("Exit", Command.EXIT, 1);
           聲明一個Command對象。J2ME的事件處理機制和J2SE的事件處理機制不太一樣。在J2ME程序
          中,必須預先定義一些Command對象,注冊到程序中。當設備發生了某個事件,會產生相應的Co
          mmand對象,并把它傳遞給一個事件處理函數----commandAction(),由它對所產生的事件做統
          籌處理。

          6)
          public HelloWorld()
          {
            display = Display.getDisplay(this);
          }
           這個是構造函數,函數內部,調用Display對象的靜態方法---getDisplay(),獲取屏幕對象,
          實例化display變量。這個調用是必要的。你可以在構造函數中做這個工作,也可以在startA
          pp()方法中做這個工作。推薦在構造函數中完成。

          7)MIDlet程序的運行流程
           構造函數---->startApp()------>偵聽事件,接受命令------->commandAction()方法----
          --->調用別的方法----------->如果是exit命令--------->pauseApp()--------->destroyA
          pp()方法。實際上MIDlet程序的運行流程和Applet程序的運行流程差不多。

          8)
          public void startApp()
          {
          props = new Form("Hello World");
          props.append("Hello World!\n");

          props.addCommand(exitCommand);
          props.setCommandListener(this);
          display.setCurrent(props);
                   }
           這是startApp()方法。這個方法是父類的抽象方法,在子類中必須予以覆蓋。首先實例化F
          orm對象----------props,Form的構造函數的參數(Hello World)就是屏幕的標題。Form對象
          是一容器,在里面可以包含別的東西,props.append(“…..”);的作用就是在這個容器中存放
          一個字符串。這個字符串會在屏幕中顯示出來。
           接下來的三行代碼分別做這樣的工作:
           將Exit命令注冊到Form對象(props)中,這樣Form對象(props)可以對該命令作出響應。
           設置Form對象(props)的命令監聽者。
           將Form對象設置為屏幕顯示的對象。
           你可以試著注釋掉這三行代碼,再編譯運行這個程序,看看會發生什么情況。

          9)
          public void commandAction(Command c, Displayable s)
          {
          if (c == exitCommand)
          {
          destroyApp(false);
             notifyDestroyed();
          }
                  }
           這個方法是事件處理的中樞,它接受各種命令,并對其進行分析,再分別調用合適的處理方法
          。在這個例子中,當接收到Exit命令以后,馬上銷毀程序,退出。

          10)destroyApp()方法的作用是退出程序并銷毀程序對象。pauseApp()方法的作用是暫停程序
          ,并銷毀容器對象或者是畫布對象。手機屏幕將會是一片空白。

          javax.microedition.lcdui:用戶界面包,主要用于構造程序的用戶界面。Command、Form都
          是這個包的類。
          javax.microedition.rms:這個包實現了對手機數據的存取功能。
          javax.microedition.midlet:這個包是MIDlet程序的聲明周期包,主要定義了MIDlet類,MIDl
          et類是一個抽象類,里面聲明了startApp()、destroyApp()、pauseApp()等抽象方法。
          javax.microedition.io:網絡IO包。有HttpConnection接口和Connection接口、Datagram接
          口。
          java.io.*
          java.lang.*
          java.util.*
          上面這三個包屬于J2ME核心包,J2ME中的核心包和J2SE中的同名核心包有些差別,主要是功能
          大大簡化了,許多類、方法都沒有了,只能實現一些最基本的功能。

          J2ME開發中有中文問題嗎?可能有,但是我目前沒有遇到。因為我沒有手機,只能在模擬器上
          運行J2ME程序,真實的情況是什么樣子我也不知道。在水木上有人說已經出現了中文問題,在
          模擬器上好好的,到了真正的手機上卻是一團亂碼。我現在也沒有辦法,只有在遇到的時候再
          補上這一節。我寫的測試程序如下所示,這個程序是在HelloWorld.java的基礎上改進而來的

          package fancy.test;

          import javax.microedition.midlet.*;
          import javax.microedition.lcdui.*;
          import java.util.*;

          public class Poem extends MIDlet implements CommandListener
          {
          private Display display;
                  private Form props;

           
          private Command exitCommand = new Command("Exit", Command.EXIT, 1);

          public Poem()
          {
          display = Display.getDisplay(this);
                  }

          public void startApp()
          {
          props = new Form("影落寒潭的簽名檔");
          props.append("小樓一夜聽春雨\n");
          props.append("深巷明朝賣杏花\n\r");
          props.append("虹虹的簽名檔\n");
          props.append("鴛鴦獨宿何曾慣\n");
          props.append("化作西樓一縷云\n");
          props.addCommand(exitCommand);
          props.setCommandListener(this);
          display.setCurrent(props);
                  }

          public void commandAction(Command c, Displayable s)
          {
          if (c == exitCommand)
          {
          destroyApp(false);
             notifyDestroyed();
          }
                  }

          public void destroyApp(boolean unconditional)
          {
                  }

          public void pauseApp()
          {
          display.setCurrent(null);
          props = null;
                  }
          }
           使用普通的編輯器編輯好上述文件以后,保存為Poem.java,保存路徑為src\fancy\test。然
          后在Ktoolbar中編譯,一切無誤之后,單擊Setting按鈕,出現一個配置窗口,選擇MIDlets面板
          ,單擊Add按鈕,依次輸入Poem、fancy.png、fancy.test.Poem三項。單擊OK按鈕,再單擊OK按
          鈕,關閉配置窗口,回到Ktoolbar的主界面,再次編譯。一切無誤之后,單擊Run按鈕運行程序。
          Poem的運行效果如下圖所示。
           注意:每新編寫一個程序,都要按照這個步驟進行配置,再編譯運行,我以后就不再重復描述
          這個步驟了。


          請看下面的代碼(Prop.java):
          package fancy.test;

          import javax.microedition.midlet.*;
          import javax.microedition.lcdui.*;
          import java.util.*;

          public class Prop extends MIDlet implements CommandListener
          {
          private Display display;
                  private Form props;

           
          private Command exitCommand = new Command("Exit", Command.EXIT, 1);

          public Prop()
          {
          display = Display.getDisplay(this);
                  }

          public void startApp()
          {
          props = new Form("System Properties");
          props.append("Hello World!\n");
          long time=System.currentTimeMillis();
          props.append("current time:"+time+"\n");
          props.append("microedition.configuration:"+
          System.getProperty("microedition.configuration")+"\n");
          props.append("microedition.profiles:"+
          System.getProperty("microedition.profiles")+"\n");
          props.append("microedition.platform:"+
          System.getProperty("microedition.platform")+"\n");
          props.append("microedition.locale:"+
          System.getProperty("microedition.locale")+"\n");
          props.append("microedition.encoding:"+
          System.getProperty("microedition.encoding")+"\n");
          props.append("java.version:"+System.getProperty("java.version")+"\n");//null
          props.append("java.vendor:"+System.getProperty("java.vendor")+"\n");//null
          props.append("java.vm.name:"+System.getProperty("java.vm.name")+"\n");//null
          props.append("java.vm.version:"+System.getProperty("java.vm.version")+"\n");//
          null
          props.append("os.name:"+System.getProperty("os.name")+"\n");//null
          props.append("os.arch:"+System.getProperty("os.arch")+"\n");//null
          props.append("os.version:"+System.getProperty("os.version")+"\n");//null
          props.append("user.name:"+System.getProperty("user.name")+"\n");//null
          props.addCommand(exitCommand);
          props.setCommandListener(this);
          display.setCurrent(props);
                 }

          public void commandAction(Command c, Displayable s)
          {
          if (c == exitCommand)
          {
          destroyApp(false);
             notifyDestroyed();
          }
                  }

          public void destroyApp(boolean unconditional)
          {
                  }

          public void pauseApp()
          {
          display.setCurrent(null);
          props = null;
                  }
          }
           這個程序的作用是輸出系統中各個環境屬性的值。訣竅是使用System類的getProperty()方
          法。請注意,J2ME核心包的System類已經不支持getProperties()方法了,而且很多環境屬性都
          不再支持了,比如java.version、java.vendor等等。


          查看內存利用情況
          請看程序(Memory.java):
          package fancy.test;

          import javax.microedition.midlet.*;
          import javax.microedition.lcdui.*;

          public class Memory extends MIDlet implements CommandListener
          {
          private Display display;
                  private Form props;
           
          private Command exitCommand = new Command("Exit", Command.EXIT, 1);

          public Memory()
          {
          display = Display.getDisplay(this);
                 }

          public void startApp()
          {
          props = new Form("Runtime Information");
          long total=Runtime.getRuntime().totalMemory();
          long free=Runtime.getRuntime().freeMemory();
          props.append("total memory:"+total+"\n");
          props.append("free memory:"+free+"\n");

          props.addCommand(exitCommand);
          props.setCommandListener(this);
          display.setCurrent(props);
                  }

          public void commandAction(Command c, Displayable s)
          {
          if (c == exitCommand)
          {
          destroyApp(false);
             notifyDestroyed();
          }
                  }

          public void destroyApp(boolean unconditional)
          {
                  }

          public void pauseApp()
          {
          display.setCurrent(null);
          props = null;
                  }

          }
           這個程序的訣竅是利用Runtime類的totalMemory()方法以及freeMemory()方法。J2ME中的
          Runtime類不再具有執行外部程序的功能了,這是很顯然的。

          List對象
          發信站: 北大未名站 (2001年10月20日20:32:00 星期六) , 站內信件

           List屬于javax.microedition.lcdui包,它和Form一樣,同樣屬于容器類型的對象。屬于容
          器類型的對象還有TextBox和Alert。我們在下面還會介紹這兩個類的用法。此處首先介紹Li
          st的用法。請看下面的程序(FormList.java):
          package fancy.test;

          import javax.microedition.midlet.*;
          import javax.microedition.lcdui.*;

          public class FormList extends MIDlet implements CommandListener
          {
          private Display display;
                  private List list;
          private Command exitCommand = new Command("Exit", Command.EXIT, 1);

          public FormList()
          {
          display = Display.getDisplay(this);
                  }

          public void startApp()
          {
          list= new List("Choose URL", Choice.EXCLUSIVE);
          list.append("www.pku.edu.cn",null);
          list.append("www.yahoo.com",null);
          list.append("fancyrainbow@263.net",null);

          list.addCommand(exitCommand);
          list.setCommandListener(this);
          display.setCurrent(list);
                  }

          public void commandAction(Command c, Displayable s)
          {
          if (c == exitCommand)
          {
          destroyApp(false);
             notifyDestroyed();
          }
                  }

          public void destroyApp(boolean unconditional)
          {
                  }

          public void pauseApp()
          {
          display.setCurrent(null);
          list = null;
                  }

          }
          請大家留意startApp()方法的內部:
          list= new List("Choose URL", Choice.EXCLUSIVE);
          list.append("www.pku.edu.cn",null);
          list.append("www.yahoo.com",null);
          list.append("fancyrainbow@263.net",null);

          list.addCommand(exitCommand);
          list.setCommandListener(this);
          display.setCurrent(list);
           其邏輯流程如下:首先調用構造函數實例化一個List對象(list),List對象實際上代表一個
          選擇列表。List類的構造函數的第一個參數是選擇列表的名字,第二個參數是選擇列表的形式
          , Choice.EXCLUSIVE表示這個選擇列表只能夠單選。如果是Choice.MULTIPLE,則表示這個選
          擇列表可以多選。List類的append()方法有兩個參數,第一個參數是選擇項的描述,第二個參
          數是一個Image對象,代表每個選擇項前面的小圖標。第二個參數可以是null值,但是第一個參
          數是必須的。我們同樣可以使用addCommand()方法往List中注冊命令,也可以使用setComman
          dListener()方法指定命令監聽者,這和Form是一樣的。在startApp()方法的最后,使用Displ
          ay對象的setCurrent()方法將List對象設定為當前的屏幕顯示對象。

          posted on 2005-10-13 23:15 YangRj 閱讀(373) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2005年10月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          常用鏈接

          留言簿(2)

          隨筆分類(5)

          隨筆檔案(13)

          文章分類(14)

          文章檔案(34)

          Apache - Tech Online

          BLOG 收集

          BLOG地址

          DB2

          Eclipse

          IBM - Tech Online

          JAVA

          ORACLE

          OS

          好網址

          文學網站

          累了 聽聽歌曲吧

          論壇

          積分與排名

          • 積分 - 25775
          • 排名 - 1514

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 自贡市| 灵璧县| 遂昌县| 鄂托克旗| 高邮市| 眉山市| 大洼县| 枞阳县| 桐城市| 宜丰县| 吉首市| 瓮安县| 贵阳市| 兴业县| 临高县| 安顺市| 广州市| 德州市| 揭西县| 集贤县| 遂昌县| 鄯善县| 渝中区| 江达县| 柘城县| 太仓市| 格尔木市| 鹤峰县| 石景山区| 石狮市| 开江县| 嘉兴市| 曲水县| 喀喇| 海门市| 南昌县| 眉山市| 桐梓县| 兴文县| 武鸣县| 沅江市|