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

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

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

    Javaphua Blog

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

    2007年8月19日 #

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

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

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

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

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

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

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

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

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

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

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

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

    (一)人生定位

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

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

    3、從三百六十行中選擇你的最愛(ài)

    人人都可以創(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)取的心。中國(guó)成功人士大多來(lái)自小地方

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

    6、不要敗給悲觀的自己

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

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

    7、成功者不過(guò)是爬起來(lái)比倒下去多一次

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

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

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

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

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

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

    三:三大技巧

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

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

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

    3、自我管理,游刃有余

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

    (2)可以開(kāi)家特色店

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

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

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

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

    做事失敗可以重來(lái),做人失敗卻不能重來(lái)

    (1)做人要講義氣

    (2)永不氣餒

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

    35歲以前搞定婚姻生活

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

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

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

    五:五分運(yùn)氣

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

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

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

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

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

    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)知道自己的長(zhǎng)處、短處,定向聚焦

    (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í)聆聽(tīng),不打斷別人說(shuō)話

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

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

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

    十:十分自信

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

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

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

    4、如何建立自信

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

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

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

    (4)做事不拖拉

    (5)輕易不要放棄

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

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

    1、只有功勞,沒(méi)有苦勞

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

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

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

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

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

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

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

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

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

    11、眼高手低

    12、不擇手段

    十二:十二分努力

    沒(méi)有人能隨隨便便成功

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

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

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

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

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

    6、我看打工者

    7、祝你早日掘到第一桶金來(lái)源

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

    2007年8月13日 #

    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)擊鏈接或按鈕來(lái)激發(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是通過(guò)data-driven的模式來(lái)提供網(wǎng)絡(luò)頁(yè)面的, 采用的是部分頁(yè)面更新的模式, 頁(yè)面中只更新有新數(shù)據(jù)的部分,其它的部分依然不變,所以依然可以操作.

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

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

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

    XMLHttpRequest既然是Javascript的對(duì)象, 當(dāng)然需要一些Javascript的代碼來(lái)生成, 它目前支持大部分的瀏覽器,包括了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的操作過(guò)程分為七步:

    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

    我們分別來(lái)看看這七個(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; 這是通過(guò)設(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ù)器端傳回來(lái)的數(shù)據(jù)后,瀏覽器開(kāi)始著手顯示接收回的數(shù)據(jù).

    我們通過(guò)頁(yè)面里面的<div>元素來(lái)唯一的表示一個(gè)對(duì)象給DOM的API使用. 比如確定html頁(yè)面某一處的需要顯示的信息文本對(duì)象,我們可以使用userIdMessage唯一的標(biāo)簽來(lái)做引用給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通過(guò)了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 閱讀(407) | 評(píng)論 (0)編輯 收藏

    2007年7月20日 #

    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)是沒(méi)有內(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來(lái)解決編碼問(wèn)題。
    (給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ù)庫(kù)驅(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
    該單位的兩字母國(guó)家代碼是什么
      [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映射
    避免在瀏覽器里直接打開(kāi)。
    <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)頁(yè)面設(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 閱讀(797) | 評(píng)論 (0)編輯 收藏

    2007年6月5日 #

     

     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 閱讀(121544) | 評(píng)論 (23)編輯 收藏

    2007年5月17日 #

    windows中大家都知道,JAVA程序啟動(dòng)時(shí)都會(huì)JVM都會(huì)分配一個(gè)初始內(nèi)存和最大內(nèi)存給這個(gè)應(yīng)用程序。這個(gè)初始內(nèi)存和最大內(nèi)存在一定程度都會(huì)影響程序的性能。比如說(shuō)在應(yīng)用程序用到最大內(nèi)存的時(shí)候,JVM是要先去做垃圾回收的動(dòng)作,釋放被占用的一些內(nèi)存。
    所以想調(diào)整Tomcat的啟動(dòng)時(shí)初始內(nèi)存和最大內(nèi)存就需要向JVM聲明,一般的JAVA程序在運(yùn)行都可以通過(guò)中-Xms -Xmx來(lái)調(diào)整應(yīng)用程序的初始內(nèi)存和最大內(nèi)存:
    如:java -Xms64m -Xmx128m a.jar.
    tomcat
    的啟動(dòng)程序是包裝過(guò)的,不能直接使用java -X..... tomcat.*來(lái)改變內(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頁(yè)面
    <%
    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 閱讀(7220) | 評(píng)論 (1)編輯 收藏

    2007年5月10日 #

          oracle 10.2.0 在不插網(wǎng)線安裝時(shí),網(wǎng)絡(luò)由用戶驗(yàn)證,安裝完畢后重啟機(jī)子,插網(wǎng)線啟動(dòng)oracle服務(wù)時(shí),總是出現(xiàn)監(jiān)聽(tīng)失敗,這時(shí)可進(jìn)行如下修改:打開(kāi)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 閱讀(774) | 評(píng)論 (1)編輯 收藏

    2007年4月3日 #

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

    ---------------------------------------------------------------------------­-----
    作者:luyongshou 2005-02-02 15:04:45 來(lái)自:Linux先生  在此介紹一下我在RedHat Linux 7.2下裝Apache與Tomcat4整合的過(guò)程,重點(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)問(wè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"

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

    ===================================================================
    如果想和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)站是專門用來(lái)和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將要用到;
      然后解開(kāi)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ò)誤說(shuō)你的apache的httpd.conf有問(wèn)題后面的錯(cuò)誤是"inviad virual host"

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

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

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

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

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

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

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

      原來(lái)的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自帶的管理頁(yè)面,在虛擬主機(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頁(yè)面程序,而想使用大量靜態(tài)頁(yè)面或php程序的話,
      #就要使用下面這行,并把所有的靜態(tài)頁(yè)面和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í)訪問(wèn)http://host1.mydomain.com/manager/html 會(huì)提示輸入密碼,在輸入正確的 myname和mypasswd后,就會(huì)看到“Tomcat Web Application Manager”的頁(yè)面,里面的 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 閱讀(503) | 評(píng)論 (0)編輯 收藏

    2007年3月21日 #

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


    作者:廖雪峰

    作者簡(jiǎn)介


    廖雪峰,軟件工程師,現(xiàn)從事J2EE開(kāi)發(fā),您可以通過(guò)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)化問(wèn)題,所以我們還是討論1.4版本的代碼。

    集合類的根接口Collection


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

        boolean add(Object c)
    

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

    類似的還有:

        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)容用集合的元素來(lái)填充。尤其要注意的是,如果a的大小比集合元素的個(gè)數(shù)還多,a后面的部分全部被置為null。

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

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


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

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

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

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

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

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

    更恐怖的是,如果以后需要把ArrayList更換為L(zhǎng)inkedList,則原來(lái)的客戶端代碼必須全部重寫。

    為解決以上問(wèn)題,Iterator模式總是用同一種邏輯來(lái)遍歷集合:

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

    奧秘在于客戶端自身不維護(hù)遍歷集合的"指針",所有的內(nèi)部狀態(tài)(如當(dāng)前元素位置,是否有下一個(gè)元素)都由Iterator來(lái)維護(hù),而這個(gè)Iterator由集合類通過(guò)工廠方法生成,因此,它知道如何遍歷整個(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ì)上面的代碼在語(yǔ)法上作了簡(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源碼剖析


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

        private class Itr implements Iterator {
            ...
        }
    

    而iterator()方法的定義是:

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

    因此客戶端不知道它通過(guò)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的引用)來(lái)實(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值,用來(lái)判斷在遍歷過(guò)程中集合是否被修改過(guò)。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與一開(kāi)始記錄在expectedModeCount中的值不等,說(shuō)明集合內(nèi)容被修改過(guò),此時(shí)會(huì)拋出ConcurrentModificationException。

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

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

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

    要確保遍歷過(guò)程順利完成,必須保證遍歷過(guò)程中不更改集合的內(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 閱讀(604) | 評(píng)論 (0)編輯 收藏

    2007年1月5日 #

    ??????? 今天很郁悶,昨天剛裝的orage 10g,當(dāng)時(shí)啟動(dòng)OracleDBConsoleoradb服務(wù)沒(méi)有什么問(wèn)題,可是今天早上就無(wú)法啟動(dòng)起來(lái),查看windows事件日志,發(fā)現(xiàn)啟動(dòng)報(bào)錯(cuò),錯(cuò)誤描述“An error occured while trying to initialize the service.”。
    ?????????啟動(dòng)N次也無(wú)法啟動(dòng),重啟操作系統(tǒng),也是一樣的錯(cuò)誤,很惱火,拔掉網(wǎng)線一試,成功啟動(dòng)了,不知為什么,特向高手們請(qǐng)教?(oracle 10g是在不聯(lián)網(wǎng)的狀態(tài)下安裝的,會(huì)不會(huì)跟安裝有問(wèn)題?)。
    posted @ 2007-01-05 12:56 Javaphua 閱讀(1062) | 評(píng)論 (3)編輯 收藏

    2006年12月30日 #

    一個(gè)程序員的成長(zhǎng)的六個(gè)階段

    本文轉(zhuǎn)自csai,挺有意思



    第一階段

    此階段主要是能熟練地使用某種語(yǔ)言。這就相當(dāng)于練武中的套路和架式這些表面的東西。

    第二階段

    此階段能精通基于某種平臺(tái)的接口(例如我們現(xiàn)在常用的Win 32的API函數(shù))以及所對(duì)應(yīng)語(yǔ)言的自身的庫(kù)函數(shù)。到達(dá)這個(gè)階段后,也就相當(dāng)于可以進(jìn)行真實(shí)散打?qū)毩耍梢哉嬲卦趯?shí)踐中做些應(yīng)用。

    第三階段

    此階段能深入地了解某個(gè)平臺(tái)系統(tǒng)的底層,已經(jīng)具有了初級(jí)的內(nèi)功的能力,也就是“手中有劍,心中無(wú)劍”。

    第四階級(jí)

    此階段能直接在平臺(tái)上進(jìn)行比較深層次的開(kāi)發(fā)。基本上,能達(dá)到這個(gè)層次就可以說(shuō)是進(jìn)入了高層次。這時(shí)進(jìn)入了高級(jí)內(nèi)功的修煉。比如能進(jìn)行VxD或操作系統(tǒng)的內(nèi)核的修改。

    這時(shí)已經(jīng)不再有語(yǔ)言的束縛,語(yǔ)言只是一種工具,即使要用自己不會(huì)的語(yǔ)言進(jìn)行開(kāi)發(fā),也只是簡(jiǎn)單地熟悉一下,就手到擒來(lái),完全不像是第一階段的時(shí)候?qū)W習(xí)語(yǔ)言的那種情況。一般來(lái)說(shuō),從第三階段過(guò)渡到第四階段是比較困難的。為什么會(huì)難呢?這就是因?yàn)楹芏嗳说乃枷胱儾贿^(guò)來(lái)。

    第五階級(jí)

    此階段就已經(jīng)不再局限于簡(jiǎn)單的技術(shù)上的問(wèn)題了,而是能從全局上把握和設(shè)計(jì)一個(gè)比較大的系統(tǒng)體系結(jié)構(gòu),從內(nèi)核到外層界面。可以說(shuō)是“手中無(wú)劍,心中有劍”。到了這個(gè)階段以后,能對(duì)市面上的任何軟件進(jìn)行剖析,并能按自己的要求進(jìn)行設(shè)計(jì),就算是MS Word這樣的大型軟件,只要有充足的時(shí)間,也一定會(huì)設(shè)計(jì)出來(lái)。

    第六階級(jí)

    此階段也是最高的境界,達(dá)到“無(wú)招勝有招”。這時(shí)候,任何問(wèn)題就純粹變成了一個(gè)思路的問(wèn)題,不是用什么代碼就能表示的。也就是“手中無(wú)劍,心中也無(wú)劍”。

    此時(shí),對(duì)于練功的人來(lái)說(shuō),他已不用再去學(xué)什么少林拳,只是在旁看一下少林拳的對(duì)戰(zhàn),就能把此拳拿來(lái)就用。這就是真正的大師級(jí)的人物。這時(shí),Win 32或Linux在你眼里是沒(méi)有什么差別的。

    每一個(gè)階段再向上發(fā)展時(shí)都要按一定的方法。第一、第二個(gè)階段通過(guò)自學(xué)就可以完成,只要多用心去研究,耐心地去學(xué)習(xí)。

    要想從第二個(gè)階段過(guò)渡到第三個(gè)階段,就要有一個(gè)好的學(xué)習(xí)環(huán)境。例如有一個(gè)高手帶領(lǐng)或公司里有一個(gè)好的練手環(huán)境。經(jīng)過(guò)二、三年的積累就能達(dá)到第三個(gè)階段。但是,有些人到達(dá)第三個(gè)階段后,常常就很難有境界上的突破了。他們這時(shí)會(huì)產(chǎn)生一種觀念,認(rèn)為軟件無(wú)非如此,認(rèn)為自己已無(wú)所不能。其實(shí),這時(shí)如果遇到大的或難些的軟件,他們往往還是無(wú)從下手。

    現(xiàn)在我們國(guó)家大部分程序員都是在第二、三級(jí)之間。他們大多都是通過(guò)自學(xué)成才的,不過(guò)這樣的程序員一般在軟件公司也能獨(dú)當(dāng)一面,完成一些軟件的模塊。

    但是,也還有一大堆處在第一階段的程序員,他們一般就能玩玩VB,做程序時(shí),去找一堆控件集成一個(gè)軟件。
    posted @ 2006-12-30 13:55 Javaphua 閱讀(436) | 評(píng)論 (0)編輯 收藏

    僅列出標(biāo)題  下一頁(yè)
    主站蜘蛛池模板: 最近中文字幕免费mv在线视频 | 亚洲AⅤ优女AV综合久久久| 免费精品久久久久久中文字幕| 亚洲精品少妇30p| 我要看免费的毛片| 精品久久久久久国产免费了| 久久精品国产亚洲av麻豆| 成人免费777777| 久草视频在线免费看| 免费国产a理论片| 亚洲jjzzjjzz在线播放| 亚洲va久久久噜噜噜久久天堂| 免费观看a级毛片| aⅴ在线免费观看| 久久精品成人免费观看| 一个人免费播放在线视频看片| 亚洲人成综合在线播放| 亚洲国产精品国自产电影| 亚洲麻豆精品国偷自产在线91| 日韩一级视频免费观看| 在线免费不卡视频| 国语成本人片免费av无码 | 最新国产AV无码专区亚洲| 免费一看一级毛片| 国产性生交xxxxx免费| 噜噜嘿在线视频免费观看| 最近最新中文字幕完整版免费高清| 久久香蕉国产线看免费| 午夜免费啪视频在线观看| 国产精品偷伦视频观看免费 | 久久亚洲精品成人无码网站| 亚洲精品自产拍在线观看动漫| 国产亚洲无线码一区二区| 亚洲邪恶天堂影院在线观看| 亚洲AV无码国产在丝袜线观看| 久久亚洲私人国产精品vA | 十八禁无码免费网站| 免费视频爱爱太爽了| 午夜视频免费成人| 亚洲国产一区二区三区| 亚洲国产香蕉碰碰人人|