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

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

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

    posts - 23, comments - 0, trackbacks - 0, articles - 3
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理


    作者: beauty9235  鏈接:http://beauty9235.javaeye.com/blog/229639  發(fā)表時(shí)間: 2008年06月19日

    聲明:本文系JavaEye網(wǎng)站發(fā)布的原創(chuàng)博客文章,未經(jīng)作者書(shū)面許可,嚴(yán)禁任何網(wǎng)站轉(zhuǎn)載本文,否則必將追究法律責(zé)任!

    經(jīng)過(guò)辛苦的建站工作,網(wǎng)站終于建成發(fā)布了。的確,你大可以坐下來(lái)休息一下,一邊喝著咖啡一邊欣賞自己的網(wǎng)站,但千萬(wàn)不要以為這樣就可以坐著待訂單會(huì)滾滾而來(lái)。坦率地說(shuō),倘若嚴(yán)格按照前獎(jiǎng)期所介紹的建站方法做了,估計(jì)會(huì)有五、六成的收獲把握,不過(guò)那可能需要等待較長(zhǎng)的時(shí)間,因?yàn)槟阋戎阉饕嬖诒姸嗟木W(wǎng)站中找到你,然后網(wǎng)站被搜索引擎收錄、網(wǎng)頁(yè)媒介標(biāo)簽META(所設(shè)置的關(guān)鍵字、網(wǎng)頁(yè)描述等)被讀取,令排位緩慢爬升,然后瀏覽逐漸地提......。

    與上述被動(dòng)式的"坐等生意"相比,筆者提倡在"精耕細(xì)作"基礎(chǔ)之上,主動(dòng)進(jìn)行網(wǎng)站的推廣和網(wǎng)絡(luò)行銷工作。事實(shí)上,網(wǎng)站推廣和網(wǎng)絡(luò)行銷是一件事物的兩個(gè)方位。網(wǎng)站推廣是讓更多的人知道你的網(wǎng)站、提高網(wǎng)站流量;網(wǎng)絡(luò)行銷是如何留住回頭客、提升成交率,兩者相輔相成,缺一不可。目前網(wǎng)站推廣和網(wǎng)絡(luò)行銷的方法歸納有:搜索引擎排名、網(wǎng)絡(luò)廣告、合作專題(軟廣告)、電子雜志、電子郵件行銷等。筆者認(rèn)為搜索引擎行銷是企業(yè)網(wǎng)站宣傳推廣最值得投入的(費(fèi)用不是很高),而其余的網(wǎng)絡(luò)行銷方式則視情況而定。

    一.搜索引擎行銷

    1.主動(dòng)向搜索引擎和目錄分類站點(diǎn)登記注冊(cè)

    很多企業(yè)網(wǎng)站內(nèi)容豐富,頗有創(chuàng)意,卻鮮有訪問(wèn)者,原因何在?在于沒(méi)有進(jìn)行網(wǎng)站的宣傳推廣工作,正如一位絕色女子,卻"養(yǎng)在深閨無(wú)人識(shí)"。沒(méi)有網(wǎng)站宣傳和網(wǎng)絡(luò)行銷,網(wǎng)站如同虛設(shè),你就不可能達(dá)到你建設(shè)網(wǎng)站的目的。搜索引擎行銷的基本思想是讓用戶發(fā)現(xiàn)你,并點(diǎn)擊進(jìn)去進(jìn)一步了解他所需要的資訊和服務(wù)。

    還記得上期所做的工作嗎?那些網(wǎng)頁(yè)媒介標(biāo)簽META,那些從競(jìng)爭(zhēng)對(duì)手的網(wǎng)頁(yè)中找出的,根據(jù)自己的具體情況整理的,優(yōu)于競(jìng)爭(zhēng)對(duì)手的關(guān)鍵字(KEYWORDS),網(wǎng)頁(yè)標(biāo)題(TITLE)和網(wǎng)頁(yè)描述(DESCRIPTION),現(xiàn)在是用武之地了。首先認(rèn)真準(zhǔn)備好網(wǎng)頁(yè)的TITLE和META標(biāo)簽,以20個(gè)最重要的關(guān)鍵字為基本元素,找出與自己網(wǎng)頁(yè)內(nèi)容相關(guān)的專業(yè)性、地區(qū)性搜索引擎和目錄站點(diǎn),主動(dòng)向它們登記注冊(cè)。

    由于95%的網(wǎng)上用戶是通過(guò)Yahoo!、Google、Altavista、Excite、Infoseek、Netscape、Hotbot、Looksmart、Lycos、MSN、All the Web、Webcrawler、AOL、Netfind、Fast、Ask Jeeves、Dmoz、About、Euroseek和Northern Light等搜索引擎來(lái)尋找他們所需要資訊,因此它們是網(wǎng)站登記注冊(cè)中最重要的部分,在很大程度上決定了網(wǎng)站宣傳推廣的成敗。

    目前,市面上專門的搜索引擎登記注冊(cè)軟體很多,號(hào)稱能自動(dòng)發(fā)送到上千的搜索引擎和目錄分類網(wǎng)站,對(duì)此應(yīng)謹(jǐn)慎用之。筆者強(qiáng)烈建議對(duì)上述全球TOP 20搜索引擎和目錄分類網(wǎng)站,以手工登記為上策(原因很奧妙)。在此以Altavista為例,重點(diǎn)介紹主要搜索引擎登記網(wǎng)頁(yè)的步驟和技巧。

    1)用Meta Medic檢查你的Metatag是否符合各大搜索引擎的標(biāo)準(zhǔn);只有在通過(guò)Meta Medic的檢測(cè)后,才能進(jìn)行網(wǎng)頁(yè)登記。(http://www.northernwebs.com/set/setsimjr.html)

    2)首先向AltaVista登記你的網(wǎng)站的首頁(yè)。在所有的搜索引擎中,Altavista收錄網(wǎng)頁(yè)的速度最快,在一至兩天內(nèi)就會(huì)收錄你所申請(qǐng)登記的網(wǎng)頁(yè)。隔兩天后,在Infoseek中鍵入你的域名或網(wǎng)頁(yè)的標(biāo)題,看Altavista是否收錄了你的網(wǎng)站。如果Altavista已經(jīng)收錄了你的網(wǎng)站,鍵入關(guān)鍵字來(lái)檢查你的網(wǎng)頁(yè)在搜索結(jié)果的排名情況,如果排名不理想,你需要重復(fù)設(shè)置首頁(yè)中的網(wǎng)頁(yè)媒介標(biāo)簽META。仔細(xì)閱讀Altavista中Add your page上的提示,向Altavista report your dead link,請(qǐng)求Altavista刪除已被收錄的網(wǎng)頁(yè),然后重新登記你修改過(guò)的網(wǎng)頁(yè)。你需要不斷重復(fù)以上步驟,直至在Altavista的搜索結(jié)果中取得你理想的排名為止。

    3)在一個(gè)星期后,如果你的網(wǎng)頁(yè)在Altavista的搜索結(jié)果中的理想排名沒(méi)有大的變化,那么說(shuō)明你不但通過(guò)了Altavista這一關(guān),而且你的Metatag也不會(huì)被其他搜索引擎認(rèn)為是Spamming(胡亂塞入垃圾電子郵件行為)。

    4)向其他搜索引擎登記你的網(wǎng)頁(yè),要注意三點(diǎn):

    嚴(yán)格遵守每個(gè)搜索引擎的規(guī)定。如Yahoo!規(guī)定網(wǎng)站描述不得超過(guò)20個(gè)字(包括標(biāo)點(diǎn)符號(hào)),能在Yahoo!的搜索結(jié)果中排前10名,將會(huì)給你帶來(lái)很大效益;

    只向搜索引擎登記首頁(yè)和最重要的兩至三頁(yè),搜索程式會(huì)根據(jù)你首頁(yè)的鏈結(jié)讀出其他頁(yè)面并收錄。建議第一次只登記首頁(yè)。

    這些搜索引擎收錄網(wǎng)頁(yè)的時(shí)間從幾天至幾周不等。筆者建議等待一個(gè)月后,鍵入你的域名查詢。如果網(wǎng)站沒(méi)有被收錄,再次登記直至被收錄為止。要注意在一個(gè)月內(nèi),千萬(wàn)不要重復(fù)登記你的網(wǎng)頁(yè),這也許會(huì)導(dǎo)致網(wǎng)頁(yè)永遠(yuǎn)不會(huì)被收錄。

    12家著名中文搜索引擎推介序號(hào)網(wǎng)站名稱網(wǎng)址

    01 雅虎中文 www.yahoo.com.cn

    02 Google www.google.com

    03 新浪 www.sina.com.cn

    04 網(wǎng)易 www.163.com

    05 搜狐 www.sohu.com

    06 3721 www.3721.com

    07 百度 www.baidu.com

    08 tom.com www.tom.com

    09 21cn www.21cn.com

    10 263在線 www.263.net

    11 中國(guó)搜索聯(lián)盟 www.chinasearch.com.cn

    12 中文Lycos www.lycos.com.cn

    2.Google的工作原理

    Google自1998年成立至今,在短短5年間已成為全球最受歡迎的搜索引擎(Search Engine),大大超越了老牌入門級(jí)的搜索引擎網(wǎng)站Yahoo!,成為大多數(shù)網(wǎng)民的首選。以Google為代表的新一代搜索引擎不僅僅只依靠META標(biāo)簽和網(wǎng)頁(yè)內(nèi)容的相關(guān)度來(lái)排名,而是被其他網(wǎng)站錄接的數(shù)量作為一項(xiàng)重要的排名指標(biāo),Google排名規(guī)則不僅關(guān)注網(wǎng)站設(shè)計(jì)本身,而且還受其他因素的限制。Google的演算方法一直是個(gè)秘密,并且時(shí)刻在改變著,據(jù)說(shuō)影響Google排名的因素有三百多種。事實(shí)上,Google搜索引擎采用了全新的搜索方式,通過(guò)一種復(fù)雜的數(shù)學(xué)分析,估計(jì)出一次搜索查詢后反饋的網(wǎng)頁(yè)的質(zhì)量或重要性及相關(guān)主題。要知道一個(gè)網(wǎng)頁(yè)的質(zhì)量,Google可以通過(guò)有多少網(wǎng)頁(yè)與它連接來(lái)判斷,這是因?yàn)槿藗儾粫?huì)與糟糕的網(wǎng)頁(yè)做鏈接。傳統(tǒng)的搜索引擎如Hotbot和Lycos等當(dāng)前使用的是元素搜索技術(shù),即使用網(wǎng)頁(yè)中的的關(guān)鍵字進(jìn)行搜索,而Google則使用一種包含對(duì)整個(gè)網(wǎng)絡(luò)的連接結(jié)構(gòu)進(jìn)行分析和大規(guī)模資料挖掘的技術(shù),Google不僅掃描搜索關(guān)鍵字,還閱讀頁(yè)面全文,考慮到圖像和所有鏈結(jié),然后把該頁(yè)面與類似頁(yè)面劃分開(kāi)來(lái)。

    因此,Google排名靠的是經(jīng)驗(yàn)、資源、細(xì)節(jié)方面的技巧。在網(wǎng)絡(luò)行銷界,有句很有名的話,那就是"網(wǎng)絡(luò)行銷,細(xì)節(jié)制勝"。Google排名同樣是這樣的道理。

    如果你的網(wǎng)站想在Google排名搜索結(jié)果排到前面,首先,你要把自己的網(wǎng)站建設(shè)做好,然后按情況進(jìn)行改革。如果你沒(méi)有時(shí)間和精力去做這些工作,可以找相關(guān)的服務(wù)公司或者個(gè)人工作室來(lái)做。不過(guò),不要因?yàn)樽约翰涣私舛ǖ粼┩麇X。比如網(wǎng)絡(luò)行銷公司常常讓客戶購(gòu)買一些并不常用的關(guān)鍵字或所謂的熱門關(guān)鍵字,或者要求客戶支付過(guò)高的價(jià)格等等。

    3.搜索引擎行銷的目標(biāo)層次和網(wǎng)站優(yōu)化設(shè)計(jì)

    搜索引擎行銷的基本思想是讓用戶發(fā)現(xiàn)資訊,并通過(guò)點(diǎn)擊進(jìn)到網(wǎng)站/網(wǎng)頁(yè)進(jìn)一步了解他所需要的資訊。在介紹搜索引擎策略時(shí),一般認(rèn)為,搜索引擎優(yōu)化設(shè)計(jì)主要目標(biāo)有2個(gè)層次:被搜索引擎收錄,在搜索結(jié)果中排名靠前。這已經(jīng)是常識(shí)問(wèn)題,多數(shù)網(wǎng)絡(luò)行銷人員和專業(yè)服務(wù)商對(duì)搜索引擎的目標(biāo)設(shè)定也基本處于這個(gè)水平。但從實(shí)際情況來(lái)看,僅僅做到被搜索引擎收錄并且在搜索結(jié)果中排名靠前還不夠,因?yàn)槿〉眠@樣的效果實(shí)際上并不一定能增加用戶的點(diǎn)擊率,更不能保證將訪問(wèn)者轉(zhuǎn)化為顧客或者潛在顧客,因此只能說(shuō)是搜索引擎行銷策略中兩個(gè)最基本的目標(biāo)。

    利用搜索引擎工具可以實(shí)現(xiàn)4個(gè)層次的行銷目標(biāo):

    1)被搜索引擎收錄;

    2)在搜索結(jié)果中排名靠前;

    3)增加用戶的點(diǎn)擊(點(diǎn)進(jìn))率;

    4)將瀏覽者轉(zhuǎn)化為顧客。

    在這四個(gè)層次中,前三個(gè)可以理解為搜索引擎行銷的過(guò)程,而只有將瀏覽者轉(zhuǎn)化為顧客才是最終目的。在一般的搜索引擎優(yōu)化中,通過(guò)設(shè)計(jì)網(wǎng)頁(yè)標(biāo)題,META標(biāo)簽中的內(nèi)容等,通??梢詫?shí)現(xiàn)前兩個(gè)初級(jí)目標(biāo)(如果付費(fèi)登錄,就直接可以實(shí)現(xiàn)這個(gè)目標(biāo)了,甚至不需要考慮網(wǎng)站優(yōu)化問(wèn)題)。實(shí)現(xiàn)高層次的目標(biāo),還需要進(jìn)一步對(duì)搜索引擎進(jìn)行優(yōu)化設(shè)計(jì),或者說(shuō),從整體上設(shè)計(jì)對(duì)搜索引擎友好的網(wǎng)站。(參見(jiàn)本文"網(wǎng)站的持續(xù)改進(jìn)"之"改進(jìn)網(wǎng)站以盡量對(duì)搜索引擎友好"。)

    二.網(wǎng)絡(luò)廣告

    網(wǎng)絡(luò)廣告和與其他大型知名網(wǎng)站合作專題是許多大企業(yè)在網(wǎng)絡(luò)行銷上經(jīng)常采用的手法,其優(yōu)點(diǎn)在于影響面廣,宣傳效果好,同時(shí)有利于企業(yè)品牌的提升,缺點(diǎn)在于費(fèi)用太高,需要專業(yè)的行銷策劃團(tuán)隊(duì)配合,以及設(shè)計(jì)人員的協(xié)助等。該手段適合大型知名企業(yè)采用,而對(duì)一般中小型企業(yè)來(lái)說(shuō),較可行的方法是選擇本行業(yè)內(nèi)較知名的網(wǎng)絡(luò)媒體合作,這樣一方面可節(jié)約宣傳成本,另一方面目標(biāo)群體更為明確有效。此外,不定期的更換企業(yè)網(wǎng)站上廣告條(banner),有針對(duì)性對(duì)企業(yè)產(chǎn)品、品牌展開(kāi)宣傳,也是一種行之有效的手段,在企業(yè)網(wǎng)站上也開(kāi)設(shè)專題區(qū),定期策劃宣傳專題,有針對(duì)性地進(jìn)行宣傳,同樣可起到引導(dǎo)用戶,從而達(dá)到宣傳效果。專題的選擇可以是產(chǎn)品、活動(dòng)、事件、互動(dòng)調(diào)查等。

    競(jìng)價(jià)排名是搜索引擎關(guān)鍵字廣告的一種形式。其中以Google公司推出的關(guān)鍵字廣告Adwords業(yè)務(wù)最為有效和常用。通過(guò)Google Adwords(http://www.google.com/intl/zh-CN/ads/)。

    你可以自行制作廣告,選擇關(guān)鍵字,廣告出現(xiàn)在所選擇的"關(guān)鍵字"的相關(guān)搜索頁(yè)面右側(cè)。收費(fèi)原則是點(diǎn)擊付費(fèi)(Cost Per Click),從而使得廣告非常具有針對(duì)性,最低每次點(diǎn)擊0.05美元的收費(fèi)使得該業(yè)務(wù)尤其適合中小型企業(yè)開(kāi)展網(wǎng)上宣傳。

    例如,在Google中鍵入"印刷"關(guān)鍵字,搜索所有中文網(wǎng)站,在其搜索結(jié)果右側(cè)的"贊助商鏈結(jié)"中將出現(xiàn)已經(jīng)購(gòu)買了印刷關(guān)鍵字的印刷企業(yè)的廣竹土口,目前共有8家,包括上海金粟印務(wù)有限公司、廣州皇信彩印紙品有限公司、深圳極雅致印刷有限公司、深圳新聯(lián)美術(shù)印刷廠等。

    至于企業(yè)如何直接在Google上投放廣告以節(jié)省費(fèi)用,由于篇幅限制,在此不做詳細(xì)介紹,讀者可參見(jiàn)專題文章:《如何在GOOGLE上投放廣告》(http://www.linkwan.com/gb/articles/97.htm)。

    三.E-mail行銷與垃圾郵件

    目前,國(guó)內(nèi)互聯(lián)網(wǎng)用戶使用最多的是電子郵件,這從另一方面也可以看出電子郵件行銷的重要性及其作用。不過(guò),現(xiàn)階段電子郵件行銷的重要性及其作用。不過(guò),現(xiàn)階段電子郵件行銷還不是十分規(guī)范,存在著不少問(wèn)題,因此,筆者認(rèn)為,如果企業(yè)有實(shí)力,不妨采用企業(yè)電子雜志與電子郵件行銷相結(jié)合的手段,效果將非常顯著。

    具體做法是,組織或成立專門的編輯部,負(fù)責(zé)企業(yè)各種資料的撰寫(xiě)、收集和整理,定期把宣傳內(nèi)容制作成電子雜志的形式掛在網(wǎng)站上,并設(shè)計(jì)訂閱,退訂視窗,如果用戶喜歡你提供的內(nèi)容,就會(huì)主動(dòng)訂閱。通過(guò)這種手段,企業(yè)可以收集到第一手客戶資料,為日后有效的電子郵件行銷打下良好基礎(chǔ)。不過(guò),筆者建議,初期開(kāi)展電子雜志可借助外界電子郵件行銷服務(wù)公司協(xié)助發(fā)送雜志,待形成規(guī)模后再主動(dòng)傳播。電子雜志傳播方法如果得到有效實(shí)施,不但會(huì)給企業(yè)宣傳帶來(lái)極大提升,而且也有助企業(yè)網(wǎng)站訪問(wèn)量提高。

    值得提出的是,以垃圾郵件方式行銷。企業(yè)應(yīng)該對(duì)規(guī)范的電子郵件行銷方式有必要的了解。警惕有些打著網(wǎng)絡(luò)營(yíng)銷旗號(hào)的"網(wǎng)絡(luò)營(yíng)銷軟體"、"分類郵件地址"名義垃圾郵件發(fā)送者以"定向發(fā)布資訊"、"搜集潛在客戶"、"郵件群發(fā)是最好的網(wǎng)絡(luò)營(yíng)銷手段"等口號(hào)混淆垃圾郵件與許可E-mail行銷的概念,使得一些企業(yè)和個(gè)人在對(duì)正規(guī)的E-mail行銷缺乏了解的情況下發(fā)送垃圾郵件,或者委托垃圾郵件發(fā)送者發(fā)送廣告資訊。

    四.其他網(wǎng)絡(luò)行銷方式

    1.網(wǎng)絡(luò)行銷與傳統(tǒng)行銷的相互配合

    廣播、電視、報(bào)紙、雜志等傳統(tǒng)媒體的行銷廣告是"廣播"方式,即這些廣告的觀眾不全都是你的目標(biāo)客戶。與此相比,Internet網(wǎng)絡(luò)行銷的最美妙之處在于由于網(wǎng)絡(luò)搜尋資訊的特有方式,人們通過(guò)搜索引擎或其他網(wǎng)站的鏈結(jié)找到你的網(wǎng)站,獲取產(chǎn)品或服務(wù)資訊,決定了網(wǎng)上行銷的觀眾幾乎全都是你的目標(biāo)客戶,及"窄播"效應(yīng)。很顯然,只有對(duì)某種產(chǎn)品或服務(wù)感興趣的人才會(huì)鍵入與此產(chǎn)品、服務(wù)相關(guān)的關(guān)鍵字,從而找到此種產(chǎn)品或提供此種服務(wù)的商家。因此建議企業(yè)在形象設(shè)計(jì)(CI)中加入企業(yè)的網(wǎng)址,將企業(yè)網(wǎng)站作為企業(yè)形象(CI)的一個(gè)部分,在其他傳統(tǒng)媒體(電視、廣播、報(bào)刊、雜志等)的廣告中有意識(shí)地加入網(wǎng)址,兩者相互促進(jìn)。

    此外,企業(yè)在日常的營(yíng)銷工作中,也要有意識(shí)的加入網(wǎng)站宣傳工作。比如,在企業(yè)會(huì)議室、會(huì)客室、業(yè)務(wù)洽談室等地方醒目地打上自己的網(wǎng)址,并告訴客戶可以通過(guò)企業(yè)網(wǎng)站了解企業(yè)業(yè)務(wù)和獲得相關(guān)資料等。以及在企業(yè)的各種宣傳冊(cè)、廣告、信紙、傳真、名片、贈(zèng)品上,印上企業(yè)網(wǎng)址和E-mail信箱。這樣,既能體現(xiàn)企業(yè)的品位,又能讓想了解企業(yè)的人可隨時(shí)隨地上網(wǎng)瀏覽網(wǎng)站。

    2.網(wǎng)絡(luò)會(huì)員制行銷

    網(wǎng)絡(luò)會(huì)員制行銷是電子商務(wù)中一種有效的行銷模式。目前網(wǎng)絡(luò)會(huì)員制行銷已經(jīng)在國(guó)內(nèi)大型網(wǎng)絡(luò)公司獲得了廣泛應(yīng)用,不僅受到大型電子商務(wù)網(wǎng)站的重視,也擴(kuò)展到其他網(wǎng)絡(luò)服務(wù)領(lǐng)域,如搜索引擎的競(jìng)價(jià)排名、競(jìng)價(jià)廣告等。尤其是在2003年上半年,以"短信聯(lián)盟"為代表的網(wǎng)絡(luò)會(huì)員制行銷模式風(fēng)風(fēng)火火,幾乎到了過(guò)熱狀態(tài)。

    其他的網(wǎng)絡(luò)行銷方式還有:鏈結(jié)交換、間接網(wǎng)頁(yè)策略(也叫迷你網(wǎng)站)、新聞組討論、電子公告欄(BBS)、結(jié)合行銷、CRM(客戶關(guān)系管理)網(wǎng)絡(luò)行銷等。

    五.網(wǎng)站的持續(xù)改進(jìn)

    1.網(wǎng)站診斷

    通過(guò)網(wǎng)站訪問(wèn)日志報(bào)告,分析網(wǎng)站中的那幾頁(yè)的被調(diào)閱率最高,了解訪問(wèn)者對(duì)你的產(chǎn)品或服務(wù)中的那幾項(xiàng)最感興趣,并在這幾頁(yè)中增加更多內(nèi)容和資訊,然后以此為主要內(nèi)容向目標(biāo)市場(chǎng)推介。

    網(wǎng)上行銷是一個(gè)實(shí)踐-認(rèn)識(shí)-再實(shí)踐-再認(rèn)識(shí)的過(guò)程。你需要根據(jù)訪問(wèn)流量和實(shí)際的銷售業(yè)績(jī)比較,看看影響成交率的是哪些因素,來(lái)制定出銷售重點(diǎn)和銷售策略,再根據(jù)實(shí)際的市場(chǎng)反應(yīng)來(lái)修正你的銷售策略和重點(diǎn),以及確定哪些網(wǎng)上行銷方法最有效,然后再主動(dòng)出擊,有的放矢地進(jìn)行網(wǎng)上行銷。

    筆者要重申網(wǎng)站更新的重要性,其原因有三:

    1)搜索引擎傾向于將經(jīng)常更新的網(wǎng)站在搜索結(jié)果中排位靠前;

    2)網(wǎng)上行銷需要你經(jīng)常更新網(wǎng)站的內(nèi)容;

    3)經(jīng)常更新網(wǎng)站會(huì)增加公司的信任度。當(dāng)看到很多網(wǎng)站的最近更新日期是幾個(gè)月或一年前,筆者就會(huì)發(fā)出這樣的疑問(wèn):燈總是亮著,但有人在家嗎?

    為此,建議至少每個(gè)月更新一次網(wǎng)站,哪怕只是做最細(xì)微的改動(dòng)。

    2.改進(jìn)網(wǎng)站以盡量對(duì)搜索引擎友好

    有些企業(yè)網(wǎng)站非常重視網(wǎng)頁(yè)的視覺(jué)效果,尤其是首頁(yè),常常使用很復(fù)雜的圖片,或者用Flash等Rich Media形式來(lái)展示企業(yè)形象,這些固然能從視覺(jué)上引起人們的注意,但從搜索引擎優(yōu)化的角度來(lái)看,沒(méi)有任何價(jià)值,甚至起到反作用,讓搜索引擎無(wú)從檢索,用戶也就無(wú)法通過(guò)搜索引擎發(fā)現(xiàn)這個(gè)網(wǎng)站。

    因此,應(yīng)該在兼顧實(shí)用的前提下追求美觀,而不是將美觀放在首位,在兩者之間必須權(quán)衡取舍時(shí),寧可放棄外在的美觀,因?yàn)閷?duì)于對(duì)視覺(jué)效果并沒(méi)有完全一致的評(píng)價(jià)標(biāo)準(zhǔn),但搜索引擎卻有共同的檢索基礎(chǔ),對(duì)搜索引擎不夠友好,失去的將是自己的潛在用戶。強(qiáng)調(diào)網(wǎng)站的實(shí)用還有一個(gè)重要原因:用戶通過(guò)搜索引擎來(lái)到一個(gè)網(wǎng)站,他們不是為了欣賞網(wǎng)頁(yè)的視覺(jué)效果,而是為了獲得與他在搜索引擎中所使用的關(guān)鍵字相關(guān)的資訊。可以想象,如果用戶進(jìn)入一個(gè)網(wǎng)站卻沒(méi)有發(fā)現(xiàn)自己需要的資訊,他唯一的選擇就是盡快離開(kāi),這大概不是網(wǎng)站經(jīng)營(yíng)者所期望的結(jié)果吧!

    網(wǎng)站設(shè)計(jì)對(duì)搜索引擎不友好,表現(xiàn)在多個(gè)方面,最糟糕的是使得搜索引擎無(wú)法檢索資訊,或者得到的檢索資訊讓用戶看起來(lái)沒(méi)有吸引力。造成網(wǎng)站對(duì)搜索引擎不友好的主要原因是:

    大量采用圖片形式,沒(méi)有可以檢索的文本資訊;

    網(wǎng)頁(yè)沒(méi)有標(biāo)題,或者標(biāo)題中潒有包含有效的關(guān)鍵字;

    網(wǎng)頁(yè)正文中有效關(guān)鍵字比較少;

    網(wǎng)站導(dǎo)航系統(tǒng)讓搜索引擎"看不懂";

    部分資料庫(kù)資訊對(duì)搜索引擎"保密";

    沒(méi)有與其他網(wǎng)站提供鏈接線索進(jìn)行比較。

    另外,除了考慮網(wǎng)站的設(shè)計(jì)、流量的增加、排名提升外,一個(gè)非常重要的問(wèn)題是維持網(wǎng)站的穩(wěn)定運(yùn)行和擁有較高的訪問(wèn)速度。試想,一個(gè)排名非常靠前的網(wǎng)站,因?yàn)樗欧鞒霈F(xiàn)問(wèn)題而造成無(wú)法訪問(wèn),后果會(huì)如何?所以,如何降低伺服器故障及優(yōu)化伺服器功能一直是業(yè)界所關(guān)心的話題。訪問(wèn)速度和穩(wěn)定性乃優(yōu)秀網(wǎng)站之重要指標(biāo),亦是提升網(wǎng)站瀏覽率的物質(zhì)保障,在伺服器世界里,"穩(wěn)定代表一切"。


    本文的討論也很精彩,瀏覽討論>>


    JavaEye推薦



    posted @ 2008-08-18 17:04 beauty9235 閱讀(150) | 評(píng)論 (0)編輯 收藏


    作者: beauty9235  鏈接:http://beauty9235.javaeye.com/blog/229638  發(fā)表時(shí)間: 2008年06月19日

    聲明:本文系JavaEye網(wǎng)站發(fā)布的原創(chuàng)博客文章,未經(jīng)作者書(shū)面許可,嚴(yán)禁任何網(wǎng)站轉(zhuǎn)載本文,否則必將追究法律責(zé)任!

    訪問(wèn)速度和穩(wěn)定性乃優(yōu)秀網(wǎng)站之重要技術(shù)指標(biāo),亦是提升網(wǎng)站瀏覽率之重要環(huán)節(jié)。在伺服器世界里,穩(wěn)定代表一切。按業(yè)界的一般標(biāo)準(zhǔn),高檔伺服器產(chǎn)品的穩(wěn)定度達(dá)99.99%,也就是說(shuō)伺服器運(yùn)行一年內(nèi)的當(dāng)機(jī)(Hang)時(shí)間平均不超過(guò)53分鐘,中檔伺服器的穩(wěn)定度為99%,平均當(dāng)機(jī)時(shí)間是88小時(shí),低檔伺服器的穩(wěn)定度僅為90%,平均當(dāng)機(jī)時(shí)間高達(dá)876小時(shí)。

    數(shù)據(jù)中心伺服器托管一般都是采用1U、2U機(jī)箱,尤其是訪問(wèn)量大的mail、web、ftp類的伺服器,對(duì)穩(wěn)定度的要求很嚴(yán)格。如何降低伺服器故 障及優(yōu)化其性能一直是業(yè)界所關(guān)心的話題。要達(dá)到百分之百的零當(dāng)機(jī)是不可能的,我們要做的是深入分析影響伺服器穩(wěn)定度的關(guān)鍵問(wèn)題,采用針對(duì)性技術(shù)有效提高伺服器的穩(wěn)定性,使當(dāng)機(jī)時(shí)間盡可能地縮短。

    就筆者的實(shí)際經(jīng)驗(yàn)而言,影響伺服器穩(wěn)定與安全之因素主要有伺服器的電源供應(yīng)器、散熱系統(tǒng)、伺服器主板選擇、軟件運(yùn)用等。本文將就上述硬件的合理配置、如何評(píng)測(cè)、以及伺服器軟件設(shè)置、優(yōu)化等方面的問(wèn)題進(jìn)行探討。

    一、電源供應(yīng)器

    熟悉電腦的用戶都知道,電源質(zhì)量的優(yōu)劣直接影響到系統(tǒng)的穩(wěn)定和硬件的使用壽命,并不僅僅是將220V市電的交流電轉(zhuǎn)變?yōu)殡娔X所需要的低電壓強(qiáng)電流的直流電這么簡(jiǎn)單。

    如果將CPU(處理器)比擬做一臺(tái)伺服器的大腦,那么電源就可以說(shuō)是伺服器的血液了。伺服器對(duì)電源的要求不僅是要求提供穩(wěn)定的電流和較高的功率,還必須能應(yīng)付各種苛刻的工作環(huán)境,同時(shí)還要求常年不間斷地工作。隨著CPU主頻的提高,功耗將越來(lái)越大,硬盤(Harddis)容量和轉(zhuǎn)速等也越來(lái)越大、越快,這對(duì)電源的要求就更高了。伺服器通常支持的CPU可以達(dá)到2個(gè)甚至更多。所使用SCSI硬盤約為2-4個(gè),RAM容量2GB以上,以上配件在消耗能量方面都是驚人的。比如Intel P43.2G CPU 功耗達(dá)到82W(瓦特);Prescott 0.09微米制程P4-E 3.2G更達(dá)103W,所以目前Prescott CPU 己不適合應(yīng)用在1U、2U機(jī)箱做伺服器。而SCSI硬盤的功率也在10W以上,所以伺服器系統(tǒng)所需要的功率遠(yuǎn)遠(yuǎn)高于一般PC,一般PC只要200W電源就夠用了,而伺服器1U機(jī)箱應(yīng)有300W,2U應(yīng)有350W。

    高品質(zhì)電源是伺服器正常運(yùn)行的重要保證,也是一般人最容易忽略的。實(shí)踐經(jīng)驗(yàn)告訴我們,電源導(dǎo)致伺服器經(jīng)常自動(dòng)重啟(Reboot),致使硬盤出現(xiàn)壞道。功率不足使+5V、+3.3V和+12V在滿負(fù)荷狀態(tài)運(yùn)行時(shí)(CPU使用率保持在100%,硬盤也在大量讀寫(xiě)資料,功率消耗大)出現(xiàn)電壓波動(dòng),或者散熱不良造成過(guò)熱,是經(jīng)常性自動(dòng)重啟的主要原因,造成伺服器不能正常提供服務(wù),同時(shí)也會(huì)縮短硬件的壽命。

    二、散熱

    散熱是伺服器要解決的首要問(wèn)題之一。伺服器硬件一般放在1U、2U機(jī)箱內(nèi)配合機(jī)架統(tǒng)一使用,機(jī)架伺服器的寬度為19英寸,高度以U為單位(1U=1.75英寸=44.45毫米),在狹小的空間內(nèi)有大量的硬件高速運(yùn)行狀態(tài)下散發(fā)的熱量非常大,且伺服器一般要求24小時(shí)不間斷工作,如果機(jī)箱材料的選用或內(nèi)部結(jié)構(gòu)設(shè)計(jì)不良,導(dǎo)致整體散熱性能差,則會(huì)經(jīng)常導(dǎo)致伺服器出現(xiàn)當(dāng)機(jī)、重啟等狀況。

    首先,伺服器機(jī)箱的選料就馬虎不得。首選全鋁質(zhì)的或者鋁合金的,次選鐵板。顏色應(yīng)漆成黑色,以利于散熱。采用全銅及直接整體銅切割出來(lái)的CPU散熱器較好,其散熱效果優(yōu)于其它材料,是伺服器CPU散熱的理想選擇。但為達(dá)到最佳散熱效果,須配合品質(zhì)良好的散熱膏并正確地使用。筆者采用Arctic Silver 5純銀散熱膏,嚴(yán)格按照說(shuō)明書(shū)操作,成功將CPU溫度降低3-4℃。

    再者,采用高風(fēng)量(CFM)散熱風(fēng)扇對(duì)伺服器來(lái)說(shuō)也是關(guān)鍵組件,散熱風(fēng)扇一般分滾珠軸承、油封軸承兩種。滾珠軸承較為耐用,所以廣泛應(yīng)用,雖噪聲略高,但實(shí)際上伺服器放在機(jī)房中,噪音干擾不成問(wèn)題。判斷風(fēng)量的大小可以從風(fēng)扇注明的A(電流量)或W(功率)來(lái)作選擇,數(shù)字越大風(fēng)量越強(qiáng)。可選擇Delta、Sunon、Nidec、Sany、Y.S.Tech等名牌,以確保長(zhǎng)期運(yùn)轉(zhuǎn)不出故障。為提高散熱效果,也可選用小型鼓風(fēng)機(jī)(BLOWER)。筆者使用的伺服器,選用小型鼓風(fēng)機(jī)配合1U機(jī)箱,另加6個(gè)萬(wàn)轉(zhuǎn)4CM電流0.24A強(qiáng)力風(fēng)扇使機(jī)箱溫度降低了8-10℃左右。有興趣了解各類強(qiáng)力風(fēng)扇的朋友可到超頻專門店網(wǎng)址http://www.pcbulb.com/查詢。近期Sany推出1.5萬(wàn)轉(zhuǎn)4CM電流0.55A風(fēng)量20.83CFM超強(qiáng)力風(fēng)扇是1U伺服器散熱較佳配搭。

    另一方面要合理設(shè)計(jì)風(fēng)道,在安裝好硬件后把機(jī)箱內(nèi)的cable、電線整齊地扎好,以保證機(jī)箱內(nèi)氣流循環(huán)無(wú)阻,能更有效地對(duì)CPU、RAM、硬盤、南北橋晶片等進(jìn)行散熱。Intel P4CPU溫度75℃、AMD CPU溫度86℃是工作溫度極限,高溫時(shí)CPU將會(huì)自動(dòng)降低工作效率。所以在1U機(jī)箱伺服器P4平臺(tái)full loading CPU溫度能維持65℃左右及機(jī)箱溫度50℃以內(nèi)可算不錯(cuò)的散熱效果。注:(Intel 的設(shè)計(jì)規(guī)范CPU溫度不超過(guò)72℃)

    三、主板

    不可置疑,主板對(duì)于伺服器至關(guān)重要。主板猶如人的骨架,承載著CPU、RAM(記憶體)等重要部件的運(yùn)行。如果你的伺服器電源質(zhì)量可靠,功率充足;機(jī)箱及CPU散熱良好,但仍偶爾會(huì)莫名其妙的當(dāng)機(jī),就該考慮問(wèn)題可能出自主板了。有些主板在當(dāng)機(jī)后,因有自我保護(hù)功能,必須關(guān)掉電源再開(kāi)機(jī);更有甚者,必須清除CMOS中的記憶,才可以重啟,這對(duì)伺服器的遠(yuǎn)程維護(hù)與管理造成嚴(yán)重障礙。

    INTEL主板是少數(shù)通過(guò)WHQL微軟WINDOWS操作系統(tǒng)硬件質(zhì)量認(rèn)證的產(chǎn)品,穩(wěn)定性和兼容性經(jīng)受實(shí)際考驗(yàn),INTEL生產(chǎn)的主板嚴(yán)格遵照規(guī)格制造。在性能方面INTEL原廠伺服器主板針對(duì)WINDOWS操作系統(tǒng)做了優(yōu)化設(shè)計(jì),加上INTEL對(duì)自己生產(chǎn)的處理器最為了解,更容易釋放出自家處理器的性能,可以說(shuō)INTEL的主板是高品質(zhì)與高性能兼具的產(chǎn)品。但是INTEL也有為了穩(wěn)定性而犧牲性能的傳統(tǒng),與同級(jí)的主板晶片組比較,INTEL的主板總是比其它大廠的主板要慢上一點(diǎn),功能方面也沒(méi)有太多的擴(kuò)展性。但是在伺服器最注重穩(wěn)定性的原則上,筆者強(qiáng)烈推薦采用INTEL主板。

    四、評(píng)測(cè)

    綜上所述,電源、主板及散熱是如此重要。直接影響到伺服器的穩(wěn)定與安全,那么,你要如何判斷其好壞呢?下面,我們將自己動(dòng)手進(jìn)行評(píng)測(cè),去了解自己的伺服器是否處于一個(gè)良好的工作狀態(tài)。

    測(cè)試平臺(tái)的搭建,主要考慮電源輸出電壓的穩(wěn)定和主板、CPU等機(jī)箱內(nèi)關(guān)鍵部分溫度的測(cè)試。對(duì)于電源的測(cè)試相對(duì)比較簡(jiǎn)單,我們當(dāng)然沒(méi)有必要像專業(yè)電源制造廠商一樣,用示波器、萬(wàn)用表甚至用ATE(自動(dòng)測(cè)試儀)等專業(yè)工具來(lái)進(jìn)行測(cè)試,僅通過(guò)軟件來(lái)進(jìn)行測(cè)試就足夠了。雖然通過(guò)軟件測(cè)試只能作為一個(gè)參考,所測(cè)值可能會(huì)與你的電源的真實(shí)值有所差距,但是通過(guò)這個(gè)測(cè)試,我們還是能大概看清自己伺服器中電源的"真實(shí)面目"。當(dāng)然,探測(cè)主板及CPU的溫度,用軟件來(lái)測(cè)試也是很容易的事了。

    Windows任務(wù)管理器可以監(jiān)視電腦的CPU 和RAM使用情況、程式和進(jìn)程的相關(guān)信息。建議搭配下述推薦評(píng)測(cè)軟件共同使用。

    *MBM5溫度、電壓監(jiān)控軟件

    MBM5是一款用來(lái)探測(cè)主板CPU溫度以及電壓的軟件。推薦使用Motherboard Monitor 5(以下簡(jiǎn)稱MBM5)來(lái)測(cè)試。MBM5最新5.3.6.0英文版本、最新5.3.6.0多語(yǔ)言版本。其適合作業(yè)系統(tǒng):Windows 9X/Me/2000/XP,可在世界網(wǎng)絡(luò):http://www.linkwan.com/gb/download/下載。

    當(dāng)溫度超高過(guò)你的設(shè)定值時(shí),MBM5便會(huì)啟動(dòng)警示音樂(lè)或是顯示警示文字,還可以輸出TXT或HTML格式的日志文件。

    安裝MBM5完成后,開(kāi)始設(shè)置,這是關(guān)健的一步。因?yàn)椴煌靼宓臋z測(cè)晶片是不同的,所以要先設(shè)定了MBM5。在程式集里面找出MBM5,然后運(yùn)行MBM 5Config Wizard。

    如下畫(huà)面出現(xiàn),點(diǎn)擊NEXT。

    如安裝好的MBM5不能完全支持你最新的主板,請(qǐng)?jiān)囋圏c(diǎn)擊Update(升級(jí)),一般更新后軟件會(huì)對(duì)更多新主板支持。升級(jí)完成后,進(jìn)入下一步,出現(xiàn)如下畫(huà)面,列出許多廠家和主板型號(hào),根據(jù)你的主板,選擇相應(yīng)的主板廠商和主板名稱。比如,筆者的主板為Intel S875WP1-E,選好后點(diǎn)擊NEXT。

    之后會(huì)出現(xiàn)一些選項(xiàng),比如選擇溫度單位是攝氏度(Celsius)還是華氏度(Fahrenheit)。不同的主板也可能會(huì)出現(xiàn)不相同的設(shè)定,一般使用默認(rèn)。

    最后點(diǎn)擊Finish。到了這一步許多朋友可能會(huì)想,這樣就應(yīng)該完成MBM5的安裝了吧?其實(shí)不然。還有一個(gè)非常重要的設(shè)置,否則,MBM5測(cè)出來(lái)的值是不正確的。

    運(yùn)行MBM5,打開(kāi)管理界面,在安裝了語(yǔ)言包后,你可以選擇繁體/簡(jiǎn)體中文。

    然后在Voltages(電壓)中,Voltages Configuration(電壓適配器)要選擇自己的主板的型號(hào),如果在列表中沒(méi)有你的主板型號(hào),請(qǐng)先不要急,那是因?yàn)橐话愕闹靼宥际遣捎脴?biāo)準(zhǔn)的ITE8712F傳感器,但你也可以對(duì)應(yīng)你的主板進(jìn)行相應(yīng)的選擇。

    顯示CPU溫度、主頻,風(fēng)扇轉(zhuǎn)速、機(jī)箱溫度

    點(diǎn)擊Apply(應(yīng)用)后,再看一下Dashboard看看是否都正常。該軟件具體的使用,大家可按提示操作。

    *OCCT電源測(cè)試軟件

    談到電源質(zhì)量的測(cè)試,就不得不提一下OCCT這個(gè)軟件。其適合作業(yè)系統(tǒng):Windows 9X/Me/2000/XP 可在http://www.linkwan.com/gb/download/下載。

    OCCT需要和MBM5這個(gè)軟件共同協(xié)作才能為用戶提供一份完美的電源質(zhì)量報(bào)告。在測(cè)試過(guò)程中,OCCT通過(guò)MBM5所測(cè)出的資料,自動(dòng)模擬電腦滿負(fù)載的狀態(tài),讓電腦連續(xù)30分鐘滿負(fù)載運(yùn)行,最后得出相應(yīng)的電壓波動(dòng)圖表,通過(guò)這些圖表,用戶就可以判斷出電源是否令人滿意了。

    在安裝好MBM5及OCCT后,點(diǎn)擊桌面捷徑方式就可以進(jìn)入OCCT的主界面了。首先點(diǎn)擊右下方的"Option"(選項(xiàng))鍵進(jìn)入設(shè)置界面,在這里用戶可以對(duì)測(cè)試電壓的負(fù)載進(jìn)行設(shè)置,供用戶選擇的有"Lowest"(最低)或者"Highest"(最高)等5個(gè)等級(jí),還可以設(shè)置使用內(nèi)存(RAM)的大小、CPU溫度以及輸出圖像的格式。設(shè)置完畢后,點(diǎn)擊"Go Back"(返回)回到主界面,再點(diǎn)擊左下方的"Test"(測(cè)試)鍵就可以對(duì)電源進(jìn)行測(cè)試了。

    測(cè)試將進(jìn)行30分鐘,這期間,OCCT占用系統(tǒng)資源很多,用戶最好不要進(jìn)行其它操作,否則可能會(huì)出現(xiàn)死機(jī)。測(cè)試完畢后,OCCT將把測(cè)試結(jié)果以分析圖的方式呈現(xiàn)在用戶眼前,這些分別是"系統(tǒng)(機(jī)箱)溫度變化"、"CPU溫度變化"、"+5V的電壓波動(dòng)"、"+3.3V的電壓波動(dòng)"、"+12V的電壓波動(dòng)"以及"CPU電壓波動(dòng)"。

    如果用戶的電源品質(zhì)良好,那么圖表上的各種電壓波動(dòng)幅度會(huì)非常小,即使有波動(dòng)也是在正常范圍之內(nèi);如果用戶電源質(zhì)量比較低劣,那么圖表上各種電壓的波動(dòng)范圍也會(huì)相應(yīng)較大。

    OCCT還可以單獨(dú)對(duì)CPU進(jìn)行測(cè)試,只要點(diǎn)擊主界面下中間的"Torture"(CPU穩(wěn)定檢測(cè))鍵就可以對(duì)CPU進(jìn)行穩(wěn)定性測(cè)試,并向用戶報(bào)告錯(cuò)誤。另外,由于OCCT可以實(shí)時(shí)監(jiān)控CPU溫度、系統(tǒng)(機(jī)箱)溫度以及電源各個(gè)輸出電壓的情況,所以它也可以作為一款監(jiān)控軟件使用。

    好了,我們終于可以開(kāi)始我們的測(cè)試了。打開(kāi)OCCT軟件(它會(huì)自動(dòng)關(guān)掉MBM5)點(diǎn)擊test(測(cè)試)。你可以去休息了,約半個(gè)小時(shí)后再來(lái)看看成績(jī)吧。

    在OCCT進(jìn)行測(cè)試的過(guò)程中,它會(huì)模擬你的伺服器在滿負(fù)荷的狀態(tài)下運(yùn)行。在這期間,我們來(lái)了解一下伺服器的電源吧。為了保證電源的輸出穩(wěn)定,伺服器電源供應(yīng)器都設(shè)計(jì)了一套自動(dòng)補(bǔ)償電路,也就是當(dāng)電源的其中一組電壓需要更大的功率的時(shí)候,它就會(huì)提高那組電壓的輸出電壓,但由于不是每組電壓都可以單獨(dú)進(jìn)行補(bǔ)償,也就是說(shuō),我們的電源在提高一組電壓的同時(shí),其它的所有電壓均會(huì)相應(yīng)的提高。這樣,就會(huì)形成一個(gè)特殊的現(xiàn)象,比如+5V因?yàn)樨?fù)載太大而導(dǎo)致輸出電壓開(kāi)始下降,電源會(huì)同時(shí)增加所有的輸出電壓,并不會(huì)單獨(dú)對(duì)+5V進(jìn)行控制,其結(jié)果必然導(dǎo)致其它電壓組因?yàn)檩敵鲭妷哼^(guò)渡補(bǔ)償而超過(guò)額定的電壓,當(dāng)電源設(shè)計(jì)欠佳或輸出功率不足時(shí)這種特有的現(xiàn)象就更加明顯!這樣,電腦內(nèi)許多設(shè)備都會(huì)在較高的電壓環(huán)境下工作。

    那什么范圍才算是合理波動(dòng)呢?電源輸出的正電壓,合理的波動(dòng)范圍在-5%~+5%之內(nèi),而負(fù)電壓的合理波動(dòng)范圍在-10%~+10%。

    只要電源的輸出在合理的范圍內(nèi),對(duì)電腦的配件都不會(huì)造成負(fù)面影響的,所以也不用過(guò)分地關(guān)注波動(dòng)的大小。但波動(dòng)的相對(duì)大小,側(cè)面反映了電源的負(fù)載能力,波動(dòng)率相對(duì)越小的電源,其實(shí)際的最大輸出功率可能越大。

    下面我們來(lái)看看測(cè)試結(jié)果吧,筆者的測(cè)試是在以下平臺(tái)完成的:

    CPU :P4 2.8G (800FSB)

    RAM :1G DDR400RAM

    主板:Intel S875WP1-E

    硬盤:WD360DG,36G 1萬(wàn)轉(zhuǎn)SATA

    電源:美基350CD(300W)

    首先來(lái)看看CPU溫度,從圖中可以看出,從44℃升到64℃。看起來(lái)還是不錯(cuò)的。

    +3.3V電壓,大致波動(dòng)范圍是3.3195-3.336V,還不錯(cuò),是在正常范圍(3.14-3.46V)內(nèi),此電壓主要應(yīng)用在顯卡、PCI、南北橋等設(shè)備。

    再來(lái)看一下,系統(tǒng)要求最高的+5V電壓,看這個(gè)圖,波動(dòng)曲線還不算大,在(5.123-5.16V)范圍內(nèi)供電包括CPU(舊式主版)、RAM、硬盤、光驅(qū)、I/O及主板的其它設(shè)備。

    +12V,波動(dòng)范圍在11.85-11.975V,波動(dòng)范圍看似挺大的。主要應(yīng)用在耗電量比較大的設(shè)備上,例如風(fēng)扇,硬盤、光驅(qū),新式主版用來(lái)轉(zhuǎn)換為CPU所需的電壓。

    CPU電壓,我在BIOS中設(shè)置的是1.45V,所以測(cè)試出來(lái)的結(jié)果也是在1.45V左右,看起來(lái)還是平穩(wěn)。

    測(cè)試結(jié)果看完了,該電源供應(yīng)器總的來(lái)說(shuō)非常不錯(cuò),雖然所有電壓均稍微偏離中心值,但均在安全的范圍內(nèi)。OCCT不對(duì)負(fù)電壓進(jìn)行測(cè)試,因?yàn)檫@幾個(gè)電壓的輸出電流均小,而且相應(yīng)的正電壓的值也就可以大概看出負(fù)電壓的波動(dòng)。除了看波動(dòng)范圍,還需看波動(dòng)大小。由下表可見(jiàn)筆者伺服器所用美基350CD電源的電壓波動(dòng)幅度非常小。

    電壓 合理波動(dòng)范圍 美基350CD (300W)實(shí)際波動(dòng)范圍 穩(wěn)壓精度
    +5V 4.75-5.25V 5.123-5.16V 3.04%
    +3.3V 3.14-3.46V 3.3195-3.336V 1.1%
    +12V 11.4-12.6V 11.85-11.975V 1.07%

    *Hot CPU Tester系統(tǒng)穩(wěn)定度測(cè)試軟件

    為進(jìn)一步考驗(yàn)伺服器的穩(wěn)定性,筆者還給大家介紹一個(gè)不錯(cuò)的軟件-Hot CPU Tester。其作用是考驗(yàn)CPU的穩(wěn)定性以及散熱系統(tǒng)的優(yōu)劣(需要溫度監(jiān)控軟件配合使用),不過(guò)在烤機(jī)(燒機(jī))的時(shí)候還有一個(gè)附加功能,那就是可以發(fā)現(xiàn)CPU是否被超頻。其最新版本:4.0,其適合作業(yè)系統(tǒng):Windows 9X/Me/2000/XP,可在http://www.linkwan.com/gb/download/下載。

    安裝好Hot CPU Tester,桌面會(huì)顯示一個(gè)icon ,雙擊icon進(jìn)入Hot CPU Tester的主界面。下面主圖左邊是菜單,在這里我們可以看到7個(gè)選項(xiàng),分別是"Diagnotisc"(檢測(cè)運(yùn)算測(cè)試)、"Burn-in"(CPU、RAM測(cè)試)、"Benchmark"(基準(zhǔn)測(cè)試)、"System Info"(系統(tǒng)信息)、"Option"(選項(xiàng))、"LiveSupport"(在線支持)以及"About"(關(guān)于)。可以看出,Hot CPU Tester是一個(gè)非常全面的測(cè)試軟件,在這里,我們著重介紹幾個(gè)Hot CPU Tester的主要功能。

    *穩(wěn)定性測(cè)試

    穩(wěn)定性測(cè)試主要是依靠"Diagnotisc"(檢測(cè)運(yùn)算測(cè)試)和"Burn-in"(CPU、RAM測(cè)試)兩個(gè)功能。只要在"Diagnotisc"(檢測(cè)運(yùn)算測(cè)試)的界面中單擊"Run Test"(開(kāi)始測(cè)試)鍵就可以開(kāi)始對(duì)系統(tǒng)進(jìn)行測(cè)試。這個(gè)測(cè)試是讓伺服器連續(xù)運(yùn)算各種項(xiàng)目,使CPU在一段時(shí)間內(nèi)保持使用率為100%,以此來(lái)測(cè)試CPU的穩(wěn)定性。

    中間的界面是測(cè)試的項(xiàng)目,包括硬盤、內(nèi)存(RAM)以及MMX等,下方有CPU資源占用的情況,通常不到幾分鐘,CPU使用率就會(huì)達(dá)到100%。如果在這種狀態(tài)下能讓Hot CPU Tester運(yùn)行達(dá)1小時(shí)以上,那么CPU的穩(wěn)定性就算達(dá)到標(biāo)準(zhǔn)了。另外,由于CPU長(zhǎng)期在100%狀態(tài)下工作,會(huì)產(chǎn)生極大的熱量,這個(gè)時(shí)候通過(guò)MBM5溫度測(cè)試軟件就可以看到CPU及系統(tǒng)的溫度,并以此判斷散熱系統(tǒng)的優(yōu)劣了。

    在右下方,Hot CPU Tester會(huì)顯示測(cè)試進(jìn)行的時(shí)間,以及開(kāi)始測(cè)試和結(jié)束測(cè)試的時(shí)間。另外,在Option(選項(xiàng))中還可以對(duì)測(cè)試進(jìn)行一些設(shè)置,比如測(cè)試的時(shí)間以及測(cè)試時(shí)硬件的狀態(tài),有一些功能需要用戶注冊(cè)后才能使用。

    如果你只想測(cè)試CPU和內(nèi)存,那么可以進(jìn)入"Burn-in(CPU、內(nèi)存測(cè)試)"的界面,在這個(gè)界面中可以設(shè)定測(cè)試的次數(shù)以及測(cè)試內(nèi)存的大小,然后直接點(diǎn)擊"Run CPU Burn-in(開(kāi)始測(cè)試CPU)"鍵或者"Run Memory Burn-in(開(kāi)始測(cè)試內(nèi)存)"鍵進(jìn)行測(cè)試。

     

    小提示:在進(jìn)行測(cè)試的時(shí)候,由于伺服器CPU的資源占用率達(dá)到了100%,所以這個(gè)時(shí)候操作其它程式都是危險(xiǎn)的,極可能引起系統(tǒng)崩潰,所以在進(jìn)行Hot CPU Tester測(cè)試的時(shí)候,應(yīng)該關(guān)閉其它程式。

    *性能測(cè)試

    在Hot CPU Tester中也有類似PCMark2003的系統(tǒng)性能測(cè)試。進(jìn)入Benchmark(性能測(cè)試)菜單中,點(diǎn)擊右上角的"Run Benchmark"(開(kāi)始性能測(cè)試)就可以對(duì)系統(tǒng)整體性能進(jìn)行測(cè)試,測(cè)試項(xiàng)目在中間窗口中顯示,測(cè)試結(jié)果會(huì)出現(xiàn)在"Total Score"(總分)的空格中。

    五、伺服器軟件優(yōu)化

    提到系統(tǒng)優(yōu)化,我們有必要區(qū)別碎片整理和系統(tǒng)優(yōu)化的概念。前者指系統(tǒng)向磁盤存儲(chǔ)的文件體積大于磁盤提供的連續(xù)存儲(chǔ)空間時(shí),因此不得不將文件拆開(kāi)分別存于幾塊不連續(xù)的物理磁盤區(qū)域,從而產(chǎn)生了所謂的磁盤碎片,而通過(guò)軟件的調(diào)整將其轉(zhuǎn)化成連續(xù)區(qū)域的過(guò)程稱為碎片整理。系統(tǒng)磁盤優(yōu)化則全然不同,它有兩個(gè)方面:首先,根據(jù)文件調(diào)用的頻繁程度來(lái)調(diào)整它們?cè)诖疟P中的位置,把使用頻繁的文件放在磁盤開(kāi)頭以達(dá)到最短的調(diào)用時(shí)間;另外一個(gè)過(guò)程恰好與碎片整理相反,就是整理未被占用的磁盤空間,讓它們連成一片,使以后磁盤碎片產(chǎn)生的可能性降至最低。

    對(duì)訪問(wèn)量大的伺服器,定期的磁盤整理對(duì)于提高硬盤訪問(wèn)效率、保持系統(tǒng)穩(wěn)定性非常有用。一般用戶都是習(xí)慣使用WINDOWS自帶的磁盤整理工具,它的優(yōu)點(diǎn)在于工作時(shí)只占用CPU 10-30%適合伺服器在線時(shí)整理,不影響服務(wù)但其速度和效能往往不能令人滿意。

    現(xiàn)介紹二個(gè)優(yōu)秀磁盤優(yōu)化軟件:

    1)Norton Utilities

    Norton Utilities是諾頓工具包Norton SystemWorks 2003中的一個(gè)組件,該軟件是一個(gè)功能強(qiáng)大的磁盤修復(fù)、磁盤優(yōu)化、系統(tǒng)維護(hù)和系統(tǒng)優(yōu)化工具。在你的伺服器上運(yùn)行該軟件后,你將會(huì)發(fā)現(xiàn)Norton Utilities所具有的那些性能強(qiáng)大的功能是不可缺少。系統(tǒng)優(yōu)化(Optimize Performance)選項(xiàng)中的Speed Disk工具,可用于優(yōu)化系統(tǒng)磁盤,將最常用的檔案放在硬碟最前端,使存取時(shí)間更短,以提高伺服器性能。優(yōu)化磁盤的步驟非常簡(jiǎn)單,大家按下Optimization Map,在右邊選擇一個(gè)需要進(jìn)行優(yōu)化的磁盤分區(qū),再按Start Optimizing即可開(kāi)始優(yōu)化磁盤。

    在優(yōu)化過(guò)程時(shí),我們可以發(fā)現(xiàn),Speed Disk的整理速度要比Windows自帶的碎片整理程序快許多。但由于工作時(shí)占CPU使用率就會(huì)達(dá)到50%左右,如伺服器在線時(shí)流量大,可能會(huì)影響服務(wù)。筆者在一臺(tái)使用Intel P42.8GHz處理器、1G內(nèi)存、安裝WINDOWS 2000SERVER的伺服器上對(duì)Norton Utilities進(jìn)行了測(cè)試。為了測(cè)試該軟件,我們?cè)陂_(kāi)啟許多應(yīng)用程式的情況下反復(fù)的重啟伺服器、向注冊(cè)表中添加許多錯(cuò)誤條目、將程式的捷徑指向錯(cuò)誤的可執(zhí)行檔案,并且在電腦中反復(fù)安裝和解除安裝軟件以便能夠在硬盤中產(chǎn)生大量磁盤碎片。在我們所做的測(cè)試中,Norton Utilities成功地報(bào)告各項(xiàng)錯(cuò)誤,而且很好地完成了修復(fù)工作。查找及修復(fù)系統(tǒng)問(wèn)題上Norton System Doctor(系統(tǒng)醫(yī)生),監(jiān)測(cè)的內(nèi)容要豐富得多。還有Norton Disk Doctor(磁盤醫(yī)生)和Norton System Check(系統(tǒng)檢查)等,功能都很強(qiáng)大。

    2.Voptxp V7.12

    除了Norton Utilities外,Voptxp v7.12也是優(yōu)秀磁盤軟件,可以把磁盤一些詳細(xì)資料顯示出來(lái)包括:磁盤使用和剩余空間圖例結(jié)構(gòu)圖,當(dāng)前磁盤碎片個(gè)數(shù)情況,當(dāng)前磁盤文件和文件夾個(gè)數(shù),分區(qū)大小,不連續(xù)文件個(gè)數(shù),交換文件的情況等,和傳統(tǒng)的磁盤碎片整理程序比較,Voptxp v7.12有著更大的優(yōu)勢(shì):多任務(wù)窗口、速度快、功能強(qiáng)大等特點(diǎn),更在"優(yōu)化"選項(xiàng)中有:互聯(lián)網(wǎng)優(yōu)化和系統(tǒng)優(yōu)化兩個(gè)不錯(cuò)的功能,是一個(gè)完美的測(cè)試工具,幫你節(jié)省更多時(shí)間。

    除系統(tǒng)及硬盤的維護(hù)問(wèn)題外,操作系統(tǒng)的安裝與配置、系統(tǒng)的及時(shí)更新與升級(jí)、殺毒軟件的使用及日常的管理和維護(hù)等都是非常重要的。筆者就自己日常管理網(wǎng)站伺服器的經(jīng)驗(yàn),整理出來(lái)供大家分享。

    a、定期查看系統(tǒng)/網(wǎng)站日志,查看是否有異常報(bào)錯(cuò),以便找出網(wǎng)站存在的問(wèn)題。系統(tǒng)有那些缺陷,可通過(guò)系統(tǒng)日志反映出來(lái),通過(guò)網(wǎng)站日志,可以找到那些頁(yè)面有錯(cuò)誤、那些頁(yè)面需優(yōu)化、那些圖片及文件應(yīng)刪除或減肥使網(wǎng)站訪問(wèn)的效率提升。查看網(wǎng)站日志最好是能安裝相關(guān)的網(wǎng)站日志分析工具,使日志更直觀。

    b、必要時(shí)重啟伺服器也是提高訪問(wèn)速度的方法之一,WIN系統(tǒng)定期重啟是必要的,以釋放一些使用完而沒(méi)有被釋放的資源。

    c、當(dāng)使用ACCESS數(shù)據(jù)庫(kù)時(shí),數(shù)據(jù)庫(kù)最好是分多個(gè)文件來(lái)處理,這樣讀取和存貯速度都會(huì)快很多。數(shù)據(jù)庫(kù)很大時(shí)最好是用MS SQL,不論是處理資料還是 數(shù)據(jù)容錯(cuò)性都會(huì)有一個(gè)質(zhì)的提升,使用MS SQL要定期對(duì)SQL數(shù)據(jù)庫(kù)日志進(jìn)行清理,清理SQL的日志有利于降低系統(tǒng)資源的使用,特別是內(nèi)存的占用率。

    d、經(jīng)常留意伺服器的資源使用量,查看是那些程式占用的系統(tǒng)資源比較高,是那些程式或那些內(nèi)容引起的,是否屬于正常。留意系統(tǒng)最新的(Service Pack)補(bǔ)丁程式和病毒,及時(shí)更新相關(guān)軟件,打補(bǔ)丁程式要先在其它機(jī)上測(cè)試后再在伺服器上安裝,以免引起兼容性的問(wèn)題。查看伺服器的流量,隨時(shí)分析伺服器狀態(tài),通過(guò)流量可知伺服器是否正常,如有駭客或入侵都會(huì)產(chǎn)生比較大的流量。

    e、WIN2000在默認(rèn)情況下會(huì)安裝一些常用的組件,但是這個(gè)默認(rèn)安裝是極度危險(xiǎn)的。你應(yīng)該明確地知道你需要那些服務(wù),而且僅僅安裝你確實(shí)需要的服務(wù)。根據(jù)安全原則,最少的服務(wù)+最小的權(quán)限=最大的安全。典型的WEB伺服器需要的最小組件選擇是:只安裝IIS的Com Files,IIS Snap-In,WWW Server組件。如果你確實(shí)需要安裝其它組件,特別是:Indexing Service,FrontPage 2000Server Extensions,Internet Service Manager (HTML)這幾個(gè)危險(xiǎn)服務(wù),請(qǐng)慎重處理。其它的不在此詳述。

    經(jīng)過(guò)評(píng)測(cè),您是否擁有了一臺(tái)性能穩(wěn)定、處于良好工作狀態(tài)的伺服器,為迎接隨后接踵而來(lái)的訪客做好準(zhǔn)備了呢?是的,經(jīng)過(guò)了前期細(xì)致的建站準(zhǔn)備工作,又經(jīng)過(guò)了緊鑼密鼓的網(wǎng)站規(guī)劃建設(shè)和網(wǎng)絡(luò)營(yíng)銷工作,相信您網(wǎng)站的瀏覽率和知名度將會(huì)節(jié)節(jié)攀升,名列前茅。下期筆者將就優(yōu)秀中文印刷網(wǎng)站的排名情況和本系列文章做最后的總結(jié)。希望不久的將來(lái)您能榜上有名


    本文的討論也很精彩,瀏覽討論>>


    JavaEye推薦



    posted @ 2008-08-18 17:04 beauty9235 閱讀(110) | 評(píng)論 (0)編輯 收藏


    作者: beauty9235  鏈接:http://beauty9235.javaeye.com/blog/229636  發(fā)表時(shí)間: 2008年06月19日

    聲明:本文系JavaEye網(wǎng)站發(fā)布的原創(chuàng)博客文章,未經(jīng)作者書(shū)面許可,嚴(yán)禁任何網(wǎng)站轉(zhuǎn)載本文,否則必將追究法律責(zé)任!

    目前國(guó)內(nèi)用的最多的無(wú)非就是 美國(guó)-韓國(guó)-香港-臺(tái)灣-加拿大 日本 英國(guó) 德國(guó) 比較少吧!日本可能SEX的比較多!   今天做的比較,是自己有初步接觸,部分機(jī)房有用的,拿出來(lái)比較下:   1、比-速度   美國(guó):(機(jī)房名地理位置-加洲、華盛頓、紐約、路易斯安娜、亞拉巴馬、北卡羅來(lái)那、德洲、喬治亞)   美國(guó)整體速度其實(shí)不錯(cuò),主要是看地理位置和機(jī)房!有些朋友都認(rèn)為中國(guó)訪問(wèn)美國(guó)的,不行,慢!其實(shí)未必,選擇一個(gè)好的機(jī)房,國(guó)內(nèi)整體來(lái)說(shuō)速度還是不錯(cuò)的。 現(xiàn)在由于做SEX和六合的多,很多國(guó)內(nèi)同行 都把客戶放到美國(guó),一臺(tái)服務(wù)器上放了很多六合和SEX的用戶,沒(méi)有很好的控制,會(huì)造成訪問(wèn)很慢,整體來(lái)說(shuō) 美國(guó)的速度還是滿優(yōu)秀的!   香港:(機(jī)房名地理位置-HKNET、新世界電訊、、ENET、城市電訊、和記、太平洋電訊)   香港原本連接國(guó)內(nèi)速度其實(shí)很快的,真的可以說(shuō)和國(guó)內(nèi)一樣的快??墒谴蠹叶贾老愀圩隽系亩啵貏e到了開(kāi)獎(jiǎng)的時(shí)候特別卡,有些客戶經(jīng)常會(huì)罵 “你們香港服務(wù)器怎么那么卡啊?” 中國(guó)這么多人去訪問(wèn)香港 能不卡嗎???   HKNET ENET盈科 新世界都是比較常用的機(jī)房,這幾個(gè)機(jī)房每個(gè)禮拜那幾天總是比較慢的!   新世界我用了1年多了,個(gè)人感覺(jué)還算滿意,但是最近比較不理想很糟糕!特別福建泉洲-廣東一帶的客戶訪問(wèn)很不理想! 城市電訊 國(guó)內(nèi)電信客戶訪問(wèn)比較理想,可是和廈門電信一樣 快成為“稀有品種”了。 和機(jī)、太平洋都比較貴,適合大企業(yè)客戶!   韓國(guó):(機(jī)房名地理位置-釜山、漢城、安山、大田、仁川、光洲、大邱、慶洲)   速度很明顯可以感覺(jué)的到!真的很不錯(cuò),可是由于價(jià)格的原因,能用的上的朋友,也不是很多。 記得落伍以前那個(gè)MR.L提供的韓國(guó)虛擬主機(jī),速度大家都可以看的到的吧。   臺(tái)灣:(機(jī)房名地理位置-高雄 臺(tái)北 新竹 嘉義 苗栗 臺(tái)東 花蓮)   速度不錯(cuò),起碼我是在廈門,訪問(wèn)的時(shí)候 感覺(jué)很不錯(cuò)!但是好象很少人用,而且價(jià)格方面,也是有點(diǎn)不敢恭維,等會(huì)下面比價(jià)格的時(shí)候再詳細(xì)比。   臺(tái)灣在虛擬主機(jī)上控制的也不錯(cuò),他們SEX也特別的多,和美國(guó)一樣流量限制很嚴(yán)格,很少有商家做不限制流量的,做不限制流量的價(jià)格也非常的可怕!下面再提!   加拿大:(機(jī)房名地理位置-無(wú))   加拿大,個(gè)人租用過(guò)一次,速度實(shí)在不敢恭維,不知道其他朋友用的怎么樣。   2、比-價(jià)格   美國(guó)-c42.4 512 80g MD機(jī)房算不錯(cuò) 速度還滿理想的,價(jià)格約為 600-700元RMB 國(guó)際代購(gòu)價(jià)算在內(nèi) 國(guó)內(nèi)市場(chǎng)價(jià)650-900元!   香港-c42.4 512 80g 新世界不錯(cuò),價(jià)格合理,速度現(xiàn)在不是很理想,市場(chǎng)價(jià)約為700-900,國(guó)內(nèi)市場(chǎng)價(jià)900-1500元!   臺(tái)灣-c42.4 512 80g 臺(tái)中的還成,其他的沒(méi)用過(guò),市場(chǎng)價(jià)在1000左右,國(guó)內(nèi)做的價(jià)大概在1500以上,利潤(rùn)滿高的!   韓國(guó)-c42.4 512 80g 市場(chǎng)價(jià)1000-1200左右 國(guó)內(nèi)市場(chǎng)價(jià)1500-1900左右!   加拿大-不熟,不太了解!   3、部分商家推薦   http://www.smartinfo.com.hk/ 香港   http://www.asiahost.com.hk/ 香港的 性價(jià)比不錯(cuò)   http://host.cigi.com.tw 臺(tái)灣   Ipowerweb.com   Globat   Startlogic   MidPhase   Powweb 美國(guó)的 性價(jià)比 不錯(cuò)!   總結(jié):   對(duì)于國(guó)內(nèi)的朋友來(lái)說(shuō),美國(guó)-香港都是不錯(cuò)的選擇!   美國(guó)100M asp+ac+asp.net(50IIS-100IIS) /php+MYSQL+5-10G月流量 市場(chǎng)價(jià)300-600 再貴 利潤(rùn)實(shí)在太高了!   香港價(jià)格和美國(guó)差不錯(cuò)!韓國(guó)臺(tái)灣的價(jià)格會(huì)比較貴點(diǎn)!   站點(diǎn)經(jīng)營(yíng)內(nèi)容選擇:   企業(yè)用戶/個(gè)人用戶   此類用戶建議采用香港,臺(tái)灣的服務(wù)器或是虛擬主機(jī)。為什么不推薦使用美國(guó)? 因?yàn)槊绹?guó)畢竟有時(shí)差,如果是服務(wù)器在美國(guó),日常的維護(hù)會(huì)比較麻煩,而且還有就是溝通上還是有差別,當(dāng)然英語(yǔ)好的,那就不一樣了。   特殊用戶:   如XX,LHC,ZQ之類的客戶,此類客戶是非常的多,最常用的是 香港,但是香港IP少,而且封的也快。美國(guó)也是很不錯(cuò)的選擇,美國(guó)有的機(jī)房速度也很快,但是好的機(jī)房?jī)r(jià)格又要比普通機(jī)房的價(jià)格貴1-1。5倍。但是美國(guó)優(yōu)勢(shì)在于IP多,(下面會(huì)再舉例選購(gòu)的誤區(qū)! ) 臺(tái)灣,臺(tái)灣其實(shí)也滿快的,但是價(jià)格和流量 是一個(gè)很大的屏障!   推薦 香港新世界/城市電信 (注意選擇IP段) 美國(guó)!   選購(gòu)誤區(qū):   1、現(xiàn)在市場(chǎng)上美國(guó)服務(wù)器都標(biāo) 10個(gè)IP,注意,大家購(gòu)買的時(shí)候要問(wèn)清楚,是如何分配法。   美國(guó)機(jī)房現(xiàn)在開(kāi)始抓IP,經(jīng)??吹降腎P分配為1+9 4+6 等。   注意,并不是網(wǎng)站上標(biāo)明10個(gè)IP,就是一次性給你10條,而是第1次 可能給你1條,之后9條需要申請(qǐng),但是申請(qǐng)了未必就是給你9條,有可能2條,3條這樣。 目前比較明顯的就是 美國(guó)的MD機(jī)房。   2、香港獨(dú)享帶寬   香港目前有2家以上提供每臺(tái)服務(wù)器獨(dú)享2M帶寬。 這里的2M是每秒2M,并且,根據(jù)不同商家,限制是不同的。   有的商家是限制2M,超過(guò)了就不行,有的說(shuō)是2M,但是實(shí)際用起來(lái)有的超過(guò)4M。(我有個(gè)客戶就是做代理服務(wù)器的,之前和我合作的是一家香港公司,他們之前柜子機(jī)子少,所以當(dāng)時(shí)客戶能跑到4M左右,沒(méi)做限制。)基本上2M獨(dú)享 大多商家還是有限制的?。?! 但是,不要拿國(guó)內(nèi)的10M和香港的2M對(duì)比, 可以說(shuō),香港城市的2M獨(dú)享 效果要比國(guó)內(nèi)10M效果來(lái)的好,國(guó)內(nèi)10M保證那些都是文字游戲,BS。 而且香港城市電信提供的帶寬,國(guó)內(nèi)無(wú)論電信,網(wǎng)通,鐵通 訪問(wèn)都特別的快。(這里拿出個(gè)自用服務(wù)器給大家測(cè)試203.186.128.225 ,)注意,同個(gè)機(jī)房不同的路由,不同的帶寬接入 還是有差別!!!
    本文的討論也很精彩,瀏覽討論>>


    JavaEye推薦



    posted @ 2008-08-18 17:04 beauty9235 閱讀(74) | 評(píng)論 (0)編輯 收藏


    作者: beauty9235  鏈接:http://beauty9235.javaeye.com/blog/229634  發(fā)表時(shí)間: 2008年06月23日

    聲明:本文系JavaEye網(wǎng)站發(fā)布的原創(chuàng)博客文章,未經(jīng)作者書(shū)面許可,嚴(yán)禁任何網(wǎng)站轉(zhuǎn)載本文,否則必將追究法律責(zé)任!

     

    其于window系統(tǒng)的同步實(shí)戰(zhàn)

    1. 遠(yuǎn)程數(shù)據(jù)同步工具Rsync介紹

    1.1 軟件簡(jiǎn)介

     

    Rsync是一個(gè)遠(yuǎn)程數(shù)據(jù)同步工具,可通過(guò)LAN/WAN快速同步多臺(tái)主機(jī)間的文件。Rsync本來(lái)是用以取代rcp的一個(gè)工具,它當(dāng)前由 rsync.samba.org維護(hù)。Rsync使用所謂的“Rsync演算法”來(lái)使本地和遠(yuǎn)程兩個(gè)主機(jī)之間的文件達(dá)到同步,這個(gè)算法只傳送兩個(gè)文件的不同部分,而不是每次都整份傳送,因此速度相當(dāng)快。運(yùn)行Rsync server的機(jī)器也叫backup server,一個(gè)Rsync server可同時(shí)備份多個(gè)client的數(shù)據(jù);也可以多個(gè)Rsync server備份一個(gè)client的數(shù)據(jù)。

     

      Rsync可以搭配rshssh甚至使用daemon模式。Rsync server會(huì)打開(kāi)一個(gè)873的服務(wù)通道(port),等待對(duì)方Rsync連接。連接時(shí),Rsync server會(huì)檢查口令是否相符,若通過(guò)口令查核,則可以開(kāi)始進(jìn)行文件傳輸。第一次連通完成時(shí),會(huì)把整份文件傳輸一次,下一次就只傳送二個(gè)文件之間不同的部份。

     

      Rsync支持大多數(shù)的類Unix系統(tǒng),無(wú)論是Linux、Solaris還是BSD上都經(jīng)過(guò)了良好的測(cè)試。此外,它在windows平臺(tái)下也有相應(yīng)的版本,比較知名的有cwRsyncSync2NAS。

     

      Rsync的基本特點(diǎn)如下:

     

      1.可以鏡像保存整個(gè)目錄樹(shù)和文件系統(tǒng);

     

      2.可以很容易做到保持原來(lái)文件的權(quán)限、時(shí)間、軟硬鏈接等;

     

      3.無(wú)須特殊權(quán)限即可安裝;

     

      4.優(yōu)化的流程,文件傳輸效率高;

     

      5.可以使用rcpssh等方式來(lái)傳輸文件,當(dāng)然也可以通過(guò)直接的socket連接;

     

    6.支持匿名傳輸。

     

     

     

    1.2 核心算法

     

      假定在名為αβ的兩臺(tái)計(jì)算機(jī)之間同步相似的文件AB,其中α對(duì)文件A擁有訪問(wèn)權(quán),β對(duì)文件B擁有訪問(wèn)權(quán)。并且假定主機(jī)αβ之間的網(wǎng)絡(luò)帶寬很小。那么rsync算法將通過(guò)下面的五個(gè)步驟來(lái)完成:

     

      1.β將文件B分割成一組不重疊的固定大小為S字節(jié)的數(shù)據(jù)塊。最后一塊可能會(huì)比S 小。

     

      2.β對(duì)每一個(gè)分割好的數(shù)據(jù)塊執(zhí)行兩種校驗(yàn):一種是32位的滾動(dòng)弱校驗(yàn),另一種是128位的MD4強(qiáng)校驗(yàn)。

     

      3.β將這些校驗(yàn)結(jié)果發(fā)給α

     

      4.α通過(guò)搜索文件A的所有大小為S的數(shù)據(jù)塊(偏移量可以任選,不一定非要是S的倍數(shù)),來(lái)尋找與文件B的某一塊有著相同的弱校驗(yàn)碼和強(qiáng)校驗(yàn)碼的數(shù)據(jù)塊。這項(xiàng)工作可以借助滾動(dòng)校驗(yàn)的特性很快完成。

     

      5.α發(fā)給β一串指令來(lái)生成文件Aβ上的備份。這里的每一條指令要么是對(duì)文件B經(jīng)擁有某一個(gè)數(shù)據(jù)塊而不須重傳的證明,要么是一個(gè)數(shù)據(jù)塊,這個(gè)數(shù)據(jù)塊肯定是沒(méi)有與文件B的任何一個(gè)數(shù)據(jù)塊匹配上的。

     

     

     

    1.3 命令語(yǔ)法

     

     rsync的命令格式可以為以下六種:

     

      rsync [OPTION]... SRC DEST

     

      rsync [OPTION]... SRC [USER@]HOST:DEST

     

      rsync [OPTION]... [USER@]HOST:SRC DEST

     

      rsync [OPTION]... [USER@]HOST::SRC DEST

     

      rsync [OPTION]... SRC [USER@]HOST::DEST

     

      rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

     

      對(duì)應(yīng)于以上六種命令格式,rsync有六種不同的工作模式:

     

      1)拷貝本地文件。當(dāng)SRCDES路徑信息都不包含有單個(gè)冒號(hào)":"分隔符時(shí)就啟動(dòng)這種工作模式。

     

      2)使用一個(gè)遠(yuǎn)程shell程序(rsh、ssh)來(lái)實(shí)現(xiàn)將本地機(jī)器的內(nèi)容拷貝到遠(yuǎn)程機(jī)器。當(dāng)DST路徑地址包含單個(gè)冒號(hào)":"分隔符時(shí)啟動(dòng)該模式。

     

      3)使用一個(gè)遠(yuǎn)程shell程序(rsh、ssh)來(lái)實(shí)現(xiàn)將遠(yuǎn)程機(jī)器的內(nèi)容拷貝到本地機(jī)器。當(dāng)SRC地址路徑包含單個(gè)冒號(hào)":"分隔符時(shí)啟動(dòng)該模式。

     

      4)從遠(yuǎn)程rsync服務(wù)器中拷貝文件到本地機(jī)。當(dāng)SRC路徑信息包含"::"分隔符時(shí)啟動(dòng)該模式。

     

      5)從本地機(jī)器拷貝文件到遠(yuǎn)程rsync服務(wù)器中。當(dāng)DST路徑信息包含"::"分隔符時(shí)啟動(dòng)該模式。

     

      6)列遠(yuǎn)程機(jī)的文件列表。這類似于rsync傳輸,不過(guò)只要在命令中省略掉本地機(jī)信息即可。

     

    主服務(wù)器

    IP 192.168.0.100

    F:/data/www

    備份服務(wù)器

    IP 192.168.0.101

    F:/data/www

    實(shí)戰(zhàn):

    1http://rsync.samba.org/ 下載cwRsync客戶端(cwRsync)和服務(wù)器端(cwRsyncServer)。

     

    2、服務(wù)器端安裝:采用默認(rèn)選項(xiàng)安裝。

    安裝后,服務(wù)默認(rèn)為手動(dòng)啟動(dòng)模式,到“管理工具/服務(wù)管理”里,啟動(dòng)“RsyncServer”服務(wù),并修改“RsyncServer”為自動(dòng)啟動(dòng)模式。

     

    1、http://rsync.samba.org/ 下載cwRsync客戶端(cwRsync)和服務(wù)器端(cwRsyncServer)。

     

    安裝的過(guò)程很簡(jiǎn)單,也很順利,從 cwRsync 網(wǎng)站上下載的 server and client ,都安裝了一下,不過(guò)后來(lái)發(fā)現(xiàn),其實(shí)是不需要安裝 client 的,只要 server 就可以了,server 包括了 client 的功能。安裝完 server 后,會(huì)在 service 中增加 Rsync ssh 服務(wù)。

     

    服務(wù)器端安裝:采用默認(rèn)選項(xiàng)安裝。

     

    安裝后,服務(wù)默認(rèn)為手動(dòng)啟動(dòng)模式,到“管理工具/服務(wù)管理”里,啟動(dòng)“RsyncServer”服務(wù),并修改“RsyncServer”為自動(dòng)啟動(dòng)模式

     

    2、配置主服務(wù)器

    配置了一下 rsyncd.conf

     

    use chroot = false

    strict modes = false

    hosts allow = *

    log file = rsyncd.log

    pid file = rsyncd.pid

     

    # Module definitions

    # Remember cygwin naming conventions : c:\work becomes /cygwin/c/work

    #

    [test]

    path = /cygdrive/c/work

    read only = false

    transfer logging = yes

     

    只是將 [test] 中的 path 改成了我本機(jī)的備份目錄

     

    [www]

    path = /cygdrive/F/data/www

    read only = false

    transfer logging = yes

     

    3、備分服務(wù)器數(shù)據(jù)同步

     

    因?yàn)橹皇亲詈?jiǎn)單的數(shù)據(jù)同步,所以就不使用 ssh 了,直接啟動(dòng) rsync 服務(wù)就可以了。然后按照 usage 上面教的。

     

    rsync -av /cygdrive/F/data/www 192.168.0.100::www

     

    完成了數(shù)據(jù)的同步工作,一切順利。順便說(shuō)一下,/cygdrive/d 是安裝完 cwRsync ,會(huì)自動(dòng)將系統(tǒng)上所有的盤 mount /cygdrive/x x 表示盤符,小寫(xiě)的,并把安裝目錄 mount / 了。

    這樣我們實(shí)現(xiàn)了從主服務(wù)器到備分服務(wù)器的數(shù)據(jù)同步

     

    下一步我們結(jié)合windows的任務(wù)調(diào)度來(lái)實(shí)現(xiàn)這個(gè)批處理文件,取名為XXX.cmd

    rsync -avr --ignore-errors --force 192.168.0.100::www /cygdrive/F/data/wwwroot

    test.bat

    ---------------------------------------------------------------------------------------------

    @echo off set path=%path%;C:\Program Files\cwRsyncServer\bin; date /t >> F:\syn.txt time /t >> F:\syn.txt rsync -avr --ignore-errors --force --exclude="/tmp/" --delete 192.168.0.103::test  /cygdrive/F/temp >>   F:\syn.txt date /t >> F:\syn.txt time /t >> F:\syn.txt echo . echo . echo . remote synchronous over echo . echo .

    rem pause

    ---------------------------------------------------------------------------------------------

     

    linux中安全性說(shuō)明

     

    一:服務(wù)端rsyncd.conf文件配置

    uid = nobody

    gid = nobody

    use chroot = no # 不使用chroot

    max connections = 4 # 最大連接數(shù)為4

    pid file = /var/run/rsyncd.pid

    lock file = /var/run/rsync.lock

    log file = /var/log/rsyncd.log # 日志記錄文件

    [inburst] # 這里是認(rèn)證的模塊名,在client端需要指定

    path = /home/inburst/python/ # 需要做鏡像的目錄

    comment = BACKUP CLIENT IS SOLARIS 8 E250

    ignore errors # 可以忽略一些無(wú)關(guān)的IO錯(cuò)誤

    read only = yes # 只讀

    list = no # 不允許列文件

    hosts allow=172.25.43.57 #允許連接IP

    auth users = inburst # 認(rèn)證的用戶名,如果沒(méi)有這行,則表明是匿名

    secrets file = /etc/inburst.pas # 認(rèn)證文件名

     

    注:

    為安全考慮,在設(shè)置服務(wù)端rsyncd.conf模塊時(shí),最好加上auth users = inburst,secrets file = /etc/inburst.pas,密碼寫(xiě)到一個(gè)文件中inburst.pas

    執(zhí)行命令時(shí):rsync -avrp /test/ [email=inburst@172.25.43.158::test]inburst@172.25.43.158::test[/email] --password-file=inburst.pas

     

    二:客戶端腳本

    rsync -avrp /test/ [email=administrator@172.25.43.58::test]administrator@172.25.43.58::test[/email] --password-file=1234567

    (表示將客戶端test目錄下文件備份到服務(wù)器test模塊下。如果將/test/放后面,表示將服務(wù)器test模塊下目錄備份帶客戶端/test/下。)

    選項(xiàng)說(shuō)明:

    -v, --verbose 詳細(xì)模式輸出

    -q, --quiet 精簡(jiǎn)輸出模式

    -c, --checksum 打開(kāi)校驗(yàn)開(kāi)關(guān),強(qiáng)制對(duì)文件傳輸進(jìn)行校驗(yàn)

    -a, --archive 歸檔模式,表示以遞歸方式傳輸文件,并保持所有文件屬性,等于-rlptgoD

    -r, --recursive 對(duì)子目錄以遞歸模式處理

    -R, --relative 使用相對(duì)路徑信息

    其他參數(shù)可以查看rsync相關(guān)手冊(cè)。

     

     


    本文的討論也很精彩,瀏覽討論>>


    JavaEye推薦



    posted @ 2008-08-18 17:04 beauty9235 閱讀(468) | 評(píng)論 (0)編輯 收藏


    作者: beauty9235  鏈接:http://beauty9235.javaeye.com/blog/229632  發(fā)表時(shí)間: 2008年07月04日

    聲明:本文系JavaEye網(wǎng)站發(fā)布的原創(chuàng)博客文章,未經(jīng)作者書(shū)面許可,嚴(yán)禁任何網(wǎng)站轉(zhuǎn)載本文,否則必將追究法律責(zé)任!

    dwr動(dòng)態(tài)載入小結(jié)

    筆記在實(shí)際開(kāi)發(fā)中用到dwr框架,一直以來(lái),常為加載中提示用戶等待這問(wèn)題困擾,經(jīng)筆者研究,摸索出一個(gè)切實(shí)可行的方案,供大家參考。 實(shí)例如下: <a style="cursor:hand"  onclick="changeStatus(this);Test.invoke('${parameters}','${pageId}',callBack);"><img src='/icon.gif'></a> 函數(shù)說(shuō)明: changeStatus我們將用來(lái)改變提示狀態(tài)值 Test類的invoke函數(shù)將觸發(fā)從臺(tái)數(shù)據(jù)庫(kù)取出值 然后通過(guò)回調(diào)函數(shù)callBack負(fù)責(zé)在頁(yè)面顯示出來(lái)

    頁(yè)面配置

    <script type='text/javascript' src='/dwr/interface/Test.js'></script>
    
    <script type='text/javascript' src='/dwr/engine.js'></script>
    
    <script type='text/javascript' src='/dwr/util.js'></script>
    
    <script type='text/javascript' src="/js/prototype-1.4.0.js"></script>

     

    dwr.xml

    <!DOCTYPE dwr PUBLIC
    
            "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
    
            "http://www.getahead.ltd.uk/dwr/dwr10.dtd">
    
    <dwr>
    
        <allow>
    
    	   <create creator="new" javascript="Test">
    
                <param name="class" value="pakage.Test"/>
    
            </create>
    
            <convert converter="bean" match="pakage.Test"/>
    
        </allow>
    
    </dwr>
    回調(diào)函數(shù)
    var callBack=function(data){
    
            var pageId=data.pageId;
    
            var list=data.listEntityBean;
    
            if ($(pageId).style.display == "none") {
    
                $(pageId).style.display="block";
    
                var htmlStr = "";
    
                for (var i = 0; i < list.length; i++) { 
    
                    htmlStr +=...//這里是將list中的值取出來(lái)給一個(gè)字符串
    
                }
    
                $(pageId).innerHTML = htmlStr;
    
                return;
    
            }
    
            $(pageId).style.display="none";
    
        }
    pakage.Test類
    public class Test  {
    
        private String pageId;
    
    	private List list;
    
        public String getPageId() {
    
            return pageId;
    
        }
    
    
    
        public void setPageId(String pageId) {
    
            this.pageId = pageId;
    
        }
    
    	public String getList() {
    
            return list;
    
        }
    
    
    
        public void setList(List list) {
    
            this.list = list;
    
        }
    
       static Log log= LogFactory.getLog(Test.class);	
    
       public void invoke(String parameter,String pageId){
    
          this.setPageId(pageId);
    
    	  this.list=...//這里根據(jù)參數(shù)從數(shù)據(jù)庫(kù)里取出值來(lái)
    
    	  return this;
    
       }
    至些我們完成的dwr的編寫(xiě)。
    function changeStatus(obj){
    
        var htmlStr = "";
    
        var oPopup = window.createPopup();
    
        DWREngine.setPreHook(function() {     //這是正在加載的代碼
    
            htmlStr = "<img src=\"/loading.gif\">";
    
            obj.innerHTML = htmlStr;//這里是改變傳入對(duì)象的值,是dwr正在加載時(shí)的提示,如loading,我這里是用的是圖片
    
            var oPopupBody = oPopup.document.body;
    
            oPopupBody.innerHTML = "<img src='/admin/images/spinner.gif'>";
    
            oPopup.show((Math.abs(Math.round((document.body.clientWidth-50) / 2))), Math.abs(Math.round((document.body.clientHeight-50)/ 2)), 100, 100, document.body);
    
        });
    
        DWREngine.setPostHook(function() {    //這是加載完成的代碼
    
            htmlStr = "<img src=\"/loadok.gif\">";//這里是改變傳入對(duì)象的值,是dwr加載時(shí)完成的提示,如load ok,我這里是用的是圖片
    
            obj.innerHTML = htmlStr;
    
            oPopup.hide();
    
        });
    
    }   
    
    
    以上代碼,是我在項(xiàng)目中抽取出來(lái)的一部份。
    小說(shuō)明一下:
    var oPopup = window.createPopup();這個(gè)函數(shù)用于創(chuàng)建浮動(dòng)頁(yè)面的loading載入提示,加載完成后將對(duì)象進(jìn)行oPopup隱藏處理oPopup.hide();
    如果不須要,changeStatus這個(gè)函數(shù)完全可以這樣寫(xiě)
    function changeStatus(obj){
    
        DWREngine.setPreHook(function() {     //這是正在加載的代碼
    
            obj.innerHTML = "<img src=\"/loading.gif\">";//這里是改變傳入對(duì)象的值,是dwr正在加載時(shí)的提示,如loading,我這里是用的是圖片
    
        });
    
        DWREngine.setPostHook(function() {    //這是加載完成的代碼
    
            obj.innerHTML = "<img src=\"/loadok.gif\">";//這里是改變傳入對(duì)象的值,是dwr加載時(shí)完成的提示,如load ok,我這里是用的是圖片
    
        });
    
    } 
    至此我們完美的完成了dwr加載時(shí)的提示問(wèn)題,這樣也使用戶體更強(qiáng),更具人性化.

    本文的討論也很精彩,瀏覽討論>>


    JavaEye推薦



    posted @ 2008-08-18 17:04 beauty9235 閱讀(232) | 評(píng)論 (0)編輯 收藏


    作者: beauty9235  鏈接:http://beauty9235.javaeye.com/blog/229631  發(fā)表時(shí)間: 2008年07月17日

    聲明:本文系JavaEye網(wǎng)站發(fā)布的原創(chuàng)博客文章,未經(jīng)作者書(shū)面許可,嚴(yán)禁任何網(wǎng)站轉(zhuǎn)載本文,否則必將追究法律責(zé)任!

    linux 與adsl 共享上網(wǎng)
    真實(shí)機(jī)系統(tǒng)為windows xp,使用adsl撥號(hào)上網(wǎng),虛擬機(jī)安裝linux,有一塊網(wǎng)卡,使用橋接模式。

    實(shí)現(xiàn)環(huán)境:

      1、在windows下,啟用ICS。

      選擇adsl上網(wǎng)撥號(hào)后的連接,屬性->高級(jí)->Internet連接共享->勾選“允許其他網(wǎng)絡(luò)用戶通過(guò)此計(jì)算機(jī)的internet連接共享”,家庭網(wǎng)絡(luò)連接選“本地連接”。

      2、在linux下,配置靜態(tài)IP。

      點(diǎn)主菜單->系統(tǒng)設(shè)置->網(wǎng)絡(luò),彈出“網(wǎng)絡(luò)配置”,雙擊eth0,勾選“靜態(tài)設(shè)置的ip地址”,

      地址:192.168.0.2 (除192.168.0.1和255外,隨便填)

      子網(wǎng)掩碼: 255.255.255.0

      網(wǎng)關(guān):192.168.0.1

      確定

      DNS項(xiàng),主DNS填:192.168.0.1

      都填完,記得保存。

     ?。?、重起服務(wù)

      service network restart 或者重啟linux。

      4、現(xiàn)在ping 一下 google.cn 看看,如果通就ok了


    本文的討論也很精彩,瀏覽討論>>


    JavaEye推薦



    posted @ 2008-08-18 17:04 beauty9235 閱讀(85) | 評(píng)論 (0)編輯 收藏


    作者: beauty9235  鏈接:http://beauty9235.javaeye.com/blog/229629  發(fā)表時(shí)間: 2008年07月21日

    聲明:本文系JavaEye網(wǎng)站發(fā)布的原創(chuàng)博客文章,未經(jīng)作者書(shū)面許可,嚴(yán)禁任何網(wǎng)站轉(zhuǎn)載本文,否則必將追究法律責(zé)任!

    最近由于公司要求開(kāi)發(fā)一個(gè)小小的插件,用來(lái)改變文件名字
    簡(jiǎn)單的說(shuō),就是讀取一個(gè)csv文件,里面只有兩列
    如:test.csv
    "OldName","NewName"
    "test1.eps","1.eps"
    "test2.eps","2.eps"
    "test3.tif","3.eps"
    然后用戶通過(guò)界面選擇csv文件,選擇源文件目錄,選擇目的文件目錄,選好再按一個(gè)鍵對(duì)原來(lái)文件按新的文件名輸出。

    我開(kāi)始拿到蒙了,因?yàn)樽约簺](méi)有搞過(guò)呀,經(jīng)過(guò)查資料,自己研究,搞定。
    下面開(kāi)始我們的實(shí)戰(zhàn)吧。

    工欲善其事,必須利其器

    首選搭建好開(kāi)發(fā)環(huán)境。

    1.安裝MyEclipse 6.0
    2.安裝打包工具
       net.sf.fjep.fatjar_0.0.27.zip
       我是解壓到 MyEclipse 6.0\fjep\eclipse\plugins
        在MyEclipse 6.0\eclipse\links
     建fjep.link 里,添加 path=C:\\Program Files\\MyEclipse 6.0\\fjep
    3.重啟myeclipse
     我們的開(kāi)發(fā)環(huán)境就搞定啦
     重啟后Window->Preferences可以看到 Fat Jar Preferences
        說(shuō)明你安裝成功
     
    下面開(kāi)始我們的項(xiàng)目
    1.新建Plug-in Project名字自己取Demo
      建好后可以看到結(jié)構(gòu)Demo --src
                             --bin
    2.新建log4j.properties
     log4j.rootLogger=DEBUG, stdout
     log4j.appender.stdout=org.apache.log4j.ConsoleAppender
     log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
     log4j.appender.stdout.layout.ConversionPattern=%c{1} - %m%n
     log4j.logger.java.sql.PreparedStatement=DEBUG
    3.新建cvs.properties  
        csv.field.key=OldName, NewName
    4.編輯NewRenamer.java


    import java.io.File;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;

    import org.apache.commons.configuration.Configuration;
    import org.apache.commons.configuration.PropertiesConfiguration;
    import org.apache.commons.io.FileUtils;
    import org.apache.commons.lang.StringUtils;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.custom.CLabel;
    import org.eclipse.swt.graphics.Color;
    import org.eclipse.swt.graphics.Point;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.DirectoryDialog;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.FileDialog;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Table;
    import org.eclipse.swt.widgets.TableColumn;
    import org.eclipse.swt.widgets.TableItem;
    public class Renamer
    {                                                
     private static final String CVS_PROPERTIES = "cvs.properties";
     
     Log log = LogFactory.getLog(Renamer.class);
     private Shell sShell = null;
     private Button btnSourceDir = null;
     private CLabel labSourceDir = null;
     
     private Button btnDestinationDir = null;
     private CLabel labDestinationDir = null;
     
     private Button btnCSVFile = null;
     private CLabel labCSVFile = null;
     
     String openDirPathFlag = "openDirPath";  //  @jve:decl-index=0:
     private Table tabPreview = null;
     private Button processIt = null;
     
     //private Button restoreIt = null;
     //private Button flashRestore = null;
     int runTime = 1000 * 10;
     
     private void createSShell() {
      GridData gridData = new GridData();
     
      gridData.horizontalSpan = 7;
      gridData.verticalAlignment = GridData.FILL;
     
      gridData.verticalSpan = 3;
      gridData.grabExcessVerticalSpace = true;
      gridData.horizontalAlignment = GridData.FILL;
     
      GridLayout gridLayout = new GridLayout();
      gridLayout.numColumns = 8;
     
      sShell = new Shell();
      sShell.setText("Shell");
      sShell.setLayout(gridLayout);
      sShell.setSize(new Point(800, 500));
     
     
      btnCSVFile = new Button(sShell, SWT.NONE);
      btnCSVFile.setText("CSV");
      btnCSVFile.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
       public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
        //清掉以前的顯示結(jié)果
        tabPreview.removeAll();
        //path part
        String openDirPath = (String)btnCSVFile.getData(openDirPathFlag);
        FileDialog dd = new FileDialog(sShell, SWT.NONE);//用來(lái)顯示一個(gè)目錄對(duì)話
        dd.setFilterPath(openDirPath);
        dd.setText("CVS file");
        String cvsPath = dd.open();
        cvsPath = cvsPath == null ? "" : cvsPath;
        btnCSVFile.setData(openDirPathFlag,cvsPath);
           labCSVFile.setText(cvsPath);
           if(StringUtils.isEmpty(cvsPath)) return;
         //得到csv文件
       
        String csvDir=StringUtils.substringBeforeLast(cvsPath, "\\");
        String csvFileName=StringUtils.substringAfterLast(cvsPath, "\\");
        String csvFileNameNotSuffix=StringUtils.replace(csvFileName, ".csv", "");
        log.debug(csvDir);
        log.debug(csvFileNameNotSuffix);
        try {
         Configuration config = new PropertiesConfiguration(CVS_PROPERTIES);
         String[] aryFields = config.getStringArray("csv.field.key"); 
        
         // 加載驅(qū)動(dòng)
         Class.forName("org.relique.jdbc.csv.CsvDriver");

         // 定位文件夾位置

         Connection conn = DriverManager
           .getConnection("jdbc:relique:csv:"+csvDir);

         Statement stmt = conn.createStatement();

         // 注意 csvFileNameNotSuffix 就是cvs文件
        
         ResultSet results = stmt
           .executeQuery("SELECT * FROM "+csvFileNameNotSuffix);

         while (results.next()) {
          String showname = results.getString(aryFields[0]);
                String destName = results.getString(aryFields[1]);
                TableItem item = new TableItem(tabPreview, SWT.NONE);
                item.setText(0,showname);
             TabItemData itemData = new TabItemData(cvsPath,"",showname,"",destName);
             item.setData("itemData",itemData);
                item.setText(1,destName); 
         }
         results.close();
         stmt.close();
         conn.close();

        } catch (Exception e1) {

         log.debug(e1);
        }

       }
      });
      labCSVFile = new CLabel(sShell, SWT.NONE);
      labCSVFile.setText("please choose CSV");
     
     
     
     
     
      btnSourceDir = new Button(sShell, SWT.NONE);
      btnSourceDir.setText("source");
      btnSourceDir
      .addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
       public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
        String csvFile = (String)btnCSVFile.getData(openDirPathFlag);
        if(StringUtils.isEmpty(csvFile)) return;//必須先有csv文件

        //path part
        String openDirPath = (String)btnSourceDir.getData(openDirPathFlag);
       
        DirectoryDialog dd = new DirectoryDialog(sShell, SWT.NONE);//用來(lái)顯示一個(gè)目錄對(duì)話
        dd.setFilterPath(openDirPath);
        dd.setText("Souce Dir");
        String sourcePath = dd.open();
        sourcePath = sourcePath == null ? "" : sourcePath;
       
        btnSourceDir.setData(openDirPathFlag,sourcePath);
           labSourceDir.setText(sourcePath);
          
                    int tabLength = tabPreview.getItems().length;
       
        for(int i=0;i<tabLength;i++){
         TableItem item = tabPreview.getItem(i);
        
         TabItemData itemData = (TabItemData)item.getData("itemData");
         itemData.setSourceDir(sourcePath+"\\");//把源目錄加進(jìn)去
        
         item.setData("itemData",itemData);

         System.out.println(i+":" +tabPreview.getItems().length + "\n" + itemData);
         if(new File(itemData.getSourceFilePath()).exists()){
          item.setBackground(new Color( sShell.getDisplay(), 0, 255, 128 ));
         }
        
        }
       
       
       }
      });
     
     
     
      labSourceDir = new CLabel(sShell, SWT.NONE);
      labSourceDir.setText("please choose directory");
     
      btnDestinationDir = new Button(sShell, SWT.NONE);
      btnDestinationDir.setText("destination");
      btnDestinationDir.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
       public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
        String openDirPath = (String)btnDestinationDir.getData(openDirPathFlag);
       
        DirectoryDialog dd = new DirectoryDialog(sShell, SWT.NONE);
        dd.setFilterPath(openDirPath);
        dd.setText("destination dir");
        String path = dd.open();
        btnDestinationDir.setData(openDirPathFlag,path);
        labDestinationDir.setText(path);
       }
      });
      labDestinationDir = new CLabel(sShell, SWT.NONE);
      labDestinationDir.setText("please choose directory");
     
     
     
     
     
     
      processIt = new Button(sShell, SWT.NONE);
      processIt.setText(" process it ");
      processIt.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
       public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
        //得到目的路徑
        String descPath = (String)btnDestinationDir.getData(openDirPathFlag);
        if(StringUtils.isEmpty(descPath)) return;
       
        int tabLength = tabPreview.getItems().length;
        descPath += "\\";
        for(int i=0;i<tabLength;i++){
         TableItem item = tabPreview.getItem(i);
         TabItemData itemData = (TabItemData)item.getData("itemData");
        
         itemData.setDestinationDir(descPath);
        
         System.out.println(i+":" +tabPreview.getItems().length + "\n" + itemData);
         if(new File(itemData.getSourceFilePath()).exists()){
         try {
          FileUtils.copyFile(new File(itemData.getSourceFilePath()),new File(itemData.getDestinationFilePath()));
          item.setBackground(new Color( sShell.getDisplay(), 184, 109, 109 ));
         } catch (IOException e1) {
          System.out.println("e1:" + e1);
         }
         }
        }
       }
      });
     

      tabPreview = new Table(sShell, SWT.NONE);
      tabPreview.setHeaderVisible(true);
      tabPreview.setLayoutData(gridData);
      tabPreview.setLinesVisible(true);
     
      TableColumn colSource = new TableColumn(tabPreview, SWT.NONE);
      colSource.setWidth(350);
      colSource.setText("source");
     
      TableColumn colDestination = new TableColumn(tabPreview, SWT.NONE);
      colDestination.setWidth(350);
      colDestination.setText("destination");
     
     }
     
     
        public static void main(String[] args)
        {
        
         Display display = Display.getDefault();
         Renamer thisClass = new Renamer();
      thisClass.createSShell();
      thisClass.sShell.open();

      while (!thisClass.sShell.isDisposed()) {
       if (!display.readAndDispatch())
        display.sleep();
      }
      display.dispose();
     
         }
    }

     

    5.編輯BaseObject.java


    import org.apache.commons.lang.builder.HashCodeBuilder;
    import org.apache.commons.lang.builder.ToStringStyle;
    import org.apache.commons.lang.builder.ToStringBuilder;
    import org.apache.commons.lang.builder.EqualsBuilder;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;

    import java.io.Serializable;

    public class BaseObject implements Serializable {

        public static final Log log = LogFactory.getLog(BaseObject.class);

        public String toString() {
            return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
        }

        public boolean equals(Object o) {
            return EqualsBuilder.reflectionEquals(this, o);
        }

        public int hashCode() {
            return HashCodeBuilder.reflectionHashCode(this);
        }


    }
    6.編輯TabItemData.java


    public class TabItemData extends BaseObject{
     String sourceDir = "";
     String csvFile = "";
     String fileInSourceDir = "";
     String destinationDir = "";
     String fileInDestinationDir = "";
     
     
     public TabItemData(String csvFile,String sourceDir,
       String fileInSourceDir,
       String destinationDir,
       String fileInDestinationDir){
      this.csvFile = csvFile;
      this.sourceDir = sourceDir;
      this.fileInSourceDir = fileInSourceDir;
      this.destinationDir = destinationDir;
      this.fileInDestinationDir = fileInDestinationDir;
     
     }
     
     
     public String getCsvFile() {
      return csvFile;
     }

     public void setCsvFile(String csvFile) {
      this.csvFile = csvFile;
     }

     public String getSourceFilePath(){
      return this.getSourceDir() + this.getFileInSourceDir();
     }
     
     public String getDestinationFilePath(){
      return this.getDestinationDir() + this.getFileInDestinationDir();
     }
     
     public String getDestinationDir() {
      return destinationDir;
     }
     public void setDestinationDir(String destinationDir) {
      this.destinationDir = destinationDir;
     }
     public String getFileInDestinationDir() {
      return fileInDestinationDir;
     }
     public void setFileInDestinationDir(String fileInDestinationDir) {
      this.fileInDestinationDir = fileInDestinationDir;
     }
     public String getFileInSourceDir() {
      return fileInSourceDir;
     }
     public void setFileInSourceDir(String fileInSourceDir) {
      this.fileInSourceDir = fileInSourceDir;
     }
     public String getSourceDir() {
      return sourceDir;
     }
     public void setSourceDir(String sourceDir) {
      this.sourceDir = sourceDir;
     }
     
     

    }


    7.上面我們把一切都編好了
      然后選擇項(xiàng)目->右健->Fat jar->選擇main class [NewRenamer] ->finish就生成夾包了
    8.編輯批處理文件 
    run.bat 里面加
    start javaw -jar Demo_fat.jar

    即可運(yùn)行啦

    說(shuō)明:
    jdk 1.42
    這是本項(xiàng)目必須的jar包
    commons-collections-3.0.jar
    commons-configuration-1.5.jar
    commons-io-1.2.jar
    commons-lang-2.4.jar
    commons-logging.jar
    csvjdbc.jar
    log4j-1.2.9.jar

     


    本文的討論也很精彩,瀏覽討論>>


    JavaEye推薦



    posted @ 2008-08-18 17:04 beauty9235 閱讀(139) | 評(píng)論 (0)編輯 收藏


    作者: beauty9235  鏈接:http://beauty9235.javaeye.com/blog/229627  發(fā)表時(shí)間: 2008年07月23日

    聲明:本文系JavaEye網(wǎng)站發(fā)布的原創(chuàng)博客文章,未經(jīng)作者書(shū)面許可,嚴(yán)禁任何網(wǎng)站轉(zhuǎn)載本文,否則必將追究法律責(zé)任!

    import org.eclipse.swt.SWT;
    import org.eclipse.swt.events.PaintEvent;
    import org.eclipse.swt.events.PaintListener;
    import org.eclipse.swt.events.SelectionAdapter;
    import org.eclipse.swt.events.SelectionEvent;
    import org.eclipse.swt.graphics.Image;
    import org.eclipse.swt.layout.FormAttachment;
    import org.eclipse.swt.layout.FormData;
    import org.eclipse.swt.layout.FormLayout;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Canvas;
    import org.eclipse.swt.widgets.Combo;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.FileDialog;
    import org.eclipse.swt.widgets.Group;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.List;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Text;
    
    public class DogShowRegistrationWindow {
    	/*
    	 * 參考文章
    	 * http://www.eclipse.org/articles/article.php?file=Article-Understanding-Layouts/index.html
    	 * http://www.ibm.com/developerworks/cn/linux/opensource/os-ecgui1/index.html
    	 * http://www.ibm.com/developerworks/cn/linux/opensource/os-ecgui2/index.html
    	 * http://www.ibm.com/developerworks/cn/linux/opensource/os-ecgui3/index.html
    	 * http://www-128.ibm.com/developerworks/cn/opensource/os-swingswt/
    	 * http://www.tkk7.com/fortune/archive/2006/03/09/34463.html
    	 */	
    	Image dogImage;
    	Text dogNameText;
    	Combo dogBreedCombo;
    	Canvas dogPhoto;
    	List categories;
    	Text nameText;
    	Text phoneText;
    
    	public static void main(String[] args) {
    		Display display = new Display();
    		Shell shell = new DogShowRegistrationWindow().createShell(display);
    		shell.open();
    		while (!shell.isDisposed()) {
    			if (!display.readAndDispatch())
    				display.sleep();
    		}
    	}
    	
    	public Shell createShell(final Display display) {
    		final Shell shell = new Shell(display);//通用窗口 
    		FormLayout layout = new FormLayout();//布局管理器 
    		layout.marginWidth = 5;
    		layout.marginHeight = 5;
    		shell.setLayout(layout);
    		shell.setText("Dog Show Entry");
    	    //****************************定義布局所要用的資源開(kāi)始****************************
    		//定義dog name標(biāo)簽
    		Label dogName = new Label(shell, SWT.NONE);//顯示靜態(tài)文本 
    		dogName.setText("Dog's Name:");
    		//定義dog name的文本輸入框
    		dogNameText = new Text(shell, SWT.SINGLE | SWT.BORDER);//文本輸入 
    		//定義dog greed標(biāo)簽
    		Label dogBreed = new Label(shell, SWT.NONE);
    		dogBreed.setText("Breed:");
    		//定義一個(gè)dog greed多選框
    		dogBreedCombo = new Combo(shell, SWT.NONE);
    		dogBreedCombo.setItems(new String[] { "Collie", "Pitbull", "Poodle","Scottie", "Black Lab" });//從一個(gè)下拉列表中選擇
    		//定義photo標(biāo)簽
    		Label photo = new Label(shell, SWT.NONE);
    		photo.setText("Photo:");
    		//定義photo顯示域
    		dogPhoto = new Canvas(shell, SWT.BORDER);//繪圖區(qū)域;可能用于定制控件 
    		//定義Photo Browse按鈕
    		Button browse = new Button(shell, SWT.PUSH);
    		browse.setText("Browse...");
    		//定義Photo Delete按鈕
    		Button delete = new Button(shell, SWT.PUSH);//簡(jiǎn)單按下具有文本的按鈕 
    		delete.setText("Delete");
    		//定義分類標(biāo)簽
    		Label cats = new Label(shell, SWT.NONE);
    		cats.setText("Categories");
    		//定義分類List
    		categories = new List(shell, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);//從條目列表中進(jìn)行選擇 
    		categories.setItems(new String[] { "Best of Breed", "Prettiest Female",
    				"Handsomest Male", "Best Dressed", "Fluffiest Ears",
    				"Most Colors", "Best Performer", "Loudest Bark",
    				"Best Behaved", "Prettiest Eyes", "Most Hair", "Longest Tail",
    				"Cutest Trick" });
    		//定義一個(gè)組
    		Group ownerInfo = new Group(shell, SWT.NONE);//其他控件的有邊界和標(biāo)題的通用容器 
    		ownerInfo.setText("Owner Info");
    		FormLayout ownerLayout = new FormLayout();//布局管理器 
    		ownerLayout.marginWidth = 5;
    		ownerLayout.marginHeight = 5;
    		ownerInfo.setLayout(ownerLayout);
    		
    		//定義Enter按鈕
    		Button enter = new Button(shell, SWT.PUSH);
    		enter.setText("Enter");
    		//****************************定義布局所要用的資源結(jié)束****************************
    		FormData data = new FormData();
    		data.top = new FormAttachment(dogNameText, 0, SWT.CENTER);
    		dogName.setLayoutData(data);//定義dogName與dogNameText的中心位置對(duì)齊
    		
    		data = new FormData();
    		data.left = new FormAttachment(dogName, 5);
    		data.right = new FormAttachment(100, 0);
    		dogNameText.setLayoutData(data);//定義dogNameText左邊距dogName5個(gè)點(diǎn)數(shù)的偏移  右邊100%填充
    		
    		data = new FormData();
    		data.top = new FormAttachment(dogBreedCombo, 0, SWT.CENTER);
    		dogBreed.setLayoutData(data);
    		//定義dogBreed項(xiàng)部距dogBreedCombo 0個(gè)點(diǎn)數(shù)的偏移 與dogBreedCombo標(biāo)簽的中心位置對(duì)齊 
    		
    		data = new FormData();
    		data.top = new FormAttachment(dogNameText, 5);
    		data.left = new FormAttachment(dogNameText, 0, SWT.LEFT);
    		data.right = new FormAttachment(categories, -5);
    		dogBreedCombo.setLayoutData(data);
    		//定義dogBreedCombo項(xiàng)部距dogNameText 5個(gè)點(diǎn)數(shù)的偏移
    		//定義dogBreedCombo左邊與 dogNameText的左邊對(duì)齊
    		//定義dogBreedCombo右邊距 categories左邊5個(gè)點(diǎn)數(shù)的偏移
    		
    		data = new FormData(80, 80);
    		data.top = new FormAttachment(dogBreedCombo, 5);
    		data.left = new FormAttachment(dogNameText, 0, SWT.LEFT);
    		data.right = new FormAttachment(categories, -5);
    		data.bottom = new FormAttachment(ownerInfo, -5);
    		dogPhoto.setLayoutData(data);
    		//定義dogPhoto大小為80X80
    		//定義dogPhoto頂邊與dogBreedCombo底邊點(diǎn)數(shù)的偏移
    		//定義dogPhoto左邊與dogNameText左邊對(duì)齊
    		//定義dogPhoto右邊距categories 5個(gè)點(diǎn)數(shù)的偏移
    		//定義dogPhoto底邊距ownerInfo 5個(gè)點(diǎn)數(shù)的偏移
    		dogPhoto.addPaintListener(new PaintListener() {
    			public void paintControl(final PaintEvent event) {
    				if (dogImage != null) {
    					event.gc.drawImage(dogImage, 0, 0);
    				}
    			}
    		});
    		
    		data = new FormData();
    		data.top = new FormAttachment(dogPhoto,0, SWT.TOP);
    		photo.setLayoutData(data);
    		//定義photo頂邊與 dogPhoto的頂邊對(duì)齊
    		
    		data = new FormData();
    		data.top = new FormAttachment(photo, 5);
    		data.right = new FormAttachment(dogPhoto, -5);
    		browse.setLayoutData(data);
    		//定義photo頂邊距 photo 5個(gè)點(diǎn)數(shù)的偏移
    		//定義photo右邊距 dogPhoto 5個(gè)點(diǎn)數(shù)的偏移
    		browse.addSelectionListener(new SelectionAdapter() {
    			public void widgetSelected(SelectionEvent event) {
    				String fileName = new FileDialog(shell).open();//用來(lái)顯示一個(gè)文件對(duì)話
    				if (fileName != null) {
    					dogImage = new Image(display, fileName);
    				}
    			}
    		});
    		
    		data = new FormData();
    		data.top = new FormAttachment(browse, 5);
    		data.left = new FormAttachment(browse, 0, SWT.LEFT);
    		data.right = new FormAttachment(dogPhoto, -5);
    		delete.setLayoutData(data);
    		//定義delete頂邊距 browse 5個(gè)點(diǎn)數(shù)的偏移
    		//定義delete左邊與 browse 左邊對(duì)齊
    		//定義delete右邊距 dogPhoto 5個(gè)點(diǎn)數(shù)的偏移
    		delete.addSelectionListener(new SelectionAdapter() {
    			public void widgetSelected(SelectionEvent event) {
    				if (dogImage != null) {
    					dogImage.dispose();
    					dogImage = null;
    					dogPhoto.redraw();
    				}
    			}
    		});
    		
    		data = new FormData(90, 140);
    		data.top = new FormAttachment(dogPhoto, 0, SWT.TOP);
    		data.right = new FormAttachment(100, 0);
    		data.bottom = new FormAttachment(enter, -5);
    		categories.setLayoutData(data);
    		//定義categories頂邊與 dogPhoto的頂邊對(duì)齊
    		//定義categories右邊100% 填充
    		//定義categories底邊距底邊父組件 5個(gè)點(diǎn)數(shù)的偏移 
    		
    		data = new FormData();
    		data.bottom = new FormAttachment(categories, -5);
    		data.left = new FormAttachment(categories, 0, SWT.CENTER);
    		cats.setLayoutData(data);
    		//定義cats底邊與 categories的底邊 5個(gè)點(diǎn)數(shù)的偏移
    		//定義cats左邊與 categories 的中心對(duì)齊
    		
    		data = new FormData();
    		data.right = new FormAttachment(100, 0);
    		data.bottom = new FormAttachment(100, 0);
    		enter.setLayoutData(data);
    		enter.addSelectionListener(new SelectionAdapter() {
    			public void widgetSelected(SelectionEvent event) {
    				System.out.println("\nDog Name: " + dogNameText.getText());
    				System.out.println("Dog Breed: " + dogBreedCombo.getText());
    				System.out.println("Owner Name: " + nameText.getText());
    				System.out.println("Owner Phone: " + phoneText.getText());
    				System.out.println("Categories:");
    				String cats[] = categories.getSelection();
    				for (int i = 0; i < cats.length; i++) {
    					System.out.println("\t" + cats[i]);
    				}
    			}
    		});
    		
    		data = new FormData();
    		data.bottom = new FormAttachment(enter, -5);
    		data.left = new FormAttachment(0, 0);
    		data.right = new FormAttachment(categories, -5);
    		ownerInfo.setLayoutData(data);
    		
    		Label name = new Label(ownerInfo, SWT.NULL);
    		name.setText("Name:");
    		
    		Label phone = new Label(ownerInfo, SWT.PUSH);
    		phone.setText("Phone:");
    		
    		nameText = new Text(ownerInfo, SWT.SINGLE | SWT.BORDER);
    		phoneText = new Text(ownerInfo, SWT.SINGLE | SWT.BORDER);
    		
    		data = new FormData();
    		data.top = new FormAttachment(nameText, 0, SWT.CENTER);
    		name.setLayoutData(data);
    		
    		data = new FormData();
    		data.top = new FormAttachment(phoneText, 0, SWT.CENTER);
    		phone.setLayoutData(data);
    		
    		data = new FormData();
    		data.left = new FormAttachment(phone, 5);
    		data.right = new FormAttachment(100, 0);
    		nameText.setLayoutData(data);
    		
    		data = new FormData();
    		data.left = new FormAttachment(nameText, 0, SWT.LEFT);
    		data.right = new FormAttachment(100, 0);
    		data.top = new FormAttachment(55, 0);
    		phoneText.setLayoutData(data);
    		
    		shell.pack();
    		
    		return shell;
    	}	
    }
    

    本文的討論也很精彩,瀏覽討論>>


    JavaEye推薦



    posted @ 2008-08-18 17:04 beauty9235 閱讀(222) | 評(píng)論 (0)編輯 收藏


    作者: beauty9235  鏈接:http://beauty9235.javaeye.com/blog/229625  發(fā)表時(shí)間: 2008年08月04日

    聲明:本文系JavaEye網(wǎng)站發(fā)布的原創(chuàng)博客文章,未經(jīng)作者書(shū)面許可,嚴(yán)禁任何網(wǎng)站轉(zhuǎn)載本文,否則必將追究法律責(zé)任!

    swt學(xué)習(xí)小結(jié)
    Widget —— 基本的 SWT GUI 組件
    Control —— 擁有操作系統(tǒng)的對(duì)等物的窗口小部件
    Composite —— 包含其他控件的控件
    Item —— 其他控件包含的窗口小部件(該控件可能不是復(fù)合控件),比如列表和表

    標(biāo)準(zhǔn)的SWT布局類
    FillLayout:在容器中以相同的大小單行或單列的排列組件
    RowLayout:以單行或多行的方式使用幾個(gè)選項(xiàng)(fill,wrap,spacing,justify,type)定制組件的排列方式
    GridLayout:類似于swing的GridLayout的方式以格子的方式排列組件
    FormLayout(SWT 2.0的新特性):通過(guò)定義組件四個(gè)邊的“粘貼”位置來(lái)排列組件,被引用的相對(duì)的組件可以父組件,也可以是同一容器中的其它組件。

    /*
     * 參考文章
     * http://www.eclipse.org/articles/article.php?file=Article-Understanding-Layouts/index.html
     * http://www.ibm.com/developerworks/cn/linux/opensource/os-ecgui1/index.html
     * http://www.ibm.com/developerworks/cn/linux/opensource/os-ecgui2/index.html
     * http://www.ibm.com/developerworks/cn/linux/opensource/os-ecgui3/index.html
     * http://www-128.ibm.com/developerworks/cn/opensource/os-swingswt/
     * http://www.tkk7.com/fortune/archive/2006/03/09/34463.html
     */ 
     
     布局實(shí)施
    1.首先定義窗口和它的空白邊
    Display.getDefault().dispose();  //移去平臺(tái)核心啟動(dòng)畫(huà)面
            display = new Display();
            shell = new Shell(display, SWT.TITLE);
            FormLayout layout = new FormLayout();
            layout.marginHeight = 10;
            layout.marginWidth = 20;
            shell.setLayout(layout);
            shell.setText("用戶登錄");

    2.創(chuàng)建窗口上的元素,其中下面的兩個(gè)button由一個(gè)使用RowLayout的組件來(lái)包容。
            name = new Label(shell, SWT.NONE);
            name.setText("用戶名");
            nameText = new Text(shell, SWT.SINGLE | SWT.BORDER);
            pass = new Label(shell, SWT.NONE);
            pass.setText("密碼");
            passText = new Text(shell, SWT.SINGLE | SWT.BORDER);
            passText.setEchoChar('*');
            passText.setTabs(2);
            bottom = new Composite(shell, SWT.NONE);
            RowLayout rowLayout = new RowLayout();
            rowLayout.justify = true;  //justify定義組件在容器中分散開(kāi),效果類似于swing的FlowLayout
            bottom.setLayout(rowLayout);

    3.定義name標(biāo)簽的位置。它的頂邊離父組件(窗口shell)的空白邊距離是父組件clientArea(除空白邊以外的空間)高度(height)的15%,偏移的點(diǎn)數(shù)(points)為0。
    FormData data = new FormData();
            data.top = new FormAttachment(15, 0);
            name.setLayoutData(data);

    4.定義name文本輸入的位置。它的頂邊在name標(biāo)簽的中心位置(這不是正確的表達(dá),但程序是這樣解釋,事實(shí)上它的中心位置與name標(biāo)簽在同一條水平線上),左邊距name標(biāo)簽的右邊有10個(gè)點(diǎn)。
    data = new FormData();
            data.top = new FormAttachment(name, 0, SWT.CENTER);
            data.left = new FormAttachment(name, 10, SWT.RIGHT);
            nameText.setLayoutData(data);

    5.定義pass標(biāo)簽的位置。它的頂邊距name標(biāo)簽的底邊有10個(gè)點(diǎn)數(shù)的偏移。
    data = new FormData();
            data.top = new FormAttachment(name, 10, SWT.BOTTOM);
            pass.setLayoutData(data);

    6.定義pass文本輸入的位置。它的頂邊在name標(biāo)簽的中心位置(同上),左邊與name文本框的左邊對(duì)齊。
    data = new FormData();
            data.top = new FormAttachment(pass, 0, SWT.CENTER);
            data.left = new FormAttachment(nameText, 0, SWT.LEFT);
            passText.setLayoutData(data);

    7.定義bottom組件的位置。它的頂邊距pass標(biāo)簽的底邊15個(gè)點(diǎn)數(shù),左邊與pass標(biāo)簽的左邊對(duì)齊,右邊與pass文本輸入的右邊對(duì)齊。
            data = new FormData();
            data.top = new FormAttachment(pass, 15, SWT.BOTTOM);
            data.left = new FormAttachment(pass, 0, SWT.LEFT);
            data.right = new FormAttachment(passText, 0, SWT.RIGHT);
            bottom.setLayoutData(data);

    完整的源碼
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.events.SelectionAdapter;
    import org.eclipse.swt.events.SelectionEvent;
    import org.eclipse.swt.graphics.Rectangle;
    import org.eclipse.swt.layout.FormAttachment;
    import org.eclipse.swt.layout.FormData;
    import org.eclipse.swt.layout.FormLayout;
    import org.eclipse.swt.layout.RowLayout;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Composite;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Text;

    import cn.com.efly.clientframe.core.Hook;

    /**
     * @author efly
     * @version 1.0.0,11/22/02
     */
    public final class LoginUI {
        private Display display;
        private Shell shell;
        private Composite bottom;
        private Label name;
        private Label pass;
        private Text nameText;
        private Text passText;
        private Button ok;
        private Button exit;
        private Rectangle clientArea;
        private RootHook rootHook;

        public LoginUI(Hook hook) {
            rootHook = (RootHook) hook;
        }

        /**
         * 顯示登陸界面
         */
        public void show() {
            Display.getDefault().dispose();
            display = new Display();
            clientArea = display.getClientArea();
            shell = new Shell(display, SWT.TITLE);
            FormLayout layout = new FormLayout();
            layout.marginHeight = 10;
            layout.marginWidth = 20;
            shell.setLayout(layout);
            shell.setText("用戶登錄");

            name = new Label(shell, SWT.NONE);
            name.setText("用戶名");
            nameText = new Text(shell, SWT.SINGLE | SWT.BORDER);
            pass = new Label(shell, SWT.NONE);
            pass.setText("密碼");
            passText = new Text(shell, SWT.SINGLE | SWT.BORDER);
            passText.setEchoChar('*');
            passText.setTabs(2);
            bottom = new Composite(shell, SWT.NONE);
            RowLayout rowLayout = new RowLayout();
            rowLayout.justify = true;
            bottom.setLayout(rowLayout);
            ok = new Button(bottom, SWT.PUSH);
            ok.setText("確定");
            ok.addSelectionListener(new SelectionAdapter() {
                public void widgetSelected(SelectionEvent event) {
                    ok();
                }
            });
            exit = new Button(bottom, SWT.PUSH);
            exit.setText("取消");
            exit.addSelectionListener(new SelectionAdapter() {
                public void widgetSelected(SelectionEvent event) {
                    cancel();
                }
            });

            FormData data = new FormData();
            data.top = new FormAttachment(15, 0);
            name.setLayoutData(data);

            data = new FormData();
            data.top = new FormAttachment(name, 0, SWT.CENTER);
            data.left = new FormAttachment(name, 10, SWT.RIGHT);
            nameText.setLayoutData(data);

            data = new FormData();
            data.top = new FormAttachment(name, 10, SWT.BOTTOM);
            pass.setLayoutData(data);

            data = new FormData();
            data.top = new FormAttachment(pass, 0, SWT.CENTER);
            data.left = new FormAttachment(nameText, 0, SWT.LEFT);
            passText.setLayoutData(data);

            data = new FormData();
            data.top = new FormAttachment(pass, 15, SWT.BOTTOM);
            data.left = new FormAttachment(pass, 0, SWT.LEFT);
            data.right = new FormAttachment(passText, 0, SWT.RIGHT);
            bottom.setLayoutData(data);

            shell.pack();
            Rectangle shellBounds = shell.getBounds();
            shell.setLocation(
                (clientArea.width - shellBounds.width) / 2,
                (clientArea.height - shellBounds.height) / 2);

            shell.open();

            while (!shell.isDisposed()) {
                if (!display.readAndDispatch())
                    display.sleep();
            }
        }

        private void dispose() {
            display.dispose();

        }

        private void cancel() {
            dispose();
        }

        private void ok() {
            verify();
        }

        private void verify() {
            rootHook.runPlatform();
        }

            public static void main(String[]){
                    new LoginUI(null).show();
            }
    }


    本文的討論也很精彩,瀏覽討論>>


    JavaEye推薦



    posted @ 2008-08-18 17:04 beauty9235 閱讀(300) | 評(píng)論 (0)編輯 收藏


    作者: beauty9235  鏈接:http://beauty9235.javaeye.com/blog/229622  發(fā)表時(shí)間: 2008年08月08日

    聲明:本文系JavaEye網(wǎng)站發(fā)布的原創(chuàng)博客文章,未經(jīng)作者書(shū)面許可,嚴(yán)禁任何網(wǎng)站轉(zhuǎn)載本文,否則必將追究法律責(zé)任!

    webwork處理編碼webwork.properties 設(shè)置你的缺省 locale和編碼方案
     webwork.locale=en_US
     webwork.i18n.encoding=UTF-8
    如果使用freemarker 還要設(shè)置freemarker.properties
     locale=en_US
     default_encoding=UTF-8
    網(wǎng)頁(yè)上設(shè)置編碼
     1、JSP文件用支持UTF-8的文字編輯器編輯,如EditPlus、UltraEdit,并把原來(lái)ascii轉(zhuǎn)換成utf-8(菜單里有)。
     2、JSP文件頭改成:
     <%@ page contentType="text/html; charset=UTF-8" language="java"  import="java.sql.*"%>
     3、html文件
     <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    數(shù)據(jù)庫(kù)
     1、mysql配置文件:修改mysql在windows\my.ini里default-character-set=utf-8
     2、mysql里數(shù)據(jù)庫(kù)和表也都設(shè)為utf8_unicode_ci
     3、數(shù)據(jù)庫(kù)連結(jié):jdbc:mysql://localhost/mydb?useUnicode=true&characterEncoding=utf-8
    屬性文件 
    native2ascii -encoding UTF8 ApplicationResources_xx.properties ApplicationResources_zh.properties 
    過(guò)濾器
     EncodingFilter.java
      public class EncodingFilter implements Filter {
          public void init(FilterConfig cong) {
        //  do nothing
       }

       public void doFilter(ServletRequest srequest, ServletResponse sresponse,
         FilterChain chain) {
        try{
         //編碼
         srequest.setCharacterEncoding("UTF-8");
         //繼續(xù)請(qǐng)求
         chain.doFilter(srequest, sresponse);
        }catch(Exception e){
         e.printStackTrace();
        }
       }

       public void destroy() {
        //do nothing
       }
      }
     web.xml
     <filter>
      <filter-name>encodingfilter</filter-name>
      <filter-class>fr.simatai.util.application.EncodingFilter</filter-class>
     </filter>
     <filter-mapping>
      <filter-name>encodingfilter</filter-name>
      <url-pattern>/*</url-pattern>
     </filter-mapping> 
    數(shù)據(jù)庫(kù)字符編碼轉(zhuǎn)化(己存在的表)
    ALTER TABLE test CONVERT TO CHARACTER SET UTF8 


    本文的討論也很精彩,瀏覽討論>>


    JavaEye推薦



    posted @ 2008-08-18 17:04 beauty9235 閱讀(102) | 評(píng)論 (0)編輯 收藏

    僅列出標(biāo)題
    共3頁(yè): 上一頁(yè) 1 2 3 下一頁(yè) 
    主站蜘蛛池模板: 亚洲免费二区三区| 一级特级aaaa毛片免费观看| 国产日韩一区二区三免费高清| 无码高潮少妇毛多水多水免费| 国产亚洲精品a在线观看app | 国产日韩一区二区三免费高清| 情侣视频精品免费的国产| 18亚洲男同志videos网站| 精品国产呦系列在线观看免费| 波多野结衣久久高清免费| 亚洲欧洲国产成人精品| 免费看一区二区三区四区| 亚洲AⅤ永久无码精品AA| 亚洲字幕AV一区二区三区四区 | 亚洲av色影在线| 免费人成又黄又爽的视频在线电影| 9久9久女女免费精品视频在线观看| 亚洲电影一区二区三区| 国产精品青草视频免费播放| 国产午夜无码视频免费网站| 亚洲人成综合网站7777香蕉| 13一14周岁毛片免费| 亚洲AV无码一区东京热| 国产日韩在线视频免费播放| 亚洲精品99久久久久中文字幕 | 亚洲人成在线中文字幕| 免费无码一区二区三区| 国产成人无码综合亚洲日韩| 国产精品美女久久久免费| 四虎精品亚洲一区二区三区| 亚洲av无码专区国产不乱码 | 男女超爽刺激视频免费播放| 亚洲今日精彩视频| 最新亚洲成av人免费看| 成人亚洲性情网站WWW在线观看| 男女男精品网站免费观看| 国产一级一片免费播放| 处破女第一次亚洲18分钟| 情侣视频精品免费的国产| 久久亚洲中文字幕无码| 国产精品麻豆免费版|