Chasing an mobile web vision

          闖蕩在移動互聯(lián)網(wǎng)的世界中

          2006年2月15日 #

          移動互聯(lián)網(wǎng)時代--Android上的一個例子

          我們來演示一個獲取聯(lián)系人,并用網(wǎng)頁展現(xiàn)出來的簡單例子。

           首先,我們在eclipse環(huán)境中創(chuàng)建一個Android project,我們的Activity名稱是com.example.RIAExample,并且修改界面的layout文件如下:

          <?xml version="1.0" encoding="utf-8"?>
          <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation
          ="vertical"
              android:layout_width
          ="fill_parent"
              android:layout_height
          ="fill_parent"
              
          >
          <WebView android:id="@+id/web"
           android:layout_width
          ="fill_parent" android:layout_height="fill_parent">
          </WebView>
          </LinearLayout>

          可以看到,界面中僅僅包含一個WebView控件。

           接下來,創(chuàng)建一個簡單的java類來描述一個聯(lián)系人的信息,它包含聯(lián)系人姓名和號碼。

           

          package com.example;

          import java.util.Vector;

          import android.app.Activity;
          import android.os.Bundle;
          import android.webkit.WebView;

          public class RIAExample extends Activity {
              
              
          private WebView web;
              
              
          //模擬號碼簿
              private Vector<Person> phonebook = new Vector<Person>();
              
          /** Called when the activity is first created. */
              @Override
              
          public void onCreate(Bundle savedInstanceState) {
                  
          super.onCreate(savedInstanceState);
                  setContentView(R.layout.main);
                  
          this.initContacts();
                  web 
          = (WebView)this.findViewById(R.id.web);
                  web.getSettings().setJavaScriptEnabled(
          true);//開啟javascript設(shè)置,否則WebView不執(zhí)行js腳本
                  web.addJavascriptInterface(this"phonebook");//把RIAExample的一個實(shí)例添加到j(luò)s的全局對象window中,
                                                                  
          //這樣就可以使用window.phonebook來調(diào)用它的方法
                  web.loadUrl("file:///android_asset/phonebook.html");//加載網(wǎng)頁
               
              }

              
              
          /**
               * 該方法將在js腳本中,通過window.phonebook.getContacts()進(jìn)行調(diào)用
               * 返回的JavaArrayJSWrapper對象可以使得在js中訪問Java數(shù)組
               * 
          @return
               
          */

              
          public JavaArrayJSWrapper getContacts(){
                  System.out.println(
          "fetching contacts data");
                  Person[] a 
          = new Person[this.phonebook.size()];
                  a 
          = this.phonebook.toArray(a);
                  
          return new JavaArrayJSWrapper(a);
              
              }

              
              
          /**
               * 初始化電話號碼簿
               
          */

              
          public void initContacts(){
                  Person p 
          = new Person();
                  p.name 
          = "Perter";
                  p.phone_number 
          = "8888888";
                  phonebook.add(p);
                  p 
          = new Person();
                  p.name 
          = "Jack";
                  p.phone_number 
          = "777777";
                  phonebook.add(p);
                 
              }

              
              
          /**
               * 通過window.phonebook.debugout來輸出js調(diào)試信息。
               * 
          @param info
               
          */

              
          public void debugout(String info){
                  
                  System.out.println(info);
              }

          }

          下面是html文件,它非常簡單。
          <html>
              
          <head>
                  
          <script type="text/javascript" src="fetchcontacts.js"/>
          </head>
          <body>
              
          <div id = "contacts">
                  
          <p> this is a demo </p>
              
          </div>
          </body>
          </html>

          而主角就是我們的javascript腳本fetchcontacts.js
          window.onload= function(){
              window.phonebook.debugout(
          "inside js onload");//調(diào)用RIAExample.debugout
              var persons = window.phonebook.getContacts();//調(diào)用RIAExample.getContacts()
              if(persons){//persons實(shí)際上是JavaArrayJSWrapper對象
                  window.phonebook.debugout(persons.length() + " of contact entries are fetched");
                  
          var contactsE = document.getElementById("contacts");
                  
          var i = 0
                  
          while(i < persons.length()){//persons.length()調(diào)用JavaArrayJSWrapper.length()方法
                      
                      pnode 
          = document.createElement("p");
                      tnode 
          = document.createTextNode("name : " + persons.get(i).getName() + " number : " + persons.get(i).getNumber());//persons.get(i)獲得Person對象,然后在js里面直接調(diào)用getName()和getNumber()獲取姓名和號碼
                      pnode.appendChild(tnode);
                      contactsE.appendChild(pnode);
                      i 
          ++;
                  }

              }
          else{
                  window.phonebook.debugout(
          "persons is undefined");
              }

              
          }


           例子很簡單,我加了注釋希望有助大家理解,其他我就不深入解釋了。
          我把例子的源代碼放上來,你可以下來試一試。

          RIADemo

          這個例子說明通過WebView.addJavascriptInterface方法,我們可以擴(kuò)展JavaScript的API,獲取Android的數(shù)據(jù)。這樣,JS的粉絲就可以使用Dojo,JQuery,Prototy等這些知名的js框架來搭建android應(yīng)用程序來展現(xiàn)它們很酷很玄的效果!但是,目前addJavascriptInterface還不夠靈活強(qiáng)大,為什么呢?敬請關(guān)注第四篇“what next?”


          posted @ 2009-03-14 16:16 勤勞的蜜蜂 閱讀(5487) | 評論 (6)編輯 收藏

          移動互聯(lián)網(wǎng)時代--忽如一夜春風(fēng)來,web花開各終端

          自從Apple在safari上使用webkit并移植到iphone后,webkit就仿佛是獲得了選秀第一名似的,吸引了眾多眼球。
          其實(shí),我最早聽說webkit是在iphone出來前一兩年,當(dāng)時有報道說Nokia正在采用webkit為它下一代的Symbian平臺做一個引擎,而且還有專門的社區(qū),但比較封閉,很難進(jìn)入那個圈子,讓人一點(diǎn)感覺沒有。不過,至少說明Nokia很早就盯上這一塊了。
          iphone發(fā)布后,Apple似乎就接管webkit了,從此,webkit社區(qū)就有了巨大變化。Apple把能開放的東西都放到了webkit社區(qū)里面,速度還相當(dāng)?shù)目欤ㄓ肁pple自己的話說,他們貢獻(xiàn)了81%的力量,看看webkit社區(qū)的主力開發(fā)人員,有多少來自Apple!)現(xiàn)在,我們時不時的可以看到webkit的更新,比如對html5的跟進(jìn),css的特效等新功能!其中不得不重點(diǎn)提出的是2008年6月2日,webkit社區(qū)發(fā)布了高性能javascript引擎SquirrelFish!9月3日google chrome發(fā)布,采用了V8 javascript引擎,號稱比SquirrelFish還快,兩個禮拜后webkit就發(fā)布了SquirrelFish Extreme給予正面還擊。巨頭們牟足了勁爭先把javascript引擎油門踩到底!我不想猜測他們賣力的真正原因,但是,我覺得隨著移動終端能力加強(qiáng),javascript大面積攻進(jìn)終端已經(jīng)指日可待了,iphone和android已經(jīng)實(shí)現(xiàn)了。
          這期間,由于Apple的快速組合拳,Nokia經(jīng)營的webkit專區(qū)很快就倒閉了。但他并沒有放棄對webkit的投入,2008年1月28日Nokia宣布收購了Trolltech公司。現(xiàn)在Trolltech lab作為Nokia的代表仍然活躍在webkit社區(qū)之中。就前兩天,他們還在http://planet.webkit.org/發(fā)布了一篇標(biāo)題極其引人的博文“Creating a Google chat client in 15 minutes”,為QWebView做了一把廣告,相信qt的粉絲肯定不會錯過。而本月初發(fā)布的qt4.5中,明確指出qt加強(qiáng)了對webkit諸如SquirrelFish等新功能的整合。那么就讓我們期待一下Nokia的新款機(jī)器吧。
          到此,我們已經(jīng)看到Google, Apple, Nokia, Palm等移動終端的領(lǐng)頭羊們所采取的行動,然而,不要忘記軟件廠商!Adobe就是杰出的代表。作為RIA的強(qiáng)烈倡導(dǎo)者,他也選擇把webkit整合到其AIR平臺,你可以想象這個webkit+flash的威力有多強(qiáng)大!而Adobe發(fā)起的openscreen項(xiàng)目,更是表明了他要在RIA上爭奪王位的野心!
          好了,不啰嗦那么多了,總之呢,webkit已經(jīng)成為移動互聯(lián)網(wǎng)這出大戲的主角了,回歸到我在上一篇中提到的主題,讓我們來研究一下android.webkit.WebView的功能,來看android上的RIA。
          敬請關(guān)注下一篇--使用WebView的小例子。

          posted @ 2009-03-10 22:39 勤勞的蜜蜂 閱讀(2288) | 評論 (0)編輯 收藏

          移動互聯(lián)網(wǎng)時代的終端--暫時遺忘OSGi,讓我們?nèi)テ肺兑槐璦ndroid磨出的移動互聯(lián)網(wǎng)咖啡吧

          1年多前,揣著在移動終端推廣OSGi的夢想,我離開了原來的公司,來到了一個自認(rèn)為更利于osgi的地方,在我看來osgi擁有eRCP這樣的粉絲,應(yīng)該會給它在移動終端上提供廣闊的舞臺。然而半路殺出個程咬金,google android!第一次見到它時,我不相信osgi會輸,于是就廢寢忘食的研究它,結(jié)果我沒有進(jìn)行太多的抵抗,很快就被Android收編了。我得承認(rèn)它在某些關(guān)鍵的因素,確實(shí)比osgi更適合移動終端。對此,我只能感嘆google開源的偉大,以及摒棄jcp的雷厲風(fēng)行!但是,更為重要的是,在移動互聯(lián)網(wǎng)時代即將到來的時刻,Android為我們打開了一扇方便之門,這到底為何?

          通過對Android的(java)源碼進(jìn)行掃描后,我看到了像jsr211,MVM這些老朋友的影子,嗯,我可不想再炒這些舊飯了。還有啥?網(wǎng)上熱炒android用了webkit作為其瀏覽器的引擎,和iphone的safari使用的引擎一樣,這個東西應(yīng)該不錯,因?yàn)槲乙恢庇X得eRCP沒有很好的web控件,使得它在移動平臺上遜色不少,于是我翻到了android.webkit這個java包,wow! Google給webkit封裝了很多java的接口,這真是java開發(fā)人員的福氣,(聽說很多java開發(fā)人員對sun的javafx期待度最高的就是一個傳說中的JWebView控件,但是不知道出來沒,算了,我懶得查證了,因?yàn)榘超F(xiàn)在不想浪費(fèi)太多在sun java上,呵呵),不過我覺得這更是廣大互聯(lián)網(wǎng)應(yīng)用開發(fā)人員的福氣!想想!用html + css + javascript就能編寫android的類似電話簿,日歷甚至手機(jī)桌面的應(yīng)用,這難道不讓您浮想聯(lián)翩嗎?所以,如果說Android為移動終端進(jìn)入互聯(lián)網(wǎng)開了一扇門,那么android.webkit.WebView就是這扇門的金鑰匙,而webkit就是通向互聯(lián)網(wǎng)的康莊大道!

          其實(shí)android的webview是一個極端復(fù)雜的控件,而我個人認(rèn)為它是可以實(shí)現(xiàn)現(xiàn)在熱炒的RIA/webos等概念的基石!雖然我進(jìn)入這個領(lǐng)域不長,但覺得它非常有意思,很有前途,所以我打算寫一個系列,分享對它的理解,強(qiáng)烈歡迎各位高手指點(diǎn)!

          怎么開始說呢?不知道大家有沒有注意,年初Palm公司在CES上palm pre的基于webkit的webos驚艷之秀,十足掉起了大家的胃口,這是我聽到第一個冠以webos的移動終端,這是不是意味著目前由palm來唱這個webos的獨(dú)角戲呢?答案當(dāng)然不是,其實(shí)很多終端廠家以及平臺廠商很早就率領(lǐng)大部隊(duì)兵臨webos的城下了,相信很快一場硝煙彌漫的戰(zhàn)爭就要開始了......

          欲知端的,敬請關(guān)注移本系列第二篇--忽如一夜春風(fēng)來,web花開各終端

          posted @ 2009-03-09 22:53 勤勞的蜜蜂 閱讀(3449) | 評論 (7)編輯 收藏

          OSGi介紹(七)bundle和service(續(xù))

          接上一篇的例子,為了更具體一點(diǎn),我們考慮這樣的case,
          假設(shè)房地產(chǎn)開發(fā)商construction A采納了規(guī)劃公司design A的方案,打算建造公寓類型的房子CityApartment
          然后客戶A買了一套房子

          用ooa方式分析這個case,
          我抽象這幾個實(shí)體:規(guī)劃公司,圖紙類型,開發(fā)商,房子,買房人
          然后描述這幾件事情:開發(fā)商選擇設(shè)計圖紙,蓋樓然后銷售;買房人根據(jù)圖紙買房并使用房子

          下面是我用java語言來簡單描述它:

          design A 公司

          package design.a;
          interface Apartment {
          ..
          //方法省略先
          }

           

          開發(fā)商construction A

          package construction.a

          import design.a.*;//開發(fā)商要按照圖紙蓋樓

          class CityApartment implements Apartment {
          .
          //方法省略先
          }


          class Construction implements BundleActivator{

          }



          客戶 costumer A

          package customer.a

          import design.a.*;//客戶要按照圖紙選擇房子

          class Customer implements BundleActivator {
          .
          //方法省略先
          }



          然后我們把他們分別做成bundle
          Bundle A : design A
          其manifest中這樣描述

          BundleSymbolicName: design A
          Export
          -Package: design.a


          Bundle B : construction A
          其manifest中這樣描述

          BundleSymbolicName: construction A
          Import
          -Package: design.a
          Bundle
          -Activator: construction.a.Construction


          Bundle C : customer C
          其manifest中這樣描述

          BundleSymbolicName: customer C
          Import
          -Package: design.a
          Bundle
          -Activator: customer.c.Customer



          這樣,裝入到framework后,framework就會把BundlB和C與BundleA關(guān)聯(lián)起來,正好描述開發(fā)商A選擇design A的圖紙,客戶A也不得不選擇design A的圖紙啦
          可是,單從這里,我們看不出來,開發(fā)商和客戶拿同一份圖紙干什么。那我們得必須在BundleB和C的實(shí)現(xiàn)里面寫點(diǎn)東西來說明。

          這里給出開發(fā)商construction.a.Construction的偽代碼:

          class Construction implements BundleActivator {

           
          public void start(BundleContext context){
            CityApartment apartment 
          = null;
            Hashtable properties 
          = null;
            
          for(int i = 0; i < 100; i ++){
             properties 
          = new Hashtable();
             properties.put(
          "price",new Integer(1000 + i*5));//開發(fā)商為房子定價
             apartment = new CityApartment();//一套房子蓋好
             
          //把房子按照公寓注冊出去并打廣告,等待客戶來購買,framework就相當(dāng)于一個售樓處兼房屋中介
             context.registerService(Apartment.class.getName()/*公寓類型*/,apartment/*房子作為服務(wù)對象*/,properties/*與房子相關(guān)的附帶信息*/);
             
            }

            
          //這樣開發(fā)商一共注冊一百套房子
           }

          }



          而客戶的代碼可以如下:

          class Customer implements BundleActivator {
           
          public void start(BundleContext context){
            Apartment apartment 
          = null;
            ServiceReference ref 
          = context.getServiceReference(Apartment.class.getName,"(price=1050)");//先簽署購房合同,而且指明選擇Apartment類型,價格為1050的房子。
            apartment = (Apartment)context.getService(ref);//然后買到房子
            
          //買房人就可以使用房子apartment對象進(jìn)行日常生活了
           }

          }


          這樣,我們就很清楚的看出,Design A為Construction A和Customer A提供了共同的Apartment定義,才使得他們有交易的可能。于此同時,Construction A和Customer A之間的耦合是非常松的,因?yàn)椋绻辛硗庖粋€開發(fā)商onstruction B加入進(jìn)來也構(gòu)造了Apartment的對象,Customer就可以通過改變選擇條件,輕易的獲得B的房子,而客戶本身不關(guān)心房子是A還是B蓋的,這個是典型的面向?qū)ο蟮亩鄳B(tài)應(yīng)用。

          總的說來,Bundle在framework的幫助下,使得其他bundle使用其類型定義成為可能。service就是在這些共享的類型定義基礎(chǔ)上產(chǎn)生的具體對象,而使用這些service對象的bundle,必然也是對應(yīng)共享類型的使用者。
          這種類型共享,在osgi里面叫做"class space". framework運(yùn)行時通過關(guān)聯(lián)bundle之間的類型定義,可以構(gòu)成一個或多個"class space",而某個bundle在framework里面,只能處在一個"class space"里面,不能同時出現(xiàn)在多個"class space"中。
          怎么理解這個話呢?請看下一篇,外星人入侵了。

           

          posted @ 2007-07-21 22:28 勤勞的蜜蜂 閱讀(1731) | 評論 (1)編輯 收藏

          OSGi 介紹(七)bundle和service的關(guān)系

          osgi系列已經(jīng)發(fā)表了有將近2年的時間了,很高興這期間得到了許多朋友的關(guān)注,你們和我的討論切磋都讓我興奮無比。而過去很長的時間里,由于靈感枯竭外加精力有限,不能給大家分享更多osgi的精彩,實(shí)在辜負(fù)大家的期望,還請諒解。不過,根據(jù)這段時間大家和我私下的討論,發(fā)現(xiàn)很多人都苦惱于分不清楚bundle和service的關(guān)系,而我的osgi 5-6又臭又長,而且還非常依賴技術(shù),實(shí)在是坑害入門者的必備武器。這個不足,猶如頭上方圓半尺盤旋的蒼蠅,困擾著我,解釋的郵件也不知寫多少,估計收效甚微。于是我決定再次出山,寫一個驚世駭俗的分析文章,力圖讓更多讀者都能夠把這兩個瘋馬牛理清楚。

          開講之前,還是用老辦法,給大家舉個例子。放心,這個例子一點(diǎn)都不技術(shù),而且我相信你可能比我還清楚。大家都知道房地產(chǎn)商是怎么運(yùn)作樓盤的吧。據(jù)我淺顯的認(rèn)識,他們都會先進(jìn)行一些圖紙上的規(guī)劃,里面包含小區(qū)的整體規(guī)模,樓房外觀以及廣大疾苦民眾最為關(guān)心和渴求的戶型圖。據(jù)說,很多房地產(chǎn)商在搞定政府某些關(guān)鍵部門(個人意見僅供參考)拿到一塊地后,根本不用費(fèi)心思去自己規(guī)劃這些自己都一竅不通的東西,只要請一個有資質(zhì)的第三方公司寫寫畫畫,甚至照搬某西方發(fā)達(dá)國家的某社區(qū)概念,冠于中國特色云云,就能使廣大民眾趨之若鶩,傾囊搶購。ok,你可能受不了我又憤世嫉俗了,這個到底和osgi有啥關(guān)系?別著急,天色已經(jīng)很晚,下次某個時間請繼續(xù)關(guān)注osgi(七)續(xù),其間,請大家先考慮一下,如何用ooa的方式來描述人們?nèi)绾钨彿浚约霸诜孔永镞M(jìn)行日常生活這樣的簡單場景。

          posted @ 2007-07-16 23:31 勤勞的蜜蜂 閱讀(2489) | 評論 (2)編輯 收藏

          OSGi on mobile phone !

          如果你一直關(guān)注osgi在embedded的發(fā)展,并且還能到舊金山參加正在舉行的java one,那我真是羨慕死你了.

          Nokia在她的N800上demo運(yùn)行了osgi(此消息來源于david beers對BJ在osgi alliance blog上的評論,關(guān)于demo可以看這個link http://thehereweb.googlepages.com/)
          同時美國運(yùn)行商Sprint也宣布采用osgi的手機(jī)平臺將會在年底面世.多么值得期待的事情!

          posted @ 2007-05-14 10:11 勤勞的蜜蜂 閱讀(1796) | 評論 (0)編輯 收藏

          framework implementation updated

          瞎整了半年多,克服了重重困難,終于把原來framework做了更新,如果有興趣,還可以按照原來的Link下載。
          framework下載后,解壓并運(yùn)行startframework.bat就可以啟動framework了。
          目前該framework只支持在內(nèi)存中存儲bundle.

          另外,多增加了一個管理bundle,它為framework提供了簡單的圖形化操作界面,可以在這里下載。

          http://www.aygfsteel.com/Files/Ferrari4000/bundlemanagement.zip

          下載后,最好先把名字改為bundlemanagement.jar
          然后可以這樣安裝,假設(shè)該文件下載到d:\bundles下,則可以在framework的shell下輸入
          in file:d:/bundles/bundlemanagement.jar
          安裝該bundle,安裝成功后輸入stt 1(注意:1是數(shù)字一),啟動該bundle就可以出現(xiàn)圖形操作界面了。

          圖形界面提供bundle的安裝(只支持本地安裝),啟動,停止,升級和刪除等簡單功能。
          其他功能會在后面陸續(xù)增加。目前這個bundle只能運(yùn)行在j2se環(huán)境下。

          給的源代碼沒有很好的build文件,等我有時間了,再寫一個。

          感謝畢嘉兄弟的支持,他幫助設(shè)計了bundle存儲模塊以及實(shí)現(xiàn)了bundle在內(nèi)存存儲的第一版。

          有啥問題,可以直接給我發(fā)郵件,jerrylee.li@gmail.com

          posted @ 2006-09-16 23:40 勤勞的蜜蜂 閱讀(1563) | 評論 (0)編輯 收藏

          OSGi的曙光?

          前兩天,看到Peter的blog里說,由ibm牽頭發(fā)起了jsr291(http://www.jcp.org/en/jsr/detail?id=291),
          要把osgi的core應(yīng)用到目前的j2se上,以填補(bǔ)jsr277發(fā)布前的需求空白。

          osgi和277的pk開始了!我投osgi一票,呵呵,你買誰?

          posted @ 2006-03-03 13:51 勤勞的蜜蜂 閱讀(1737) | 評論 (1)編輯 收藏

          OSGi Alliance開設(shè)面向公眾的郵件列表

          繼開設(shè)Blog后(http://www.osgi.org/blog/index.html),昨天OSGi Alliance又宣布開設(shè)一個public的mail list,每個對OSGi感興趣的人都可以加入到這個列表中,通過這個列表可以訊問OSGi的相關(guān)的各種問題以及訂閱列表的郵件。
          請到http://bundles.osgi.org/mailman/listinfo/osgi-dev這里注冊。

          下面是BJ Hargrave的代表OSGi Alliance發(fā)的announcement


          Hello,

          As part of the OSGi evangelism work, I would like to announce that OSGi now has a new public mail list for OSGi technical questions and discussion. This mail list is a public list and is open to anyone to participate. This new list is mainly for non-members to discuss OSGi technology and ask question about the technology. ......

          The new mail list address is:

          osgi-dev@bundles.osgi.org

          You can subscribe to the list here:
          http://bundles.osgi.org/mailman/listinfo/osgi-dev or by sending an e-mail to osgi-dev-subscribe@bundles.osgi.org.

          So please go ahead and subscribe to the new osgi-dev mail list. Your participation there can help educate others about the OSGi technology.

          BJ Hargrave
          Senior Technical Staff Member, IBM
          OSGi Fellow and CTO of the OSGi Alliance

          posted @ 2006-02-16 10:20 勤勞的蜜蜂 閱讀(1299) | 評論 (0)編輯 收藏

          framework implementation

          這里是我目前的成果。
          http://www.aygfsteel.com/Files/Ferrari4000/framework.zip包含了framework的jar文件。
          解壓后,直接運(yùn)行.bat文件就可以了。這個framework實(shí)現(xiàn)了r4core的大部分api(除一些支持local和安全的外,secrurity admin和conditional permission這兩個服務(wù)也沒有實(shí)現(xiàn),url service也沒有實(shí)現(xiàn)),輸入help可以看到可以運(yùn)行的命令(不過全是英文的,還是我寫的,將就一下吧)。

          http://www.aygfsteel.com/Files/Ferrari4000/src.zip包含所有源碼。代碼有點(diǎn)亂,hoho

          要成功編譯代碼,您還需要下載這個http://www.aygfsteel.com/Files/Ferrari4000/osgi.rar
          解壓并后得到4個jar,并把他們放入到build path中,import順序保證它們優(yōu)先于jre就可以了。

          我打算重新編寫了。把framework的實(shí)現(xiàn)重新規(guī)劃一下,然后實(shí)現(xiàn)core的所有內(nèi)容,進(jìn)而再實(shí)現(xiàn)cmpn的所有服務(wù)。
          如果你對開發(fā)osgi framework感興趣,一起來吧!

          給我發(fā)信:jerrylee.li@gmail.com

          posted @ 2006-02-15 09:15 勤勞的蜜蜂 閱讀(1799) | 評論 (8)編輯 收藏

          主站蜘蛛池模板: 庆安县| 蒲江县| 临澧县| 常德市| 偏关县| 五寨县| 汽车| 阜宁县| 漯河市| 沂水县| 洞头县| 余庆县| 云阳县| 张家港市| 卢湾区| 武安市| 呈贡县| 珲春市| 淮安市| 秦皇岛市| 和田市| 平阳县| 呈贡县| 巴林右旗| 两当县| 阿拉善盟| 宁乡县| 大同市| 浦城县| 乡城县| 积石山| 察哈| 泗洪县| 淳安县| 龙南县| 当涂县| 连城县| 阿城市| 高碑店市| 中超| 绵阳市|