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

          2009年6月7日

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

          首先從服務(wù)器端啟動(dòng)NioSocketAcceptor對(duì)象進(jìn)行分析。
          1、實(shí)例化DefaultSocketSessionConfig會(huì)話配置器和異步傳輸NioProcessor處理器
          2、實(shí)例化AbstractPollingIoAcceptor構(gòu)造器同時(shí)實(shí)例化SimpleIoProcessorPool處理器池
                --〉在SimpleProcessorPool中初始化執(zhí)行器<線程池>,然后初始化一個(gè)IoProcessor對(duì)象數(shù)組,長度為3,最后將處理器對(duì)象放入到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) 閱讀(1417) | 評(píng)論 (1)編輯 收藏
           
           Dojo介紹
                 Dojo 是一個(gè)用javascript語言實(shí)現(xiàn)的開源DHTML工具包。它是在幾個(gè)項(xiàng)目捐助基礎(chǔ)上建立起來的(nWidgets, Burstlib, f(m)), 這也是為什么叫它a \"unified\" toolkit的原因。Dojo的目標(biāo)是解決開發(fā)DHTML應(yīng)用程序遇到的那些,長期存在 、歷史問題。historical problems with DHTML 跨瀏覽器問題。Dojo讓你更容易 使web頁面具有動(dòng)態(tài)能力,或在任何穩(wěn)健的支持javascript語言的環(huán)境中發(fā)揮作用。

          a、利用dojo提供的組件,你可以提升你的web應(yīng)用程序可用性、交互能力以及功能上的提高;
          b、你也可以 更容易的建立degradeable user interfaces ??,dojo提供小巧的 widgets ,animate transitions;
          c、利用它的低級(jí)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 ,只需要三個(gè)js文件)。當(dāng)你寫腳本時(shí),只需要包含很少的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)。(比較美好啊)更進(jìn)一步,the DojoML 剖析器可以接受html和svg為輸入,容易的建立DegradeableResponsiveApplications。

          第一部分  安裝
          第一個(gè)小節(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
          第一個(gè)小節(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選擇對(duì)象,以確定當(dāng)數(shù)據(jù)回調(diào)時(shí)該怎么做。


          posted @ 2009-06-29 14:20 小兄弟(Robbins) 閱讀(373) | 評(píng)論 (0)編輯 收藏
           
             如果不輸入絕對(duì)的URL訪問地址,例如:URL=http://localhost:8080/petstore;則Glassfish能夠自動(dòng)的搜索項(xiàng)目中是否存在index.html或者index.jsp頁面作為入口頁面。 
             CatalogFacade對(duì)象在服務(wù)器啟動(dòng)時(shí)被實(shí)例化,然后將實(shí)例化的CatalogFacade對(duì)象放置到ServletContext環(huán)境中,這樣可以直接從ServletContext環(huán)境中取得CatalogFacade對(duì)象進(jìn)行相關(guān)數(shù)據(jù)方法的調(diào)用。
             index.jsp中涉足到一個(gè)js框架DOJO,這個(gè)需要進(jìn)一步的學(xué)習(xí)。
             對(duì)數(shù)據(jù)的增、刪、改、查主要用到了JPA來處理。
          posted @ 2009-06-29 12:34 小兄弟(Robbins) 閱讀(347) | 評(píng)論 (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)容對(duì)初學(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 對(duì) JSF 的實(shí)現(xiàn),相對(duì)來說兼容性比較好,也比較穩(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 ,它是一個(gè)大的項(xiàng)目,下面有幾個(gè)子項(xiàng)目,分別是 myfaces core, sandbox ,tabago,tomahawk ,(奇怪的名字,好難說,我簡稱它為 TOM ),還有一個(gè)新的 ADF Faces (跟 oracle adf 有關(guān),應(yīng)該是兼容整合 adf 的功能吧)。 Tabago,tom 都是組件庫, tabago 比較好玩的是支持換膚,還有一些支持 ajax 的組件, TOM 則是一個(gè)豐富的增強(qiáng)組件庫,大概有三十個(gè)之多,例如 TREE TAB 等等。 Sandbox 是測試用的。

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

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

          Facelets 這個(gè)是很激動(dòng)人心的一個(gè)框架,有了這個(gè)框架才把 JSF 的組件化發(fā)揮出來,通過模板的方式來組合成我們所需要的組件,而且可以不使用 <h:input> 這樣的標(biāo)簽庫,而用 <input type=”text” jsfc=”h:input”> 這樣的方式來使用組件,這樣就可以方便的使用 UI 可視化工具去開發(fā)我們的 WEB 程序。這個(gè)框架我會(huì)在以后的文章中詳細(xì)的說,以及和 jsp2.0 的模板功能作對(duì)比。
          --------------------------------------------------------------------------------
             JSF的session超時(shí)問題會(huì)在頁面上拋出如下異常:
          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>這個(gè)節(jié)點(diǎn)中,不然會(huì)報(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) 閱讀(447) | 評(píng)論 (0)編輯 收藏
           
           Hibernate本身自帶的連接池算法不成熟,并不適合用于產(chǎn)品系統(tǒng)或者性能測試。出于最佳性能和穩(wěn)定性考慮你應(yīng)該使用第三方連接池。
          比如使用:C3PO。
          C3PO是一個(gè)隨Hibernate一同分發(fā)的開源JDBC連接池。
          posted @ 2009-06-25 15:17 小兄弟(Robbins) 閱讀(153) | 評(píng)論 (0)編輯 收藏
           

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

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

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

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

          前言

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

          表單是網(wǎng)頁中常見的控件(集)。小到網(wǎng)站注冊(cè)登錄,大到一個(gè)企業(yè)的數(shù)據(jù)管理系統(tǒng),都基本上有表單的身影。表單之所以如此重要,主要是因?yàn)樗鼡?dān)負(fù)大量的用戶和網(wǎng)頁后臺(tái)數(shù)據(jù)更新交互的任務(wù)。Web開發(fā)人員,對(duì)于網(wǎng)頁表單可以說又愛又恨,愛的是它方便的收集、組織數(shù)據(jù)的功能,恨的是它的功能很大程度上也就僅此而已。一些在最終網(wǎng)站用戶看起來稀松平常的功能,比如說輸入類型檢查、表單校驗(yàn)、錯(cuò)誤提示等等,開發(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是對(duì)目前Web表單的全面提升,它在保持了簡便易用的特性的同時(shí),增加了許多內(nèi)置的控件或者控件屬性來滿足用戶的需求,并且同時(shí)減少了開發(fā)人員的編程。在我看來,HTML5 主要在以下幾個(gè)方面對(duì)目前的Web表單做了改進(jìn):

          • 新的控件類型
            • 還在為類型檢查犯愁嗎,還在為那一長串看不太明白的檢驗(yàn)輸入的正則表達(dá)式而苦惱嗎,HTML5提供的一系列新的控件將天然的具備類型檢查的功能。比如說URL輸入框,Email輸入框等。
              <input type="url"></input>
              <input type="email"></input>
            • 當(dāng)然還有非常重要的日期輸入框,要知道使用JavaScript和CSS來“手工”制作一個(gè)日期輸入框還是非常花功夫的,類似Dojo,YUI這樣的類庫也無不在這個(gè)widget上面大做文章。
              <input type="date"></input>
            • 作為我痛苦記憶的一部分,我經(jīng)常記得我們開發(fā)人員要為一個(gè)select下拉別表動(dòng)態(tài)的添加非常多的選項(xiàng),這些選項(xiàng)大多數(shù)都是來自數(shù)據(jù)庫,比如說國家、省市列表等等。這個(gè)事情非常繁瑣。HTML5將支持data屬性,為select控件外聯(lián)數(shù)據(jù)源!
              <select data="http://domain/getmyoptions"></select>
          • 改進(jìn)的文件上傳控件,你可以使用一個(gè)控件上傳多個(gè)文件,自行規(guī)定上傳文件的類型(accept),你甚至可以設(shè)定每個(gè)文件最大的大小(maxlength)。你看出它和一般操作系統(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)常看到的編輯列表,這是一個(gè)很常見的模式,我們可以增加一個(gè)條目、刪除某個(gè)條目、或者移動(dòng)某個(gè)條目等等。
          • 內(nèi)建的表單校驗(yàn)系統(tǒng),HTML5為不同類型的輸入控件各自提供了新的屬性,來控制這些控件的輸入行為,比如我們常見的必填項(xiàng)required屬性,以及為數(shù)字類型控件提供的max、min等。而在你提交表單的時(shí)候,一旦校驗(yàn)錯(cuò)誤,瀏覽器將不執(zhí)行提交操作,而會(huì)顯示相應(yīng)的檢驗(yàn)錯(cuò)誤信息。
            <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), 做一個(gè)簡單的用戶注冊(cè)的界面,包括用戶名,密碼,出生日期,保密問題等內(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(請(qǐng)使用Email注冊(cè))</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'>個(gè)性頭像</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ā)中,不同的瀏覽器對(duì)HTML5特性的支持都相當(dāng)有限。其中Opera在表單方面支持得比較好,本實(shí)例在Opera9上運(yùn)行一切正常,效果圖如下:

          這個(gè)實(shí)例運(yùn)用了一些HTML5的新的表單元素,比如email類型的輸入框(ID),日期類型的輸入框(出生日期)。并且使用了重復(fù)模型來引導(dǎo)用戶填寫保密問題,而在個(gè)性頭像的上傳中,通過限制文件類型,方便用戶選擇圖片進(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)容將會(huì)以XML的形式提交。你還會(huì)發(fā)現(xiàn),在ID輸入框如果沒有值,或者輸入了非email類型的字符串時(shí),一旦試圖提交表單,就會(huì)有提示錯(cuò)誤的信息出現(xiàn),而這都是瀏覽器內(nèi)置的。

          結(jié)語

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

          參考資料

          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)。對(duì)HTML5的發(fā)展以及各種 JavaScript類庫有比較濃厚的興趣,經(jīng)常關(guān)注社交型的網(wǎng)站發(fā)展情況,平常喜歡聽音樂,看一些歷史類書籍。(本文僅代表個(gè)人觀點(diǎn),與公司立場無關(guān)。)


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

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

              事務(wù)處理上,Spring可以利用不同的事務(wù)管理對(duì)象進(jìn)行事務(wù)上的配置,根據(jù)不同的數(shù)據(jù)層環(huán)境而定。
          posted @ 2009-06-23 21:44 小兄弟(Robbins) 閱讀(180) | 評(píng)論 (0)編輯 收藏
           
            Spring的容器事務(wù)主要是基于動(dòng)態(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只是我們編寫的一個(gè)普通Java Class,其中包含了一些基本的數(shù)據(jù)應(yīng)用邏輯。通過Spring,我們即可簡單的實(shí)現(xiàn)事務(wù)的可配置化。也就是說,我們可以隨意為某個(gè)類的某個(gè)方法指定事務(wù)管理機(jī)制。與之對(duì)比,如果使用EJB容器提供的事務(wù)管理功能,我們不得不按照EJB規(guī)范編將UserDAO 進(jìn)行改造,將其轉(zhuǎn)換為一個(gè)標(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) 閱讀(160) | 評(píng)論 (0)編輯 收藏
           
            模板技術(shù)相對(duì)傳統(tǒng)JSP技術(shù)有以下三個(gè)主要的優(yōu)勢(shì):
             1、表現(xiàn)邏輯與業(yè)務(wù)邏輯的分離
             2、將UI和程序分離,即將美工人員和程序員分離
             3、如果需要,模板引擎可以脫離web容器單獨(dú)運(yùn)行,為系統(tǒng)可能的移植需求提供了更多的彈性空間

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

              加載器目前有兩種選擇:ContextLoaderListener和ContextLoaderServlet。這兩者在功能上完全等同,只是一個(gè)是基于Servlet2.3版本中新引入的Listener接口實(shí)現(xiàn),而另一個(gè)基于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容器會(huì)自動(dòng)加載/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) 閱讀(206) | 評(píng)論 (0)編輯 收藏
           
            這個(gè)文檔的作者是夏昕。先看看這個(gè)文檔的內(nèi)容,在作出評(píng)論!! 
            看了spring初探這一章,給我的感覺就是利用java的反射機(jī)制,和hibernate差不多!!
           
            控制反轉(zhuǎn) IOC(Inversion of control):由容器控制程序之間的關(guān)系,而非傳統(tǒng)實(shí)現(xiàn)中,有程序直接操控。
            依賴注入DI(Dependency injection):組件之間的依賴關(guān)系由容器在運(yùn)行期決定,即由容器動(dòng)態(tài)的將某種依賴關(guān)系注入到組件中。
           
           依賴注入的特性:依賴注入機(jī)制減輕了組件之間的依賴關(guān)系,同時(shí)也大大地提高了組件的可移植性,這意味組件得到重用的機(jī)會(huì)將會(huì)更多!

           注入主要有:接口方式、參數(shù)方式、構(gòu)造方式,其實(shí)我覺得參數(shù)和構(gòu)造應(yīng)該都屬于參數(shù)傳值的方式。 
           
           什么叫熱部署?
                熱部署指的是配置文件修改后自動(dòng)被容器讀取,無需重新啟動(dòng)應(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>
          這里聲明了一個(gè)名為messageSource的Bean(注意對(duì)于Message定義,Bean ID必須為messageSource,這是目前Spring的編碼規(guī)約),對(duì)應(yīng)類為ResourceBundleMessageSource,目前Spring中提供了兩個(gè)MessageSource接口的實(shí)現(xiàn),即ResourceBundleMessageSourceReloadableResourceBundleMessageSource后者提供了無需重啟即可重新加載配置信息的特性

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

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

          什么瞬態(tài)(transient)\什么持久化(persistent)\什么脫管(detached)
          把一個(gè)對(duì)象說的這么理論化,不知為何???
                                                
          posted @ 2009-06-22 15:12 小兄弟(Robbins) 閱讀(117) | 評(píng)論 (0)編輯 收藏
           
              我找來一本《hibernate的參考手冊(cè)-翻譯版本》
              我訪問http://www.hibernate.org.cn ,既然目前處于域名轉(zhuǎn)讓???不知何解!可能已經(jīng)不用了,網(wǎng)上有些人說已經(jīng)轉(zhuǎn)向www.javaeye.com上了。
           
             還有個(gè)網(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主要依賴于映射文件將對(duì)象模型轉(zhuǎn)換成關(guān)系模型。hibernate的配置文件中的DTD文件放在hibernate3.jar包中。 

           標(biāo)識(shí)符生成策略:
          <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ù)庫(方言)自動(dòng)選擇最佳的標(biāo)識(shí)符生成策略。

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

          name:工程名稱
          default:構(gòu)建文件中的一個(gè)目標(biāo)名,如果在命令行沒有指定目標(biāo),則使用默認(rèn)的目標(biāo)
          basedir:定義工程的根目錄,一般情況下為"."
          --------------------------------------------------------------------------------------------------------------------------------------------------------------------------
          target
          以下目標(biāo)將編譯一組文件,并將它們打包到一個(gè)名為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)簽表示的名-值對(duì)
          DataType:一類表示復(fù)雜數(shù)據(jù)集合的元素,例如fileset和path
          數(shù)據(jù)元素(data element):這個(gè)詞涵蓋了特性和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) 閱讀(113) | 評(píng)論 (0)編輯 收藏
           
          這一章沒有什么新意。但是有一個(gè)點(diǎn)就是網(wǎng)絡(luò)任務(wù)需要關(guān)注一下

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

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

          posted @ 2009-06-18 13:57 小兄弟(Robbins) 閱讀(143) | 評(píng)論 (0)編輯 收藏
           
               突然想學(xué)習(xí)學(xué)習(xí)Java-PetStore2.0,感覺比較有趣,學(xué)習(xí)一個(gè)Java-PetStore就涉及到GlassFish2.1、db-Derby-10.1.2.1、IDE-NetBeans6.5.1、Ant1.7.1,一堆的工具,java-PetStore2.0是一個(gè)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)境分開來,這樣才能保證安全性,但是安裝兩個(gè)glassfish又不太可能,因?yàn)樗嫶罅恕A硗庾鰹橐粋€(gè)工程發(fā)布也不太方便,每次都要將工程名改來改去,并且綁定的EJB在同一個(gè)域內(nèi)里是不能同名的。這樣的話,要改變的東西實(shí)在是太多了。
              我們可有以第三種方法,那就是為glassfish添加另外的domain,一個(gè)domain跑我們的真實(shí)環(huán)境,一個(gè)domain跑我們的測試環(huán)境,因?yàn)槭峭粋€(gè)glassfish,所以也不會(huì)存在從測試到真實(shí)環(huán)境的移植問題。以后只要改一個(gè)domain就可以了。我們?cè)诎惭bglassfish的時(shí)候,它已經(jīng)默認(rèn)為我們安裝了一個(gè)domain,那就是domain1.
              我們查看setup.xml里面可以看出,是如何新建domain的,于是我們把我們需要的一些target提取了出來,見如下。下面的配置里面唯一可能需要改變的就是glassfish安裝目錄這個(gè)屬性了,其它可以按照我配的來,也可以自己修改。

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

          compile(編譯范圍)

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

          provided(已提供范圍)

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

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

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

          test(測試范圍)

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

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

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

           
          依賴版本界限:
          (?, ?) 不包含量詞。意思為:?<xx<?
          [?, ?] 包含量詞。意思為:?<=xx<=?
          例如:指定一個(gè)依賴界限: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) 閱讀(567) | 評(píng)論 (0)編輯 收藏
           
          查看有效的pom—〉mvn help:effective-pom
          ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
          Maven中的版本包含了以下部分:主版本,次版本,增量版本,和限定版本號(hào);一個(gè)版本中,這些部分對(duì)應(yīng)如下的格式:
          <major version>.<minor version>.<incremental version>-<qualifier>
          Maven提供了三個(gè)隱式的變量,可以用來訪問環(huán)境變量,POM信息,和Maven Settings.

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

          project變量暴露了POM

          settings變量暴露了Maven settings信息。

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

           

           

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

          超級(jí)POM
          所有的Maven項(xiàng)目的POM都擴(kuò)展自超級(jí)POM。你可以在${M2_HOME}/lib中的maven-2.0.9-uber.jar文件中找到pom-4.0.0.xml
          超級(jí)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)的超級(jí)POM定義了一個(gè)單獨(dú)的遠(yuǎn)程Maven倉庫,ID為central,這是所有Maven客戶端默認(rèn)配置訪問的中央Maven倉庫;該配置可以通過一個(gè)自定義的settings.xml文件來覆蓋,注意這個(gè)默認(rèn)的超級(jí)POM關(guān)閉了從中央Maven倉庫下載snapshot構(gòu)件的功能。如果你需要使用一個(gè)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

          一個(gè)groupId歸類了一組相關(guān)的構(gòu)件。組定義符基本上類似于一個(gè)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è)構(gòu)件,這個(gè)構(gòu)件將由artifactId命名。當(dāng)你引用一個(gè)項(xiàng)目,你就需要使用artifactId來引用它。artifactIdgroupId的組合必須是唯一的。換句話說,你不能有兩個(gè)不同的項(xiàng)目擁有同樣的artifactIdgroupId;在某個(gè)特定的groupId下,artifactId也必須是唯一的。

          version

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


           

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

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

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

          posted @ 2009-06-07 07:49 小兄弟(Robbins) 閱讀(123) | 評(píng)論 (0)編輯 收藏
           
          主站蜘蛛池模板: 咸宁市| 慈溪市| 遂川县| 云安县| 建德市| 佛学| 郑州市| 东港市| 平江县| 霍州市| 三门县| 泰宁县| 元谋县| 安福县| 长葛市| 平南县| 新化县| 贵德县| 开鲁县| 高清| 榆林市| 科技| 汤原县| 巴彦淖尔市| 商丘市| 清新县| 高要市| 巴南区| 和顺县| 旬阳县| 峡江县| 澄城县| 姜堰市| 和平县| 亳州市| 全州县| 麻阳| 界首市| 贵港市| 伊宁市| 平潭县|