Javaphua Blog

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            46 Posts :: 5 Stories :: 46 Comments :: 0 Trackbacks

          2007年3月21日 #

          一:一個(gè)目標(biāo)

          一艘沒有航行目標(biāo)的船,任何方向的風(fēng)都是逆風(fēng)

          1、你為什么是窮人,第一點(diǎn)就是你沒有立下成為富人的目標(biāo)

          2、你的人生核心目標(biāo)是什么?

          杰出人士與平庸之輩的根本差別并不是天賦、機(jī)遇,而在于有無目標(biāo)。

          3、起跑領(lǐng)先一步,人生領(lǐng)先一大步:成功從選定目標(biāo)開始

          4、賈金斯式的人永遠(yuǎn)不會(huì)成功

          為什么大多數(shù)人沒有成功?真正能完成自己計(jì)劃的人只有5%,大多數(shù)人不是將自己的目標(biāo)舍棄,就是淪為缺乏行動(dòng)的空想

          5、如果你想在35歲以前成功,你一定在25至30歲之間確立好你的人生目標(biāo)

          6、每日、每月、每年都要問自己:我是否達(dá)到了自己定下的目標(biāo)

          二:兩個(gè)成功基點(diǎn)

          好位置,調(diào)正心態(tài),努力沖刺,35歲以前成功

          (一)人生定位

          1、人怕入錯(cuò)行:你的核心競(jìng)爭(zhēng)力是什么?

          2、成功者找方法,失敗者找借口

          3、從三百六十行中選擇你的最愛

          人人都可以創(chuàng)業(yè),但卻不是人人都能創(chuàng)業(yè)成功

          4、尋找自己的黃金寶地

          (二)永恒的真理:心態(tài)決定命運(yùn),35歲以前的心態(tài)決定你一生的命運(yùn)

          1、不滿現(xiàn)狀的人才能成為富翁

          2、敢于夢(mèng)想,勇于夢(mèng)想,這個(gè)世界永遠(yuǎn)屬于追夢(mèng)的人

          3、 35歲以前不要怕,35歲以后不要悔

          4、出身貧民,并非一輩子是貧民,只要你永遠(yuǎn)保持那顆進(jìn)取的心。中國成功人士大多來自小地方

          5、做一個(gè)積極的思維者

          6、不要敗給悲觀的自己

          有的人比你富有一千倍,他們也會(huì)比你聰明一千倍么?不會(huì),他們只是年輕時(shí)心氣比你高一千倍。

          人生的好多次失敗,最后并不是敗給別人,而是敗給了悲觀的自己。

          7、成功者不過是爬起來比倒下去多一次

          8、寧可去碰壁,也不要在家里面壁

          克服你的失敗、消極的心態(tài)

          (1)找個(gè)地方喝點(diǎn)酒

          (2)找個(gè)迪廳跳跳舞

          (3)找?guī)团笥奄┵┥?

          (4)積極行動(dòng)起來

          三:三大技巧

          1、管理時(shí)間:你的時(shí)間在哪里,你的成就就在哪里。

          把一小時(shí)看成60分鐘的人,比看作一小時(shí)的人多60倍

          2、你不理財(cái),財(cái)不理你

          3、自我管理,游刃有余

          (1)創(chuàng)業(yè)不怕本小,腦子一定要好

          (2)可以開家特色店

          (3)做別人不愿做的生意

          四:四項(xiàng)安身立命的理念

          35歲以前一定要形成個(gè)人風(fēng)格

          1、做人優(yōu)于做事

          做事失敗可以重來,做人失敗卻不能重來

          (1)做人要講義氣

          (2)永不氣餒

          2、豁達(dá)的男人有財(cái)運(yùn),豁達(dá)的女人有幫夫運(yùn)

          35歲以前搞定婚姻生活

          3、忠誠的原則:35歲以前你還沒有建立起忠誠美譽(yù),這一缺點(diǎn)將要困擾你的一生

          4、把小事做細(xì),但不要耍小聰明

          中國人想做大事的人太多,而愿把小事做完美的人太少

          五:五分運(yùn)氣

          比爾·蓋茨說:人生是不公平的,習(xí)慣去接受它吧

          1、人生的確有很多運(yùn)氣的成人:謀事在人,成事在天:中國的古訓(xùn)說明各占一半

          2、機(jī)會(huì)時(shí)常意外地降臨,但屬于那些不應(yīng)決不放棄的人

          3、抓住人生的每一次機(jī)會(huì)

          機(jī)會(huì)就像一只小鳥,如果你不抓住,它就會(huì)飛得無影無蹤

          4、者早一步,愚者晚一步

          六:六項(xiàng)要求

          1、智慧

          (1)別人可你以拿走你的一切,但拿不走你的智慧

          (2)巧妙運(yùn)用自己的智慧

          (3)智者與愚者的區(qū)別

          2、勇氣

          (1)勇氣的力量有時(shí)會(huì)讓你成為“超人”

          (2)敢于放棄,敢于“舍得”

          3、培養(yǎng)自己的“領(lǐng)導(dǎo)才能、領(lǐng)袖氣質(zhì)”

          (1)激情感染別人

          (2)“三·七法則”實(shí)現(xiàn)領(lǐng)袖氣質(zhì)

          (3)拍板決斷能力

          (4)人格魅力

          4、創(chuàng)造性:不要做循規(guī)蹈矩的人

          25-35歲是人生最有創(chuàng)造性的階段,很多成功人士也都產(chǎn)生在這一階段

          5、明智

          (1)知道自己的長處、短處,定向聚焦

          (2)盡量在自己的熟悉的領(lǐng)域努力

          6、持之以恒的行動(dòng)力:在你選定行業(yè)堅(jiān)持十年,你一定會(huì)成為大贏家

          七:七分學(xué)習(xí)

          1、知識(shí)改變命運(yùn)

          2、35歲以前學(xué)會(huì)你行業(yè)中必要的一切知識(shí)

          a)每天淘汰你自己

          b)在商言商

          3、太相信的書人,只能成為打工仔

          4、思考、實(shí)踐、再思考、再實(shí)踐

          八:八分交際

          朋友多了路好走

          1、智商很重要,情商更重要:35歲以前建立起人際關(guān)系網(wǎng)

          2、人脈即財(cái)脈:如何搞好人際關(guān)系

          3、交友有原則

          4、善于溝通:35歲以前要鍛煉出自己的演講才能

          九:九分習(xí)慣

          習(xí)慣的力量是驚人的,35歲以前養(yǎng)成的習(xí)慣決定著你的成功的大小

          1、積極思維的好習(xí)慣

          2、養(yǎng)成高效工作的好習(xí)慣

          (1)辦公

          (2)生活可以不拘小節(jié),但要把工作做細(xì)

          (3)學(xué)習(xí)聆聽,不打斷別人說話

          3、養(yǎng)成鍛煉身體的好習(xí)慣

          4、廣泛愛好的好習(xí)慣

          5、快速行動(dòng)的好習(xí)慣

          十:十分自信

          1、自信是成功的精神支柱

          2、自信方能贏得別人的信任

          3、把自信建立在創(chuàng)造價(jià)值的基礎(chǔ)上

          4、如何建立自信

          (1)為自己確立目標(biāo)

          (2)發(fā)揮自己的長處

          (3)做事要有計(jì)劃

          (4)做事不拖拉

          (5)輕易不要放棄

          (6)學(xué)會(huì)自我激勵(lì)

          (7)不要讓自己成為別人 十一: 11個(gè)需要避開的成功陷阱

          1、只有功勞,沒有苦勞

          2、不要“懷才不遇“,而要尋找機(jī)遇

          3、不要想發(fā)橫財(cái)

          4、不要為錢而工作,而讓錢為你工作

          5、盲目跟風(fēng),人云亦云,人做我也做

          6、小富即安,不思進(jìn)取,知足常樂

          7、承認(rèn)錯(cuò)誤而非掩飾錯(cuò)誤

          8、腳踏實(shí)地而非想入非非

          9、野心太大而不是信心十足

          10、反復(fù)跳槽不可取

          11、眼高手低

          12、不擇手段

          十二:十二分努力

          沒有人能隨隨便便成功

          1、小不是成功,大不是成功,由小變大才是成功

          2、中國社會(huì)進(jìn)入微利時(shí)代:巧干+敢干+實(shí)干=成功

          3、努力嘗試就有成功的可能

          4、做任何事情,盡最大努力

          5、把事情當(dāng)成事業(yè)來做

          6、我看打工者

          7、祝你早日掘到第一桶金來源

          posted @ 2007-08-19 00:36 Javaphua 閱讀(581) | 評(píng)論 (0)編輯 收藏

          Ajax 基礎(chǔ)和例子

          Ajax -- Asynchronous JavaScript and XML Ajax 使用的是JavaScript + DOM + CSS + XMLHttpRequest的技術(shù),是目前Web2.0更加流行的技術(shù).

          與傳統(tǒng)網(wǎng)絡(luò)應(yīng)用相比,Ajax具備更加直觀和方便的用戶交互. 為什么呢? 比如, 我們需要點(diǎn)擊鏈接或按鈕來激發(fā)事件,而使用Ajax只要移動(dòng)鼠標(biāo)或者在一個(gè)輸入框輸入字母已經(jīng)可以觸發(fā)事件. 傳統(tǒng)的網(wǎng)絡(luò)應(yīng)用是基于page-driven的模式, 使用的是'click, wait a refresh the whole page' 模式, 而Ajax是通過data-driven的模式來提供網(wǎng)絡(luò)頁面的, 采用的是部分頁面更新的模式, 頁面中只更新有新數(shù)據(jù)的部分,其它的部分依然不變,所以依然可以操作.

          Ajax就象它的名字一樣, 可以異步地在瀏覽器和服務(wù)器之間進(jìn)行交流, 當(dāng)服務(wù)器端處理submit過來的數(shù)據(jù)的同時(shí), 客戶依然可以正常地處理瀏覽器端同一頁面的其他功能.

          那么Ajax和傳統(tǒng)網(wǎng)絡(luò)應(yīng)用相比是怎樣工作的呢?下面這張圖可以讓你了解清楚.

          傳統(tǒng)的網(wǎng)絡(luò)應(yīng)用在瀏覽器和服務(wù)器之間的交流是直來直去的, 而Ajax的網(wǎng)絡(luò)應(yīng)用在瀏覽器中有一個(gè)Ajax引擎,這個(gè)引擎實(shí)際上就是一個(gè)Javascript的對(duì)象XMLHttpRequest, 而XMLHttpRequest負(fù)責(zé)瀏覽器和服務(wù)器的異步交流.

          XMLHttpRequest既然是Javascript的對(duì)象, 當(dāng)然需要一些Javascript的代碼來生成, 它目前支持大部分的瀏覽器,包括了Mozilla, Firefox等等.

          服務(wù)器端依然可以使用傳統(tǒng)的技術(shù)如servlet, JSP, JSF,Struts等等,但會(huì)有一些小的限制,比如客戶端會(huì)發(fā)更頻繁的請(qǐng)求,而響應(yīng)這些請(qǐng)求的類型包括text/xml, text/plain, text/json, text/javascript.

          整個(gè)Ajax的操作過程分為七步:

          1.A client event occurs

          2.An XMLHttpRequest object is created

          3.The XMLHttpRequest object is configured

          4.The XMLHttpRequest object makes an async. request

          5.The ValidateServlet returns an XML document containing the result

          6.The XMLHttpRequest object calls the callback() function and processes the result

          7.The HTML DOM is updated

          我們分別來看看這七個(gè)步驟是怎么做的: 1. A client event occurs,

          <input type="text"
          size="20"
          id="userid"
          name="id"
          onkeyup="validateUserId();">

          比如我們手頭上有這樣一段Javascript的代碼:  這是一個(gè)ID為userid的文本框,里面包含了一個(gè)Javascript的函數(shù),當(dāng)我們?cè)谖谋究蚶锎蛉胍粋€(gè)英文字母時(shí),會(huì)激發(fā)onkeyup的事件,從而激發(fā)validateUserId的Javascript的函數(shù).

          2.An XMLHttpRequest object is created

          var req;
          function initRequest() {
          if (window.XMLHttpRequest) {
          req = new XMLHttpRequest();
          } else if (window.ActiveXObject) {
          isIE = true;
          req = new ActiveXObject("Microsoft.XMLHTTP");
          }
          }
          function validateUserId() {
          initRequest();
          req.onreadystatechange = processRequest;
          if (!target) target = document.getElementById("userid");
          var url = "validate?id=" + escape(target.value);
          req.open("GET", url, true);
          req.send(null);
          }

          validateUserId的Javascript的函數(shù)調(diào)用initRequest函數(shù)生成XMLHttpRequest對(duì)象, 大家注意到在initRequest函數(shù)里面有兩種生成XMLHttpRequest的方法,這是針對(duì)不同的瀏覽器的做法,對(duì)于Mozilla,我們可以直接使用"new XMLHttpRequest()”, 而對(duì)于IE,我們需要生成ActiveX對(duì)象.

          3.The XMLHttpRequest object is configured

          rvalidateUserId的Javascript的函數(shù)包含一句req.onreadystatechange = processRequest; 這是通過設(shè)定XMLHttpRequest對(duì)象里面的onreadystatechange特性為回調(diào)函數(shù).

          4.The XMLHttpRequest object makes an async. request

          if (!target) target = document.getElementById("userid");
          var url = "validate?id=" + escape(target.value);
          req.open("GET", url, true);
          req.send(null);

          然后XMLHttpRequest調(diào)用open方法和服務(wù)器交流, open方法有三個(gè)參數(shù), HTTP方法是Get還是Post, 服務(wù)器端的URL, 方式采取異步還是同步.

          5.The ValidateServlet returns an XML document containing the result

          public void doGet(HttpServletRequest request, HttpServletResponse response)
          throws IOException, ServletException {
          String targetId = request.getParameter("id");
          if ((targetId != null) && !accounts.containsKey(targetId.trim())) {
          response.setContentType("text/xml ");
          response.setHeader("Cache-Control", "no-cache");
          response.getWriter().write("<valid>true</valid>");
          } else {
          response.setContentType("text/xml ");
          response.setHeader("Cache-Control", "no-cache");
          response.getWriter().write("<valid>false</valid>");
          }
          }

          然后是服務(wù)器端ValidateServlet的響應(yīng),首先Content type設(shè)為text/xml, Cache-Control設(shè)為no-cache, 最后會(huì)返回true或者false的xml格式響應(yīng).

          6.The XMLHttpRequest object calls the callback() function and processes the result

          function processRequest() {
          if (req.readyState == 4) {
          if (req.status == 200) {
          var message = ...;

          現(xiàn)在控制交回給客戶端, 由于我們?cè)O(shè)定了回調(diào)函數(shù)為processRequest, 那么當(dāng)響應(yīng)從服務(wù)器端回到客戶端瀏覽器,就激發(fā)了processRequest函數(shù), 我們?cè)趐rocessRequest函數(shù)中檢查XMLHttpRequest對(duì)象的readyState狀態(tài)是否為4和status狀態(tài)是否為200,如果兩者同時(shí)成立,就代表服務(wù)器端的數(shù)據(jù)已經(jīng)成功返回給客戶端,那么就可以執(zhí)行下面的處理.

           7.The HTML DOM is updated.

          接收完服務(wù)器端傳回來的數(shù)據(jù)后,瀏覽器開始著手顯示接收回的數(shù)據(jù).

          我們通過頁面里面的<div>元素來唯一的表示一個(gè)對(duì)象給DOM的API使用. 比如確定html頁面某一處的需要顯示的信息文本對(duì)象,我們可以使用userIdMessage唯一的標(biāo)簽來做引用給DOM的API使用. 如下面這段代碼:

          23.<body>
          24. <div id="userIdMessage"></div>
          25.</body>

          一但你有了唯一確定的引用,你就可以使用DOM的API對(duì)其進(jìn)行隨心所欲的操作,如屬性的修改等等,比如下面這段代碼:

          1. <script type="text/javascript">
          2. function setMessageUsingDOM(message) {
          3. var userMessageElement = document.getElementById("userIdMessage");
          4. var messageText;
          5. if (message == "false") {
          6. userMessageElement.style.color = "red";
          7. messageText = "Invalid User Id";
          8. } else {
          9. userMessageElement.style.color = "green";
          10. messageText = "Valid User Id";
          11. }
          12. var messageBody = document.createTextNode(messageText);
          13. // if the messageBody element has been created simple replace it otherwise
          14. // append the new element
          15. if (userMessageElement.childNodes[0]) {
          16. userMessageElement.replaceChild(messageBody,
          17. userMessageElement.childNodes[0]);
          18. } else {
          19. userMessageElement.appendChild(messageBody);
          20. }
          21.}
          22.</script>
          23.<body>
          24. <div id="userIdMessage"></div>
          25.</body>

          在這里javascript通過了getElementById方法得到了userIdMessage對(duì)象,然后對(duì)服務(wù)器端返回的數(shù)據(jù)進(jìn)行對(duì)比,如果值是true,在userIdMessage里添加文本"Valid User Id", 如果值是false,則在userIdMessage里添加文本"Invalid User Id".

          大概就是這樣的一個(gè)狀況,那么在Ajax里面的XMLHttpRequest還有很多方法和屬性, 包括:

          方法:


          • open(“HTTP method”, “URL”, syn/asyn)
          > Assigns HTTP method, destination URL, mode
          • send(content)
          > Sends request including string or DOM object data
          • abort()
          > Terminates current request
          • getAllResponseHeaders()
          > Returns headers (labels + values) as a string
          • getResponseHeader(“header”)
          > Returns value of a given header
          • setRequestHeader(“label”,”value”)
          > Sets Request Headers before sending

          屬性:

          • onreadystatechange
          > Set with an JavaScript event handler that fires at each
          change
          • readyState – current status of request
          > 0 = uninitialized
          > 1 = loading
          > 2 = loaded
          > 3 = interactive (some data has been returned)
          > 4 = complete
          • status
          > HTTP Status returned from server: 200 = OK

          • responseText
          > String version of data returned from the server
          • responseXML
          > XML document of data returned from the server
          • statusText
          > Status text returned from server

           

          posted @ 2007-08-13 09:31 Javaphua 閱讀(412) | 評(píng)論 (0)編輯 收藏

          tomcat5.5.x 配置記錄。
           
          1.下載:
          http://www.eu.apache.org/dist/jakarta/tomcat-5/
          http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-admin.zip
          http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-compat.zip
          http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x.zip
          http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-deployer.zip
          jakarta-tomcat-5.5.x.zip
          jakarta-tomcat-5.5.x-compat.zip
          jakarta-tomcat-5.5.x-admin.zip
          (Tomcat 默認(rèn)是沒有內(nèi)置admin模塊了
          Tomcat's administration web application is no longer installed by default. Download and install the "admin" package to use it. )
          都解壓到同一個(gè)目錄下面。比如:D:\jakarta-tomcat-5.5.x\
          (如果使用jdk1.4,才需要compat.zip用jdk1.5就可以免了這個(gè)。)
           
          2.修改jakarta-tomcat-5.5.x\conf\tomcat-users.xml.
          添加管理員賬號(hào)lizongbo,密碼為lizongbopass.
          新xml如下:
          <?xml version='1.0' encoding='utf-8'?>
          <tomcat-users>
            <role rolename="tomcat"/>
            <role rolename="role1"/>
            <role rolename="manager"/>
            <role rolename="admin"/>
            <user username="tomcat" password="tomcat" roles="tomcat"/>
            <user username="role1" password="tomcat" roles="role1"/>
            <user username="both" password="tomcat" roles="tomcat,role1"/>
            <user username="lizongbo" password="lizongbopass" roles="admin,manager"/>
          </tomcat-users>
           
          3.修改jakarta-tomcat-5.5.x\conf\server.xml來解決編碼問題。
          (給Connector 添加URIEncoding參數(shù),參考http://blog.csdn.net/darkxie/archive/2004/10/25/TOMCATAPP.aspx)
          (可以設(shè)置成GB18030)
              <Connector port="8080"
                         maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                         enableLookups="false" redirectPort="8443" acceptCount="200"
                         connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"
                         compression="on" compressionMinSize="2048"
                noCompressionUserAgents="gozilla, traviata"
                compressableMimeType="text/html,text/xml"/>
           
              <Connector port="8009"
                         enableLookups="false" redirectPort="8443" protocol="AJP/1.3" URIEncoding="GBK"/>
           

          4.啟用支持gzip壓縮.
          (http://www.linuxaid.com.cn/forum/showdoc.jsp?l=1&i=81169)
          添加下列屬性
           compression="on"
                compressionMinSize="2048"
                noCompressionUserAgents="gozilla, traviata"
                compressableMimeType="text/html,text/xml"
           
          5.設(shè)置虛擬主機(jī)。
          在jakarta-tomcat-5.5.x\下建立文件夾vhost\www.mydomain.com。
          然后修改jakarta-tomcat-5.5.x\conf\server.xml
           
          <Engine defaultHost="localhost" name="Catalina">
                <Host appBase="vhost/www.mydomain.com" name="www.mydomain.com">
                </Host>
                <Host appBase="webapps" name="localhost">
                </Host>
                <Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>
              </Engine>
           
          6.添加數(shù)據(jù)庫驅(qū)動(dòng),更新mail.jar和actiovation.jar
          復(fù)制mysql-connector-java-3.0.16-ga-bin.jar,pg74.215.jdbc3.jar到 jakarta-tomcat-5.5.x\common\lib\
          還有javamail 1.3.2的mail.jar,jaf-1_0_2的 activation.jar
          msSQl 2000 JDBC sp3,msbase.jar,msutil,jar,mssqlserver.jar
           
           
          7.配置SSL
          參考 http://jakarta.apache.org/tomcat/tomcat-5.5-doc/ssl-howto.html
          D:\j2sdk1.4.2_06\bin>%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA
          輸入keystore密碼:  lizongbossl
          您的名字與姓氏是什么?
            [tomcat5.5.x]:  tomcat5.5.x
          您的組織單位名稱是什么?
            [jakarta]:  jakarta
          您的組織名稱是什么?
            [apache]:  apache
          您所在的城市或區(qū)域名稱是什么?
            [hzcity]:  hzcity
          您所在的州或省份名稱是什么?
            [gdp]:  gdp
          該單位的兩字母國家代碼是什么
            [CN]:  CN
          CN=tomcat5.5.x, OU=jakarta, O=apache, L=hzcity, ST=gdp, C=CN 正確嗎?
            [否]:  y
           
          輸入<tomcat>的主密碼
                  (如果和 keystore 密碼相同,按回車):
          (必須密碼一致,因此直接回車)
          然后再把userhome(例如:C:\Documents and Settings\lizongbo\)下的.keystore復(fù)制到
          tomcat的conf\目錄下。
           (例如:D:\jakarta-tomcat-5.5.x\conf\.keystore )
          配置jakarta-tomcat-5.5.x\conf\server.xml
          加上
              <Connector port="8443"
                         maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                         enableLookups="false" disableUploadTimeout="true"
                         acceptCount="100" scheme="https" secure="true"
                         clientAuth="false" sslProtocol="TLS"
                     keystoreFile="conf/.keystore"
                     keystorePass="lizongbossl"> <!--與先前設(shè)置的密碼一致-->
              </Connector>
          8.禁止文件目錄列表,
          修改jakarta-tomcat-5.5.x\conf\web.xml,把listing設(shè)置為false
           
              <servlet>
                  <servlet-name>default</servlet-name>
                  <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
                  <init-param>
                      <param-name>debug</param-name>
                      <param-value>0</param-value>
                  </init-param>
                  <init-param>
                      <param-name>listings</param-name>
                      <param-value>true</param-value>
                  </init-param>
                  <load-on-startup>1</load-on-startup>
              </servlet>
           
           9.指定了自己的javaEncoding
          (參考 http://gceclub.sun.com.cn/staticcontent/html/sunone/app7/app7-dg-webapp/ch6/ch6-4.html )

              <servlet>
                  <servlet-name>jsp</servlet-name>
                  <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
                  <init-param>
                      <param-name>fork</param-name>
                      <param-value>false</param-value>
                  </init-param>
                          <init-param>
                      <param-name>javaEncoding</param-name>
                      <param-value>GB18030</param-value>
                  </init-param>
                  <init-param>
                      <param-name>xpoweredBy</param-name>
                      <param-value>true</param-value>
                  </init-param>
                  <load-on-startup>3</load-on-startup>
              </servlet>
           10.添加rar,iso等的mime-type映射
          避免在瀏覽器里直接打開。
          <mime-mapping>
          <extension>mht</extension>
          <mime-type>text/x-mht</mime-type>
          </mime-mapping>
          <mime-mapping>
                  <extension>rar</extension>
                  <mime-type>application/octet-stream</mime-type>
              </mime-mapping>
              <mime-mapping>
                  <extension>iso</extension>
                  <mime-type>application/octet-stream</mime-type>
              </mime-mapping>
              <mime-mapping>
                  <extension>ape</extension>
                  <mime-type>application/octet-stream</mime-type>
              </mime-mapping>
              <mime-mapping>
                  <extension>rmvb</extension>
                  <mime-type>application/octet-stream</mime-type>
              </mime-mapping>
              <mime-mapping>
                  <extension>ico</extension>
                  <mime-type>image/x-icon</mime-type>
              </mime-mapping>
          10.1對(duì)html靜態(tài)頁面設(shè)置編碼
          <!--  修改下面兩行以支持靜態(tài)超文本的自動(dòng)編碼 
            -->
           
           <mime-mapping>
            <extension>htm</extension> 
            <mime-type>text/html;charset=gb2312</mime-type> 
            </mime-mapping>
           <mime-mapping>
            <extension>html</extension> 
            <mime-type>text/html;charset=gb2312</mime-type> 
            </mime-mapping>
            </web-app>
           
          11.添加welcome-file-list,并調(diào)整順序。
           <welcome-file-list>   
                  <welcome-file>index.jsp</welcome-file>
                  <welcome-file>index.html</welcome-file>
                  <welcome-file>index.htm</welcome-file>
                  <welcome-file>default.html</welcome-file>
                  <welcome-file>default.htm</welcome-file>
                  <welcome-file>default.jsp</welcome-file>
              </welcome-file-list>

          posted @ 2007-07-20 16:07 Javaphua 閱讀(806) | 評(píng)論 (0)編輯 收藏

           

           java中判斷字符串是否為數(shù)字的三種方法
          1用JAVA自帶的函數(shù)
          public static boolean isNumeric(String str){
            
          for (int i = str.length();--i>=0;){   
             
          if (!Character.isDigit(str.charAt(i))){
              
          return false;
             }
            }
            
          return true;
           }

          2用正則表達(dá)式
          public static boolean isNumeric(String str){
              Pattern pattern = Pattern.compile("[0-9]*");
              return pattern.matcher(str).matches();   
           }

          3用ascii碼

          public static boolean isNumeric(String str){
             for(int i=str.length();--i>=0;){
                int chr=str.charAt(i);
                if(chr<48 || chr>57)
                   return false;
             }
             return true;
          }
          posted @ 2007-06-05 14:17 Javaphua 閱讀(121590) | 評(píng)論 (23)編輯 收藏

          windows中大家都知道,JAVA程序啟動(dòng)時(shí)都會(huì)JVM都會(huì)分配一個(gè)初始內(nèi)存和最大內(nèi)存給這個(gè)應(yīng)用程序。這個(gè)初始內(nèi)存和最大內(nèi)存在一定程度都會(huì)影響程序的性能。比如說在應(yīng)用程序用到最大內(nèi)存的時(shí)候,JVM是要先去做垃圾回收的動(dòng)作,釋放被占用的一些內(nèi)存。
          所以想調(diào)整Tomcat的啟動(dòng)時(shí)初始內(nèi)存和最大內(nèi)存就需要向JVM聲明,一般的JAVA程序在運(yùn)行都可以通過中-Xms -Xmx來調(diào)整應(yīng)用程序的初始內(nèi)存和最大內(nèi)存:
          如:java -Xms64m -Xmx128m a.jar.
          tomcat
          的啟動(dòng)程序是包裝過的,不能直接使用java -X..... tomcat.*來改變內(nèi)存的設(shè)置。在Tomcat在改變這個(gè)設(shè)置
          有兩種方法:
          1.
          就需要在環(huán)境變量中加上TOMCAT_OPTS, CATALINA_OPTS兩個(gè)屬性,
          SET CATALINA_OPTS= -Xms64m -Xmx512m;
          ms
          是最小的,mx是最大,64m, 512m分別是指內(nèi)存的容量.
          2.
          修改Catalina.bat文件
          166“rem Execute Java with the applicable properties ”以下每行
          %_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
          中的%CATALINA_OPTS% 替換成-Xms64m -Xmx512m(把四行內(nèi)的%CATALINA_OPTS%都替換掉,包括兩邊的%

          3.啟動(dòng)%tomcat%\bin\tomcat5w.exe,在java項(xiàng)中設(shè)置初始化內(nèi)存的大小

          測(cè)試tomcat大小,jsp頁面
          <%
          Runtime lRuntime = Runtime.getRuntime();
          out.println("*** BEGIN MEMORY STATISTICS ***<br/>");
          out.println("Free  Memory: "+lRuntime.freeMemory()+"<br/>");
          out.println("Max   Memory: "+lRuntime.maxMemory()+"<br/>");
          out.println("Total Memory: "+lRuntime.totalMemory()+"<br/>");
          out.println("Available Processors : "+lRuntime.availableProcessors()+"<br/>");
          out.println("*** END MEMORY STATISTICS ***");
          %>
          posted @ 2007-05-17 12:59 Javaphua 閱讀(7228) | 評(píng)論 (1)編輯 收藏

                oracle 10.2.0 在不插網(wǎng)線安裝時(shí),網(wǎng)絡(luò)由用戶驗(yàn)證,安裝完畢后重啟機(jī)子,插網(wǎng)線啟動(dòng)oracle服務(wù)時(shí),總是出現(xiàn)監(jiān)聽失敗,這時(shí)可進(jìn)行如下修改:打開oracle\product\10.2.0\db_1\NETWORK\ADMIN\listener.ora

          SID_LIST_LISTENER =
            (SID_LIST =
              (SID_DESC =
                (SID_NAME = PLSExtProc)
                (ORACLE_HOME = D:\soft\oracle\product\10.2.0\db_1)
                (PROGRAM = extproc)
              )
            )

          LISTENER =
            (DESCRIPTION_LIST =
              (DESCRIPTION =
                (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
                (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
              )
            )
          中紅色標(biāo)識(shí)的localhost改為機(jī)器名,如:mycoputer

          posted @ 2007-05-10 14:11 Javaphua 閱讀(780) | 評(píng)論 (1)編輯 收藏

          最新整理apache-2.0.43和tomcat-4.1.12集成

          ---------------------------------------------------------------------------­-----
          作者:luyongshou 2005-02-02 15:04:45 來自:Linux先生  在此介紹一下我在RedHat Linux 7.2下裝Apache與Tomcat4整合的過程,重點(diǎn)講述mod_webapp.so的制作方法,
            以及在虛擬主機(jī)環(huán)境下的配置、管理和應(yīng)用,經(jīng)測(cè)試已經(jīng)成功。希望對(duì)各位有所幫助,如有錯(cuò)誤也請(qǐng)指正。

          一、正確安裝Tomcat4
            必要軟件的安裝,如下:
            1、Java SDK
            版本1.3.1或1.4,建議安裝在/usr/java下,并做一個(gè)jdk的軟鏈接。
            如果在裝版本1.3.1的SDK出現(xiàn)問題,請(qǐng)閱讀文檔:http://java.sun.com/j2se/1.3/install-linux-sdk.html
            2、Tomcat4
            建議安裝最新release版本的二進(jìn)制文件安裝包。當(dāng)前最新的tomcat版本是4.1.12。
            下載地址:
            http://jakarta.apache.org/builds/ja...t-4.1.12.tar.gz
            下載后接壓到一個(gè)目錄 "tar xvzf jakarta-tomcat-4.1.12.tar.gz"
          本例將tomcat安裝在/opt目錄下,并做了個(gè)tomcat的軟鏈接。
            設(shè)置如下環(huán)境變量并啟用:
            PATH=$PATH:/usr/java/jdk/bin:/usr/java/jdk/jre/bin
            JAVA_HOME=/usr/java/jdk
            export JAVA_HOME
            CLASSPATH="./:/usr/java/jdk/lib:/usr/java/jdk/jre/lib"
            export CLASSPATH
            CATALINA_HOME=/opt/tomcat
            export CATALINA_HOME

            建議單建一個(gè)用戶tomcat,將其設(shè)成/opt/tomcat以下所有目錄文件的屬主,并由它啟動(dòng)tomcat:
            # useradd tomcat
            # chown -R tomcat:tomcat /opt/tomcat
            # su - tomcat -c "/opt/tomcat/bin/startup.sh"

            訪問http://localhost:8080/ 應(yīng)能看到tomcat安裝成功的頁面。

          ===================================================================
          如果想和apache集成需要修改tomcat/conf/server.xml這個(gè)文件的

          <!-- Define an Apache-Connector Service -->

          <Service name="Tomcat-Apache">
          <!--
          <Connector className="org.apache.catalina.connector.warp.WarpConnector"
          port="8008" minProcessors="5" maxProcessors="75"
          enableLookups="true" appBase="webapps"
          acceptCount="10" debug="0"/>

          <Engine className="org.apache.catalina.connector.warp.WarpEngine"
          name="Apache" debug="0">

          <Logger className="org.apache.catalina.logger.FileLogger"
          prefix="apache_log." suffix=".txt"
          timestamp="true"/>

          <Realm className="org.apache.catalina.realm.MemoryRealm" />

          </Engine>

          </Service>
          -->
          </Server>

          中的"<!--"和"-->"刪掉,其實(shí)就是解除注釋,因?yàn)檫@個(gè)網(wǎng)站是專門用來和apache的集成的。

          二、Apache與Tomcat4的整合

            1、首先安裝Apache,
            請(qǐng)注意Apache必須安裝DSO模式,即在執(zhí)行./configure時(shí)須加上 --enable-module=so

            默認(rèn)安裝到/usr/local/apache目錄下。本例安裝的apache的版本是2.0.43系列的。

            2、制作mod_webapp.so
            需要以下軟件包:
            jakarta-tomcat-connectors-4.x.xx-src.tar.gz
            下載地址在tomcat對(duì)應(yīng)版本的src目錄下。例如,我安裝的tomcat版本是4.1.12,則現(xiàn)在所需要的軟件包的位置是:
            http://jakarta.apache.org/builds/ja...1.12-src.tar.gz
            apr-0.9.1.tar.gz
            下載地址:http://www.apache.org/dist/apr/apr-0.9.1.tar.gz
            autoconf-2.52-ximian.1.i386.rpm
            下載地址:http://rpmfind.net/linux/RPM/helix/...ian.1.i386.html
            先用rpm安裝autoconf-2.52,因?yàn)橄旅娴陌惭b將要用到;
            然后解開jakarta-tomcat-connectors-4.1.12-src.tar.gz,生成jakarta-tomcat-connectors­-4.1.12-src目錄,
            進(jìn)入jakarta-tomcat-connectors-4.1.12-src/webapp的目錄里,再把a(bǔ)pr-0.9.1.tar.gz解到這個(gè)目錄下­,
            并把剛生成的目錄apr-0.9.1的目錄名改成apr。
            還是在webapp目錄,運(yùn)行以下命令:
            # support/buildconf.sh
            此時(shí)如果autoconf的版本低于2.52的話會(huì)報(bào)錯(cuò)退出,所以必須先安裝autoconf-2.52。
            當(dāng)命令成功結(jié)束后會(huì)在當(dāng)前目錄下生成configure文件。
            依次運(yùn)行以下命令:

            # ./configure --with-apxs=/usr/local/apache/bin/apxs
            # make
            # cp apache-2.0/mod_webapp.so /usr/local/apache/modules

            現(xiàn)在mod_webapp.so已經(jīng)制作好了,并已經(jīng)拷貝到apache的modules目錄下。
            編輯apache的配置文件,在最后加上如下幾行:
            ==========================
            LoadModule webapp_module modules/mod_webapp.so
            WebAppConnection Connector warp localhost:8008
            WebAppDeploy examples Connector /examples
            ==========================

            運(yùn)行以下命令:
            # /usr/local/apache/bin/apachectl configtest

          如果出現(xiàn)錯(cuò)誤說你的apache的httpd.conf有問題后面的錯(cuò)誤是"inviad virual host"

          就說明你的httpd.conf的ServerName沒有設(shè),把ServerName前面的"#"去掉就可以了!(這是差了好多資料才得到的答案,我也是在這­兒困惑了好多天了)

            只要出現(xiàn)“Syntax OK”就表明mod_webapp.so已經(jīng)安裝成功了。
            啟動(dòng)apache
            # /usr/local/apache/bin/apachectl start
            訪問http://localhost/examples 就可以看到tomcat的例子程序了。

          注意:一定要先啟動(dòng)tomcat 然后再重新啟動(dòng)apache!

          三、虛擬主機(jī)下的配置、管理和應(yīng)用

            下面以一個(gè)例子來說明虛擬主機(jī)如何同時(shí)使用Apache與Tomcat4

            虛擬主機(jī)host1的目錄結(jié)構(gòu)如下所示:

            /www               
             |---host1  虛擬主機(jī)host1的主目錄
             |  |--htdocs  普通根目錄:用于顯示靜態(tài)頁面或php程序
             |  |----logs  apache訪問日志
             |  |----webapps java應(yīng)用目錄(新加,與tomcat的webapps目錄無任何關(guān)聯(lián))
             |     |--ROOT jsp根目錄:用于顯示jsp頁面程序
             |     |----jive 一套java應(yīng)用實(shí)例
             |---host2   虛擬主機(jī)host2的主目錄
            ............

            原來的apache的配置文件是這樣配置的:

            =====================================
            NameVirtualHost xxx.xxx.xxx.xxx

            < VirtualHost xxx.xxx.xxx.xxx >
            ServerName host1.mydomain.com
             ServerAdmin webmas...@mydomain.com
             DocumentRoot /www/host1/htdocs
             ErrorLog /www/host1/logs/error_log
            CustomLog /www/host1/logs/access_log common
            < /VirtualHost >
            .............

            =====================================

            現(xiàn)在要讓虛擬主機(jī)host1能同時(shí)使用Apache與Tomcat4,需要做如下配置:

            1、編輯tomcat的配置文件server.xml,在最后的部分做如下修改:

            =====================================
            < !-- Define an Apache-Connector Service -- >

            < Service name="Tomcat-Apache" >

            < Connector className="org.apache.catalina.connector.warp.WarpConnector"
            port="8008" minProcessors="5" maxProcessors="75"
            enableLookups="true" appBase="webapps"
            acceptCount="10" debug="0"/ >

          < Engine className="org.apache.catalina.connector.warp.WarpEngine"
            name="Apache" debug="0" >

            < Logger className="org.apache.catalina.logger.FileLogger"
            prefix="apache_log." suffix=".txt"
          timestamp="true"/ >

            < Realm className="org.apache.catalina.realm.MemoryRealm" / >

          < !-- 下面是新加的內(nèi)容 -- >

            < Host name="host1.mydomain.com" debug="0" appBase="/www/host1/webapps"
          uppackWars="true" autoDeploy="true" >
            < Context path="" docBase="ROOT" debug="0"/ >
          < !-- 下面套用的是tomcat自帶的管理頁面,在虛擬主機(jī)下也可使用 -- >
          < Context path="/manager" debug="0" privileged="true"
            docBase="/opt/tomcat/server/webapps/manager"/ >
            < Context path="/jive" docBase="jive" debug="0"
          reloadable="true" crossContext="true"/ >
            < Logger className="org.apache.catalina.logger.FileLogger"
          prefix="host1_log." suffix=".txt"
            timestamp="true"/ >
            < /Host >

          < !-- 新加內(nèi)容結(jié)束 -- >

          < /Engine >

            < /Service >
            =====================================
            2、編輯tomcat的管理權(quán)限文件tomcat-users.xml,在中間加一行:
          < user username="myname" password="mypasswd" roles="standard,manager"/ >
            3、編輯apache的配置文件,做如下修改
            =====================================
            LoadModule webapp_module libexec/mod_webapp.so
            AddModule mod_webapp.c
            WebAppConnection warpConnection warp localhost:8008
            NameVirtualHost xxx.xxx.xxx.xxx
            < VirtualHost xxx.xxx.xxx.xxx >
            ServerName host1.mydomain.com
             ServerAdmin webmas...@mydomain.com
             DocumentRoot /www/host1/htdocs
             ErrorLog /www/host1/logs/error_log
             CustomLog /www/host1/logs/access_log common

             WebAppDeploy ROOT warpConnection /

            #注:此行的作用是把ROOT目錄作為虛擬主機(jī)URL的根,并使前面定義的根htdocs失效。
            #但如果不想整個(gè)虛擬主機(jī)都使用jsp頁面程序,而想使用大量靜態(tài)頁面或php程序的話,
            #就要使用下面這行,并把所有的靜態(tài)頁面和php程序放在htdocs目錄下。
            # WebAppDeploy ROOT warpConnection /jsp

             WebAppDeploy manager warpConnection /manager
            WebAppDeploy jive warpConnection /jive
            #在server.xml里每定義一個(gè)都要在這里加一條WebAppDeploy。

            < /VirtualHost >
            =====================================

            4、將tomcat用戶設(shè)成/www/host1/webapps以下所有目錄文件的屬主。

            要注意的是,以后如果想上傳或改動(dòng)該目錄以下的文件,都要將其屬主改成tomcat。
            (如果一直是以root身份運(yùn)行tomcat,這步可以省略。)

            # chown -R tomcat:tomcat /www/host1/webapps
            5、重起tomcat:
            # su - tomcat -c "/opt/tomcat/bin/shutdown.sh"
            # su - tomcat -c "/opt/tomcat/bin/startup.sh"
            6、重起apache:
            /usr/local/apache/bin/apachectl restart

            此時(shí)訪問http://host1.mydomain.com/manager/html 會(huì)提示輸入密碼,在輸入正確的 myname和mypasswd后,就會(huì)看到“Tomcat Web Application Manager”的頁面,里面的 Application Path已經(jīng)是虛擬主機(jī)里配置的信息了,并可以對(duì)其進(jìn)行管理。
            到此虛擬主機(jī)下的配置和管理就全部完成,剩下的事情就是測(cè)試和應(yīng)用了。在上面的例子
            里我們已經(jīng)安裝了jive,經(jīng)測(cè)試已經(jīng)可以正常運(yùn)行

          posted @ 2007-04-03 11:42 Javaphua 閱讀(510) | 評(píng)論 (0)編輯 收藏

          Java源碼分析:深入探討Iterator模式


          作者:廖雪峰

          作者簡(jiǎn)介


          廖雪峰,軟件工程師,現(xiàn)從事J2EE開發(fā),您可以通過asklxf@163.com與他聯(lián)系。

          正文


          java.util包中包含了一系列重要的集合類。本文將從分析源碼入手,深入研究一個(gè)集合類的內(nèi)部結(jié)構(gòu),以及遍歷集合的迭代模式的源碼實(shí)現(xiàn)內(nèi)幕。

          下面我們先簡(jiǎn)單討論一個(gè)根接口Collection,然后分析一個(gè)抽象類AbstractList和它的對(duì)應(yīng)Iterator接口,并仔細(xì)研究迭代子模式的實(shí)現(xiàn)原理。

          本文討論的源代碼版本是JDK 1.4.2,因?yàn)镴DK 1.5在java.util中使用了很多泛型代碼,為了簡(jiǎn)化問題,所以我們還是討論1.4版本的代碼。

          集合類的根接口Collection


          Collection接口是所有集合類的根類型。它的一個(gè)主要的接口方法是:

              boolean add(Object c)
          

          add()方法將添加一個(gè)新元素。注意這個(gè)方法會(huì)返回一個(gè)boolean,但是返回值不是表示添加成功與否。仔細(xì)閱讀doc可以看到,Collection規(guī)定:如果一個(gè)集合拒絕添加這個(gè)元素,無論任何原因,都必須拋出異常。這個(gè)返回值表示的意義是add()方法執(zhí)行后,集合的內(nèi)容是否改變了(就是元素有無數(shù)量,位置等變化),這是由具體類實(shí)現(xiàn)的。即:如果方法出錯(cuò),總會(huì)拋出異常;返回值僅僅表示該方法執(zhí)行后這個(gè)Collection的內(nèi)容有無變化。

          類似的還有:

              boolean addAll(Collection c);
              boolean remove(Object o);
              boolean removeAll(Collection c);
              boolean remainAll(Collection c);
          

          Object[] toArray()方法很簡(jiǎn)單,把集合轉(zhuǎn)換成數(shù)組返回。Object[] toArray(Object[] a)方法就有點(diǎn)復(fù)雜了,首先,返回的Object[]仍然是把集合的所有元素變成的數(shù)組,但是類型和參數(shù)a的類型是相同的,比如執(zhí)行:

              String[] o = (String[])c.toArray(new String[0]);
          

          得到的o實(shí)際類型是String[]。

          其次,如果參數(shù)a的大小裝不下集合的所有元素,返回的將是一個(gè)新的數(shù)組。如果參數(shù)a的大小能裝下集合的所有元素,則返回的還是a,但a的內(nèi)容用集合的元素來填充。尤其要注意的是,如果a的大小比集合元素的個(gè)數(shù)還多,a后面的部分全部被置為null。

          最后一個(gè)最重要的方法是iterator(),返回一個(gè)Iterator(迭代子),用于遍歷集合的所有元素。

          用Iterator模式實(shí)現(xiàn)遍歷集合


          Iterator模式是用于遍歷集合類的標(biāo)準(zhǔn)訪問方法。它可以把訪問邏輯從不同類型的集合類中抽象出來,從而避免向客戶端暴露集合的內(nèi)部結(jié)構(gòu)。

          例如,如果沒有使用Iterator,遍歷一個(gè)數(shù)組的方法是使用索引:

              for(int i=0; i<array.size(); i++) { ... get(i) ... }
          

          而訪問一個(gè)鏈表(LinkedList)又必須使用while循環(huán):

              while((e=e.next())!=null) { ... e.data() ... }
          

          以上兩種方法客戶端都必須事先知道集合的內(nèi)部結(jié)構(gòu),訪問代碼和集合本身是緊耦合,無法將訪問邏輯從集合類和客戶端代碼中分離出來,每一種集合對(duì)應(yīng)一種遍歷方法,客戶端代碼無法復(fù)用。

          更恐怖的是,如果以后需要把ArrayList更換為LinkedList,則原來的客戶端代碼必須全部重寫。

          為解決以上問題,Iterator模式總是用同一種邏輯來遍歷集合:

              for(Iterator it = c.iterater(); it.hasNext(); ) { ... }
          

          奧秘在于客戶端自身不維護(hù)遍歷集合的"指針",所有的內(nèi)部狀態(tài)(如當(dāng)前元素位置,是否有下一個(gè)元素)都由Iterator來維護(hù),而這個(gè)Iterator由集合類通過工廠方法生成,因此,它知道如何遍歷整個(gè)集合。

          客戶端從不直接和集合類打交道,它總是控制Iterator,向它發(fā)送"向前","向后","取當(dāng)前元素"的命令,就可以間接遍歷整個(gè)集合。

          首先看看java.util.Iterator接口的定義:

              public interface Iterator {
                  boolean hasNext();
                  Object next();
                  void remove();
              }
          

          依賴前兩個(gè)方法就能完成遍歷,典型的代碼如下:

              for(Iterator it = c.iterator(); it.hasNext(); ) {
                  Object o = it.next();
                  // 對(duì)o的操作...
              }
          

          在JDK1.5中,還對(duì)上面的代碼在語法上作了簡(jiǎn)化:

              // Type是具體的類型,如String。
              for(Type t : c) {
                  // 對(duì)t的操作...
              }
          

          每一種集合類返回的Iterator具體類型可能不同,Array可能返回ArrayIterator,Set可能返回SetIterator,Tree可能返回TreeIterator,但是它們都實(shí)現(xiàn)了Iterator接口,因此,客戶端不關(guān)心到底是哪種Iterator,它只需要獲得這個(gè)Iterator接口即可,這就是面向?qū)ο蟮耐Α?/p>

          Iterator源碼剖析


          讓我們來看看AbstracyList如何創(chuàng)建Iterator。首先AbstractList定義了一個(gè)內(nèi)部類(inner class):

              private class Itr implements Iterator {
                  ...
              }
          

          而iterator()方法的定義是:

              public Iterator iterator() {
                  return new Itr();
              }
          

          因此客戶端不知道它通過Iterator it = a.iterator();所獲得的Iterator的真正類型。

          現(xiàn)在我們關(guān)心的是這個(gè)申明為private的Itr類是如何實(shí)現(xiàn)遍歷AbstractList的:

              private class Itr implements Iterator {
                  int cursor = 0;
                  int lastRet = -1;
                  int expectedModCount = modCount;
              }
          

          Itr類依靠3個(gè)int變量(還有一個(gè)隱含的AbstractList的引用)來實(shí)現(xiàn)遍歷,cursor是下一次next()調(diào)用時(shí)元素的位置,第一次調(diào)用next()將返回索引為0的元素。lastRet記錄上一次游標(biāo)所在位置,因此它總是比cursor少1。

          變量cursor和集合的元素個(gè)數(shù)決定hasNext():

              public boolean hasNext() {
                  return cursor != size();
              }
          

          方法next()返回的是索引為cursor的元素,然后修改cursor和lastRet的值:

              public Object next() {
                  checkForComodification();
                  try {
                      Object next = get(cursor);
                      lastRet = cursor++;
                      return next;
                  } catch(IndexOutOfBoundsException e) {
                      checkForComodification();
                      throw new NoSuchElementException();
                  }
              }
          

          expectedModCount表示期待的modCount值,用來判斷在遍歷過程中集合是否被修改過。AbstractList包含一個(gè)modCount變量,它的初始值是0,當(dāng)集合每被修改一次時(shí)(調(diào)用add,remove等方法),modCount加1。因此,modCount如果不變,表示集合內(nèi)容未被修改。

          Itr初始化時(shí)用expectedModCount記錄集合的modCount變量,此后在必要的地方它會(huì)檢測(cè)modCount的值:

              final void checkForComodification() {
                  if (modCount != expectedModCount)
                      throw new ConcurrentModificationException();
              }
          

          如果modCount與一開始記錄在expectedModeCount中的值不等,說明集合內(nèi)容被修改過,此時(shí)會(huì)拋出ConcurrentModificationException。

          這個(gè)ConcurrentModificationException是RuntimeException,不要在客戶端捕獲它。如果發(fā)生此異常,說明程序代碼的編寫有問題,應(yīng)該仔細(xì)檢查代碼而不是在catch中忽略它。

          但是調(diào)用Iterator自身的remove()方法刪除當(dāng)前元素是完全沒有問題的,因?yàn)樵谶@個(gè)方法中會(huì)自動(dòng)同步expectedModCount和modCount的值:

              public void remove() {
                  ...
                  AbstractList.this.remove(lastRet);
                  ...
                  // 在調(diào)用了集合的remove()方法之后重新設(shè)置了expectedModCount:
                  expectedModCount = modCount;
                  ...
              }
          

          要確保遍歷過程順利完成,必須保證遍歷過程中不更改集合的內(nèi)容(Iterator的remove()方法除外),因此,確保遍歷可靠的原則是只在一個(gè)線程中使用這個(gè)集合,或者在多線程中對(duì)遍歷代碼進(jìn)行同步。

          最后給個(gè)完整的示例:

              Collection c = new ArrayList();
              c.add("abc");
              c.add("xyz");
              for(Iterator it = c.iterator(); it.hasNext(); ) {
                  String s = (String)it.next();
                  System.out.println(s);
              }
          

          如果你把第一行代碼的ArrayList換成LinkedList或Vector,剩下的代碼不用改動(dòng)一行就能編譯,而且功能不變,這就是針對(duì)抽象編程的原則:對(duì)具體類的依賴性最小。

          posted @ 2007-03-21 15:54 Javaphua 閱讀(611) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 金溪县| 泗阳县| 新绛县| 黔江区| 太原市| 邵武市| 惠东县| 历史| 湖州市| 乐陵市| 晴隆县| 革吉县| 个旧市| 大安市| 南阳市| 五莲县| 莱州市| 绩溪县| 明光市| 大宁县| 河间市| 轮台县| 昂仁县| 恩平市| 安远县| 波密县| 巴彦县| 尼勒克县| 凭祥市| 巴林左旗| 象州县| 泽库县| 辉南县| 沾益县| 轮台县| 密云县| 乌拉特前旗| 星座| 磐石市| 秭归县| 长寿区|