qiyadeng

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

          2013年2月27日


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

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

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

          阿里云監(jiān)控

          阿里的云服務(wù)器在市場中是做的很不錯(cuò)的,我的很多朋友都購買了阿里的云服務(wù)器。以阿里的公司實(shí)力,做一款云監(jiān)控的產(chǎn)品應(yīng)該不會差到哪里去。
          優(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)控,可以在全國提供幾個(gè)點(diǎn)的監(jiān)控。從用戶的角度了解服務(wù)是否可用。
          4.站點(diǎn)監(jiān)控功能也很全面,包含SMTP、POP3、FTP監(jiān)控。
          5.免費(fèi),且監(jiān)控站點(diǎn)數(shù)沒限制。
          缺點(diǎn):
          1.服務(wù)器監(jiān)控和自定義監(jiān)控,要求是云服務(wù)器,如果不是云服務(wù)器,只能使用站點(diǎn)檢測功能。

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

          360的個(gè)人用戶產(chǎn)品很少使用,但是360的企業(yè)產(chǎn)品還真有不少做的不錯(cuò)的。說說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ù)器上開SNMP協(xié)議。(不過360提供很多腳本工具,可以一鍵安裝)
          2.有20臺服務(wù)器的限制。(這個(gè)基本上夠用,超過20臺服務(wù)器,可以購買服務(wù)了)

          監(jiān)控寶

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

          簡單介紹一下8個(gè)Java牛人,他們?yōu)镴ava社區(qū),創(chuàng)建了框架(framework),產(chǎn)品或者是寫書,影響甚至改變了Java開發(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開發(fā)的各個(gè)領(lǐng)域。

          7.測試驅(qū)動開發(fā)JUnit創(chuàng)始人

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

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

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

          5.JBoss創(chuàng)始人

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

          4.Struts創(chuàng)始人

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

          3.Spring創(chuàng)始人

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

          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語言,他創(chuàng)建了Java編譯器和虛擬機(jī)。在2010年,當(dāng)Oracle收購Sun公司時(shí),他離開了Sun公司。

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

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

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

          1.申請開發(fā)者帳號

          首先注冊百度的帳號,然后申請成為百度開發(fā)者(需要通過手機(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作為版本號

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

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

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

          之后選擇Java作為Project Language。

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

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

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

          B.接下來把Java project轉(zhuǎn)換為Java Web Project(Eclipse中Java Project轉(zhuǎn)換為Java web Project),注意如果你的tomcat是6版本的話,請注意選擇Dynamic web Module的版本不超過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測試

          新建一個(gè)Servlet,HomeServlet,Eclipse會自動在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)行開發(fā)。

          6.最后

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

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

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

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

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

          1.申請開發(fā)者帳號

          首先注冊百度的帳號,然后申請成為百度開發(fā)者(需要通過手機(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作為版本號

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

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

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

          之后選擇Java作為Project Language。

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

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

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

          B.接下來把Java project轉(zhuǎn)換為Java Web Project(Eclipse中Java Project轉(zhuǎn)換為Java web Project),注意如果你的tomcat是6版本的話,請注意選擇Dynamic web Module的版本不超過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測試

          新建一個(gè)Servlet,HomeServlet,Eclipse會自動在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)行開發(fā)。

          6.最后

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

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


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

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


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

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

          首先我們看如下的示例

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


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

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

          接下來我將接著提供幾種避免空指針的建議。

          1.判斷Collection是否為空。

          2.使用一些判斷方法。

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

          4.Assert類。

          5.異常處理。

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

          7.使用StringUtils類

          1.判斷Collection是否為空

          Collection 為空是指Collection中沒有元素。一些開發(fā)者如果碰到Collection中沒有元素的時(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()等來判斷,確保不存在空值。

          示例:

          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來確定你的代碼中的假設(shè)。使用的語法如下:

          assert expression1

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

          另外一種使用方法

          assert expression1:expression2

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

          示例:

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

          我使用getManager(null)來調(diào)用getManger方法,最后運(yùn)行的結(jié)果是"java.lang.AssertionError:employeedId must be not null"
          注意記得使用java選項(xiàng)中加入-enableassertion開啟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)來調(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());

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

          try-catch方法

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

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

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

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

          錯(cuò)誤的寫法

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

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

          7.使用StringUtils類

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

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

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

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

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

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

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

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

              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)行測試
              @Test
              
          public void testGeoCode() throws Exception {
                  BaiduMapService bms 
          = new BaiduMapService();
                  String response 
          = bms.getGeoCode("上地十街十號");
                  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)載請注明: 轉(zhuǎn)載自http://www.qiyadeng.com/

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


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

          到了一個(gè)較陌生的環(huán)境,經(jīng)常會在周邊找一些基礎(chǔ)設(shè)施,比如銀行,商場,餐廳等(還有一種更急切的是找?guī)Mㄟ^百度提供的地圖API,可以在你的應(yīng)用中簡單做到,詳情可閱讀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測試

              @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>中國工商銀行東長安街支行</name>
          <location>
          <lat>39.915891</lat>
          <lng>116.41867</lng>
          </location>
          <address>東城區(qū)東長安街1號東方廣場西三辦公樓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=中國工商銀行東長安街支行, telephone=null, address=東城區(qū)東長安街1號東方廣場西三辦公樓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)載請注明: 轉(zhuǎn)載自http://www.qiyadeng.com/

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


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

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

          1.微信地理位置信息

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

          1.微信地理位置消息

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


          <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中描述的位置信息,提供給用戶對應(yīng)的服務(wù)。也可根據(jù)用戶的經(jīng)度緯度信息,提供你最近的產(chǎn)品或是有地域性的產(chǎn)品。

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

          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>中國工商銀行東長安街支行</name>
                      
          <location>
                          
          <lat>39.915891</lat>
                          
          <lng>116.41867</lng>
                      
          </location>
                      
          <address>東城區(qū)東長安街1號東方廣場西三辦公樓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>

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

              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)志性建筑或是商場名稱

          對路名、標(biāo)志性建筑等信息,方法還是通過第三方地圖信息,確定輸入的位置信息的經(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)度和緯度,問題就變成和第1種消息類型一致了,根據(jù)經(jīng)度緯度去做相應(yīng)處理。

          3.源代碼

          本文的代碼較長,提供源代碼下載。

          WeChatDemo下載

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

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










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

          本文介紹,如果把Java Project轉(zhuǎn)換為Java Web Project,應(yīng)該在多數(shù)的Eclipse的版本都類似。

          1.Java Project

          一個(gè)Java Projec,在Eclipse中顯示的是一個(gè)“J”的藍(lán)色文件夾。

          2.Project Facets

          右鍵項(xiàng)目屬性Properties,右側(cè)選擇菜單Project Facets,點(diǎn)擊converted to faceted form...

          勾選dynamic web module

          選擇下面的further configuration available

          項(xiàng)目中的Web目錄和設(shè)置保持一致。

          3.Java Web Project

          這樣你就轉(zhuǎn)換到了Java Web Project。

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

          本文鏈接地址: Eclipse中Java Project轉(zhuǎn)換為Java Web Project


          posted @ 2013-03-24 21:58 qiyadeng 閱讀(7556) | 評論 (4)編輯 收藏

          1.新建Project

          新建Java Project,并把mongo-java-driver驅(qū)動加入到項(xiàng)目bulid path中,如果你使用的是maven增加依賴。


                <dependency>
                    
          <groupId>org.mongodb</groupId>
                    
          <artifactId>mongo-java-driver</artifactId>
                    
          <version>2.10.1</version>
                
          </dependency>

          2.連接上MongoDB

          //>2.10版本
          MongoClient mongo = new MongoClient( "localhost" , 27017 );

          //老版本  
          Mongo mongo = new Mongo("localhost"27017);

          如果需要驗(yàn)證,需要輸入用戶名和密碼


              MongoClient mongoClient = new MongoClient();
              DB db 
          = mongoClient.getDB("database name");
              
          boolean auth = db.authenticate("username""password".toCharArray());
          3.MongoDB數(shù)據(jù)庫

          得到MongoDB中的數(shù)據(jù)庫,如果數(shù)據(jù)庫名不存在,MongoDB會自動創(chuàng)建


          DB db = mongo.getDB("database name");
          顯示所有的數(shù)據(jù)庫
              List<String> dbs = mongo.getDatabaseNames();
              
          for(String db : dbs){
                  System.out.println(db);
              }
          4.MongoDB Collection(MongoDB表)

          得到數(shù)據(jù)庫中的表

              DB db = mongo.getDB("testdb");
              DBCollection table 
          = db.getCollection("user");
          顯示數(shù)據(jù)庫中的所有表
              DB db = mongo.getDB("testdb");
              Set
          <String> tables = db.getCollectionNames();
           
              
          for(String coll : tables){
                  System.out.println(coll);
              }
          5.插入、查找、更新、刪除操作

          插入數(shù)據(jù),向Collection(表)中插入一個(gè)Document

              DBCollection table = db.getCollection("user");
              BasicDBObject document 
          = new BasicDBObject();
              document.put(
          "name""qiyadeng");
              document.put(
          "age"30);
              document.put(
          "createdDate"new Date());
              table.insert(document);
          更新Document中的name="qiyadeng.com"
          	
              DBCollection table = db.getCollection("user");

               BasicDBObject query 
          = new BasicDBObject();
              query.put(
          "name""qiyadeng");

              BasicDBObject newDocument 
          = new BasicDBObject();
              newDocument.put(
          "name""qiyadeng.com");

              BasicDBObject updateObj 
          = new BasicDBObject();
              updateObj.put(
          "$set", newDocument);
           
              table.update(query, updateObj);
          從Collection中查找name="qiyadeng.com"的Document
              DBCollection table = db.getCollection("user");
           
              BasicDBObject searchQuery 
          = new BasicDBObject();
              searchQuery.put(
          "name""qiyadeng.com");
           
              DBCursor cursor 
          = table.find(searchQuery);
           
              
          while (cursor.hasNext()) {
                  System.out.println(cursor.next());
              }
          刪除name="qiyadeng"的Document
              DBCollection table = db.getCollection("user");
           
              BasicDBObject searchQuery 
          = new BasicDBObject();
              searchQuery.put(
          "name""qiyadeng.com");
           
              table.remove(searchQuery);

          6.完整的例子
          package com.qiyadeng.mongodb;


          import java.util.Date;

          import com.mongodb.BasicDBObject;
          import com.mongodb.DB;
          import com.mongodb.DBCollection;
          import com.mongodb.DBCursor;
          import com.mongodb.MongoClient;

          public class MongoDBSample {

              
          public static void main(String[] args) throws Exception{
                       
                      
          /**** Connect to MongoDB ****/
                      
          //2.10.0后,使用MongoClient
                      MongoClient mongo = new MongoClient("localhost"27017);
                   
                      
          /**** Get database ****/
                      
          // if database doesn't exists, MongoDB will create it for you
                      DB db = mongo.getDB("testdb");
                   
                      
          /**** Get collection / table from 'testdb' ****/
                      
          // if collection doesn't exists, MongoDB will create it for you
                      DBCollection table = db.getCollection("user");
                   
                      
          /**** Insert ****/
                      
          // create a document to store key and value
                      BasicDBObject document = new BasicDBObject();
                      document.put(
          "name""qiyadeng");
                      document.put(
          "age"30);
                      document.put(
          "createdDate"new Date());
                      table.insert(document);
                   
                      
          /**** Find and display ****/
                      BasicDBObject searchQuery 
          = new BasicDBObject();
                      searchQuery.put(
          "name""qiyadeng");
                   
                      DBCursor cursor 
          = table.find(searchQuery);
                   
                      
          while (cursor.hasNext()) {
                          System.out.println(cursor.next());
                      }
                   
                      
          /**** Update ****/
                      
          // search document where name="qiyadeng" and update it with new values
                      BasicDBObject query = new BasicDBObject();
                      query.put(
          "name""qiyadeng");
                   
                      BasicDBObject newDocument 
          = new BasicDBObject();
                      newDocument.put(
          "name""qiyadeng.com");
                   
                      BasicDBObject updateObj 
          = new BasicDBObject();
                      updateObj.put(
          "$set", newDocument);
                   
                      table.update(query, updateObj);
                   
                      
          /**** Find and display ****/
                      BasicDBObject searchQuery2 
                          
          = new BasicDBObject().append("name""qiyadeng.com");
                   
                      DBCursor cursor2 
          = table.find(searchQuery2);
                   
                      
          while (cursor2.hasNext()) {
                          System.out.println(cursor2.next());
                      }
              }
          }


          輸出

          "_id" : { "$oid" : "51444c88874c79654063356b"} , "name" : "qiyadeng" , "age" : 30 , "createdDate" : { "$date" : "2013-03-16T10:42:16.555Z"}}
          "_id" : { "$oid" : "51444c88874c79654063356b"} , "age" : 30 , "createdDate" : { "$date" : "2013-03-16T10:42:16.555Z"} , "name" : "qiyadeng.com"}

          使用mongo驗(yàn)證創(chuàng)建的數(shù)據(jù)庫testdb,collection user是否存在。


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

          本文鏈接地址: Java和MongoDB之Hello World



          posted @ 2013-03-19 22:17 qiyadeng 閱讀(2199) | 評論 (0)編輯 收藏

          本文介紹如何安裝在windows 7中安裝MongoDB。
          注:MongoDB并不像Windows上安裝其他軟件,只需要下載Zip包并解壓,然后配置數(shù)據(jù)存放目錄并啟動即可。

          1.下載MongoDB

          從MongoDB官方網(wǎng)站,根據(jù)你的平臺選擇對應(yīng)的windows的壓縮包并解壓,本文解壓到D:\mongodb\。


          注:如果需要在命令行中快速使用MongoDB bin目錄下的命令,可以將D:\mongoDB\bin加入到Window環(huán)境變量。

          2.配置數(shù)據(jù)文件

          在D:\mongodb\創(chuàng)建mongo.config文件,如下(并在d:\mongodb目錄下新建data,log文件夾)
          ##數(shù)據(jù)存儲的位置
          dbpath
          =D:\mongodb\data
           
          ##所有的輸出位置
          logpath
          =D:\mongodb\log\mongo.log
           
          ##日志讀寫操作
          diaglog
          =3

          3.運(yùn)行MongoDB Server

          在命令控制行,切換到d:\mongodb\bin目錄下,使用命令mongod.exe --config d:\mongdb\mongo.config啟動MongoDb Server。
          D:\mongodb\bin>mongod.exe --config d:\mongodb\mongo.config
          all output going to
          : D:\mongodb\log\mongo.log

          4.連接MongoDB

          新開啟一個(gè)命令行控制窗口,使用mongo.exe連接MongoDB Server.

          5.設(shè)置MongoDB為Windows服務(wù)

          在命令行控制窗口,加入--install選項(xiàng)可以把MongoDB安裝為Windows服務(wù)。
          D:\mongodb\bin>mongod.exe --config d:\mongodb\mongo.config
          啟動MongoDB的命令為:net start MongoDB

          停車MongODB的命令為:net stop MongoDB

          刪除MongoDB的命令為:mongod --remove

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

          本文鏈接地址: 在Window平臺安裝MongoDB

          posted @ 2013-03-18 22:33 qiyadeng 閱讀(2982) | 評論 (1)編輯 收藏

          1.設(shè)置成為開發(fā)者模式

          登錄微信工作平臺,選擇高級功能-進(jìn)入開發(fā)模式,成為開發(fā)者。需要做如下圖配置。URL配置的信息是指,微信的后臺服務(wù)器把您的用戶消息發(fā)送到該URL處理。Token是你和微信之間的一個(gè)密碼,用來驗(yàn)證消息是否是從微信的服務(wù)發(fā)送而來,而不是其他來攻擊你的系統(tǒng)。


          現(xiàn)在你還不能設(shè)置,在設(shè)置時(shí)微信會GET請求你設(shè)置的URL,已檢測接口是否可以使用。只有等你準(zhǔn)備好GET方法之后才可以進(jìn)行設(shè)置。


          2.實(shí)現(xiàn)GET方法

          從文檔中知道,我們需要實(shí)現(xiàn)POST和GET方法,GET方法用于驗(yàn)證微信和你的通訊驗(yàn)證,POST用于消息處理。

          新建Servlet HelloWeChat,先實(shí)現(xiàn)其中的GET方法


              protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                  
          // TODO 為了簡單起見,先不對消息來源進(jìn)行校驗(yàn)
                  response.setContentType("text/html;charset=UTF-8");
                  PrintWriter pw 
          = response.getWriter();
                  String echo 
          = request.getParameter("echostr");
                  echo 
          = new String(echo.getBytes("ISO-8859-1"),"UTF-8");
                  pw.println(echo);
              }
          可以在本地使用http://localhost:8080/QiyadengWeb/HelloWeChat?echostr=hello中文,先進(jìn)行測試,如果沒有問題,可以部署到服務(wù)器上,然后在微信公眾平臺進(jìn)行設(shè)置了。

          3.實(shí)現(xiàn)POST方法

          POST方法首先接收到微信公眾平臺傳送過來的XML,從中提取消息發(fā)送人和消息內(nèi)容。更加消息發(fā)送內(nèi)容,你可以增加自己的處理邏輯,最后拼裝成回復(fù)消息XML,返回給微信公眾平臺。


              protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                  response.setContentType(
          "text/html;charset=UTF-8");
                  PrintWriter pw 
          = response.getWriter();
                  String wxMsgXml 
          = IOUtils.toString(request.getInputStream(),"utf-8");
                  WeChatTextMessage textMsg 
          = null;
                  
          try {
                      textMsg 
          = getWeChatTextMessage(wxMsgXml);
                  } 
          catch (Exception e) {
                      e.printStackTrace();
                  }
                  StringBuffer replyMsg 
          = new StringBuffer();
                  
          if(textMsg != null){
                      
          //增加你所需要的處理邏輯,這里只是簡單重復(fù)消息
                      replyMsg.append("您給我的消息是:");
                      replyMsg.append(textMsg.getContent());
                  }
                  
          else{
                      replyMsg.append(
          ":)不是文本的消息,我暫時(shí)看不懂");
                  }
                  String returnXml 
          = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName());
                  pw.println(returnXml);
              }

          關(guān)于調(diào)試,這里推薦一個(gè)工具Fiddler,你可以模擬微信的POST消息到你的本地,而不必每次部署到服務(wù)器上進(jìn)行調(diào)試。關(guān)于Fiddler的POST數(shù)據(jù)使用方法,可以參考下圖標(biāo)注內(nèi)容。

          4.部署并測試

          完成第一步,并和你的公眾帳號好進(jìn)行對話,回復(fù)消息沒有問題的話,那就恭喜你了

          5.依賴庫

          使用maven的同學(xué),添加以下依賴即可。非maven用戶,找到這些庫添加到buider path中即可。


                <dependency>
                    
          <groupId>joda-time</groupId>
                    
          <artifactId>joda-time</artifactId>
                    
          <version>2.2</version>
                
          </dependency>
                
          <dependency>
                    
          <groupId>org.apache.commons</groupId>
                    
          <artifactId>commons-io</artifactId>
                    
          <version>1.3.2</version>
                
          </dependency>
                
          <dependency>
                    
          <groupId>com.thoughtworks.xstream</groupId>
                    
          <artifactId>xstream</artifactId>
                    
          <version>1.4.3</version>
                
          </dependency>
          6.完整的代碼
          package com.qiyadeng.wechat;

          import java.io.IOException;
          import java.io.PrintWriter;
          import java.util.Date;

          import javax.servlet.ServletException;
          import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;

          import org.apache.commons.io.IOUtils;

          import com.thoughtworks.xstream.XStream;
          import com.thoughtworks.xstream.io.xml.DomDriver;

          /**
           * Servlet implementation class HelloWeChat
           
          */
          public class HelloWeChat extends HttpServlet {
              
          private static final long serialVersionUID = 1L;
                 
              
          /**
               * 
          @see HttpServlet#HttpServlet()
               
          */
              
          public HelloWeChat() {
                  
          super();
              }

              
          /**
               * 
          @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
               
          */
              
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                  
          // TODO 為了簡單起見,先不對消息來源進(jìn)行校驗(yàn)
                  response.setContentType("text/html;charset=UTF-8");
                  PrintWriter pw 
          = response.getWriter();
                  String echo 
          = request.getParameter("echostr");
                  echo 
          = new String(echo.getBytes("ISO-8859-1"),"UTF-8");
                  pw.println(echo);
              }

              
          /**
               * 
          @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
               
          */
              
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                  response.setContentType(
          "text/html;charset=UTF-8");
                  PrintWriter pw 
          = response.getWriter();
                  String wxMsgXml 
          = IOUtils.toString(request.getInputStream(),"utf-8");
                  WeChatTextMessage textMsg 
          = null;
                  
          try {
                      textMsg 
          = getWeChatTextMessage(wxMsgXml);
                  } 
          catch (Exception e) {
                      e.printStackTrace();
                  }
                  StringBuffer replyMsg 
          = new StringBuffer();
                  
          if(textMsg != null){
                      
          //增加你所需要的處理邏輯,這里只是簡單重復(fù)消息
                      replyMsg.append("您給我的消息是:");
                      replyMsg.append(textMsg.getContent());
                  }
                  
          else{
                      replyMsg.append(
          ":)不是文本的消息,我暫時(shí)看不懂");
                  }
                  String returnXml 
          = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName());
                  pw.println(returnXml);
              }
              
              
          private WeChatTextMessage getWeChatTextMessage(String xml){
                  XStream xstream 
          = new XStream(new DomDriver());
                  xstream.alias(
          "xml", WeChatTextMessage.class);
                  xstream.aliasField(
          "ToUserName", WeChatTextMessage.class"toUserName");
                  xstream.aliasField(
          "FromUserName", WeChatTextMessage.class"fromUserName");
                  xstream.aliasField(
          "CreateTime", WeChatTextMessage.class"createTime");
                  xstream.aliasField(
          "MsgType", WeChatTextMessage.class"messageType");
                  xstream.aliasField(
          "Content", WeChatTextMessage.class"content");
                  xstream.aliasField(
          "MsgId", WeChatTextMessage.class"msgId");
                  WeChatTextMessage wechatTextMessage 
          = (WeChatTextMessage)xstream.fromXML(xml); 
                  
          return wechatTextMessage;
              }
              
              
          private String getReplyTextMessage(String content, String weChatUser){
                  WeChatReplyTextMessage we 
          = new WeChatReplyTextMessage();
                  we.setMessageType(
          "text");
                  we.setFuncFlag(
          "0");
                  we.setCreateTime(
          new Long(new Date().getTime()).toString());
                  we.setContent(content);
                  we.setToUserName(weChatUser);
                  we.setFromUserName(
          "shanghaiweather");//TODO 你的公眾帳號微信號
                  XStream xstream = new XStream(new DomDriver()); 
                  xstream.alias(
          "xml", WeChatReplyTextMessage.class);
                  xstream.aliasField(
          "ToUserName", WeChatReplyTextMessage.class"toUserName");
                  xstream.aliasField(
          "FromUserName", WeChatReplyTextMessage.class"fromUserName");
                  xstream.aliasField(
          "CreateTime", WeChatReplyTextMessage.class"createTime");
                  xstream.aliasField(
          "MsgType", WeChatReplyTextMessage.class"messageType");
                  xstream.aliasField(
          "Content", WeChatReplyTextMessage.class"content");
                  xstream.aliasField(
          "FuncFlag", WeChatReplyTextMessage.class"funcFlag");
                  String xml 
          =xstream.toXML(we);
                  
          return xml;
              }

          }

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

          本文鏈接地址: 微信公眾平臺開發(fā)(二)–簡單的聊天機(jī)器人

          posted @ 2013-03-17 20:41 qiyadeng 閱讀(15217) | 評論 (4)編輯 收藏

            開始微信公眾平臺的開發(fā),我們首先要了解微信平臺可以幫助我們做哪些事情?
          使用您的公眾賬號登陸http://mp.weixin.qq.com/,選擇菜單--高級功能-開發(fā)模式--查看文檔,即能看到微信公眾平臺目前所能開發(fā)的功能。

          一、通訊機(jī)制


          公眾平臺的主要內(nèi)容是

          • 接受用戶發(fā)送給您公眾賬號的消息
          • 給您的用戶回復(fù)消息

          需要特別說明的是,發(fā)送消息和回復(fù)消失是一個(gè)連貫的過程,只能在一個(gè)對話中完成。也就是說您的用戶不找您說話,您是不能主動發(fā)送消息給你的客戶(群發(fā)是另外一種情況,有次數(shù)限制。你也可以申請付費(fèi)使用微信CRM平臺)。所有的發(fā)送消息和接受消息,都需要微信平臺進(jìn)行中轉(zhuǎn)。

          二、消息類型

          下面介紹用戶能給您發(fā)送的消息類型,也就是目前接受到的消息類型。

          1.接受消息類型

            1.1文本消息

            這也是我們平時(shí)碰到最多的,可以根據(jù)文本中提到的一些關(guān)鍵字,進(jìn)行判斷,判斷用戶的含義,并進(jìn)行回復(fù)。

            1.2圖片消息

            目前通過圖片理解用戶想表達(dá)的意思,還是有較大難度,因此多數(shù)的公眾賬號,會選擇忽略圖片信息或選擇由人工來處理。只能說一句:圖片很美,但是我看不懂。

            1.3地理位置消息

            用戶把他的位置發(fā)給您,這對大多數(shù)公眾賬號來說,是一個(gè)重要的信息。可以提供一些基于位置信息的服務(wù),比如酒店預(yù)訂公眾賬號,可以給你推薦你周邊的酒店。 另外一個(gè)補(bǔ)充是,可以在文本消息中分析出位置信息,并加以利用。比如用戶輸入“南京路步行街”,可以提供用戶南京路步行街的相關(guān)商戶。

            1.4鏈接消息

            目前還沒有看到開發(fā)模式中特別有效的使用方法。使用比較多的可能會是購物時(shí)或是咨詢時(shí),對所談?wù)摰膶ο筮M(jìn)行明確。

            1.5事件推送消息

            當(dāng)用戶進(jìn)入到和你對話的過程中,可以先和用戶打招呼等。這個(gè)消息目前只支持4.5版本,且暫時(shí)還沒有開發(fā)。后續(xù)可想想的空間很大,比如用戶進(jìn)入到會話之后,搖一搖會發(fā)生什么呢?

          2.回復(fù)消息類型

            2.1文本消息
             這是我們平時(shí)發(fā)送最多的一類消息,當(dāng)只需要簡單的文字即可回答用戶的消息時(shí),可用文本消息。文本消息中可以帶有鏈接地址。

             2.2圖文消息
              圖文消息,這是我們在推送消息中經(jīng)常看到的消息格式。每項(xiàng)內(nèi)容可以點(diǎn)擊查看更詳細(xì)信息(當(dāng)然你也可以把鏈接設(shè)置為空,使其不能跳轉(zhuǎn))

             2.3音樂消息
             在你的答復(fù)中給用戶一個(gè)語音消息或是音樂,可以獲得不少用戶的親睞。
          了解了公眾平臺的通訊機(jī)制和消息類型,接下來,我們開始準(zhǔn)備開發(fā)環(huán)境了。

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

          本文鏈接地址: 微信公眾平臺開發(fā)(一)

          posted @ 2013-03-17 20:36 qiyadeng 閱讀(34563) | 評論 (12)編輯 收藏

          在類似PHP的項(xiàng)目中,經(jīng)常會碰到項(xiàng)目開發(fā)目錄和運(yùn)行目錄不是一個(gè)目錄的情況。

          在window7下面有一個(gè)非常好的工具,可以做到自動同步。

          如:

           

          mklink /J D:\wamp\www\shanghaisales C:\Users\Admin\git\ShanghaiSales\ShanghaiSales

           

           

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

          本文鏈接地址: Window7自動目錄同步(mklink)

          posted @ 2013-03-13 20:49 qiyadeng 閱讀(1408) | 評論 (1)編輯 收藏

          本文中演示如何通過URLConnection獲取Http響應(yīng)Header信息

          1.從響應(yīng)中獲得Header信息

                          
                          URL obj = new URL("http://www.qiyadeng.com");
                          URLConnection conn 
          = obj.openConnection();
                          Map
          <String, List<String>> map = conn.getHeaderFields();
           

          2.從響應(yīng)Header中獲取Server信息

           
                         Map<String, List<String>> map = conn.getHeaderFields();
                          List
          <String> server = map.get("Server");
           

          完整的示例

          package com.qiyadeng.http;

          import java.net.URL;
          import java.net.URLConnection;
          import java.util.List;
          import java.util.Map;
           
          public class GetHttpResponseHeader {
           
            
          public static void main(String[] args) {
           
                  
          try {
           
                          URL obj 
          = new URL("http://www.qiyadeng.com");
                          URLConnection conn 
          = obj.openConnection();
                          Map
          <String, List<String>> map = conn.getHeaderFields();
           
                          System.out.println(
          "顯示響應(yīng)Header信息\n");
           
                          
          for (Map.Entry<String, List<String>> entry : map.entrySet()) {
                                  System.out.println(
          "Key : " + entry.getKey() + 
                                                     
          " ,Value : " + entry.getValue());
                          }
           
                          System.out.println(
          "\n使用key獲得響應(yīng)Header信息 \n");
                          List
          <String> server = map.get("Server");
           
                          
          if (server == null) {
                                  System.out.println(
          "Key 'Server' is not found!");
                          } 
          else {
                                  
          for (String values : server) {
                                          System.out.println(values);
                                  }
                          }
           
                  } 
          catch (Exception e) {
                          e.printStackTrace();
                  }
           
            }
           
          }
           

          輸出

          顯示響應(yīng)Header信息...

          Key : null ,Value : [HTTP/1.1 200 OK]
          Key : X
          -Pingback ,Value : [http://www.qiyadeng.com/xmlrpc.php]
          Key : Date ,Value : [Sun, 10 Mar 2013 12:16:26 GMT]
          Key : Transfer
          -Encoding ,Value : [chunked]
          Key : Connection ,Value : [close]
          Key : Content
          -Type ,Value : [text/html; charset=UTF-8]
          Key : Server ,Value : [Apache
          /2.2.3 (CentOS)]
          Key : X
          -Powered-By ,Value : [PHP/5.2.17]
          使用key獲得響應(yīng)Header信息 ...

          Apache/2.2.3 (CentOS)




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

          本文鏈接地址: Java獲取Http響應(yīng)Header信息

          posted @ 2013-03-12 21:40 qiyadeng 閱讀(11188) | 評論 (3)編輯 收藏

          在.net中也有非常多的日志工具,今天介紹下NLog。NLog特別好的地方就是和Vs(Visual Studio)開發(fā)環(huán)境的集成。

          只需下載(下載地址)安裝包,安裝之后NLog就會在VS的新建項(xiàng)中增加很多選項(xiàng),并且在編輯NLog配置文件時(shí)也會提供智能提示和校驗(yàn)。

          NLog工作主要依賴的是兩個(gè)文件一個(gè)是NLog.dll,另外一個(gè)是NLog.config,解下來演示下如何引入和進(jìn)行配置

          1.在你的項(xiàng)目中加入NLog。右擊項(xiàng)目,選擇添加新項(xiàng)目,選擇Empty NLog Configuration,并選擇添加(如圖)。

          vs add new item

          (說明:有可能不像官網(wǎng)上說的在NLog的目錄下面,在ASP.net Web項(xiàng)目中,會在VB的目錄中。)

          在非Asp.net項(xiàng)目中,記得把NLog.config文件復(fù)制到輸出目錄(右擊NLog.config文件屬性)。

          2.編輯配置文件NLog.config.

          關(guān)于配置文件如何編輯有大量的篇幅(https://github.com/nlog/nlog/wiki/Configuration-file),我們這里介紹兩種常用的場景。

          A)在Vs的輸出窗口輸出日志,關(guān)于這些變量的說明${},請參看文檔Configuration Reference。(https://github.com/nlog/nlog/wiki)

           <target name="debugger" xsi:type="Debugger" layout="${logger}::${message}" />
          

          B)以文件形式輸出。

          <target name="file" xsi:type="File" maxArchiveFiles="30"

                      layout
          ="${longdate} ${logger} ${message}"

                      fileName
          ="${basedir}/logs/log${shortdate}.txt"

                      keepFileOpen
          ="false" />

          完整的配置文件例子:

          <?xml version="1.0" encoding="utf-8" ?>

          <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"

                xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"  throwExceptions="true" internalLogFile="d:\internal_log_file.txt" internalLogLevel="Trace" internalLogToConsole="true">

            <targets>

              <target name="debugger" xsi:type="Debugger" layout="${logger}::${message}" />

           

              <target name="file" xsi:type="File" maxArchiveFiles="30"

                      layout
          ="${longdate} ${logger} ${message}"

                      fileName
          ="${basedir}/logs/log${shortdate}.txt"

                      keepFileOpen
          ="false" />

            </targets>

           

            <rules>

              <logger name="*" minlevel="Trace" writeTo="debugger" />

              <logger name="*" minlevel="Trace" writeTo="file" />

            </rules>

          </nlog>

          3.在程序中使用NLog

          在程序中使用就特別簡單了,和大多數(shù)日志工具類似。

          using NLog;
          namespace MyNamespace
          {
            public class MyClass
            {
              private static Logger logger = LogManager.GetCurrentClassLogger();
            }
          }

          posted @ 2013-02-27 16:00 qiyadeng 閱讀(5083) | 評論 (2)編輯 收藏

          主站蜘蛛池模板: 克什克腾旗| 高邑县| 杂多县| 泽库县| 京山县| 瓦房店市| 乐亭县| 阳信县| 南投县| 宝应县| 循化| 泽普县| 阿瓦提县| 合作市| 永川市| 临桂县| 湘乡市| 光泽县| 扎兰屯市| 汽车| 孝感市| 武强县| 丰顺县| 南通市| 左贡县| 郑州市| 当雄县| 青田县| 长寿区| 祥云县| 柘城县| 兴安县| 勐海县| 阜康市| 金湖县| 池州市| 新郑市| 常熟市| 玛多县| 潞城市| 若羌县|