計(jì)算機(jī)程序虛擬的人生
          虛擬世界中的游魂

          2009年6月7日

          第一次接觸mina這個物件,在網(wǎng)上看了一些相關(guān)的資料,同時也參考了別人的一些分析mina的心得和方式!
          mina是何物?
          Mina是一個用于開發(fā)高性能和高可用性的網(wǎng)絡(luò)應(yīng)用程序基礎(chǔ)架構(gòu),它封裝了底層的I/O和線程并發(fā)等復(fù)雜工作。
          Mina主要是基于java NIO類庫開發(fā);采用非阻塞方式的異步傳輸、事件驅(qū)動、批量數(shù)據(jù)傳輸;支持TCP、UDP網(wǎng)絡(luò)協(xié)議

          首先從服務(wù)器端啟動NioSocketAcceptor對象進(jìn)行分析。
          1、實(shí)例化DefaultSocketSessionConfig會話配置器和異步傳輸NioProcessor處理器
          2、實(shí)例化AbstractPollingIoAcceptor構(gòu)造器同時實(shí)例化SimpleIoProcessorPool處理器池
                --〉在SimpleProcessorPool中初始化執(zhí)行器<線程池>,然后初始化一個IoProcessor對象數(shù)組,長度為3,最后將處理器對象放入到IoProcessor數(shù)組中
                --〉處理化傳輸帶元數(shù)據(jù)
                --〉初始化服務(wù)監(jiān)視器
                --〉初始化異常監(jiān)視器
          3、初始化過濾鏈
          4、初始化選擇器

          架構(gòu)介紹

          應(yīng)用結(jié)構(gòu)圖

          深入分析結(jié)構(gòu)圖

          mina的基本應(yīng)用可以分為3層:
          1、I/O Serivce:實(shí)際執(zhí)行I/O層
          2、I/OFilter chain:數(shù)據(jù)過濾和轉(zhuǎn)換層,主要是把字節(jié)轉(zhuǎn)換為需要的數(shù)據(jù)格式或者反過來處理
          3、I/OHandler:業(yè)務(wù)處理層
          創(chuàng)建Mina應(yīng)用分為3部分:
          1、創(chuàng)建I/O 2、創(chuàng)建過濾鏈
          3、創(chuàng)建I/O業(yè)務(wù)處理

          posted @ 2009-09-04 12:25 小兄弟(Robbins) 閱讀(1427) | 評論 (1)編輯 收藏
           
           Dojo介紹
                 Dojo 是一個用javascript語言實(shí)現(xiàn)的開源DHTML工具包。它是在幾個項(xiàng)目捐助基礎(chǔ)上建立起來的(nWidgets, Burstlib, f(m)), 這也是為什么叫它a \"unified\" toolkit的原因。Dojo的目標(biāo)是解決開發(fā)DHTML應(yīng)用程序遇到的那些,長期存在 、歷史問題。historical problems with DHTML 跨瀏覽器問題。Dojo讓你更容易 使web頁面具有動態(tài)能力,或在任何穩(wěn)健的支持javascript語言的環(huán)境中發(fā)揮作用。

          a、利用dojo提供的組件,你可以提升你的web應(yīng)用程序可用性、交互能力以及功能上的提高;
          b、你也可以 更容易的建立degradeable user interfaces ??,dojo提供小巧的 widgets ,animate transitions;
          c、利用它的低級APIs和可兼容的代碼,寫出輕便的、單一風(fēng)格(復(fù)雜)的javascript代碼,Dojo的 event system, I/O APIs, and generic language enhancement form the basis of a powerful programming environment.
          d、通過Dojo提供的工具,你可以為你的代碼寫命令行式的單元測試代碼。
          e、the Dojo package system使你自己的代碼更容易維護(hù),偶合性更低。

          Dojo通過很少的代碼完成了以上的功能。(以后可能我詳細(xì)說說dojo的package system ,只需要三個js文件)。當(dāng)你寫腳本時,只需要包含很少的js文件(大?。?。也可以選擇的(包含)下載dojo提供的龐大的功能。Dojo provides MultiplePointsOfEntry, InterpreterIndependence, ForwardLookingAPIs, and focuses on ReducingBarriersToAdoption.
            dojo試圖建立一種新的標(biāo)簽語言DojoML。目標(biāo)是,在DojoML和javascript腳本語言不變的情況下,用不同的render方式展示數(shù)據(jù), Renderings may be made available in several rendering contexts (such as SVG, or perhaps even the desktop or Flash)。(比較美好?。└M(jìn)一步,the DojoML 剖析器可以接受html和svg為輸入,容易的建立DegradeableResponsiveApplications。

          第一部分  安裝
          第一個小節(jié)  怎么安裝Dojo Toolkit
           Dojo在磁盤上只是一堆文件,它不需要特殊的設(shè)置,它可以通過以下三種途徑獲得:
           1、可以從google的內(nèi)容分布網(wǎng)絡(luò)獲得
             加載的方法可以參考http://code.google.com/intl/zh-CN/apis/ajaxlibs/documentation/index.html#dojo
           2、.在你自己的服務(wù)器上使用Dojo
            a、下載最新的dojo包,地址:http://dojotoolkit.org/downloads;目前最新的包為1.3.1
            b、解壓下載的壓縮文件
                   --dojo-release-1.3.1-src
                      ----dijit
                      ----dojo
                      ----dojox
                      ----util
            c、可以通過D:\Apache-Source\dojo\1.3.1\dojo-release-1.3.1-src\dojo-release-1.3.1-src\dijit\themes\themeTester.html 這樣的路徑來查看相關(guān)的JS例子
          3、每日構(gòu)建代碼
             你可以通過SVN地址獲得
          For instance, Dojo Core repository is:
          http://svn.dojotoolkit.org/src/dojo/trunk

          There are two versions of this view: anonymous and committer.

          For users (readonly):
          http://svn.dojotoolkit.org/src/view/anon/all/trunk

          For committers (read/write):
          https://svn.dojotoolkit.org/src/view/committer/all/trunk

          第二部分 Ajax
          第一個小節(jié) ajax
          a、ajax and Dojo
          1)XHR選項(xiàng)
          例子:

          // post some data, ignore the response:
          dojo.xhrPost({
          form: "someFormId", // read the url: from the action="" of the <form>
          timeout: 3000, // give up after 3 seconds
          content: { part:"one", another:"part" } // creates ?part=one&another=part with GET, Sent as POST data when using xhrPost
          });
          // get some data, convert to JSON
          dojo.xhrGet({
          url:"data.json",
          handleAs:"json",
          load: function(data){
          for(var i in data){
          console.log("key", i, "value", data[i]);
          }
          }
          });
          

          2)XHR回調(diào)
          有三種方法可以附加到XHR選擇對象,以確定當(dāng)數(shù)據(jù)回調(diào)時該怎么做。


          posted @ 2009-06-29 14:20 小兄弟(Robbins) 閱讀(379) | 評論 (0)編輯 收藏
           
             如果不輸入絕對的URL訪問地址,例如:URL=http://localhost:8080/petstore;則Glassfish能夠自動的搜索項(xiàng)目中是否存在index.html或者index.jsp頁面作為入口頁面。 
             CatalogFacade對象在服務(wù)器啟動時被實(shí)例化,然后將實(shí)例化的CatalogFacade對象放置到ServletContext環(huán)境中,這樣可以直接從ServletContext環(huán)境中取得CatalogFacade對象進(jìn)行相關(guān)數(shù)據(jù)方法的調(diào)用。
             index.jsp中涉足到一個js框架DOJO,這個需要進(jìn)一步的學(xué)習(xí)。
             對數(shù)據(jù)的增、刪、改、查主要用到了JPA來處理。
          posted @ 2009-06-29 12:34 小兄弟(Robbins) 閱讀(353) | 評論 (0)編輯 收藏
           
              由于PetStore涉及到了jsf,那就沒有辦法了,還是先看看JSF
          --------------------------------------------------------------------------
              JSF是有JCP(JAVA Community Process)團(tuán)隊(duì)研發(fā)出來的一套標(biāo)準(zhǔn),并在2004年3月發(fā)表JavaServer Faces1.0成果。

              看到一篇內(nèi)容對初學(xué)者目前jsf的了解很重要:注意這篇文章是2006年的內(nèi)容
                 JSF1.1 , JSF1.2 myfaces,oracle ADF,ajax4jsf , facelets, 它們究竟是什么,有什么關(guān)系呢?

          JSF1.1 、 1.2 都是 JSF 的標(biāo)準(zhǔn),定義例如接口、規(guī)范( JSF 是面向接口編程的),必須通過實(shí)現(xiàn)才能被我們所使用,而實(shí)現(xiàn)包括有 JSF RI(Reference Implementation) ,還有 myfaces core1.1.4 的實(shí)現(xiàn)等。 JSF RI SUN JSF 的實(shí)現(xiàn),相對來說兼容性比較好,也比較穩(wěn)定(因?yàn)?/span> 1.1 已經(jīng)很久沒更新過了,已經(jīng)轉(zhuǎn)向 1.2 去了),而 myfaces 更新比較快,功能也比較多一點(diǎn),初學(xué)的推薦 JSF RI1.1 就可以了, 1.2 需要新的 servlet2.5/jsp2.1 以及服務(wù)器支持,現(xiàn)在還不穩(wěn)定。

          myfaces ,它是一個大的項(xiàng)目,下面有幾個子項(xiàng)目,分別是 myfaces core, sandbox ,tabago,tomahawk ,(奇怪的名字,好難說,我簡稱它為 TOM ),還有一個新的 ADF Faces (跟 oracle adf 有關(guān),應(yīng)該是兼容整合 adf 的功能吧)。 Tabago,tom 都是組件庫, tabago 比較好玩的是支持換膚,還有一些支持 ajax 的組件, TOM 則是一個豐富的增強(qiáng)組件庫,大概有三十個之多,例如 TREE , TAB 等等。 Sandbox 是測試用的。

          Oracle ADF oracle jsf 做的一個大型的組件庫,以前是收費(fèi)的,現(xiàn)在開源了,我沒用過,不好說。

          Ajax4jsf 是為 jsf 提供 AJAX 支持的一個標(biāo)簽庫,使用它提供的標(biāo)簽,就能在原有的 JSF 程序上輕易的加上 AJAX 的功能,而且不用寫任何 Javascript 。

          Facelets 這個是很激動人心的一個框架,有了這個框架才把 JSF 的組件化發(fā)揮出來,通過模板的方式來組合成我們所需要的組件,而且可以不使用 <h:input> 這樣的標(biāo)簽庫,而用 <input type=”text” jsfc=”h:input”> 這樣的方式來使用組件,這樣就可以方便的使用 UI 可視化工具去開發(fā)我們的 WEB 程序。這個框架我會在以后的文章中詳細(xì)的說,以及和 jsp2.0 的模板功能作對比。
          --------------------------------------------------------------------------------
             JSF的session超時問題會在頁面上拋出如下異常:
          javax.faces.application.ViewExpiredException: viewId:/pages/index.faces - View /pages/index.faces could not be restored.
           at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:185)
           at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
           at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
           at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
           at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
           at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
           at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
           at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
           at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
           at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
           at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
           at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
           at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
           at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
           at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
           at java.lang.Thread.run(Unknown Source)
              解決方案:
                    在web.xml中添加如下代碼:
            <error-page>
              <exception-type>javax.faces.application.ViewExpiredException</exception-type>
              <location>/pages/SessionRefire.jsp</location>
            </error-page>

          ----------------------------------------------------
          注意:所有的JSF標(biāo)簽一定要包含在<f:view></f:view>這個節(jié)點(diǎn)中,不然會報(bào)一下問題:

          javax.servlet.ServletException: Component javax.faces.component.UIViewRoot@f1fad1 not expected type.  Expected: javax.faces.component.UIOutput.  Perhaps you're missing a tag?
          javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
          


           

          posted @ 2009-06-26 09:19 小兄弟(Robbins) 閱讀(453) | 評論 (0)編輯 收藏
           
           Hibernate本身自帶的連接池算法不成熟,并不適合用于產(chǎn)品系統(tǒng)或者性能測試。出于最佳性能和穩(wěn)定性考慮你應(yīng)該使用第三方連接池。
          比如使用:C3PO。
          C3PO是一個隨Hibernate一同分發(fā)的開源JDBC連接池。
          posted @ 2009-06-25 15:17 小兄弟(Robbins) 閱讀(161) | 評論 (0)編輯 收藏
           

          使用HTML5構(gòu)建下一代的Web Form

          作者 蔣博 發(fā)布于 2009年6月22日 上午4時52分

          社區(qū)
          Architecture,
          Java
          主題
          編程,
          語言
          標(biāo)簽
          W3C,
          標(biāo)識語言

          HTML5 是由 WHATWG (Web Hypertext Application Technology Working Group) 發(fā)起的,最開始的名稱叫做Web Application 1.0,而后這個標(biāo)準(zhǔn)吸納了Web Forms 2.0的標(biāo)準(zhǔn),并一同被W3C組織所采用,合并成為下一代的HTML5標(biāo)準(zhǔn)。

          前言

          HTML語言作為如今編程最為廣泛的語言,具有易用、快捷、多瀏覽平臺兼容等特點(diǎn),但是隨著時代的進(jìn)步,HTML的標(biāo)準(zhǔn)卻停滯不前,這一次還在不斷開發(fā)中的HTML5標(biāo)準(zhǔn)的更新可以說給這門標(biāo)記語言帶來了新的生命力。本文將著重討論HTML5中的Web Forms 2.0, 即表單的部分。

          表單是網(wǎng)頁中常見的控件(集)。小到網(wǎng)站注冊登錄,大到一個企業(yè)的數(shù)據(jù)管理系統(tǒng),都基本上有表單的身影。表單之所以如此重要,主要是因?yàn)樗鼡?dān)負(fù)大量的用戶和網(wǎng)頁后臺數(shù)據(jù)更新交互的任務(wù)。Web開發(fā)人員,對于網(wǎng)頁表單可以說又愛又恨,愛的是它方便的收集、組織數(shù)據(jù)的功能,恨的是它的功能很大程度上也就僅此而已。一些在最終網(wǎng)站用戶看起來稀松平常的功能,比如說輸入類型檢查、表單校驗(yàn)、錯誤提示等等,開發(fā)人員無不需要花費(fèi)大量精力利用 JavaScript和DOM編程來滿足這些天然所需的功能點(diǎn),而隨著Ajax的流行,出現(xiàn)的一些JavaScript的工具庫,比如Dojo, YUI等都提供了方便的JavaScript Widget或者API來減輕開發(fā)人員的負(fù)擔(dān)。

          HTML5的表單新特性

          HTML5 Web Forms 2.0是對目前Web表單的全面提升,它在保持了簡便易用的特性的同時,增加了許多內(nèi)置的控件或者控件屬性來滿足用戶的需求,并且同時減少了開發(fā)人員的編程。在我看來,HTML5 主要在以下幾個方面對目前的Web表單做了改進(jìn):

          • 新的控件類型
            • 還在為類型檢查犯愁嗎,還在為那一長串看不太明白的檢驗(yàn)輸入的正則表達(dá)式而苦惱嗎,HTML5提供的一系列新的控件將天然的具備類型檢查的功能。比如說URL輸入框,Email輸入框等。
              <input type="url"></input>
              <input type="email"></input>
            • 當(dāng)然還有非常重要的日期輸入框,要知道使用JavaScript和CSS來“手工”制作一個日期輸入框還是非常花功夫的,類似Dojo,YUI這樣的類庫也無不在這個widget上面大做文章。
              <input type="date"></input>
            • 作為我痛苦記憶的一部分,我經(jīng)常記得我們開發(fā)人員要為一個select下拉別表動態(tài)的添加非常多的選項(xiàng),這些選項(xiàng)大多數(shù)都是來自數(shù)據(jù)庫,比如說國家、省市列表等等。這個事情非常繁瑣。HTML5將支持data屬性,為select控件外聯(lián)數(shù)據(jù)源!
              <select data="http://domain/getmyoptions"></select>
          • 改進(jìn)的文件上傳控件,你可以使用一個控件上傳多個文件,自行規(guī)定上傳文件的類型(accept),你甚至可以設(shè)定每個文件最大的大?。╩axlength)。你看出它和一般操作系統(tǒng)提供的文件上傳控件的區(qū)別了嗎,反正我覺得基本一致了。在HTML5應(yīng)用中,文件上傳控件將變得非常強(qiáng)大和易用。
          • 重復(fù)(repeat)的模型,HTML5提供一套重復(fù)機(jī)制來幫助我們構(gòu)建一些重復(fù)輸入列表,其中包括一些諸如 add、remove、move-up,move-down的按鈕類型,通過這一套重復(fù)的機(jī)制,開發(fā)人員可以非常方便的實(shí)現(xiàn)我們經(jīng)??吹降木庉嬃斜恚@是一個很常見的模式,我們可以增加一個條目、刪除某個條目、或者移動某個條目等等。
          • 內(nèi)建的表單校驗(yàn)系統(tǒng),HTML5為不同類型的輸入控件各自提供了新的屬性,來控制這些控件的輸入行為,比如我們常見的必填項(xiàng)required屬性,以及為數(shù)字類型控件提供的max、min等。而在你提交表單的時候,一旦校驗(yàn)錯誤,瀏覽器將不執(zhí)行提交操作,而會顯示相應(yīng)的檢驗(yàn)錯誤信息。
            <input type="text" required></input>
            <input type="number" min=10  max=100></input>
          • XML Submission,我們一般常見的是form的編碼格式是application/x-www-form-urlencoded。開發(fā)人員都很清楚這種格式,數(shù)據(jù)送到服務(wù)器端,可以方便的存取。HTML5將提供一種新的數(shù)據(jù)格式:XML Submission,即application/x-www-form+xml。簡單的舉例說,服務(wù)器端將直接接收到XML形式的表單數(shù)據(jù)。
            <submission>
                <field name="name" index="0">Peter</field>
                <field name="password" index="0">password</field>
            </submission>

          實(shí)例分析

          我將利用HTML5新的表單系統(tǒng), 做一個簡單的用戶注冊的界面,包括用戶名,密碼,出生日期,保密問題等內(nèi)容,代碼如下:

          <! doctype html>
          <html>
          <head>
          <style>
          p label {
          width: 180px;
          float: left;
          text-align: right;
          padding-right: 10px
          }
          table {
          margin-left: 80px
          }
          table td {
          border-bottom: 1px solid #CCCCCC
          }
          input.submit {
          margin-left: 80px
          }
          </style>
          </head>
          <body>
          <form action='/register' enctype="application/x-www-form+xml" method="post">
          <p>
          <label for='name'>ID(請使用Email注冊)</label>
          <input name='name' required type='email'></input>
          </p>
          <p>
          <label for='password'>密碼</label>
          <input name='password' required type='password'></input>
          </p>
          <p>
          <label for='birthday'>出生日期</label>
          <input type='date' name='birthday' />
          </p>
          <p>
          <label for='gender'>國籍</label>
          <select name='country' data='countries.xml'></select>
          </p>
          <p>
          <label for='photo'>個性頭像</label>
          <input type='file' name='photo' accept='image/*' />
          </p>
          <table>
          <thead>
          <td><button type="add" template="questionId">+</button> 保密問題</td>
          <td>答案</td>
          <td></td>
          </thead>
          <tr id="questionId" repeat="template" repeat-start="1" repeat-min="1" repeat-max="3">
          <td><input type="text" name="questions[questionId].q"></td>
          <td><input type="text" name="questions[questionId].a"></td>
          <td><button type="remove">刪除</button></td>
          </tr>
          </table>
          <p>
          <input type='submit' value='send' class='submit' />
          </p>
          </form>
          </body>
          </html>
          

          由于目前HTML5標(biāo)準(zhǔn)仍然在開發(fā)中,不同的瀏覽器對HTML5特性的支持都相當(dāng)有限。其中Opera在表單方面支持得比較好,本實(shí)例在Opera9上運(yùn)行一切正常,效果圖如下:

          這個實(shí)例運(yùn)用了一些HTML5的新的表單元素,比如email類型的輸入框(ID),日期類型的輸入框(出生日期)。并且使用了重復(fù)模型來引導(dǎo)用戶填寫保密問題,而在個性頭像的上傳中,通過限制文件類型,方便用戶選擇圖片進(jìn)行合乎規(guī)范的內(nèi)容上傳。而用戶選擇國籍的下拉選擇輸入框中,采用的是外聯(lián)數(shù)據(jù)源的形式,外聯(lián)數(shù)據(jù)源使用coutries.xml,內(nèi)容如下:

          <select xmlns="http://www.w3.org/1999/xhtml">
          <option>China</option>
          <option>Japan</option>
          <option>Korea</option>
          </select>
          

          并且form的enctype是application/x-www-form+xml,也就是HTML5的XML提交。所以一旦form校驗(yàn)通過,form的內(nèi)容將會以XML的形式提交。你還會發(fā)現(xiàn),在ID輸入框如果沒有值,或者輸入了非email類型的字符串時,一旦試圖提交表單,就會有提示錯誤的信息出現(xiàn),而這都是瀏覽器內(nèi)置的。

          結(jié)語

          HTML5對表單控件的更新,無疑是很振奮人心的。本文描述了一部分表單的新特性,還有一部分新特性同樣很令人期待。相信隨著標(biāo)準(zhǔn)的深入開發(fā)以及瀏覽器對HTML5支持程度的進(jìn)一步提升,設(shè)計(jì)一個簡單易用的表單的工作,將變得非常輕松。

          參考資料

          1. W3C HTML5 規(guī)范: http://www.w3.org/TR/html5/
          2. HTML5 與 HTML4的差異:http://www.w3.org/TR/html5-diff/
          3. Opera dev: Improve your forms with HTML5: http://dev.opera.com/articles/view/improve-your-forms-using-html5/
          4. Comparison of layout engines(HTML5):
            http://en.wikipedia.org/wiki/Comparison_of_layout_engines_(HTML_5)

          關(guān)于作者

          蔣博,主要從事Web前端技術(shù)的開發(fā)工作,在Web開發(fā)與性能分析以及敏捷實(shí)踐等領(lǐng)域有較豐富的經(jīng)驗(yàn)。對HTML5的發(fā)展以及各種 JavaScript類庫有比較濃厚的興趣,經(jīng)常關(guān)注社交型的網(wǎng)站發(fā)展情況,平常喜歡聽音樂,看一些歷史類書籍。(本文僅代表個人觀點(diǎn),與公司立場無關(guān)。)


          給InfoQ中文站投稿或者參與內(nèi)容翻譯工作,請郵件至editors@cn.infoq.com。也歡迎大家加入到InfoQ中文站用戶討論組中與我們的編輯和其他讀者朋友交流。

          posted @ 2009-06-24 09:04 小兄弟(Robbins) 閱讀(195) | 評論 (0)編輯 收藏
           
              看完這本書給我的感覺,比較實(shí)在,基本上對spring有個初步的認(rèn)識。
              接下來我會接著看<Spring參考手冊>,這樣更好的理解Spring這個輕量級的框架。
              
              從縱向第三方框架集成方面講
              1、 web層的集成
                     spring對于web層集成外部框架有:Struts、webwork、Tapestry、JSF、Dinamica、VRaptor
              2、DAO層的集成
                      spring對于DAO層集成外部框架有:Hibernate、Ibatis、JDO

              事務(wù)處理上,Spring可以利用不同的事務(wù)管理對象進(jìn)行事務(wù)上的配置,根據(jù)不同的數(shù)據(jù)層環(huán)境而定。
          posted @ 2009-06-23 21:44 小兄弟(Robbins) 閱讀(184) | 評論 (0)編輯 收藏
           
            Spring的容器事務(wù)主要是基于動態(tài)AOP來處理。
           下面這段xml配置片斷展示了Spring中的事務(wù)設(shè)定方式:
          <beans>
               <bean id="dataSource"
                          class="org.apache.commons.dbcp.BasicDataSource"
                          destroy-method="close">
                        <property name="driverClassName">
                                 <value>org.gjt.mm.mysql.Driver</value>
                        </property>
                        <property name="url">
                                  <value>jdbc:mysql://localhost/sample</value>
                       </property>
                       <property name="username">
                                 <value>user</value>
                       </property>
                       <property name="password">
                                  <value>mypass</value>
                        </property>
                 </bean>
                <bean id="transactionManager"
                           class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
                           <property name="dataSource">
                                <ref local="dataSource" />
                           </property>
                 </bean>
                  <bean id="userDAO" class="net.xiaxin.dao.UserDAO">
                            <property name="dataSource">
                                  <ref local="dataSource" />
                           </property>
                   </bean>
                  <bean id="userDAOProxy"
                             class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
                           <property name="transactionManager">
                                    <ref bean="transactionManager" />
                           </property>
                           <property name="target">
                                   <ref local="userDAO" />
                           </property>
                            <property name="transactionAttributes">
                                   <props>
                                      <prop key="insert*">PROPAGATION_REQUIRED</prop>
                                      <prop key="get*">
                                         PROPAGATION_REQUIRED,readOnly
                                       </prop>
                                     </props>
                              </property>
                       </bean>
          </beans>

          ------------------------------------------------------------------------------------------------------------------------------------------------------------------
          EJB事務(wù)處理與Spring事務(wù)處理的區(qū)別,關(guān)鍵兩點(diǎn):
          1、Spring可以將任意Java Class 納入事務(wù)管理這里的UserDAO只是我們編寫的一個普通Java Class,其中包含了一些基本的數(shù)據(jù)應(yīng)用邏輯。通過Spring,我們即可簡單的實(shí)現(xiàn)事務(wù)的可配置化。也就是說,我們可以隨意為某個類的某個方法指定事務(wù)管理機(jī)制。與之對比,如果使用EJB容器提供的事務(wù)管理功能,我們不得不按照EJB規(guī)范編將UserDAO 進(jìn)行改造,將其轉(zhuǎn)換為一個標(biāo)準(zhǔn)的EJB。
          2、Spring事務(wù)管理并不依賴特定的事務(wù)資源。EJB 容器必須依賴于JTA 提供事務(wù)支持。而Spring 的事務(wù)管理則支持JDBC、JTA 等多種事務(wù)資源。這為我們提供了更多的選擇,從而也使得我們的系統(tǒng)部署更加靈活。
          posted @ 2009-06-23 20:08 小兄弟(Robbins) 閱讀(165) | 評論 (0)編輯 收藏
           
            模板技術(shù)相對傳統(tǒng)JSP技術(shù)有以下三個主要的優(yōu)勢:
             1、表現(xiàn)邏輯與業(yè)務(wù)邏輯的分離
             2、將UI和程序分離,即將美工人員和程序員分離
             3、如果需要,模板引擎可以脫離web容器單獨(dú)運(yùn)行,為系統(tǒng)可能的移植需求提供了更多的彈性空間

             目前spring支持以下模板技術(shù): 
             1、XSLT
                   XSLT的性能相對較低,因?yàn)樵赬SLT中,每個節(jié)點(diǎn)都是一個java對象,大量對象的存儲對內(nèi)存占用極大,同時大量對象的頻繁創(chuàng)建和銷毀也對JVM垃圾收集產(chǎn)生了較大的負(fù)面影響。
             2、Velocity
                   目前最為成熟的模板技術(shù),它是apache jakarta項(xiàng)目中的一個子項(xiàng)目。
             3、FreeMarker
                   對于web開發(fā)而言,F(xiàn)reeMarker在生產(chǎn)效率和學(xué)習(xí)成本上更具優(yōu)勢,而velocity的相對優(yōu)勢在于更多第三方工具的支持和更廣泛的開發(fā)和用戶團(tuán)體。
            
          posted @ 2009-06-23 13:13 小兄弟(Robbins) 閱讀(176) | 評論 (0)編輯 收藏
           
              對于web應(yīng)用,spring提供了可配置的ApplicatonContext加載機(jī)制;加載器目前有兩種加載選擇:ContextLoaderListener和ContextLoaderServlet

              加載器目前有兩種選擇:ContextLoaderListener和ContextLoaderServlet。這兩者在功能上完全等同,只是一個是基于Servlet2.3版本中新引入的Listener接口實(shí)現(xiàn),而另一個基于Servlet接口實(shí)現(xiàn)。開發(fā)中可根據(jù)目標(biāo)Web容器的實(shí)際情況進(jìn)行選擇。

          在web.xml中增加:
          <listener>
              <listener-class>
                   org.springframework.web.context.ContextLoaderListener
               </listener-class>
          </listener>
          -----------------------------------------------------------------
          <servlet>
                <servlet-name>context</servlet-name>
                <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
                <load-on-startup>1</load-on-startup>
          </servlet>
          通過以上配置,Web容器會自動加載/WEB-INF/applicationContext.xml初始化

          如果需要指定配置文件位置,可通過context-param加以指定
          <context-param>
                 <param-name>contextConfigLocation</param-name>
                 <param-value>/WEB-INF/myApplicationContext.xml</param-value>
          </context-param>

          posted @ 2009-06-23 11:32 小兄弟(Robbins) 閱讀(210) | 評論 (0)編輯 收藏
           
            這個文檔的作者是夏昕。先看看這個文檔的內(nèi)容,在作出評論??! 
            看了spring初探這一章,給我的感覺就是利用java的反射機(jī)制,和hibernate差不多??!
           
            控制反轉(zhuǎn) IOC(Inversion of control):由容器控制程序之間的關(guān)系,而非傳統(tǒng)實(shí)現(xiàn)中,有程序直接操控。
            依賴注入DI(Dependency injection):組件之間的依賴關(guān)系由容器在運(yùn)行期決定,即由容器動態(tài)的將某種依賴關(guān)系注入到組件中。
           
           依賴注入的特性:依賴注入機(jī)制減輕了組件之間的依賴關(guān)系,同時也大大地提高了組件的可移植性,這意味組件得到重用的機(jī)會將會更多!

           注入主要有:接口方式、參數(shù)方式、構(gòu)造方式,其實(shí)我覺得參數(shù)和構(gòu)造應(yīng)該都屬于參數(shù)傳值的方式。 
           
           什么叫熱部署?
                熱部署指的是配置文件修改后自動被容器讀取,無需重新啟動應(yīng)用服務(wù)器。

          <beans>
               <description>Spring Quick Start</description>
               <bean id="messageSource"
                         class="org.springframework.context.support.ResourceBundleMessageSource">
                     <property name="basenames">
                        <list>
                              <value>messages</value>
                        </list>
                     </property>
                </bean>
          </beans>
          這里聲明了一個名為messageSource的Bean(注意對于Message定義,Bean ID必須為messageSource,這是目前Spring的編碼規(guī)約),對應(yīng)類為ResourceBundleMessageSource,目前Spring中提供了兩個MessageSource接口的實(shí)現(xiàn),即ResourceBundleMessageSourceReloadableResourceBundleMessageSource,后者提供了無需重啟即可重新加載配置信息的特性。

          注意:實(shí)際上Spring實(shí)用了jdk中的ResourceBundle來讀取配置文件

          對于屬性文件中的國際化中文問題:可以利用JDK中的轉(zhuǎn)碼工具native2ascii.exe來進(jìn)行轉(zhuǎn)換
          posted @ 2009-06-22 15:49 小兄弟(Robbins) 閱讀(247) | 評論 (0)編輯 收藏
           
             從hibernate的概要圖上可以看出hibernate的主要是將對象模型轉(zhuǎn)換成關(guān)系模型的過程。
          第二章看完了,感覺框架中涉及的關(guān)鍵性概念及作用要記?。?br /> SessionFactory(org.hibernate.SessionFactory)
             針對單個數(shù)據(jù)庫映射關(guān)系經(jīng)過編譯后的內(nèi)存鏡像,是線程安全的(不可變)。它是生成Session的工廠,本身要用到ConnectionProvider。該對象可以在進(jìn)程或集群的級別上,為那些事務(wù)之間可以重用的數(shù)據(jù)提供可選得二級緩存。
          Session(org.hibernate.Session)
             表示應(yīng)用程序與持久存儲層之間交互操作的一個單線程對象,此對象生存期很短。其隱藏了JDBC連接,也是Transaction的工廠。其會持有一個針對持久化對象的必選(第一級)緩存,在遍歷對象圖或者根據(jù)持久化標(biāo)識查找對象時會用到。
          -----------------------------------------------------------------------------------------------------------------
          目前好像沒有什么感覺!!

          什么瞬態(tài)(transient)\什么持久化(persistent)\什么脫管(detached)
          把一個對象說的這么理論化,不知為何???
                                                
          posted @ 2009-06-22 15:12 小兄弟(Robbins) 閱讀(120) | 評論 (0)編輯 收藏
           
              我找來一本《hibernate的參考手冊-翻譯版本》
              我訪問http://www.hibernate.org.cn ,既然目前處于域名轉(zhuǎn)讓???不知何解!可能已經(jīng)不用了,網(wǎng)上有些人說已經(jīng)轉(zhuǎn)向www.javaeye.com上了。
           
             還有個網(wǎng)站:http://www.java99.com/
          ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
             例子:
                    使用JAVA 數(shù)據(jù)庫(HSQL DB)

                    運(yùn)行Hibernate所使用的最小的jar為:
                            antlr.jar;cglib.jar;asm.jar;asm-attrs.jar;commons-collections.jar;commons-logging.jar;ehcache.jar;hibernate3.jar;jta.jar;dom4j.jar;log4j.jar
                    其中第三方庫jar需要看自身使用的情況而定。 

           hibernate是通過反射機(jī)制來實(shí)例化javaBean,javaBean中默認(rèn)構(gòu)造函數(shù)是不帶參數(shù)的。
           hibernate主要依賴于映射文件將對象模型轉(zhuǎn)換成關(guān)系模型。hibernate的配置文件中的DTD文件放在hibernate3.jar包中。 

           標(biāo)識符生成策略:
          <hibernate-mapping>
            <class name="events.Event" table="EVENTS">
               <id name="id" column="EVENT_ID">
                   <generator class="native"/>
               </id>
            </class>
          </hibernate-mapping>

          native:根據(jù)已配置的數(shù)據(jù)庫(方言)自動選擇最佳的標(biāo)識符生成策略。

          看完了第一章內(nèi)容,感覺所講的東西只是傳達(dá)一個比較初略的了解。其實(shí)第一章內(nèi)容根本沒有很多必要寫出來。
          posted @ 2009-06-22 10:27 小兄弟(Robbins) 閱讀(140) | 評論 (0)編輯 收藏
           
          project
          <project name="" default="" basedir="">
          </project>

          name:工程名稱
          default:構(gòu)建文件中的一個目標(biāo)名,如果在命令行沒有指定目標(biāo),則使用默認(rèn)的目標(biāo)
          basedir:定義工程的根目錄,一般情況下為"."
          --------------------------------------------------------------------------------------------------------------------------------------------------------------------------
          target
          以下目標(biāo)將編譯一組文件,并將它們打包到一個名為finallib.jar的文件中
          <target name="build-lib">
            <javac srcdir="${src.ejb.dir}:${src.java.dir}"
                       destdir="${build.dir}"
                       debug="on"
                       deprecation="on"
                       includes="**/*.java"
                       excludes="${global.exclude}">
                <classpath>
                   <pathelement location="."/>
                   <pathelemetn location="${lib.dir}/somelib.jar"/>
                </classpath>
             </javac>
             <jar jarfile="${dist}/lib/finallib.jar" basedir="${build.dir}"/>
          </target>
          -------------------------------------------------------------------
          <copy todir="${weblogic.dir}/${weblogic.server.home}/public_html/jsp">
            <fileset dir="${src.www.dir}/jsp"/>
          </copy>
          -------------------------------------------------
          相關(guān)概念:
          特性(property):在構(gòu)建文件中由<property>標(biāo)簽表示的名-值對
          DataType:一類表示復(fù)雜數(shù)據(jù)集合的元素,例如fileset和path
          數(shù)據(jù)元素(data element):這個詞涵蓋了特性和DataType

          property
          <property name="my.first.property" value="ignore me"/>
          <property file="user.properties"/>

          <property name="property.one" value="one"/>
          <property name="property.two" value="${property.one}:two"/>
          --------------------------------------------------------------------
          <path id="classpath">
            <fileset dir="${lib.dir}">
                <include name="**/*.jar"/>
            </fileset>
          </path>
          -------------------------------------------------
          <target name="" depends="bot">
           <mkdir dir="${doc.dir}/api"/>
           <javadoc packagenames="irssibot.*"
                          sourcepath="${src.dir}"
                          destdir="${doc.dir}/api"
                          author="true"
                          version="true"
                          use="true">
                 <classpath refid="classpath"/>
              </javadoc>
          </target>
          ------------------------------------------------------------
          <target name="clean">
              <delete>
                  <fileset dir="${build.classes}" includes="**/*.class"/>
              </delete>
           </target>

          <target name="cleanall" depends="clean">
             <delete dir="${build.dir}"/>
             <delete dir="${dist.dir}"/>
             <delete dir="${doc.dir}/api"/>
          </target>
          posted @ 2009-06-19 10:27 小兄弟(Robbins) 閱讀(116) | 評論 (0)編輯 收藏
           
          這一章沒有什么新意。但是有一個點(diǎn)就是網(wǎng)絡(luò)任務(wù)需要關(guān)注一下

          真搞不懂,一本書怎么寫這么多的文字,簡直多余??!
          一個ANT寫這么厚?????
          posted @ 2009-06-18 16:56 小兄弟(Robbins) 閱讀(96) | 評論 (0)編輯 收藏
           

          我看的書籍是<Ant權(quán)威指南>,Ant的開發(fā)者:James Duncan Davidson。對于一些比較重要的內(nèi)容我記錄了下來:
          ANT命令行參考
          ant [option [option...]] [target [target...]]
          option :={-help:顯示描述Ant命令及其選項(xiàng)的幫助信息
                         -projecthelp:顯示包含在構(gòu)建文件中的、所有用戶編寫的幫助文檔。即為各個<target>中description屬  性的文本,以及包含在<description>元素中的任何文本。將有description屬性的目標(biāo)列為主目標(biāo)("Main target"),沒有此屬性的目標(biāo)則列為子目標(biāo)("subtarget")
                         -version:要求Ant顯示其版本信息,然后退出
                         -quiet:抑制并非由構(gòu)建文件中的echo任務(wù)所產(chǎn)生的大多數(shù)信息
                         -verbose:顯示構(gòu)建過程中每個操作的詳細(xì)消息。此選項(xiàng)與-debug選項(xiàng)只能選其一
                         -debug:顯示Ant和任務(wù)開發(fā)人員已經(jīng)標(biāo)志為調(diào)試消息的消息。此選項(xiàng)與-verbose只能選其一
                         -emacs:對日志消息進(jìn)行格式化,使它們能夠很容易地由Emacs的shell模式(shell-mode)所解析;也就是說,打印任務(wù)事件,但并不縮排,在其之前也沒有[taskname]
                         -logfile filename:將日志輸出重定向到指定文件
                         -logger classname:指定一個類來處理Ant的日志記錄。所指定的類必須實(shí)現(xiàn)了org.apache.tools.ant.BuildLogger接口
                         -listener classname:為Ant聲明一個監(jiān)聽類,并增加到其監(jiān)聽者列表中。在Ant與IDE或其他Java程序集成時,此選項(xiàng)非常有用
                         -buildfile filename:指定Ant需要處理的構(gòu)建文件。默認(rèn)的構(gòu)建文件為build.xml
                         -Dproperty=value:在命令行上定義一個特性名--值對
                         -find filename:指定Ant應(yīng)當(dāng)處理的構(gòu)建文件。與-buildfile選項(xiàng)不同,如果所指定文件在當(dāng)前目錄中未找到,-find就要求Ant在其父目錄中再進(jìn)行搜索。這種搜索會繼續(xù)在其祖父目錄中進(jìn)行,直至達(dá)到文件系統(tǒng)的根為止,在此如果文件還未找到,則構(gòu)建失敗
                         }

          posted @ 2009-06-18 13:57 小兄弟(Robbins) 閱讀(146) | 評論 (0)編輯 收藏
           
               突然想學(xué)習(xí)學(xué)習(xí)Java-PetStore2.0,感覺比較有趣,學(xué)習(xí)一個Java-PetStore就涉及到GlassFish2.1、db-Derby-10.1.2.1、IDE-NetBeans6.5.1、Ant1.7.1,一堆的工具,java-PetStore2.0是一個netBeans工程,直接使用NetBeans就可以打開,也可以使用Ant操作;工程中所涉及的服務(wù)器GlassFish和數(shù)據(jù)庫Derby,NetBeans都已經(jīng)為你準(zhǔn)備好了。
               ANT一直都沒有好好的去學(xué)習(xí)過,現(xiàn)在打算先把ANT看看??!


          -------------------------------------------------------------------------------------------
              在開發(fā)的過程中,我們可能需要將生產(chǎn)環(huán)境和調(diào)試環(huán)境分開來,這樣才能保證安全性,但是安裝兩個glassfish又不太可能,因?yàn)樗嫶罅?。另外做為一個工程發(fā)布也不太方便,每次都要將工程名改來改去,并且綁定的EJB在同一個域內(nèi)里是不能同名的。這樣的話,要改變的東西實(shí)在是太多了。
              我們可有以第三種方法,那就是為glassfish添加另外的domain,一個domain跑我們的真實(shí)環(huán)境,一個domain跑我們的測試環(huán)境,因?yàn)槭峭粋€glassfish,所以也不會存在從測試到真實(shí)環(huán)境的移植問題。以后只要改一個domain就可以了。我們在安裝glassfish的時候,它已經(jīng)默認(rèn)為我們安裝了一個domain,那就是domain1.
              我們查看setup.xml里面可以看出,是如何新建domain的,于是我們把我們需要的一些target提取了出來,見如下。下面的配置里面唯一可能需要改變的就是glassfish安裝目錄這個屬性了,其它可以按照我配的來,也可以自己修改。

          <?xml version="1.0" encoding="UTF-8"?>
          <project name="createDomain" default="create.domain" basedir=".">
          <target name="setEnv">
              
          <property name="domain.name" value="domain3"/>
              
          <property name="admin.user" value="admin"/>
              
          <property name="admin.password" value="adminadmin"/>
              
          <property name="admin.port" value="6848"/>
              
          <property name="instance.port" value="10080"/>
              
          <property name="orb.port" value="5700"/>
              
          <property name="imq.port" value="9676"/>
              
          <property name="https.port" value="10181"/>

              
          <property name="iiop.ssl" value="5821"/>  
              
          <property name="iiop.mutualauth" value="5921"/>  
              
          <property name="jmx.admin" value="10687"/>  

              
          <property name="install.home" value="C:/Program Files/glassfish-v2ur2"/>
              
          <property name="adminpassfile" value="${install.home}/passfile"/>
              
          <property name="ASADMIN" value="${install.home}/bin/asadmin.bat"/>
              
          <echo file="${adminpassfile}" append="false">AS_ADMIN_ADMINPASSWORD=${admin.password}</echo>
          </target>
          <target name="create.domain" depends="setEnv">
              
          <exec executable="${ASADMIN}" failonerror="true">
                  
          <arg line="create-domain" />
                  
          <arg line="--adminport ${admin.port}" />
                  
          <arg line="--instanceport ${instance.port}" />
                  
          <arg line="--user ${admin.user}" />
                  
          <arg line="--passwordfile &quot;${adminpassfile}&quot;" />
                  
          <arg line="--domainproperties orb.listener.port=${orb.port}:jms.port=${imq.port}:http.ssl.port=${https.port}:domain.jmxPort=${jmx.admin}:orb.ssl.port=${iiop.ssl}:orb.mutualauth.port=${iiop.mutualauth}" />
                  
          <arg line="--savelogin" />
                  
          <arg line="${domain.name}" />
              
          </exec>
              
          <delete file="${adminpassfile}" />
          </target>
          </project>


          然后用ant執(zhí)行它就可以了,我這里的執(zhí)行輸出如下:

          C:\Program Files\glassfish-v2ur2>ant
          Buildfile: build.xml

          setEnv:

          create.domain:
               [exec] Using port 6848 for Admin.
               [exec] Using port 10080 for HTTP Instance.
               [exec] Using port 9676 for JMS.
               [exec] Using port 5700 for IIOP.
               [exec] Using port 10181 for HTTP_SSL.
               [exec] Using port 5821 for IIOP_SSL.
               [exec] Using port 5921 for IIOP_MUTUALAUTH.
               [exec] Using port 10687 for JMX_ADMIN.
               [exec] Domain being created with profile:developer, as specified by variabl
          e AS_ADMIN_PROFILE in configuration file.
               [exec] The file in given locale [zh_CN] at: [C:\Program Files\glassfish-v2u
          r2\lib\install\templates\locales\zh_CN\index.html] could not be found. Using def
          ault (en_US) index.html instead.
               [exec] Security Store uses: JKS
               [exec] Domain domain3 created.
               [exec] Login information relevant to admin user name [admin] for this domai
          n [domain3] stored at [C:\Documents and Settings\hadeslee\.asadminpass] successf
          ully.
               [exec] Make sure that this file remains protected. Information stored in th
          is file will be used by asadmin commands to manage this domain.
             [delete] Deleting: C:\Program Files\glassfish-v2ur2\passfile

          BUILD SUCCESSFUL
          Total time: 21 seconds
          C:\Program Files\glassfish-v2ur2>


          這樣我們就可以看到glassfish的domains目錄下面,多出了一個domain3這個文件夾。然后有關(guān)數(shù)據(jù)庫連接池啊什么的,就可以到該目錄下面的config/domain.xml去改了,domain.xml里面的屬性我們以后有時候再好好研究一下。當(dāng)然,我們也可以去glassfish的控制臺進(jìn)行可視化修改,glassfish的控制臺是所有的應(yīng)用服務(wù)器里面做得最好的一個了。訪問的端口就是我們新建domain的時候用到的admin.port的這個屬性。
          posted @ 2009-06-18 10:43 小兄弟(Robbins) 閱讀(744) | 評論 (0)編輯 收藏
           
          三種依賴范圍:compile,test,provided,runtime,test,system

          compile(編譯范圍)

          compile是默認(rèn)的范圍;如果沒有提供一個范圍,那該依賴的范圍就是編譯范圍。編譯范圍依賴在所有的classpath中可用,同時它們也會被打包。

          provided(已提供范圍)

          provided依賴只有在當(dāng)JDK或者一個容器已提供該依賴之后才使用。例如,如果你開發(fā)了一個web應(yīng)用,你可能在編譯classpath中需要可用的Servlet API來編譯一個servlet,但是你不會想要在打包好的WAR中包含這個Servlet API;這個Servlet API JAR由你的應(yīng)用服務(wù)器或者servlet容器提供。已提供范圍的依賴在編譯classpath(不是運(yùn)行時)可用。它們不是傳遞性的,也不會被打包。

          runtime(運(yùn)行時范圍)

          runtime依賴在運(yùn)行和測試系統(tǒng)的時候需要,但在編譯的時候不需要。比如,你可能在編譯的時候只需要JDBC API JAR,而只有在運(yùn)行的時候才需要JDBC驅(qū)動實(shí)現(xiàn)。

          test(測試范圍)

          test范圍依賴在一般的 編譯和運(yùn)行時都不需要,它們只有在測試編譯和測試運(yùn)行階段可用。

          system(系統(tǒng)范圍)

          system范圍依賴與provided類似,但是你必須顯式的提供一個對于本地系統(tǒng)中JAR文件的路徑。這么做是為了允許基于本地對象編譯,而這些對象是系統(tǒng)類庫的一部分。這樣的構(gòu)件應(yīng)該是一直可用的,Maven也不會在倉庫中去尋找它。如果你將一個依賴范圍設(shè)置成系統(tǒng)范圍,你必須同時提供一個systemPath元素。注意該范圍是不推薦使用的(你應(yīng)該一直盡量去從公共或定制的Maven倉庫中引用依賴)。

           
          依賴版本界限:
          (?, ?) 不包含量詞。意思為:?<xx<?
          [?, ?] 包含量詞。意思為:?<=xx<=?
          例如:指定一個依賴界限:JUnit 3.8 - JUnit 4.0
          <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>[3.8,4.0)</version>
          <scope>test</scope>
          </dependency>
          
           
          posted @ 2009-06-07 22:28 小兄弟(Robbins) 閱讀(570) | 評論 (0)編輯 收藏
           
          查看有效的pom—〉mvn help:effective-pom
          ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
          Maven中的版本包含了以下部分:主版本,次版本,增量版本,和限定版本號;一個版本中,這些部分對應(yīng)如下的格式:
          <major version>.<minor version>.<incremental version>-<qualifier>
          Maven提供了三個隱式的變量,可以用來訪問環(huán)境變量,POM信息,和Maven Settings.

          env變量:暴露了你操作系統(tǒng)或者shell的環(huán)境變量

          project變量暴露了POM。

          settings變量暴露了Maven settings信息。

          除了這三個隱式的變量,你還可以引用系統(tǒng)屬性,以及任何在Maven POM中和構(gòu)建profile中自定義的屬性組
           
          自定義屬性:
          <properties>
          <foo>bar</foo>
          </properties>

           

           

          posted @ 2009-06-07 22:10 小兄弟(Robbins) 閱讀(124) | 評論 (0)編輯 收藏
           

          超級POM
          所有的Maven項(xiàng)目的POM都擴(kuò)展自超級POM。你可以在${M2_HOME}/lib中的maven-2.0.9-uber.jar文件中找到pom-4.0.0.xml
          超級pom:
          <project>
            <modelVersion>4.0.0</modelVersion>
            <name>Maven Default Project</name>

            <repositories>
              <repository>
                <id>central</id>
                <name>Maven Repository Switchboard</name>
                <layout>default</layout>
                <url>http://repo1.maven.org/maven2</url>
                <snapshots>
                  <enabled>false</enabled>
                </snapshots>
              </repository>
            </repositories>

            <pluginRepositories>
              <pluginRepository>
                <id>central</id>
                <name>Maven Plugin Repository</name>
                <url>http://repo1.maven.org/maven2</url>
                <layout>default</layout>
                <snapshots>
                  <enabled>false</enabled>
                </snapshots>
                <releases>
                  <updatePolicy>never</updatePolicy>
                </releases>
              </pluginRepository>
            </pluginRepositories>

            <build>
              <directory>target</directory>
              <outputDirectory>target/classes</outputDirectory>
              <finalName>content-zh-0.5</finalName>
              <testOutputDirectory>target/test-classes</testOutputDirectory>
              <sourceDirectory>src/main/java</sourceDirectory>
              <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
              <testSourceDirectory>src/test/java</testSourceDirectory>
              <resources>
                <resource>
                  <directory>src/main/resources</directory>
                </resource>
              </resources>
              <testResources>
                <testResource>
                  <directory>src/test/resources</directory>
                </testResource>
              </testResources>
            </build>

                <pluginManagement>
                 <plugins>
                   <plugin>
                     <artifactId>maven-antrun-plugin</artifactId>
                     <version>1.1</version>
                   </plugin>      
                   <plugin>
                     <artifactId>maven-assembly-plugin</artifactId>
                     <version>2.2-beta-1</version>
                   </plugin>
                   <plugin>
                     <artifactId>maven-clean-plugin</artifactId>
                     <version>2.2</version>
                   </plugin>
                   <plugin>
                     <artifactId>maven-compiler-plugin</artifactId>
                     <version>2.0.2</version>
                   </plugin>
                   <plugin>
                     <artifactId>maven-dependency-plugin</artifactId>
                     <version>2.0</version>
                   </plugin>
                   <plugin>
                     <artifactId>maven-deploy-plugin</artifactId>
                     <version>2.3</version>
                   </plugin>
                   <plugin>
                     <artifactId>maven-ear-plugin</artifactId>
                     <version>2.3.1</version>
                   </plugin>
                   <plugin>
                     <artifactId>maven-ejb-plugin</artifactId>
                     <version>2.1</version>
                   </plugin>
                   <plugin>
                     <artifactId>maven-install-plugin</artifactId>
                     <version>2.2</version>
                   </plugin>
                   <plugin>
                     <artifactId>maven-jar-plugin</artifactId>
                     <version>2.2</version>
                   </plugin>
                   <plugin>
                     <artifactId>maven-javadoc-plugin</artifactId>
                     <version>2.4</version>
                   </plugin>
                   <plugin>
                     <artifactId>maven-plugin-plugin</artifactId>
                     <version>2.3</version>
                   </plugin>
                   <plugin>
                     <artifactId>maven-rar-plugin</artifactId>
                     <version>2.2</version>
                   </plugin>
                   <plugin>               
                     <artifactId>maven-release-plugin</artifactId>
                     <version>2.0-beta-7</version>
                   </plugin>
                   <plugin>               
                     <artifactId>maven-resources-plugin</artifactId>
                     <version>2.2</version>
                   </plugin>
                   <plugin>
                     <artifactId>maven-site-plugin</artifactId>
                     <version>2.0-beta-6</version>
                   </plugin>
                   <plugin>
                     <artifactId>maven-source-plugin</artifactId>
                     <version>2.0.4</version>
                   </plugin>        
                   <plugin>
                      <artifactId>maven-surefire-plugin</artifactId>
                      <version>2.4.2</version>
                   </plugin>
                   <plugin>
                     <artifactId>maven-war-plugin</artifactId>
                     <version>2.1-alpha-1</version>
                   </plugin>
                 </plugins>
               </pluginManagement>
           
            <reporting>
              <outputDirectory>target/site</outputDirectory>
            </reporting>
          </project>

          1).默認(rèn)的超級POM定義了一個單獨(dú)的遠(yuǎn)程Maven倉庫,ID為central,這是所有Maven客戶端默認(rèn)配置訪問的中央Maven倉庫;該配置可以通過一個自定義的settings.xml文件來覆蓋,注意這個默認(rèn)的超級POM關(guān)閉了從中央Maven倉庫下載snapshot構(gòu)件的功能。如果你需要使用一個snapshot倉庫,你就要在你的pom.xml或者settings.xml中自定義倉庫設(shè)置.
          2)build元素設(shè)置Maven標(biāo)準(zhǔn)目錄布局中那些目錄的默認(rèn)值.
          3)POM中定義的groupIdartifactIdversion:這三項(xiàng)是所有項(xiàng)目都需要的坐標(biāo)

          groupId

          一個groupId歸類了一組相關(guān)的構(gòu)件。組定義符基本上類似于一個Java包名。例如:groupId org.apache.maven是所有由Apache Maven項(xiàng)目生成的構(gòu)件的基本groupId。組定義符在Maven倉庫中被翻譯成路徑,例如,groupId org.apache.maven可以在repo1.maven.org/maven2/org/apache/maven目錄下找到。

          artifactId

          artifactId是項(xiàng)目的主要定義符。當(dāng)你生成一個構(gòu)件,這個構(gòu)件將由artifactId命名。當(dāng)你引用一個項(xiàng)目,你就需要使用artifactId來引用它。artifactIdgroupId的組合必須是唯一的。換句話說,你不能有兩個不同的項(xiàng)目擁有同樣的artifactIdgroupId;在某個特定的groupId下,artifactId也必須是唯一的。

          version

          當(dāng)一個構(gòu)件發(fā)布的時候,它是使用一個版本號發(fā)布的。該版本號是一個數(shù)字定義符如“1.0”,“1.1.1”,或“1.1.2-alpha-01”。你也可以使用所謂的快照(snapshot)版本。一個快照版是一個處于開發(fā)過程中的組件的版本,快照版本號通常以SNAPSHOT結(jié)尾;如,“1.0-SNAPSHOT”,“1.1.1-SNAPSHOT”,和“1-SNAPSHOT”。Section 9.3.1, “項(xiàng)目版本”介紹了版本和版本界限。


           

          posted @ 2009-06-07 21:50 小兄弟(Robbins) 閱讀(285) | 評論 (0)編輯 收藏
           
          maven概念:Maven是一個項(xiàng)目管理工具,它包含了一個項(xiàng)目對象模型 (Project Object Model),一組標(biāo)準(zhǔn)集合,一個項(xiàng)目生命周期(Project Lifecycle),一個依賴管理系統(tǒng)(Dependency Management System),和用來運(yùn)行定義在生命周期階段(phase)中插件(plugin)目標(biāo)(goal)的邏輯。

          項(xiàng)目特征定義的特征:
           1).依賴管理:項(xiàng)目間可以使用這些坐標(biāo)來聲明依賴;由于項(xiàng)目是根據(jù)一個包含組標(biāo)識符,構(gòu)件標(biāo)識符和版本的唯一的坐標(biāo)定義的。
           2).遠(yuǎn)程倉庫:和項(xiàng)目依賴相關(guān)的,我們可以使用定義在項(xiàng)目對象模型(POM)中的坐標(biāo)來創(chuàng)建 Maven 構(gòu)件的倉庫。
           3).全局性構(gòu)建邏輯重用:插件被編寫成和項(xiàng)目模型對象(POM)一起工作,它們沒有被設(shè)計(jì)成操作某一個已知位置的特定文件。一切都被抽象到模型中,插件配置和自定義行為都在模型中進(jìn)行。
           4).工具可移植性/集成:像 Eclipse,NetBeans,和 InteliJ 這樣的工具現(xiàn)在有共同的地方來找到項(xiàng)目的信息。在 Maven 出現(xiàn)之前,每個 IDE 都有不同的方法來存儲實(shí)際上是自定義項(xiàng)目對象模型(POM)的信息。Maven 標(biāo)準(zhǔn)化了這種描述,而雖然每個 IDE 仍然繼續(xù)維護(hù)它的自定義項(xiàng)目文件,但這些文件現(xiàn)在可以很容易的由模型生成。
           5).便于搜索和過濾構(gòu)件:像 Nexus 這樣的工具允許你使用存儲在 POM 中的信息對倉庫中的內(nèi)容進(jìn)行索引和搜索。
          posted @ 2009-06-07 21:37 小兄弟(Robbins) 閱讀(114) | 評論 (0)編輯 收藏
           

              項(xiàng)目管理只是時間上的管理。
              MOT是告訴你自己的內(nèi)心,你應(yīng)該怎么在社會上去做人。
              其實(shí)我覺得做人是由后天性格+先天意識行為組合而成,而并不能由于某種培訓(xùn)和讀書就能夠改變本身個人后天形成的性格問題。
              再者我們再回過頭來思考,我們先天意識行為是怎么樣產(chǎn)生的。

          posted @ 2009-06-07 07:49 小兄弟(Robbins) 閱讀(127) | 評論 (0)編輯 收藏
           
          主站蜘蛛池模板: 会东县| 吉木萨尔县| 甘南县| 交口县| 仁怀市| 汕尾市| 海门市| 眉山市| 克拉玛依市| 隆安县| 漳平市| 巴彦县| 庐江县| 乐山市| 玉屏| 绍兴市| 拜城县| 新民市| 高邮市| 恩施市| 双流县| 新龙县| 剑川县| 白城市| 晋江市| 高安市| 西乌珠穆沁旗| 南皮县| 五家渠市| 嘉峪关市| 元朗区| 涪陵区| 蒙阴县| 柳林县| 全州县| 晋宁县| 无极县| 广东省| 屯门区| 长宁区| 海南省|