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

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

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

    qiyadeng

    專注于Java示例及教程
    posts - 84, comments - 152, trackbacks - 0, articles - 34

    2014年11月25日


    現(xiàn)在做互聯(lián)網(wǎng)產(chǎn)品的團(tuán)隊(duì)都比較小,也可能沒(méi)有特別多運(yùn)維人員。因此特別需要用一些系統(tǒng)或是工具來(lái)監(jiān)控服務(wù)器或者是服務(wù)是否正常。之前比較直接的做法是自己搭建一套開(kāi)源的監(jiān)控系統(tǒng),現(xiàn)在隨著云服務(wù)器的流行,也有越來(lái)越多的人用戶會(huì)使用云端的監(jiān)控平臺(tái)。

    從我的經(jīng)驗(yàn)來(lái)看,云服務(wù)器監(jiān)控是有些特別的好處的:
    1.自建的監(jiān)控平臺(tái),有一部分問(wèn)題是沒(méi)辦法發(fā)出警報(bào)。比如,一般監(jiān)控服務(wù)器也會(huì)在內(nèi)部網(wǎng)絡(luò)中,如果出現(xiàn)外部網(wǎng)絡(luò)問(wèn)題,監(jiān)控服務(wù)是沒(méi)辦法通知到相關(guān)人員(因?yàn)榘l(fā)郵件或者是發(fā)短信的通路也會(huì)出現(xiàn)問(wèn)題)。
    2.自建的監(jiān)控平臺(tái),只能檢測(cè)到一個(gè)點(diǎn)的訪問(wèn)情況。阿里云監(jiān)控平臺(tái)可以檢測(cè)杭州和青島兩個(gè)節(jié)點(diǎn)(這是我的帳號(hào)看到的),可以比較有效地了解非監(jiān)測(cè)點(diǎn)的一個(gè)訪問(wèn)情況。
    3.云監(jiān)控平臺(tái)都有一套不錯(cuò)的管理界面,可有效減少部署維護(hù)和使用成本。

    下面我介紹一下,我使用過(guò)的一些云監(jiān)控平臺(tái),并對(duì)他們的優(yōu)點(diǎn)和缺點(diǎn)進(jìn)行比較。

    阿里云監(jiān)控

    阿里的云服務(wù)器在市場(chǎng)中是做的很不錯(cuò)的,我的很多朋友都購(gòu)買了阿里的云服務(wù)器。以阿里的公司實(shí)力,做一款云監(jiān)控的產(chǎn)品應(yīng)該不會(huì)差到哪里去。
    優(yōu)點(diǎn):
    1.產(chǎn)品體驗(yàn)好,進(jìn)入住界面就能輕而易舉找到你想要的功能。
    2.監(jiān)控功能全,包括站點(diǎn)監(jiān)控、服務(wù)器監(jiān)控和自定義監(jiān)控。
    3.多點(diǎn)監(jiān)控,可以在全國(guó)提供幾個(gè)點(diǎn)的監(jiān)控。從用戶的角度了解服務(wù)是否可用。
    4.站點(diǎn)監(jiān)控功能也很全面,包含SMTP、POP3、FTP監(jiān)控。
    5.免費(fèi),且監(jiān)控站點(diǎn)數(shù)沒(méi)限制。
    缺點(diǎn):
    1.服務(wù)器監(jiān)控和自定義監(jiān)控,要求是云服務(wù)器,如果不是云服務(wù)器,只能使用站點(diǎn)檢測(cè)功能。

    360網(wǎng)站服務(wù)監(jiān)控

    360的個(gè)人用戶產(chǎn)品很少使用,但是360的企業(yè)產(chǎn)品還真有不少做的不錯(cuò)的。說(shuō)說(shuō)360監(jiān)控的優(yōu)缺點(diǎn)。
    優(yōu)點(diǎn):
    1.提供服務(wù)器監(jiān)控。可以監(jiān)控到服務(wù)器的磁盤,CPU,內(nèi)存等情況。
    2.UI和告警都設(shè)計(jì)的不錯(cuò)。
    3.免費(fèi)。
    缺點(diǎn):
    1.需要在服務(wù)器上開(kāi)SNMP協(xié)議。(不過(guò)360提供很多腳本工具,可以一鍵安裝)
    2.有20臺(tái)服務(wù)器的限制。(這個(gè)基本上夠用,超過(guò)20臺(tái)服務(wù)器,可以購(gòu)買服務(wù)了)

    監(jiān)控寶

    名字很專一,一看就知道是專業(yè)做監(jiān)控的。
    優(yōu)點(diǎn):
    1.專注監(jiān)控,界面設(shè)計(jì)還算可以。
    2.監(jiān)控功能全面,內(nèi)網(wǎng)采集的方式較多。可以采集數(shù)據(jù)庫(kù)數(shù)據(jù)。
    缺點(diǎn):
    1.免費(fèi)用戶,服務(wù)器和網(wǎng)站監(jiān)控都有限制,而且數(shù)量極少2臺(tái)服務(wù)器監(jiān)控,5臺(tái)網(wǎng)站監(jiān)控。


    作者簡(jiǎn)介:qiyadeng(www.qiyadeng.com)對(duì)互聯(lián)網(wǎng)技術(shù)、運(yùn)營(yíng)及市場(chǎng)領(lǐng)域有濃厚的興趣,喜愛(ài)思考、閱讀、討論;擅長(zhǎng)Java開(kāi)發(fā)及分布式技術(shù)。現(xiàn)專注于互聯(lián)網(wǎng)的創(chuàng)新產(chǎn)品–老來(lái)寶(http://www.laolaibao.com),幫助年輕用戶獲得補(bǔ)充養(yǎng)老金,并提供養(yǎng)老金增值產(chǎn)品。

    posted @ 2014-11-25 17:49 qiyadeng 閱讀(7266) | 評(píng)論 (1)編輯 收藏

    2014年11月17日

     
    比較少參加這類大型的會(huì)議,進(jìn)到會(huì)場(chǎng)的第一眼,發(fā)現(xiàn)會(huì)議室已經(jīng)全部坐滿,后來(lái)主辦方發(fā)現(xiàn)站的人太多了,找來(lái)了一些小板凳,我快速找到一個(gè)小板凳坐下。坐下開(kāi)始認(rèn)真聽(tīng),非常開(kāi)心地聽(tīng)到廣告時(shí)間結(jié)束,和我計(jì)劃的時(shí)間完美一致。

    回顧一下我比較關(guān)系的幾個(gè)主題

    基于用戶畫(huà)像的大數(shù)據(jù)實(shí)例

    演講嘉賓是聯(lián)通沃商店的大數(shù)據(jù)技術(shù)經(jīng)理,該大數(shù)據(jù)實(shí)例主要是通過(guò)聯(lián)通營(yíng)運(yùn)商的數(shù)據(jù)和沃商店進(jìn)行分析,通過(guò)繪制用戶畫(huà)像的形式,在其他應(yīng)用場(chǎng)景,如廣告、游戲下載中為用戶推薦用戶喜歡的產(chǎn)品。可以看出來(lái)嘉賓技術(shù)實(shí)例及基礎(chǔ)功是十分不錯(cuò),至少是一個(gè)碩士畢業(yè)。近些年被大家掛在嘴邊的機(jī)器學(xué)習(xí)算法、推薦算法、語(yǔ)義分析都有部分介紹,實(shí)在是接受不過(guò)來(lái);比較熟悉的還是我們當(dāng)初碩士的專業(yè)方向推薦算法,看到了簡(jiǎn)單的介紹覺(jué)得很親切。不過(guò)后來(lái)提問(wèn)環(huán)節(jié)看,現(xiàn)場(chǎng)還是很多高人,有不少是做這個(gè)領(lǐng)域的。不過(guò)歸根是國(guó)有企業(yè)和類似研究機(jī)構(gòu),是否能產(chǎn)生非常大的價(jià)值,我表示懷疑,不過(guò)這些算法一羅列,對(duì)經(jīng)費(fèi)的分配還是很有好處的。

    電商系統(tǒng)的心得分享

    這又是一個(gè)國(guó)有企業(yè),號(hào)稱是線上賣大力丸的人(國(guó)藥1健康)。從技術(shù)成長(zhǎng)為總經(jīng)理,有很多心得體會(huì)。感覺(jué)和我有那么一點(diǎn)像,有一些體會(huì)也迫不及待的分析給這些年輕的IT從業(yè)者,為人嚴(yán)肅,總是會(huì)把困難估計(jì)的充分一點(diǎn)(估計(jì)年輕也沒(méi)少教學(xué)費(fèi))。演講中說(shuō)了構(gòu)建系統(tǒng)中的四個(gè)原則
    權(quán)限獨(dú)立,相互制約
    非常務(wù)實(shí)的看到某些大型企業(yè)的,部門斗爭(zhēng)。從系統(tǒng)層面開(kāi)始設(shè)計(jì)制約(這個(gè)應(yīng)該非常符合老板心意)。這個(gè)對(duì)很多小型企業(yè)在成才過(guò)程中是非常有幫助的。
    設(shè)計(jì)流程  減少犯錯(cuò)
    在電商行業(yè)非常清楚客服和倉(cāng)庫(kù)的員工流動(dòng)性,以及普遍受教育程度偏低,通過(guò)流程設(shè)計(jì),而不是提高對(duì)用人的要求。這也是非常務(wù)實(shí)的方法。回顧之前在系統(tǒng)層面獨(dú)自設(shè)計(jì)支持中央預(yù)訂系統(tǒng),設(shè)計(jì)出來(lái)的自動(dòng)傳真(當(dāng)時(shí)網(wǎng)絡(luò)不如現(xiàn)在易得)及新訂單提醒(感謝施總的支持,增加音響進(jìn)行聲音)等等,簡(jiǎn)直覺(jué)得找到了知音。
    多了解一些財(cái)務(wù)知識(shí)。
    談到的兩點(diǎn)是數(shù)據(jù)之間需要有勾稽關(guān)系和不能修改歷史數(shù)據(jù),很驕傲我對(duì)財(cái)務(wù)的理解還是不錯(cuò),從未犯過(guò)這種不靠譜的錯(cuò)誤。

    跨平臺(tái)大型在線客服系統(tǒng)的技術(shù)構(gòu)架

    嘉賓談了的是一套客服系統(tǒng),比較多的關(guān)鍵字是客服妹子,可以看出IT從業(yè)者苦中作樂(lè)的精神。給我的體會(huì)是,客服系統(tǒng)都可以做成這樣。從一個(gè)項(xiàng)目到一個(gè)產(chǎn)品,在云計(jì)算的世界,可以好一個(gè)客服的組件,也是有很大的價(jià)值。和我的理想事業(yè)很接近,可以花上一生中最精華的時(shí)間,做好一個(gè)有價(jià)值的小眾專業(yè)的行業(yè)。

    阿里分布式數(shù)據(jù)庫(kù)服務(wù)實(shí)踐

    阿里的人就是高調(diào),上場(chǎng)就調(diào)戲京東雙11前系統(tǒng)崩潰。我也經(jīng)歷過(guò)很多系統(tǒng)崩潰,簡(jiǎn)直是開(kāi)發(fā)人員的噩夢(mèng),也是IT人員信用受損的嚴(yán)重事件(因此我一直比較注意防止崩潰及崩潰后的快速恢復(fù))。回到分布式數(shù)據(jù)庫(kù),這個(gè)是收獲最大的一個(gè)演講。雖然這個(gè)演講看上去是再給阿里云的DRDS做宣傳,但是嘉賓演講的很進(jìn)行,深入淺出地介紹了分布式數(shù)據(jù)庫(kù)和單機(jī)數(shù)據(jù)庫(kù)的區(qū)別。對(duì)分布式事務(wù)的重新認(rèn)識(shí)是一個(gè)很大的收獲,以前一直把教程中的數(shù)據(jù)庫(kù)原理中的事務(wù)定義,作為分布式事務(wù)需要解決的問(wèn)題,其實(shí)不是。需要更加務(wù)實(shí),在淘寶阿里這類訂單處理系統(tǒng)中,有一類對(duì)分布式事務(wù)的模式(異步消息機(jī)制);在其他領(lǐng)域會(huì)有其他模式分布式的事務(wù)模型,這些分布式模型肯定都不滿足單機(jī)的事務(wù)模型,但是可以滿足和解決相應(yīng)領(lǐng)域的問(wèn)題。

    平臺(tái)架構(gòu)的服務(wù)器監(jiān)控

    一個(gè)APP的監(jiān)控模型,猜測(cè)項(xiàng)目立項(xiàng)的原因,有兩個(gè)。一個(gè)是和競(jìng)爭(zhēng)對(duì)手的數(shù)據(jù)比較(UPYUN的對(duì)手主要是七牛),一個(gè)其實(shí)可以真正從用戶的角度看,用戶的體檢速度如何,以及影響用戶體驗(yàn)速度的真實(shí)原因。目前一般行業(yè)還不會(huì)做的這么細(xì),因?yàn)閁PYUN是技術(shù)支持公司,因此一定需要用這些數(shù)據(jù)去說(shuō)服和支持用戶。我們現(xiàn)在做的比較多的服務(wù)器的可用性、性能和應(yīng)用的可用性、性能監(jiān)控。前端時(shí)間剛好再比較,發(fā)現(xiàn)互聯(lián)網(wǎng)上有不少好的監(jiān)控平臺(tái),一般的創(chuàng)業(yè)公司,可以無(wú)需自己搭建監(jiān)控平臺(tái),接入到相應(yīng)的監(jiān)控平臺(tái)即可。下次再開(kāi)文進(jìn)行討論。


    作者簡(jiǎn)介:qiyadeng(www.qiyadeng.com)對(duì)互聯(lián)網(wǎng)技術(shù)、運(yùn)營(yíng)及市場(chǎng)領(lǐng)域有濃厚的興趣,喜愛(ài)思考、閱讀、討論;擅長(zhǎng)Java開(kāi)發(fā)及分布式技術(shù)。現(xiàn)專注于互聯(lián)網(wǎng)的創(chuàng)新產(chǎn)品--老來(lái)寶(http://www.laolaibao.com),立志于幫助廣大鳳凰(diao)男(si)提供補(bǔ)充養(yǎng)老金管理平臺(tái)。

    posted @ 2014-11-17 14:57 qiyadeng 閱讀(4177) | 評(píng)論 (0)編輯 收藏

    2013年6月13日

         摘要: guava是Java的一個(gè)擴(kuò)展類庫(kù),在google的許多項(xiàng)目中使用過(guò)了,現(xiàn)在最為一個(gè) 開(kāi)源的Java類庫(kù)廣泛使用(http://code.google.com/p/guava-libraries/)。 guava類庫(kù)擴(kuò)展的主要是這些相關(guān)類:collections(集合類),concurrency(并發(fā)),primitives,reflection(反射),comparison,I/O,hashi...  閱讀全文

    posted @ 2013-06-13 23:18 qiyadeng 閱讀(11227) | 評(píng)論 (1)編輯 收藏

    2013年5月8日

    簡(jiǎn)單介紹一下8個(gè)Java牛人,他們?yōu)镴ava社區(qū),創(chuàng)建了框架(framework),產(chǎn)品或者是寫(xiě)書(shū),影響甚至改變了Java開(kāi)發(fā)的方法(根據(jù)個(gè)人喜好排序)。

    8.Tomcat創(chuàng)始人

    James Duncan Davidson,是當(dāng)時(shí)Sun公司的軟件工程師(1997-2001),創(chuàng)建了Java的Web服務(wù)器Tomcat,Tomcat廣泛應(yīng)用于Java Web開(kāi)發(fā)的各個(gè)領(lǐng)域。

    7.測(cè)試驅(qū)動(dòng)開(kāi)發(fā)JUnit創(chuàng)始人

    Kent Beck,極限編程和測(cè)試驅(qū)動(dòng)開(kāi)發(fā)方法的締造者。此外,他還創(chuàng)造了JUnit,JUnit目前一次成為Java開(kāi)發(fā)測(cè)試的事實(shí)標(biāo)準(zhǔn)。基于測(cè)試驅(qū)動(dòng)的開(kāi)發(fā)方法和JUnit給Java開(kāi)發(fā)的方法帶了巨大的變化。

    6.Java Collections框架設(shè)計(jì)者

    Joshua Bloch,領(lǐng)導(dǎo)設(shè)計(jì)了Java平臺(tái)的許多功能,包括Java 5.0 版本中飽受贊譽(yù)的Java Collections框架。2004年他離開(kāi)Sun公司,成為Google的首席Java架構(gòu)師,此外他的著作“Effective Java”基本上是學(xué)習(xí)Java的必讀之書(shū)。

    5.JBoss創(chuàng)始人

    Marc Fleury,在2001年創(chuàng)造了JBoss,JBoss是一個(gè)Java開(kāi)源的應(yīng)用服務(wù)器,也已經(jīng)成為Java Web應(yīng)用部署中的事實(shí)標(biāo)準(zhǔn)。后來(lái)他把JBoss買給了RedHat,之后繼續(xù)從事JBoss的開(kāi)發(fā)工作。不過(guò)2007年他離開(kāi)了RedHat去追求他的個(gè)人愛(ài)好。

    4.Struts創(chuàng)始人

    Craig Mcclanahan,創(chuàng)建了Struts,一個(gè)流行的基于Java的MVC開(kāi)源框架,基本上很多Java開(kāi)發(fā)者都知道如何開(kāi)發(fā)Struts的應(yīng)用程序。

    3.Spring創(chuàng)始人

    Rod Johnson,Spring框架的創(chuàng)始人,Spring Source的CEO。Spring是一個(gè)非常流行的Java應(yīng)用程序開(kāi)發(fā)的開(kāi)源框架。此外,他的著作Expert One-to-One J2EE Design and Development,是J2EE最有影響力的一本書(shū)。

    2.Hibernate創(chuàng)始人

    Gavin King,Hibernate的創(chuàng)始人,一個(gè)流行的Java ORM解決方案;同時(shí)他也是Seam的創(chuàng)始人,此外他為EJB3.0和JPA也做出了突出的貢獻(xiàn)。

    1.Java之父

    James Gosling,1994年發(fā)明了Java語(yǔ)言,他創(chuàng)建了Java編譯器和虛擬機(jī)。在2010年,當(dāng)Oracle收購(gòu)Sun公司時(shí),他離開(kāi)了Sun公司。

    原創(chuàng)文章,作者:qiyadeng,轉(zhuǎn)載請(qǐng)注明: 轉(zhuǎn)載自http://www.qiyadeng.com/

    本文鏈接地址: 你應(yīng)該知道的8個(gè)Java牛人

    posted @ 2013-05-08 21:56 qiyadeng 閱讀(3519) | 評(píng)論 (1)編輯 收藏

    2013年4月21日

    1.申請(qǐng)開(kāi)發(fā)者帳號(hào)

    首先注冊(cè)百度的帳號(hào),然后申請(qǐng)成為百度開(kāi)發(fā)者(需要通過(guò)手機(jī)進(jìn)行身份證驗(yàn)證)。

    2.新建應(yīng)用

    點(diǎn)擊菜單中的創(chuàng)建應(yīng)用,我們目前選擇的是Web應(yīng)用。

    應(yīng)用創(chuàng)建之后,選擇左邊菜單的云環(huán)境,環(huán)境類型需要選擇JAVA。

    并新創(chuàng)建一個(gè)版本,輸入1作為版本號(hào)

    3.在百度集成開(kāi)發(fā)環(huán)境中開(kāi)始開(kāi)發(fā)

    百度提供了基于Eclipse的插件,由于該插件不能支持最新的Eclipse版本。建議下載百度的一鍵安裝版本。百度文檔中介紹了如何使用開(kāi)發(fā)環(huán)境,詳細(xì)請(qǐng)看集成開(kāi)發(fā)環(huán)境使用

    打開(kāi)百度集成開(kāi)發(fā)環(huán)境,在Eclipse左下角點(diǎn)擊Login to Baidu,使用你的賬號(hào)登陸。然后點(diǎn)擊工具欄中百度Logo,選擇Import BAE Project,填入application和version

    之后選擇Java作為Project Language。

    4.解決項(xiàng)目錯(cuò)誤

    剛導(dǎo)入的BAE project,在Eclipse中會(huì)報(bào)錯(cuò)。通過(guò)problems view可以看到是因?yàn)镴RE環(huán)境配置不正確和Web運(yùn)行環(huán)境設(shè)置不正確。

    A.右鍵項(xiàng)目屬性--選擇JavaBuildPath,在Libraries中選擇Add Library,之后再選擇JRE System Library。

    B.接下來(lái)把Java project轉(zhuǎn)換為Java Web Project(Eclipse中Java Project轉(zhuǎn)換為Java web Project),注意如果你的tomcat是6版本的話,請(qǐng)注意選擇Dynamic web Module的版本不超過(guò)2.5。

    設(shè)置Web應(yīng)用的運(yùn)行環(huán)境,在servers view中新建一個(gè)tomcat服務(wù)器。

    C.和A類似,在Java Build Path中加入 Server Runtime,選擇Tomcat。

    D.修改hello.jsp,在hello.jsp中加入如下代碼

    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>

    E.把項(xiàng)目部署到tomcat中。

    至此項(xiàng)目錯(cuò)誤全部解決,應(yīng)該可以看到運(yùn)行結(jié)果。

    5.新建Servert測(cè)試

    新建一個(gè)Servlet,HomeServlet,Eclipse會(huì)自動(dòng)在web.xml中加入配置信息,HomeServet.java和web.xml的部分代碼如下:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
    }

    /**
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    out.println("<h1>BAE Servlet Test.</h1>");
    }

    web.xml中部分代碼

    <servlet>
    <description></description>
    <display-name>HomeServlet</display-name>
    <servlet-name>HomeServlet</servlet-name>
    <servlet-class>com.qiyadeng.HomeServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>HomeServlet</servlet-name>
    <url-pattern>/HomeServlet</url-pattern>
    </servlet-mapping>

    運(yùn)行tomcat,可以看到如下運(yùn)行成功,這樣你就可以像一般的Java Web Project一樣進(jìn)行開(kāi)發(fā)。

    6.最后

    BAE中Java環(huán)境中百度使用的Jetty,而不是tomcat,Jetty的好處是不需要頻繁的重啟,修改的代碼即時(shí)就可看到運(yùn)行結(jié)果。

    通過(guò)SVN提交代碼到BAE,如果有需要做小的修改,可以通過(guò)百度的在線編輯工具直接修改。

    原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明: 轉(zhuǎn)載自http://www.qiyadeng.com/

    本文鏈接地址: 百度開(kāi)發(fā)者中心BAE新建Java應(yīng)用

    posted @ 2013-04-21 13:35 qiyadeng 閱讀(341) | 評(píng)論 (0)編輯 收藏

    1.申請(qǐng)開(kāi)發(fā)者帳號(hào)

    首先注冊(cè)百度的帳號(hào),然后申請(qǐng)成為百度開(kāi)發(fā)者(需要通過(guò)手機(jī)進(jìn)行身份證驗(yàn)證)。

    2.新建應(yīng)用

    點(diǎn)擊菜單中的創(chuàng)建應(yīng)用,我們目前選擇的是Web應(yīng)用。

    應(yīng)用創(chuàng)建之后,選擇左邊菜單的云環(huán)境,環(huán)境類型需要選擇JAVA。

    并新創(chuàng)建一個(gè)版本,輸入1作為版本號(hào)

    3.在百度集成開(kāi)發(fā)環(huán)境中開(kāi)始開(kāi)發(fā)

    百度提供了基于Eclipse的插件,由于該插件不能支持最新的Eclipse版本。建議下載百度的一鍵安裝版本。百度文檔中介紹了如何使用開(kāi)發(fā)環(huán)境,詳細(xì)請(qǐng)看集成開(kāi)發(fā)環(huán)境使用

    打開(kāi)百度集成開(kāi)發(fā)環(huán)境,在Eclipse左下角點(diǎn)擊Login to Baidu,使用你的賬號(hào)登陸。然后點(diǎn)擊工具欄中百度Logo,選擇Import BAE Project,填入application和version

    之后選擇Java作為Project Language。

    4.解決項(xiàng)目錯(cuò)誤

    剛導(dǎo)入的BAE project,在Eclipse中會(huì)報(bào)錯(cuò)。通過(guò)problems view可以看到是因?yàn)镴RE環(huán)境配置不正確和Web運(yùn)行環(huán)境設(shè)置不正確。

    A.右鍵項(xiàng)目屬性--選擇JavaBuildPath,在Libraries中選擇Add Library,之后再選擇JRE System Library。

    B.接下來(lái)把Java project轉(zhuǎn)換為Java Web Project(Eclipse中Java Project轉(zhuǎn)換為Java web Project),注意如果你的tomcat是6版本的話,請(qǐng)注意選擇Dynamic web Module的版本不超過(guò)2.5。

    設(shè)置Web應(yīng)用的運(yùn)行環(huán)境,在servers view中新建一個(gè)tomcat服務(wù)器。

    C.和A類似,在Java Build Path中加入 Server Runtime,選擇Tomcat。

    D.修改hello.jsp,在hello.jsp中加入如下代碼

    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>

    E.把項(xiàng)目部署到tomcat中。

    至此項(xiàng)目錯(cuò)誤全部解決,應(yīng)該可以看到運(yùn)行結(jié)果。

    5.新建Servert測(cè)試

    新建一個(gè)Servlet,HomeServlet,Eclipse會(huì)自動(dòng)在web.xml中加入配置信息,HomeServet.java和web.xml的部分代碼如下:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
    }

    /**
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    out.println("<h1>BAE Servlet Test.</h1>");
    }

    web.xml中部分代碼

    <servlet>
    <description></description>
    <display-name>HomeServlet</display-name>
    <servlet-name>HomeServlet</servlet-name>
    <servlet-class>com.qiyadeng.HomeServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>HomeServlet</servlet-name>
    <url-pattern>/HomeServlet</url-pattern>
    </servlet-mapping>
    運(yùn)行tomcat,可以看到如下運(yùn)行成功,這樣你就可以像一般的Java Web Project一樣進(jìn)行開(kāi)發(fā)。

    6.最后

    BAE中Java環(huán)境中百度使用的Jetty,而不是tomcat,Jetty的好處是不需要頻繁的重啟,修改的代碼即時(shí)就可看到運(yùn)行結(jié)果。

    通過(guò)SVN提交代碼到BAE,如果有需要做小的修改,可以通過(guò)百度的在線編輯工具直接修改。


    原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明: 轉(zhuǎn)載自http://www.qiyadeng.com/

    本文鏈接地址: 百度開(kāi)發(fā)者中心BAE新建Java應(yīng)用


    posted @ 2013-04-21 13:33 qiyadeng 閱讀(12334) | 評(píng)論 (12)編輯 收藏

    2013年4月11日

    空指針異常(Null Pointer Exception)是我們平時(shí)最容易碰到的,也是最令人討厭的異常。本文介紹如何避免出現(xiàn)空指針異常。

    首先我們看如下的示例

    private Boolean isFinished(String status) {  
    if (status.equalsIgnoreCase("Finish")) {
    return Boolean.TRUE;
    } else {
    return Boolean.FALSE;
    }
    }


    如果status的值為空的話,那么將會(huì)出現(xiàn)空指針異常(本例第2行)。所以我們應(yīng)該使用如下的方法
    private Boolean isFinished(String status) {
    if ("Finish".equalsIgnoreCase(status)) {
    return Boolean.TRUE;
    } else {
    return Boolean.FALSE;
    }
    }

    這樣的話,如果status為空,也不會(huì)出現(xiàn)空指針異常。相信我們大多數(shù)朋友已經(jīng)知道這樣的方法了,如果一個(gè)對(duì)象可能為null,那么不需要直接調(diào)用它的方法。

    接下來(lái)我將接著提供幾種避免空指針的建議。

    1.判斷Collection是否為空。

    2.使用一些判斷方法。

    3.assert關(guān)鍵字。

    4.Assert類。

    5.異常處理。

    6.太多的點(diǎn).操作語(yǔ)法。

    7.使用StringUtils類

    1.判斷Collection是否為空

    Collection 為空是指Collection中沒(méi)有元素。一些開(kāi)發(fā)者如果碰到Collection中沒(méi)有元素的時(shí)候,經(jīng)常return null,更好的做法是,你應(yīng)該return Collections.EMPTY_LIST,Collections.EMPTY_SET或者是Collections.EMPTY_MAP.

    錯(cuò)誤的代碼

    public static List getEmployees() {  
    List list = null;
    return list;
    }

    正確的代碼

    public static List getEmployees() {  
    List list = Collections.EMPTY_LIST;
    return list;
    }


    2.使用一些判斷方法

    使用一些方法如contains(),indexOf(),isEmpty(),containsKey(),ContainsValue和hasNext()等來(lái)判斷,確保不存在空值。

    示例:

    String myName = "qiyadeng";  

    List list = Collections.EMPTY_LIST;
    boolean exist = list.contains(myName);
    int index = list.indexOf(myName);
    boolean isEmpty =list.isEmpty();

    Map map =Collections.EMPTY_MAP;
    exist=map.containsKey(myName);
    exist=map.containsValue(myName);
    isEmpty=map.isEmpty();

    Set set=Collections.EMPTY_SET;
    exist=set.contains(myName);
    isEmpty=set.isEmpty();

    Iterator iterator;
    exist = iterator.hasNext();

    3.assert關(guān)鍵字

    在Java1.4版本之后,提供了斷言assert來(lái)確定你的代碼中的假設(shè)。使用的語(yǔ)法如下:

    assert expression1

    expression1是一個(gè)boolean表達(dá)式,如果expression1返回的false,系統(tǒng)將會(huì)拋出AssertError(沒(méi)有詳細(xì)信息)。

    另外一種使用方法

    assert expression1:expression2

    如果expression1返回false,那么系統(tǒng)將會(huì)拋出AssertError,并且詳細(xì)信息為expression2。

    示例:

    public static String getManager(String employeeId) {  
    assert (employeeId != null) : "employeeId must be not null";
    return "qiyadeng";
    }

    我使用getManager(null)來(lái)調(diào)用getManger方法,最后運(yùn)行的結(jié)果是"java.lang.AssertionError:employeedId must be not null"
    注意記得使用java選項(xiàng)中加入-enableassertion開(kāi)啟assertion功能。

    4.Assert類

    Assert類在com.bea.core.repackaged.springframework.util包中,有許多方法可以用于斷言。

    public static String getManager(String employeeId) {  
    Assert.notNull(employeeId, "employeeId must be not null");
    Assert.hasLength(employeeId, "employeeId must has length greater than 0");
    return "qiyadeng";
    }

    當(dāng)我同樣使用getManager(null)來(lái)調(diào)用getManager方法,將獲得信息"java.lang.IllegalArgumentException: employeeId must be not null"。

    5.異常處理

    使用try catch處理異常或是檢查變量是否為空。

    public static String getManager(String employeeId) {  
    return null;
    }

    如上代碼,我使用下面方法調(diào)用
    String managerId = getManager("A015");  
    System.out.println(managerId.toString());

    將會(huì)發(fā)生"java.lang.NullPointerException",為了處理這個(gè)異常,我們應(yīng)該使用try catch來(lái)處理異常或者是檢查變量是否為null。

    try-catch方法

    String managerId = getManager("A015");  
    try {
    System.out.println(managerId.toString());
    } catch (NullPointerException npe) {
    //write your code here
    }

    或者是對(duì)變量進(jìn)行檢查
    String managerId = getManager("A015");  
    if (managerId != null) {
    System.out.println(managerId.toString());
    } else {
    //write your code here
    }

    6.不要太多的點(diǎn).操作語(yǔ)法

    一些開(kāi)發(fā)者使用太多的這樣的方法來(lái)減少代碼,但是這個(gè)對(duì)后面的維護(hù)和異常處理都是不太好的。

    錯(cuò)誤的寫(xiě)法

    String attrValue = (String)findViewObject("VO_NAME").getCurrentRow().getAttribute("Attribute_NAME");

    正確的寫(xiě)法
    ViewObject vo = findViewObject("VO_NAME");  
    Row row = vo.getCurrentRow();
    String attrValue = (String)row.getAttribute("Attribute_NAME");

    7.使用StringUtils類

    StringUtil是org.apache.commns.lang包中的類,我們可以使用該類來(lái)避免空指針異常。

    例如 StringUtils.isEmpty(),StringUtils.isBlank,StringUtils.equals()等等,更多的你可以參考文檔

    為了不出現(xiàn)空指針異常,在寫(xiě)代碼的過(guò)程中需要時(shí)刻檢查你的代碼是否會(huì)拋出NullPointerException,如果你沒(méi)有時(shí)間及時(shí)調(diào)整的話,使用//TODO標(biāo)記,便于你后面解決問(wèn)題。

    原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明: 轉(zhuǎn)載自http://www.qiyadeng.com/

    本文鏈接地址: 在Java中避免空指針異常(Null Pointer Exception)

    posted @ 2013-04-11 23:08 qiyadeng 閱讀(1937) | 評(píng)論 (0)編輯 收藏

    2013年3月27日

    現(xiàn)在經(jīng)常需要根據(jù)用戶提供的位置,提供一些和位置相關(guān)的信息。有時(shí)可以直接確定用戶的經(jīng)度和緯度,有時(shí)不一定可以確定用戶的經(jīng)度和緯度信息,用戶是 通過(guò)輸入一些路名、標(biāo)志性建筑或是商場(chǎng)名等位置,但是我們的數(shù)據(jù)庫(kù)可能并沒(méi)有存法用戶可能輸入的這些位置信息的經(jīng)度緯度,這時(shí)候可以使用一些地圖提供的 API來(lái)確定,用戶所輸入的位置信息的經(jīng)度和緯度。

    我們使用百度地圖提供的GeoCoding API實(shí)現(xiàn)從位置信息到經(jīng)度緯度的轉(zhuǎn)換,詳細(xì)的使用說(shuō)明可以參考GeoCoding API。我們這里做一個(gè)簡(jiǎn)單的演示

        public String getGeoCode(String query) throws ClientProtocolException, IOException{
            HttpClient httpClient 
    = new DefaultHttpClient();
            String url 
    = geoCodeRequestUrl(query);
            logger.log(Level.INFO, url);
            HttpGet httpget 
    = new HttpGet(url);
            ResponseHandler
    <String> responseHandler = new BasicResponseHandler();
            String responseBody 
    = httpClient.execute(httpget, responseHandler);//百度返回的經(jīng)度緯度信息xml
            logger.log(Level.INFO,"baidu response:"+responseBody);
            
    return responseBody;
        }
        
        
    public String geoCodeRequestUrl(String query) throws UnsupportedEncodingException{
            String url 
    = WeChatConstant.BASEURL + "geocoder?address=" + URLEncoder.encode(query,"UTF-8"+ "&key="
                    
    + WeChatConstant.MAPKEY + "&output=" + WeChatConstant.OUTPUTFORMAT;
            
    return url;
        }

    使用JUnit進(jìn)行測(cè)試
        @Test
        
    public void testGeoCode() throws Exception {
            BaiduMapService bms 
    = new BaiduMapService();
            String response 
    = bms.getGeoCode("上地十街十號(hào)");
            BaiduGeoCodeResponse res 
    = BaiduGeoCodeResponse.getBaiduGeoCode(response);//解析xml
            System.out.println(res.toString());
        }


    輸出的結(jié)果

    <GeocoderSearchResponse> 
        
    <status>OK</status>
        
    <result>
                        
    <location>
                    
    <lat>40.057098</lat>
                    
    <lng>116.307175</lng>
                
    </location>    
                
    <precise>1</precise>
                
    <confidence>80</confidence>
                
    <level>道路</level>
                
    </result>    
    </GeocoderSearchResponse>
    BaiduGeoCodeResponse [lat
    =40.057098, lng=116.307175]

    原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明: 轉(zhuǎn)載自http://www.qiyadeng.com/

    本文鏈接地址: 確定路名、標(biāo)志性建筑和商場(chǎng)名的經(jīng)度緯度


    posted @ 2013-03-27 22:08 qiyadeng 閱讀(1405) | 評(píng)論 (0)編輯 收藏

    2013年3月26日

    到了一個(gè)較陌生的環(huán)境,經(jīng)常會(huì)在周邊找一些基礎(chǔ)設(shè)施,比如銀行,商場(chǎng),餐廳等(還有一種更急切的是找?guī)Mㄟ^(guò)百度提供的地圖API,可以在你的應(yīng)用中簡(jiǎn)單做到,詳情可閱讀Place API。我們以查找周邊銀行作為示例,需確定的參數(shù)至少有三個(gè),要查找的位置的經(jīng)度和緯度,需要查找的內(nèi)容的類型或是關(guān)鍵字。

        public String getPalace(String query,String lat,String lng) throws ClientProtocolException, IOException{
            HttpClient httpClient 
    = new DefaultHttpClient();
            String url 
    = palceRequestUrl(query,lat,lng);
            logger.log(Level.INFO, url);
            HttpGet httpget 
    = new HttpGet(url);
            ResponseHandler
    <String> responseHandler = new BasicResponseHandler();
            String responseBody 
    = httpClient.execute(httpget, responseHandler);//位置xml
            logger.log(Level.INFO,"baidu response:"+responseBody);
            
    return responseBody;
        }
        
        
    public String palceRequestUrl(String query,String lat,String lng) throws UnsupportedEncodingException {
            String url 
    = WeChatConstant.BASEURL + "place/search?query=" + URLEncoder.encode(query,"UTF-8"+ "&key="
                    
    + WeChatConstant.MAPKEY +"&location="+lat+","+lng +"&radius=2000"+"&output=" + WeChatConstant.OUTPUTFORMAT;
            
    return url;
        }

    Junit測(cè)試

        @Test
        
    public void testGetBaiduPlace() throws Exception{
            BaiduMapService bms 
    = new BaiduMapService();
            String response 
    = bms.getPalace("銀行""39.915""116.404");
            List
    <BaiduPlaceResponse> list = BaiduPlaceResponse.getBaiduPlace(response);
            
    for(BaiduPlaceResponse res:list){
                System.out.println(res.toString());
            }
        }

    輸出內(nèi)容(省略部分內(nèi)容)

    <?xml version="1.0" encoding="utf-8" ?>
    <PlaceSearchResponse>
    <status>OK</status>
    <results>
    <result>
    <name>中國(guó)工商銀行東長(zhǎng)安街支行</name>
    <location>
    <lat>39.915891</lat>
    <lng>116.41867</lng>
    </location>
    <address>東城區(qū)東長(zhǎng)安街1號(hào)東方廣場(chǎng)西三辦公樓1樓</address>
    <uid>a025683c73033c35a21de987</uid>
    <detail_url>http://api.map.baidu.com/place/detail?uid=a025683c73033c35a21de987&amp;amp;output=html&amp;amp;source=placeapi</detail_url>
    <tag>銀行,王府井/東單</tag>
    </result>
    </results>
    </PlaceSearchResponse>
    BaiduPlaceResponse [name=中國(guó)工商銀行東長(zhǎng)安街支行, telephone=null, address=東城區(qū)東長(zhǎng)安街1號(hào)東方廣場(chǎng)西三辦公樓1樓, lat=39.915891, lng=116.41867, tag=null, detailUrl=http://api.map.baidu.com/place/detail?uid=a025683c73033c35a21de987
    &amp;output=html&amp;source=placeapi]

    原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明: 轉(zhuǎn)載自http://www.qiyadeng.com/

    本文鏈接地址: 周邊信息查詢


    posted @ 2013-03-26 22:45 qiyadeng 閱讀(1772) | 評(píng)論 (0)編輯 收藏

    2013年3月25日

    位置識(shí)別這是實(shí)際應(yīng)用經(jīng)常應(yīng)用的消息,特別是很多商家,通過(guò)了解用戶位置,給用戶提供特別的產(chǎn)品或是商場(chǎng)的推薦。其中用戶可能發(fā)送兩種類型的消息:

    1.微信地理位置信息

    2.路名、標(biāo)志性建筑或是商場(chǎng)名稱

    1.微信地理位置消息

    認(rèn)識(shí)一下,微信地理位置消息,包含一些什么信息


    <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>1351776360</CreateTime>
    <MsgType><![CDATA[location]]></MsgType>
    <Location_X>23.134521</Location_X>
    <Location_Y>113.358803</Location_Y>
    <Scale>20</Scale>
    <Label><![CDATA[位置信息]]></Label>
    <MsgId>1234567890123456</MsgId>
    </xml>

    包含的主要信息有經(jīng)度緯度和Label的位置。可以根據(jù)label中描述的位置信息,提供給用戶對(duì)應(yīng)的服務(wù)。也可根據(jù)用戶的經(jīng)度緯度信息,提供你最近的產(chǎn)品或是有地域性的產(chǎn)品。

    首先根據(jù)微信的地理位置信息,定義WeChatLocationMessage類,并能把Xml轉(zhuǎn)換為WeChatLocationMessage對(duì)象

    public class WeChatLocationMessage {
        
    private String toUserName;
        
    private String fromUserName;
        
    private String createTime;
        
    private String msgType;
        
    private String locationx;
        
    private String localtiony;
        
    private String scale;
        
    private String label;
        
    private String msgId;
        
        
    public static WeChatLocationMessage getWeChatLocationMessage(String xml){
            XStream xstream 
    = new XStream(new DomDriver());
            WeChatLocationMessage  message 
    = null;
            xstream.alias(
    "xml", WeChatLocationMessage.class);
            xstream.aliasField(
    "ToUserName", WeChatLocationMessage.class"toUserName");
            xstream.aliasField(
    "FromUserName", WeChatLocationMessage.class"fromUserName");
            xstream.aliasField(
    "CreateTime", WeChatLocationMessage.class"createTime");
            xstream.aliasField(
    "MsgType", WeChatLocationMessage.class"msgType");
            xstream.aliasField(
    "Location_X", WeChatLocationMessage.class"locationx");
            xstream.aliasField(
    "Location_Y", WeChatLocationMessage.class"localtiony");
            xstream.aliasField(
    "Scale", WeChatLocationMessage.class"scale");
            xstream.aliasField(
    "Label", WeChatLocationMessage.class"label");
            xstream.aliasField(
    "MsgId", WeChatLocationMessage.class"msgId");
            message 
    = (WeChatLocationMessage)xstream.fromXML(xml);
            
    return message;
        }
    //getter and setter
    }
    本文利用百度的地圖API,查找最近的銀行做為示例。

        public String getPalace(String query,String lat,String lng) throws ClientProtocolException, IOException{
            HttpClient httpClient 
    = new DefaultHttpClient();
            String url 
    = palceRequestUrl(query,lat,lng);
            logger.log(Level.INFO, url);
            HttpGet httpget 
    = new HttpGet(url);
            ResponseHandler
    <String> responseHandler = new BasicResponseHandler();
            String responseBody 
    = httpClient.execute(httpget, responseHandler);
            logger.log(Level.INFO,
    "baidu response:"+responseBody);
            
    return responseBody;
        }
        
        
    public String palceRequestUrl(String query,String lat,String lng) throws UnsupportedEncodingException {
            String url 
    = WeChatConstant.BASEURL + "place/search?query=" + URLEncoder.encode(query,"UTF-8"+ "&key="
                    
    + WeChatConstant.MAPKEY +"&location="+lat+","+lng +"&radius=2000"+"&output=" + WeChatConstant.OUTPUTFORMAT;
            
    return url;
        }
    輸出的結(jié)果
    <PlaceSearchResponse>
        
    <status>OK</status>
        
    <results>
            
    <result>
                
    <name>中國(guó)工商銀行東長(zhǎng)安街支行</name>
                
    <location>
                    
    <lat>39.915891</lat>
                    
    <lng>116.41867</lng>
                
    </location>
                
    <address>東城區(qū)東長(zhǎng)安街1號(hào)東方廣場(chǎng)西三辦公樓1樓</address>
                
    <uid>a025683c73033c35a21de987</uid>
                
    <detail_url>http://api.map.baidu.com/place/detail?uid=a025683c73033c35a21de987&amp;amp;output=html&amp;amp;source=placeapi
                </detail_url>
                
    <tag>銀行,王府井/東單</tag>

            
    </result>
          
    </results>
    </PlaceSearchResponse>

    接下來(lái),把百度地圖反映出來(lái)的最近位置信息,以圖文消息的格式展示給微信用戶

        public static String getWeChatReplyNewsMessageByBaiduPlace(List<BaiduPlaceResponse> placeList, double lat, double lng,String userName, int size){
            WeChatReplyNewsMessage newsMessage 
    = new WeChatReplyNewsMessage();
            List
    <Item> items = new ArrayList<Item>();
            StringBuffer strBuf 
    = new StringBuffer();
            logger.log(Level.INFO,
    "placeList count="+placeList.size());
            newsMessage.setItems(items);
            
    if(placeList.size()>size){
                newsMessage.setArticleCount(size);
            }
            
    else{
                newsMessage.setArticleCount(placeList.size());
            }
            logger.log(Level.INFO,
    "article count="+newsMessage.getArticleCount());
            newsMessage.setCreateTime(
    new Date().getTime()+"");
            newsMessage.setMsgType(
    "news");
            newsMessage.setFuncFlag(
    "0");
            newsMessage.setToUserName(userName);
            newsMessage.setFromUserName(WeChatConstant.FROMUSERNAME);
            
    for(int i = 0;i <newsMessage.getArticleCount();i++){
                BaiduPlaceResponse place 
    = placeList.get(i);
                Double distance 
    = GeoUtil.DistanceOfTwoPoints(Double.valueOf(place.getLng()), Double.valueOf(place.getLat()), lng, lat, GaussSphere.Beijing54);
                Item item 
    = new Item();
                item.setTitle(place.getName()
    +"["+distance+"米]"+"\n"+place.getAddress()+"\n"+place.getTelephone());
                item.setPicUrl(
    "");
                item.setUrl(place.getDetailUrl());
                item.setDescription(
    "");
                items.add(item);
            }
            logger.log(Level.INFO,
    "newMessage="+newsMessage.toString());
            strBuf 
    = strBuf.append(getWeChatNewsMessage(newsMessage));
            
            
    return strBuf.toString();
        }
        
        
    public static String getWeChatNewsMessage(WeChatReplyNewsMessage newsMessage){
            XStream xstream 
    = new XStream(new DomDriver());
            xstream.alias(
    "xml", WeChatReplyNewsMessage.class);
            xstream.aliasField(
    "ToUserName", WeChatReplyNewsMessage.class"toUserName");
            xstream.aliasField(
    "FromUserName", WeChatReplyNewsMessage.class"fromUserName");
            xstream.aliasField(
    "CreateTime", WeChatReplyNewsMessage.class"createTime");
            xstream.aliasField(
    "MsgType", WeChatReplyNewsMessage.class"msgType");
            xstream.aliasField(
    "ArticleCount", WeChatReplyNewsMessage.class"articleCount");
            xstream.aliasField(
    "Content", WeChatReplyNewsMessage.class"content");
            xstream.aliasField(
    "FuncFlag", WeChatReplyNewsMessage.class"funcFlag");
            xstream.aliasField(
    "Articles", WeChatReplyNewsMessage.class"items");
            
            xstream.alias(
    "item", Item.class);
            xstream.aliasField(
    "Title", Item.class"title");
            xstream.aliasField(
    "Description", Item.class"description");
            xstream.aliasField(
    "PicUrl", Item.class"picUrl");
            xstream.aliasField(
    "Url", Item.class"url");
            
            
    return xstream.toXML(newsMessage);
        }

    2.路名、標(biāo)志性建筑或是商場(chǎng)名稱

    對(duì)路名、標(biāo)志性建筑等信息,方法還是通過(guò)第三方地圖信息,確定輸入的位置信息的經(jīng)度緯度。

    本文使用百度地圖API,確定所查找的位置的經(jīng)度和緯度。


        public String getGeoCode(String query) throws ClientProtocolException, IOException{
            HttpClient httpClient 
    = new DefaultHttpClient();
            String url 
    = geoCodeRequestUrl(query);
            logger.log(Level.INFO, url);
            HttpGet httpget 
    = new HttpGet(url);
            ResponseHandler
    <String> responseHandler = new BasicResponseHandler();
            String responseBody 
    = httpClient.execute(httpget, responseHandler);
            logger.log(Level.INFO,
    "baidu response:"+responseBody);
            
    return responseBody;
        }
        
        
    public String geoCodeRequestUrl(String query) throws UnsupportedEncodingException{
            String url 
    = WeChatConstant.BASEURL + "geocoder?address=" + URLEncoder.encode(query,"UTF-8"+ "&key="
                    
    + WeChatConstant.MAPKEY + "&output=" + WeChatConstant.OUTPUTFORMAT;
            
    return url;
        }

    確定了經(jīng)度和緯度,問(wèn)題就變成和第1種消息類型一致了,根據(jù)經(jīng)度緯度去做相應(yīng)處理。

    3.源代碼

    本文的代碼較長(zhǎng),提供源代碼下載。

    WeChatDemo下載

    原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明: 轉(zhuǎn)載自http://www.qiyadeng.com/

    本文鏈接地址: 微信公眾平臺(tái)開(kāi)發(fā)(三)–位置信息的識(shí)別










    posted @ 2013-03-25 21:37 qiyadeng 閱讀(4464) | 評(píng)論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲AV综合色一区二区三区| 亚洲av日韩专区在线观看| 日本黄页网址在线看免费不卡 | 永久免费AV无码网站在线观看 | 精品乱子伦一区二区三区高清免费播放| 久久午夜免费视频| 亚洲国产一成人久久精品| 日韩色视频一区二区三区亚洲 | 亚洲欧美成aⅴ人在线观看| 99国产精品视频免费观看| 亚洲一级片内射网站在线观看| 亚洲色中文字幕在线播放| 久久精品无码专区免费东京热 | 国产免费午夜a无码v视频| 亚洲三级在线播放| 亚欧免费一级毛片| 亚洲午夜未满十八勿入网站2| 男性gay黄免费网站| 四虎影院免费视频| 亚洲一区无码中文字幕乱码| 一级毛片免费毛片一级毛片免费| 久久久久亚洲精品男人的天堂| 国产成人精品久久亚洲高清不卡 | 亚洲精品无码成人片在线观看 | 亚洲国产中文字幕在线观看 | 91福利视频免费观看| 亚洲成Av人片乱码色午夜| 国产人成网在线播放VA免费| 四只虎免费永久观看| 亚洲av最新在线观看网址| 欧美大尺寸SUV免费| 亚洲人成777在线播放| 日韩精品免费一级视频| 亚洲色欲或者高潮影院| 精品无码AV无码免费专区| 亚洲AV午夜福利精品一区二区| 香蕉免费在线视频| 亚洲熟妇无码乱子AV电影| 好男人资源在线WWW免费| 国产gv天堂亚洲国产gv刚刚碰| 一个人晚上在线观看的免费视频|