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

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

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

    隨筆 - 30, 文章 - 0, 評(píng)論 - 9, 引用 - 0
    數(shù)據(jù)加載中……

    2006年11月17日

    提高網(wǎng)站在Google中的排名 ——面向搜索引擎的網(wǎng)站設(shè)計(jì)

    Google排名優(yōu)化-面向搜索引擎的網(wǎng)站設(shè)計(jì)


    內(nèi)容摘要:
    目前中文網(wǎng)站在整個(gè)互聯(lián)網(wǎng)中的影響還比較小,這主要是由于中文網(wǎng)站總體的水平(技術(shù)上,內(nèi)容上)都還相對(duì)落后造成的,最主要的表現(xiàn)有:

    1. 行業(yè)知識(shí):不知道搜索引擎對(duì)吸引的新用戶(hù)的重要性,在搜索引擎排名服務(wù)中追求“傻瓜相關(guān)”,購(gòu)買(mǎi)一些其實(shí)沒(méi)有太多實(shí)際意義的行業(yè)關(guān)鍵詞。其實(shí)能夠用戶(hù)輸入的關(guān)鍵詞越多,其目標(biāo)性越強(qiáng),這樣的客戶(hù)價(jià)值越高。用戶(hù)能夠直接定位到產(chǎn)品具體內(nèi)容頁(yè)比到網(wǎng)站首頁(yè)有價(jià)值的多;
    2. 發(fā)布技術(shù):網(wǎng)站的網(wǎng)頁(yè)進(jìn)入Google的索引量非常小,主要是由于大量使用動(dòng)態(tài)網(wǎng)頁(yè)造成的。需要將動(dòng)態(tài)頁(yè)面鏈接改寫(xiě)成靜態(tài)鏈接;
    3. 頁(yè)面設(shè)計(jì):頁(yè)面標(biāo)題重復(fù),關(guān)鍵詞不突出,過(guò)渡使用JavaScript腳本/圖片/Flash等不適合搜索引擎索引的非文本形式;
    而以上這些問(wèn)題的根本原因還是網(wǎng)站自身缺乏日志統(tǒng)計(jì)分析造成:因此無(wú)法看到SEO對(duì)網(wǎng)站自身產(chǎn)生的巨大影響。

    SEO的目的是通過(guò)一些簡(jiǎn)單的策略,讓網(wǎng)站自身的水平在互聯(lián)網(wǎng)中有一個(gè)真實(shí)的體現(xiàn)。
    網(wǎng)站結(jié)構(gòu)設(shè)計(jì)中面向搜索引擎的優(yōu)化注意事項(xiàng)包括:

    (注意:本網(wǎng)站設(shè)計(jì)本身就利用了其中一些方法)。

    什么是PageRank

    Google等新一帶搜索引擎的優(yōu)勢(shì)之一在于不僅索引量很大,而且還將最好的結(jié)果排在搜索結(jié)果的最前面,具體的原理可以參考Google の秘密 - PageRank 徹底解説一文,PageRank簡(jiǎn)單的說(shuō)類(lèi)似于科技論文中的引用機(jī)制:誰(shuí)的論文被引用次數(shù)多,誰(shuí)就是權(quán)威。在互聯(lián)網(wǎng)上PageRank就是基于網(wǎng)頁(yè)中相互鏈接關(guān)系的分析得出的。

    此外,從計(jì)算方法角度闡述PageRank機(jī)制還有這篇文章:http://pr.efactory.de/里面有更詳細(xì)的PageRank算法說(shuō)明和各種清晰的小型個(gè)案分析:

    比如:子頁(yè)中導(dǎo)航條的重要性
    B <=> A => C  
    Vs  
    B <=> A <=> C   (好)

    頁(yè)面數(shù)量因素:
    B <=> A <=> C
    Vs
    F <=\   /=> G
    B <=> A <=> C   (好)
    D <=/   \=> E

    一個(gè)意想不到的結(jié)論:
    (B <=> A <=> C)      ( E <=> D <=> F)
    Vs
    (B <=> A <=> C)  <=> ( E <=> D <=> F)
    PageRank升高的只是被鏈接的2個(gè)首頁(yè)A和D,而網(wǎng)站子頁(yè)面的PageRank平均會(huì)略有下降。同時(shí):一個(gè)網(wǎng)站進(jìn)入Google的索引量越大其受類(lèi)似因素影響越小。
    PageRank不對(duì)稱(chēng)的頁(yè)面互鏈:
    Google會(huì)用BadRank之類(lèi)的算法進(jìn)行糾正,而且一個(gè)網(wǎng)頁(yè)著有來(lái)自“與其自身不相稱(chēng)”的高PageRank站點(diǎn)的鏈接,而自身又缺少足夠數(shù)量和質(zhì)量的反相鏈接的話(huà),其PageRank會(huì)自動(dòng)降低為0,A(pr=7) <=> B(pr=0)
    簡(jiǎn)單的說(shuō)就是:偶爾要被權(quán)威站點(diǎn)反相鏈接不算數(shù),要被足夠多的權(quán)威站點(diǎn)引用才能提高自身網(wǎng)頁(yè)的PageRank。
    Web超鏈分析算法綜述(南京大學(xué)論文) 更多論文可以通過(guò)搜索:“filetype:pdf google pagerank anchor text bayesian”得到

    鏈接就是一切

    在互聯(lián)網(wǎng)的海洋中,最重要的就是互聯(lián)互通,不被其他網(wǎng)站引用的網(wǎng)站就是“信息孤島”。“酒好也怕藏的深”,也許這話(huà)說(shuō)起來(lái)有點(diǎn)像垃圾郵件廣告,但事實(shí)就是這樣。所以如果做網(wǎng)站的目的不是孤芳自賞,就需要積極的推廣自己的網(wǎng)站。
    通過(guò)搜索引擎推廣自己需要注意以下幾個(gè)方面:

    1. 以量取勝:不一定加入傳統(tǒng)門(mén)戶(hù)網(wǎng)站的分類(lèi)目錄才是網(wǎng)站推廣,來(lái)自其他網(wǎng)站的任何反相鏈接都是有用的
      網(wǎng)站推廣比較經(jīng)典的方式就是加入比較大型門(mén)戶(hù)網(wǎng)站的分類(lèi)目錄,比如:Yahoo!,dmoz.org等。其實(shí)這里有一個(gè)誤區(qū):不一定非要加入大型網(wǎng)站的分類(lèi)目錄才是網(wǎng)站推廣,因?yàn)楝F(xiàn)在搜索引擎已經(jīng)不再只是網(wǎng)站目錄的索引,而是更全面的網(wǎng)頁(yè)索引,所以無(wú)論來(lái)自其他網(wǎng)站任何地方的反相鏈接都是非常有價(jià)值的,哪怕是出現(xiàn)在新聞報(bào)道,論壇,郵件列表歸檔中。Blogger(Weblog的簡(jiǎn)稱(chēng))們也許最深刻地理解了“鏈接就是一切”這句話(huà)的含義,由于Blog的內(nèi)容之間有大量的相互鏈接(他們之間利用RSS很容易進(jìn)行鏈接大量傳播),因此最經(jīng)常被引用的Blog頁(yè)面在搜索引擎中的排名往往比一些大型商業(yè)網(wǎng)站的頁(yè)面還要高。而WIKI這樣的文檔管理系統(tǒng)更加突出了良好結(jié)構(gòu),良好引用的特征。而目前很多網(wǎng)站通過(guò)在各種WIKI/留言簿中灌注垃圾留言的方法,這種方式是非常不可取的。這種鏈接不穩(wěn)定:
    2. 以質(zhì)取勝:被PageRank高的網(wǎng)站引用能更快地提高PageRank
      數(shù)量只是關(guān)鍵因素之一,來(lái)自PageRank高的頁(yè)面的鏈接還能更快的提高被鏈接目標(biāo)的PageRank,我只是將一些文章投稿在了ZDNet中國(guó)上,由于頁(yè)面上有文章出處鏈接,相應(yīng)網(wǎng)頁(yè)和網(wǎng)站整體的PageRank過(guò)了一段時(shí)間后就有了很大的提升。有時(shí)候被什么樣的網(wǎng)站引用有時(shí)候比引用次數(shù)多更重要。這里我要特別感謝的是,當(dāng)時(shí)ZDNet中國(guó)是唯一遵循了我的版權(quán)聲明的要求表明了文章出處,并且有反相鏈接的網(wǎng)站。
      按照這個(gè)原則:能夠名列Yahoo!和DMOZ這樣的大型權(quán)威目錄的頭2層是非常有價(jià)值的。
    3. 了解搜索引擎的"價(jià)值觀":
      Lucene簡(jiǎn)介這篇文章被Jakarta.apache.org的lucene項(xiàng)目引用以后,這篇文章就成為了所有頁(yè)面中PageRank最高的頁(yè)面,而Google支持的一些項(xiàng)目,比如:Folding@Home,讓我一直懷疑他們對(duì)政府,教育和非盈利組織的站點(diǎn)有特別加分,畢竟.org .edu才代表了互聯(lián)網(wǎng)的實(shí)質(zhì):分權(quán)和共享。
      但更合理的解釋是:.org很多都是開(kāi)放技術(shù)平臺(tái)的開(kāi)發(fā)者,他們會(huì)在首頁(yè)這樣的地方加入Powered By Apache, Power by FreeBSD之類(lèi)的鏈接表示對(duì)其他開(kāi)源平臺(tái)的尊重,所以象Apache, PHP, FreeBSD這樣的開(kāi)源站點(diǎn)在GOOGLE中都有非常高的PageRank。而在.edu這些站點(diǎn)中,很多都是學(xué)術(shù)性比較強(qiáng)的文檔,以超鏈接形式標(biāo)明參考文獻(xiàn)的出處已經(jīng)成為一種習(xí)慣,而這也無(wú)疑正是PageRank最好的依據(jù)。
      注意:不要通過(guò)Link Farm提高自身的站點(diǎn)排名:Google會(huì)懲罰那些主動(dòng)鏈接到Link Farm站點(diǎn)以提高自身排名站點(diǎn),相應(yīng)站點(diǎn)的頁(yè)面將不會(huì)被收入到索引中。但如果你的頁(yè)面被別的Link Farm鏈接了也不必?fù)?dān)心,因?yàn)檫@種被動(dòng)的鏈接是不會(huì)被懲罰的。
    4. 不要吝嗇給其他網(wǎng)站的鏈接:如果一個(gè)網(wǎng)頁(yè)只有大量的進(jìn)入鏈接,而缺乏導(dǎo)出鏈接,也會(huì)被搜索引擎認(rèn)為是沒(méi)有價(jià)值的站點(diǎn)。保證你的網(wǎng)站能夠幫助搜索引擎更準(zhǔn)確地判斷哪些是對(duì)用戶(hù)最有價(jià)值的信息,也就是說(shuō)如果你的網(wǎng)站只有外部反向鏈接而沒(méi)有導(dǎo)出鏈接的話(huà),也會(huì)對(duì)你的網(wǎng)站在搜索結(jié)果中的表現(xiàn)帶來(lái)負(fù)面影響。當(dāng)然網(wǎng)站中連一個(gè)導(dǎo)出鏈接都沒(méi)有的情況非常罕見(jiàn),除非你是刻意這么做。正常情況下大家都會(huì)自然地在網(wǎng)頁(yè)中加上一些其他網(wǎng)站的鏈接,帶領(lǐng)訪問(wèn)者去到我們認(rèn)為重要或能夠提供更多有價(jià)值信息的地方,

    另外在推廣自己網(wǎng)站之前也許首先需要了解自己網(wǎng)站目前在一些搜索引擎中的知名度,原理非常簡(jiǎn)單,可以參考如何評(píng)價(jià)網(wǎng)站的人氣一文。

    網(wǎng)站推廣只是手段,如何突出內(nèi)容、讓需要相關(guān)信息的用戶(hù)能夠盡快的找到你的網(wǎng)站才是目的,PageRank高并不代表像Yahoo!這樣的門(mén)戶(hù)站點(diǎn)就能在所有搜索結(jié)果中排名靠前,因?yàn)樗阉饕娴慕Y(jié)果是搜索關(guān)鍵詞在頁(yè)面中的匹配度和頁(yè)面的PageRank相結(jié)合的排名結(jié)果。因此第二個(gè)要點(diǎn):如何突出關(guān)鍵詞。

    如何突出關(guān)鍵詞:面向主題(Theme)的關(guān)鍵詞匹配

    1.  Theme Engine正在逐步超過(guò)PR,成為結(jié)果排序中更主要的因素,可以比較一下以下現(xiàn)象:
      • 為什么查“新聞”,“汽車(chē)”之類(lèi)的文字,各種門(mén)戶(hù)網(wǎng)站的首頁(yè)不在第一位?要知道他們的頁(yè)面中都有相應(yīng)頻道的鏈接文字的
      • 一篇新聞頁(yè)面中,搜索引擎如何不通過(guò)模板匹配,自動(dòng)將新聞的主體和頁(yè)面中的頁(yè)頭,欄目導(dǎo)航條,頁(yè)尾等部分的內(nèi)容區(qū)分開(kāi)的?
      其實(shí)以上問(wèn)題都可以歸結(jié)為網(wǎng)頁(yè)內(nèi)容摘要的提取策略和關(guān)鍵詞在其中的命中:
      首先將能夠描述一個(gè)頁(yè)面內(nèi)容的分成以下幾種類(lèi)型:
      1. 鏈入文字描述:inbound link text
        http://www.searchenginedictionary.com/terms-inbound-link.shtml
      2. HTML頁(yè)面標(biāo)題:title 好標(biāo)題一般會(huì)將頁(yè)面中最重要的關(guān)鍵詞放在最前面,比如:ABC-10型吸塵器 - XX家電城
      3. HTML內(nèi)容主體:content text
      4. 鏈出文字:outbound link text
      如果按照以下規(guī)則:
      一個(gè)頁(yè)面中關(guān)鍵詞命中權(quán)重:鏈入文字 > HTML標(biāo)題文字 > HTML頁(yè)面主體內(nèi)容 >> 出鏈文字,以上現(xiàn)象就比較好解釋了。
      鏈入文字是頁(yè)面上看不見(jiàn)的,但鏈入文字對(duì)被鏈接頁(yè)面有巨大的作用:在現(xiàn)代搜索引擎在關(guān)鍵詞匹配的過(guò)程中,匹配的過(guò)程不只看當(dāng)前頁(yè)面的內(nèi)容摘要:很大程度上,不只看這個(gè)網(wǎng)頁(yè)自己說(shuō)自己有什么內(nèi)容,還要看別人如何鏈接時(shí),如何描述你的網(wǎng)站別人怎么稱(chēng)呼你,比你自己說(shuō)自己更重要。。
      比如查:“世界衛(wèi)生組織”,返回結(jié)果中有 http://www.who.int/ 而這個(gè)頁(yè)面中是沒(méi)有中文的,之所以能匹配上,是因?yàn)楹芏噫溄铀闹形木W(wǎng)站使用了:<a >世界衛(wèi)生組織</a>,所以,這個(gè)頁(yè)面中不存在的中文關(guān)鍵詞也成為了頁(yè)面摘要的一部分。這樣一想,就可以知道鏈出鏈接的文字其實(shí)是為被鏈接的子頻道首頁(yè)或者內(nèi)容詳情頁(yè)服務(wù)的。對(duì)自身頁(yè)面的關(guān)鍵詞密度只有負(fù)面的影響,這也是Google建議一個(gè)頁(yè)面中鏈接不要超過(guò)100個(gè)的原因:他根本不索引100個(gè)鏈接以后的內(nèi)容。按照以上規(guī)則,搜索引擎將一篇新聞詳情頁(yè)中的新聞內(nèi)容提取出來(lái)就是把頁(yè)面上所有帶HTTP鏈接的文字都去掉,就是新聞的內(nèi)容部分了,更精確一些可以通過(guò)取最長(zhǎng)文本段落等策略實(shí)現(xiàn);而很多網(wǎng)站首頁(yè)或頻道首頁(yè)中幾乎全部都是鏈接,經(jīng)過(guò)搜索引擎分析的結(jié)果就是:什么內(nèi)容也沒(méi)有,能夠被命中的關(guān)鍵詞僅僅是別人鏈接你用的“網(wǎng)站首頁(yè)”和頻道標(biāo)題Title中的站點(diǎn)名稱(chēng)等的幾個(gè)關(guān)鍵詞,而頁(yè)面中其他的文字則遠(yuǎn)遠(yuǎn)不如相應(yīng)子頻道和具體內(nèi)容頁(yè)面的匹配度高,而搜索引擎能夠通過(guò)以上規(guī)則,讓用戶(hù)更快的直接定位到有具體內(nèi)容的內(nèi)容詳情頁(yè)面。因此希望通過(guò)一個(gè)首頁(yè),盡可能多的命中所有希望推廣的關(guān)鍵詞是不可能的。讓網(wǎng)頁(yè)盡可能多的進(jìn)入搜索引擎的索引,然后把握好整個(gè)網(wǎng)站的主題風(fēng)格是非常重要的,讓網(wǎng)站的主題關(guān)鍵詞能夠比較均勻的按照金字塔模式分布到網(wǎng)站中可以參考:網(wǎng)站的主題金字塔設(shè)計(jì)          網(wǎng)站名稱(chēng)(用戶(hù)通過(guò)1-2個(gè)抽象關(guān)鍵詞)
               /       \
          子頻道1   子頻道2 (用戶(hù)通過(guò)2-3個(gè)關(guān)鍵詞命中)
         /    \      /    \
      產(chǎn)品1  產(chǎn)品2 文章1 文章2 (用戶(hù)通過(guò)3-4個(gè)關(guān)鍵詞命中:這種用戶(hù)最有價(jià)值)

    2. 不要空著標(biāo)題:空著<title></title>無(wú)異于浪費(fèi)了最有價(jià)值的一塊陣地;
      不要使用meta keywords/description
      傳統(tǒng)的頁(yè)面中,HTML頁(yè)面中會(huì)有類(lèi)似以下的隱含信息,用于說(shuō)明當(dāng)前網(wǎng)頁(yè)的主要內(nèi)容關(guān)鍵字:
      <header>
          <meta name="keyword" content="mp3 download music...">
      </header>
      后來(lái)由于這種人工添加關(guān)鍵詞的方式被濫用,大量網(wǎng)頁(yè)中為了提高被搜索引擎命中的概率,經(jīng)常添加一些和實(shí)際網(wǎng)頁(yè)內(nèi)容無(wú)關(guān)的熱門(mén)關(guān)鍵比如:“music mp3 download”等,所以新一代的搜索引擎已經(jīng)不再關(guān)心頁(yè)面頭文件中的人工meta keyword聲明,而頁(yè)面標(biāo)題在搜索引擎的關(guān)鍵詞的命中命中過(guò)程中往往有著更高的比重,如果一個(gè)關(guān)鍵詞在標(biāo)題中命中會(huì)比在頁(yè)面中命中有更高的得分,從而在相應(yīng)的搜索結(jié)果排名中更靠前。
    3. 標(biāo)題長(zhǎng)度和內(nèi)容:不要過(guò)長(zhǎng),一般在40個(gè)字(80個(gè)字節(jié))以?xún)?nèi),并充分突出關(guān)鍵詞的比重;
      如果更長(zhǎng)的標(biāo)題搜索引擎一般會(huì)忽略掉,所以要盡可能將主要關(guān)鍵詞放在標(biāo)題靠前的位置。省略掉不必要的形容詞吧,畢竟用戶(hù)主要通過(guò)名詞來(lái)找到需要的內(nèi)容。標(biāo)題內(nèi)容:盡量用一些別人可以通過(guò)關(guān)鍵詞找到的字眼(也別太過(guò)頭,如果標(biāo)題中的字眼超過(guò)1半內(nèi)容中都沒(méi)有,有可能被搜索引擎排除出索引),因此基于web日志中來(lái)自其他搜索引擎的關(guān)鍵詞查詢(xún)統(tǒng)計(jì)非常必要。
    4. 如果網(wǎng)頁(yè)很多的話(huà),盡量使用不同的網(wǎng)頁(yè)標(biāo)題,爭(zhēng)取讓自己網(wǎng)站的內(nèi)容更多的進(jìn)入搜索引擎索引范圍;
      因?yàn)樗阉饕鏁?huì)根據(jù)頁(yè)面內(nèi)容的相似度把一些內(nèi)容當(dāng)成重復(fù)頁(yè)面排除出索引范圍;
      http://www.chedong.com/phpMan.php是我的網(wǎng)站上的一個(gè)小應(yīng)用:一個(gè)web界面的unix命令手冊(cè)(man page),在以前的設(shè)計(jì)中所有動(dòng)態(tài)頁(yè)面使用的都是同樣的標(biāo)題:"phpMan: man page /perldoc /info page web interface" ,Google索引了大約3000多個(gè)頁(yè)面,后來(lái)我將頁(yè)面標(biāo)題改成了"phpMan:  [命令名]"這樣的格式,比如:"phpMan: ls",這樣大部分動(dòng)態(tài)頁(yè)面的標(biāo)題就都不一樣了,一個(gè)月后Google從這個(gè)頁(yè)面入口索引了大約6000個(gè)頁(yè)面。因此,如果網(wǎng)站中很多網(wǎng)頁(yè)都使用相同的標(biāo)題,比如:“新聞?lì)l道”,“論壇”,這些頁(yè)面中很大一部分就會(huì)被排重機(jī)制忽略掉。
    5. 除了<title></title>外,還可以用<h1></h1>標(biāo)題行突出內(nèi)容主題,加強(qiáng)標(biāo)題的效果;
      在我的網(wǎng)站設(shè)計(jì)中:我會(huì)把用<h1>[標(biāo)題]</h1>這樣的模板把標(biāo)題突出顯示,而不是通過(guò)改變字體的方式突出標(biāo)題。

    其他網(wǎng)站設(shè)計(jì)提示

    1. 靜態(tài)鏈接:Blog網(wǎng)站另外一個(gè)優(yōu)勢(shì)在于其網(wǎng)頁(yè)是靜態(tài)鏈接:動(dòng)態(tài)網(wǎng)頁(yè)占到整個(gè)互聯(lián)網(wǎng)內(nèi)容的90%以上。各個(gè)搜索引擎其實(shí)能夠表現(xiàn)的都只不過(guò)是互聯(lián)網(wǎng)的冰山一角(3-5%),不同的只是誰(shuí)讓優(yōu)質(zhì)網(wǎng)頁(yè)排名靠前的策略更優(yōu)秀而已:大部分搜索引擎都認(rèn)為靜態(tài)鏈接的網(wǎng)頁(yè)是優(yōu)質(zhì)網(wǎng)頁(yè),Google在優(yōu)先抓取索引的網(wǎng)頁(yè)中70%以上是不帶參數(shù)鏈接的靜態(tài)網(wǎng)頁(yè)。而且即使同樣的內(nèi)容,靜態(tài)網(wǎng)頁(yè)也會(huì)比動(dòng)態(tài)網(wǎng)頁(yè)權(quán)重高:很容易理解:query?a=1&b=2這樣的鏈接由于參數(shù)順序顛倒的query?b=2&a=1完全相同。盡量使用靜態(tài)網(wǎng)頁(yè):目前能夠動(dòng)態(tài)網(wǎng)頁(yè)進(jìn)行全面的索引還比較難,而即使是Google也更不會(huì)索引所有的內(nèi)容,因此很少會(huì)對(duì)參數(shù)超過(guò)2個(gè)的動(dòng)態(tài)網(wǎng)頁(yè)進(jìn)行進(jìn)一步的抓取和分析。以下是一個(gè)phpBB論壇頁(yè)面返回的HTTP頭信息:
      HTTP/1.1 200 OK
          Date: Wed, 28 Jan 2004 12:58:54 GMT
          Server: Apache/1.3.29 (Unix) mod_gzip/1.3.26.1a PHP/4.3.4
          X-Powered-By: PHP/4.3.4
          Set-Cookie: phpBB_data=a%3A0%3A%7B%7D; expires=Thu, 27-Jan-2005 12:58:54 GMT; path=/;
          Set-Cookie: phpBB_sid=09f67a83ee108ecbf11e35bb6f36fcec; path=/;
          Content-Encoding: gzip
          Cache-Control: private, pre-check=0, post-check=0, max-age=0
          Expires: 0
          Pragma: no-cache
          Connection: close
          Content-Type: text/html
          
      為了避免隱私問(wèn)題:Googlebot可以通過(guò)對(duì)頁(yè)面http header中的session id和session cookie進(jìn)行一些甄別,這樣很多需要認(rèn)證信息的論壇內(nèi)容就無(wú)法進(jìn)入索引了。
      總體上說(shuō)Google喜歡新的,靜態(tài)的內(nèi)容。因此無(wú)論從效率上講還是方便搜索引擎收錄:使用內(nèi)容發(fā)布系統(tǒng)將網(wǎng)站內(nèi)容發(fā)布成靜態(tài)網(wǎng)頁(yè)都是非常必要的,從某種程度上說(shuō)google friendly = anonymous cache friendly。
      比如:http://www.chedong.com/phpMan.php/man/intro/3
      比http://www.chedong.com/phpMan.php?mode=man&parameter=intro&section=3這樣的鏈接更容易進(jìn)入搜索引擎的索引。而且在URL中的命中也能突出關(guān)鍵詞。
    2. 能夠進(jìn)入Google索引的頁(yè)面數(shù)量越多越好。用類(lèi)似以下的腳本可以統(tǒng)計(jì)自己的網(wǎng)站被搜索引擎索引的情況。
      #!/bin/sh
          YESTERDAY=`date -d yesterday +%Y%m%d`
          # for FreeBSD: YESTERDAY=`date -v-1d +%Y%m%d`
          LOG_FILE='/home/apache/logs/access_log'
          grep -i Googlebot $LOG_FILE.$YESTERDAY|awk '{print $7}' |sort | uniq -c | sort -rn > spider/$YESTERDAY.googlebot.txt
          grep -i baiduspider $LOG_FILE.$YESTERDAY|awk '{print $7}' |sort | uniq -c | sort -rn > spider/$YESTERDAY.baiduspider.txt
          grep -i msnbot $LOG_FILE.$YESTERDAY|awk '{print $7}' |sort | uniq -c | sort -rn > spider/$YESTERDAY.msnbot.txt
          grep -i inktomi $LOG_FILE.$YESTERDAY|awk '{print $7}' |sort | uniq -c | sort -rn > spider/$YESTERDAY.inktomi.txt
          grep -i openbot $LOG_FILE.$YESTERDAY|awk '{print $7}' |sort |uniq -c | sort -rn > spider/$YESTERDAY.openbot.txt
          
    3. 網(wǎng)站目錄結(jié)構(gòu)要扁平,因?yàn)槊可钜患?jí)目錄,PAGERANK降低1-2個(gè)檔次。假設(shè)首頁(yè)是3,其子可能目錄就是1了,更深可能就無(wú)法列入評(píng)級(jí)范圍了。
    4. 表現(xiàn)和內(nèi)容的分離:“綠色”網(wǎng)頁(yè)
      網(wǎng)頁(yè)中的javascript和css盡可能和網(wǎng)頁(yè)分離,一方面提高代碼重用度(也方便頁(yè)面緩存),另外一方面,由于有效內(nèi)容占網(wǎng)頁(yè)長(zhǎng)度的百分比高,也能提高相關(guān)關(guān)鍵詞在頁(yè)面中的比重也增加了??傊?,應(yīng)該鼓勵(lì)遵循w3c的規(guī)范,使用更規(guī)范的XHTML和XML作為顯示格式便于內(nèi)容更長(zhǎng)時(shí)間的保存。
    5. 讓所有的頁(yè)面都有能夠快速入口:站點(diǎn)地圖,方便網(wǎng)頁(yè)爬蟲(chóng)(spider)快速遍歷網(wǎng)站所有需要發(fā)布的內(nèi)容。如果首頁(yè)就是用Flash或圖片進(jìn)入的話(huà),無(wú)異于將搜索引擎拒之門(mén)外,除了UI設(shè)計(jì)的用戶(hù)友好外,spider friendly也是非常重要的。
    6. 保持網(wǎng)站自身的健康:經(jīng)常利用壞鏈檢查工具檢查網(wǎng)站中是否有死鏈。
    7. 保持網(wǎng)頁(yè)內(nèi)容/鏈接的穩(wěn)定性和持久性:在搜索引擎索引中網(wǎng)頁(yè)存在的歷史也是一個(gè)比較重要的因素,而且歷史比較久的網(wǎng)頁(yè)被鏈接的幾率越高。為了保證自己網(wǎng)頁(yè)能夠被比較持久的被其他網(wǎng)站的頁(yè)面引用,如果自己網(wǎng)頁(yè)中有鏈接更新時(shí),最好能保留舊的頁(yè)面并做好鏈接轉(zhuǎn)向,以保持內(nèi)容的連續(xù)性。要知道,把一個(gè)網(wǎng)站和內(nèi)容在搜索引擎中的排名“培養(yǎng)”的很高是一件非常不容易的事情,誰(shuí)都不希望好不容易自己的內(nèi)容被別人找到了,點(diǎn)擊卻是“404 頁(yè)面不存在”吧,因此站點(diǎn)管理員對(duì)自身站點(diǎn)error.log的分析也是非常必要的。
    8. 文件類(lèi)型因素:Google有對(duì)PDF, Word(Power Point, Excel), PS文檔的索引能力,由于這種文檔的內(nèi)容比一般的HTML經(jīng)過(guò)了更多的整理,學(xué)術(shù)價(jià)值一般比較高,所以這些類(lèi)型的文檔天生就比一般的HTML類(lèi)型的文檔 PageRank要高。因此,對(duì)于比較重要的文檔:技術(shù)白皮書(shū),F(xiàn)AQ,安裝文檔等建議使用PDF PS等高級(jí)格式存取,這樣在搜索結(jié)果中也能獲得比較靠前的位置。
    9. 常常能發(fā)現(xiàn)門(mén)戶(hù)站點(diǎn)的一條新聞往往比其他站點(diǎn)的首頁(yè)排名還要靠前。因此一個(gè)站點(diǎn)總體PageRank提高了以后,往往自身一些并不重要的內(nèi)容也會(huì)被同那些高PageRank的內(nèi)容一起帶入被搜索引擎優(yōu)先查詢(xún)的列表中。這樣經(jīng)常造成很多大的開(kāi)發(fā)站點(diǎn)的郵件列表歸檔往往比其他站點(diǎn)的首頁(yè)P(yáng)ageRank還要高。

    知己知彼——站點(diǎn)訪問(wèn)統(tǒng)計(jì)/日志分析挖掘的重要性

    網(wǎng)站設(shè)計(jì)不僅僅只是被動(dòng)的迎合搜索引擎的索引,更重要是充分利用搜索引擎帶來(lái)的流量進(jìn)行更深層次的用戶(hù)行為分析。目前,來(lái)自搜索引擎關(guān)鍵詞統(tǒng)計(jì)幾乎是各種WEB日志分析工具的標(biāo)準(zhǔn)功能,相信商業(yè)日志統(tǒng)計(jì)工具在這方面應(yīng)該會(huì)有更強(qiáng)化的實(shí)現(xiàn)。WEB日志統(tǒng)計(jì)這個(gè)功能如此重要,以至于新的RedHat 8中已經(jīng)將日志分析工具webalizer作為標(biāo)準(zhǔn)的服務(wù)器配置應(yīng)用之一。

    以Apache/webalizer為例,具體的做法如下:
    1. 記錄訪問(wèn)來(lái)源:
      在Apache配置文件中設(shè)置日志格式為combined格式,這樣的日志中會(huì)包含擴(kuò)展信息:其中有一個(gè)字段就是相應(yīng)訪問(wèn)的轉(zhuǎn)向來(lái)源: HTTP_REFERER,如果用戶(hù)是從某個(gè)搜索引擎的搜索結(jié)果中找到了你的網(wǎng)頁(yè)并點(diǎn)擊過(guò)來(lái),日志中記錄的HTTP_REFERER就是用戶(hù)在搜索引擎結(jié)果頁(yè)面的URL,這個(gè)URL中包含了用戶(hù)查詢(xún)的關(guān)鍵詞。
    2. 在webalizer中缺省配置針對(duì)搜索引擎的統(tǒng)計(jì):如何提取HTTP_REFERER中的關(guān)鍵詞
      webalizer中缺省有針對(duì)yahoo, google等國(guó)際流行搜索引擎的查詢(xún)格式:這里我增加了針對(duì)國(guó)內(nèi)門(mén)戶(hù)站點(diǎn)的搜索引擎參數(shù)設(shè)置
      SearchEngine yahoo.com p=
      SearchEngine altavista.com q=
      SearchEngine google.com q=
      SearchEngine    sina.com.cn word=
      SearchEngine    baidu.com   word=
      SearchEngine    sohu.com    word=
      SearchEngine    163.com q=

    通過(guò)這樣設(shè)置webalizer統(tǒng)計(jì)時(shí)就會(huì)將HTTP_REFERER中來(lái)自搜索引擎的URL中的keyword提取出來(lái),比如:所有來(lái)自 google.com鏈接中,參數(shù)q的值都將被作為關(guān)鍵詞統(tǒng)計(jì)下來(lái):,從匯總統(tǒng)計(jì)結(jié)果中,就可以發(fā)現(xiàn)用戶(hù)是根據(jù)什么關(guān)鍵詞找到你的次數(shù),以及找到你的用戶(hù)最感興趣的是那些關(guān)鍵詞等,進(jìn)一步的,在webalizer中有設(shè)置還可以將統(tǒng)計(jì)結(jié)果倒出成CSV格式的日志,便于以后導(dǎo)入數(shù)據(jù)庫(kù)進(jìn)行歷史統(tǒng)計(jì),做更深層次的數(shù)據(jù)挖掘等。

    以前通過(guò)WEB日志的用戶(hù)分析主要是簡(jiǎn)單的基于日志中的訪問(wèn)時(shí)間/IP地址來(lái)源等,很明顯,基于搜索引擎關(guān)鍵詞的統(tǒng)計(jì)能得到的分析結(jié)果更豐富、更直觀。因此,搜索引擎服務(wù)的潛在商業(yè)價(jià)值幾乎是不言而喻的,也許這也是Yahoo! Altavista等傳統(tǒng)搜索引擎網(wǎng)站在門(mén)戶(hù)模式后重新開(kāi)始重視搜索引擎市場(chǎng)的原因,看看Google的年度關(guān)鍵詞統(tǒng)計(jì)就知道了,在互聯(lián)網(wǎng)上有誰(shuí)比搜索引擎更了解用戶(hù)對(duì)什么更感興趣呢?

    請(qǐng)看本站的反相鏈接統(tǒng)計(jì):http://www.chedong.com/log/2003_6.log
    需要注意的是:由于Google針對(duì)Windows 2000中的IE使用的是UTF-8方式的編碼,因此很多統(tǒng)計(jì)有時(shí)候需要在UTF-8方式下查看才是正確字符顯示。從統(tǒng)計(jì)中能夠感受到:在使用水平比較高的IT開(kāi)發(fā)人員中Google已經(jīng)成為最常用的搜索引擎。而使用百度的用戶(hù)也已經(jīng)大大超過(guò)了傳統(tǒng)的搜狐,新浪等門(mén)戶(hù)站點(diǎn),因此傳統(tǒng)門(mén)戶(hù)網(wǎng)站在搜索引擎上的優(yōu)勢(shì)將是非常脆弱的。而從技術(shù)的發(fā)展趨勢(shì)來(lái)看,以后還會(huì)有更多的利用互聯(lián)網(wǎng)媒體做更深層次數(shù)據(jù)挖掘的服務(wù)模式出現(xiàn):

     

    轉(zhuǎn)載自cnblog.org——“突發(fā)”文字可能揭示社會(huì)趨勢(shì)

    在“新科學(xué)家”(New Scientist)在線雜志上,公布了康奈爾大學(xué)的一個(gè)新研究成果,引人注目,也許與Google 收購(gòu)Pyra 的動(dòng)機(jī)有關(guān)。

    這所大學(xué)的計(jì)算機(jī)科學(xué)家 Jon Klenberg 開(kāi)發(fā)了一個(gè)計(jì)算機(jī)算法,能夠識(shí)別一篇文章中某些文字的“突發(fā)”增長(zhǎng),而且他發(fā)現(xiàn),這些“突發(fā)”增長(zhǎng)的文字可以用來(lái)快速識(shí)別最新的趨勢(shì)和熱點(diǎn)問(wèn)題,因此能夠更有效地篩選重要信息。過(guò)去很多搜索技術(shù)都采用了簡(jiǎn)單計(jì)算文字/詞組出現(xiàn)頻率的方法,卻忽略了文字使用增加的速率。

    Jon 特別指出,這種方法可以應(yīng)用到大量Weblog上,以跟蹤社會(huì)趨勢(shì),這對(duì)商業(yè)應(yīng)用也很有潛力。例如,廣告商可以從成千上萬(wàn)的個(gè)人Blog 中快速找到潛在的需求風(fēng)尚。而且只要Blog 覆蓋話(huà)題范圍足夠大(實(shí)際上發(fā)展趨勢(shì)確實(shí)如此),這項(xiàng)技術(shù)對(duì)政治、社會(huì)、文化和經(jīng)濟(jì)等領(lǐng)域也都會(huì)有實(shí)際意義了。

    雖然Google 新聞的內(nèi)部算法至今沒(méi)有公開(kāi),但是人們猜測(cè)這種完全由機(jī)器所搜集的頭條新聞應(yīng)當(dāng)不是Google搜索引擎中慣用的鴿子算法,很可能與這種“突發(fā)”判斷算法有關(guān)。如此說(shuō)來(lái),Google收購(gòu)Blog工具供應(yīng)商的舉動(dòng)確實(shí)還有更深層次的遠(yuǎn)見(jiàn)了。

    - NewScientist.com news,
    - 還沒(méi)有寫(xiě)完這些介紹,在 SlashDot 上也看到了很多有關(guān)這個(gè)發(fā)現(xiàn)的討論

    附:Google官方的站點(diǎn)設(shè)計(jì)指南

    • Make a site with a clear hierarchy and text links. Every page should be reachable from at least one static text link.  讓網(wǎng)站有著清晰的結(jié)構(gòu)和文本鏈接,所有的頁(yè)面至少要有一個(gè)靜態(tài)文本鏈接入口
      批注:盡量不要用圖片和JAVASCRIPT
    • Offer a site map to your users with links that point to the important parts of your site. If the site map is larger than 100 or so links, you may want to break the site map into separate pages.
      為用戶(hù)提供一個(gè)站點(diǎn)地圖:轉(zhuǎn)向網(wǎng)站的重要部分。如果站點(diǎn)地圖頁(yè)面超過(guò)100個(gè)鏈接,則需要將頁(yè)面分成多個(gè)頁(yè)面。
      批注:索引頁(yè)不要超過(guò)100個(gè)鏈接:SPIDER只考慮頁(yè)面中頭100個(gè)鏈接
    • Create a useful, information-rich site and write pages that clearly and accurately describe your content.
      用一些有用的,信息量豐富的站點(diǎn),清晰并正確的描述你的信息。
    • Think about the words users would type to find your pages, and make sure that your site actually includes those words within it.
      想像用戶(hù)可能用來(lái)找到你的關(guān)鍵詞,并保證這些關(guān)鍵詞在網(wǎng)站中出現(xiàn)。
      批注:少用“最大”,“最好”之類(lèi)的形容詞,用用戶(hù)最關(guān)心的詞,比如:下載,歌星名字,而不是一些抽象名詞。
    • Try to use text instead of images to display important names, content, or links. The Google crawler doesn't recognize text contained in images.
      盡可能使用文本,而不是圖片顯示重要的名稱(chēng),內(nèi)容和鏈接。GOOGLE的機(jī)器人不認(rèn)識(shí)圖片中的文字。
    • Make sure that your TITLE and ALT tags are descriptive and accurate.
      保證:頁(yè)面的TITLE和ALT標(biāo)記正確的精確描述
    • Check for broken links and correct HTML.
      檢查壞鏈并修正這些HTML錯(cuò)誤。
    • If you decide to use dynamic pages (i.e., the URL contains a '?' character), be aware that not every search engine spider crawls dynamic pages as well as static pages. It helps to keep the parameters short and the number of them small.
      如果你打算使用動(dòng)態(tài)頁(yè)面:鏈接中包含"?",必須了解:并非所有的搜索引擎的機(jī)器人能想對(duì)待靜態(tài)頁(yè)面一樣對(duì)待動(dòng)態(tài)頁(yè)面,保持動(dòng)態(tài)頁(yè)面的參數(shù)盡可能的少也會(huì)很有幫助。
    • Keep the links on a given page to a reasonable number (fewer than 100).
      讓一個(gè)頁(yè)面中的鏈接少于100個(gè)。
      批注:用lynx -dump http://www.chedong.com 可以模擬從robot角度看到的頁(yè)面。其最后有鏈接統(tǒng)計(jì)

    輸出類(lèi)似:

       [1]Google Free Search _______________________________ Google Search
       (_) Search WWW (_) Search chedong.com

       更 新 [2]站點(diǎn)地圖 / Site Map [3]留 言簿 / Guest Book [4]意見(jiàn)反饋 /
       Feed Back
        ...
    References

       Visible links
       1. http://www.google.com/services/free.html
       2. http://www.chedong.com/sitemap.html#sitemap
       3. http://www.chedong.com/guestbook/
       4. http://www.chedong.com/formmail.htm
        ...
       Hidden links:
      50. http://www.chedong.com/bbcweb/
        ...

    搜索引擎的宗旨在于提取互聯(lián)網(wǎng)中質(zhì)量最好的內(nèi)容提供給用戶(hù),任何有利于幫助用戶(hù)獲得相對(duì)公正,優(yōu)質(zhì)內(nèi)容的策略都是搜索引擎追求目標(biāo)。PageRank是一個(gè)非常好的策略,但是并非所有策略都是基于非常復(fù)雜的算法。
    從搜索引擎看來(lái)什么是互聯(lián)網(wǎng)中“好”的內(nèi)容呢?

    • 首先:互聯(lián)網(wǎng)大約是8G個(gè)網(wǎng)頁(yè),而且以每天2M的速度增長(zhǎng)的。其中80%以上是動(dòng)態(tài)網(wǎng)頁(yè),而占總量20%的靜態(tài)網(wǎng)頁(yè)就是一個(gè)相對(duì)比較簡(jiǎn)單的過(guò)濾規(guī)則。
    • 其次:用戶(hù)友好(User friendly)也是很重要的方面,搜索引擎利用算法幫助提升這些優(yōu)質(zhì)網(wǎng)站,包括:通過(guò)CSS將內(nèi)容和表現(xiàn)分離:較少的javascript和frame結(jié)構(gòu),spider本身也很難深入抓取這些網(wǎng)頁(yè):Javascript和frame結(jié)構(gòu)大部分是廣告。
    • 標(biāo)題明確:無(wú)標(biāo)題,重復(fù)標(biāo)題或者標(biāo)題SPAM(類(lèi)似于:游戲游戲游戲游戲游戲游戲這樣的標(biāo)題)進(jìn)行過(guò)濾或降低得分頁(yè)面大小:因?yàn)轫?yè)面過(guò)大會(huì)導(dǎo)致用戶(hù)下載緩慢,所以很多引擎只計(jì)算頁(yè)面大小在100k以?xún)?nèi)的網(wǎng)頁(yè)。
    • 鏈接引用:不僅需要有鏈接鏈入,也需要幫助用戶(hù)找到其他更有價(jià)值的內(nèi)容;
    • 文件類(lèi)型:PDF和DOC等專(zhuān)業(yè)文檔和來(lái)自edu,gov等非贏利網(wǎng)站的內(nèi)容;
    • 鏈入網(wǎng)站的文字:所有用戶(hù)不可見(jiàn)的因素全部被忽略。此外:用戶(hù)搜索的行為本身也被Google記錄,可能對(duì)目標(biāo)網(wǎng)站的主題相關(guān)度有幫助。

     

    參考資料:

    面向Google搜索引擎的網(wǎng)站設(shè)計(jì)優(yōu)化
    http://www.google-search-engine-optimization.com/



    如何評(píng)價(jià)一個(gè)網(wǎng)站的人氣
    http://www.chedong.com/tech/link_pop_check.html

    如何提高網(wǎng)站在Google中的排名——面向搜索引擎的廣告模式
    http://www.chedong.com/tech/google_ads.html

    如何提高網(wǎng)站在Google中的排名——面向搜索引擎的網(wǎng)站鏈接設(shè)計(jì)
    http://www.chedong.com/tech/google_url.html

    Google不斷改進(jìn)相應(yīng)的算法:HillTop
    Hilltop: A Search Engine based on Expert Documents

    Google の秘密 - PageRank 徹底解説
    http://www.kusastro.kyoto-u.ac.jp/~baba/wais/pagerank.html
    這篇文章是在查"Google PageRank"的時(shí)候查到的,這篇文章不僅有一個(gè)算法說(shuō)明,也是一個(gè)Google的weblog,記錄了很多關(guān)于Google的新聞和一些市場(chǎng)動(dòng)態(tài)信息。
    Google 的秘密- PageRank 徹底解說(shuō) 中文版

    更詳細(xì)的PageRank算法說(shuō)明:
    http://pr.efactory.de/

    WEB日志統(tǒng)計(jì)工具AWStats的使用:增加了Unicode的解碼和中國(guó)主要門(mén)戶(hù)搜索的定義
    http://www.chedong.com/tech/awstats.html

    Robots的說(shuō)明:
    http://bar.baidu.com/robots/
    http://www.google.com/bot.html
    搜索引擎通過(guò)一種程序robot(又稱(chēng)spider),自動(dòng)訪問(wèn)互聯(lián)網(wǎng)上的網(wǎng)頁(yè)并獲取網(wǎng)頁(yè)信息。您可以在您的網(wǎng)站中創(chuàng)建一個(gè)純文本文件 robots.txt,在這個(gè)文件中聲明該網(wǎng)站中哪些內(nèi)容可以被robot訪問(wèn),哪些不可以。

    反Google站點(diǎn):觀點(diǎn)也很有趣
    http://www.google-watch.org/

    關(guān)于Google的WebLog
    http://google.blogspace.com/

    關(guān)于Google的HillTop算法

    搜索引擎相關(guān)論壇
    http://searchengineforums.com/
    http://searchenginewatch.com
    http://www.webmasterworld.com/

    posted @ 2008-01-04 09:43 風(fēng)雨兼程 閱讀(262) | 評(píng)論 (0)編輯 收藏

    開(kāi)發(fā)電子商務(wù)網(wǎng)站對(duì)數(shù)據(jù)庫(kù)表的設(shè)計(jì)

    系統(tǒng)分析

      功能需求分析

      (1):產(chǎn)品展示,按照分類(lèi)展示全部產(chǎn)品,和對(duì)應(yīng)的相關(guān)信息。

      (2):增加產(chǎn)品的展示相關(guān)度,諸如最新產(chǎn)品報(bào)道,網(wǎng)站的新聞,促銷(xiāo)信息。

      (3):購(gòu)物車(chē),跟蹤用戶(hù)的購(gòu)物情況

      (4):結(jié)算中心:處理用戶(hù)帳單,購(gòu)物處理

      (5):反饋互動(dòng)區(qū),可以留言

      (6):會(huì)員信息模塊,可以注冊(cè)

      數(shù)據(jù)需求分析

      數(shù)據(jù)庫(kù)表設(shè)計(jì)定為8個(gè)表實(shí)現(xiàn):

      ccdot_user{用戶(hù)信息表}:

      ------szd_userid[PK]

      ------szd_username[用戶(hù)ID]

      ------szd_password[用戶(hù)密碼]

      ------szd_name[用戶(hù)真是信息]

      ------szd_question[丟失密碼問(wèn)題]

      ------szd_answer[用戶(hù)回答答案,用于找密碼]

      ------szd_sex[性別]

      ------szd_phone[電話(huà)]

      ------szd_email[電子郵件]

      ------szd_address[地址]

      ------szd_post[郵編]

      ------szd_province[省份]

      ------szd_city[城市]

      ------szd_mark[標(biāo)記](méi)

      ccdot_aclass{產(chǎn)品大類(lèi)}

      ------szd_aclassid[PK]

      ------szd_aclassname[名稱(chēng)]

      ccdot_bclass{產(chǎn)品小類(lèi)}

      ------szd_bclassid[pk]

      ------szd_aclassid[關(guān)聯(lián)大類(lèi)szd_aclassid]

      ------szd_bclassname[名稱(chēng)]

      ccdot_poduct{產(chǎn)品信息}

      ------szd_productid[pk]

      ------szd_bclassid[關(guān)聯(lián)小類(lèi)的szd_bclassid]

      ------szd_pname[名稱(chēng)]

      ------szd_pdetail[產(chǎn)品信息]

      ------szd_pprice[一般價(jià)格]

      ------szd_pmemderprice[會(huì)員價(jià)]

      ------szd_pfewprice[差價(jià)]

      ------szd_ppicture[圖片]

      ------szd_ptime[添加時(shí)間]

      ------szd_stock[產(chǎn)品庫(kù)存]

      ------szd_phit[產(chǎn)品點(diǎn)擊次數(shù)]

      ------szd_pdetail1[其他產(chǎn)品描述]

      ccdot_news{新聞}

      ------szd_newsid[PK]

      ------szd_title[標(biāo)題]

      ------szd_content[內(nèi)容]

      ------szd_time[添加時(shí)間]

      ------szd_type[類(lèi)型]

      ccdot_guest{評(píng)論}

      ------szd_gid[PK]

      ------szd_gname[昵稱(chēng)]

      ------szd_gcontent[留言?xún)?nèi)容]

      ------szd_productid[關(guān)聯(lián)產(chǎn)品的主鍵]

      ------szd_gtime[留言時(shí)間]

      ------szd_gip[留言者ip]

      ccdot_orderlist{訂單列表}

      ------szd_orderlistid[PK]

      ------szd_orderid[關(guān)聯(lián)詳細(xì)訂單的主鍵]

      ------szd_productid[關(guān)聯(lián)產(chǎn)品的主鍵]

      ------szd_quantity[所定數(shù)目]

      ------szd_unitcost[單價(jià)]

      ------szd_productname[產(chǎn)品名稱(chēng)]

      ccdot_orders{訂單信息表}

      ------szd_orderid[PK]

      ------szd_userid[關(guān)聯(lián)用戶(hù)主鍵]

      ------szd_orderdate[訂單日期]

      ------szd_linkman[聯(lián)系人]

      ------szd_email[聯(lián)系人email]

      ------szd_phone[聯(lián)系電話(huà)]

      ------szd_postalcode[送貨處郵編]

      ------szd_address[送貨地址]

      ------szd_result[處理結(jié)果]

      ------szd_remark[備注]

      ------szd_songhuoqixian[送貨期限]

      ------szd_songhuofangshi[發(fā)貨方式]

      ------szd_fukuanfangshi[付款方式]

      ------szd_error[意外說(shuō)明]

    posted @ 2008-01-02 15:20 風(fēng)雨兼程 閱讀(351) | 評(píng)論 (0)編輯 收藏

    petshop4.0設(shè)計(jì)說(shuō)明asp.net初學(xué)者

    petshop4.0設(shè)計(jì)說(shuō)明
    一、項(xiàng)目名稱(chēng)及描述:(實(shí)現(xiàn)步驟為:4-3-6-5-2-1)
    1、WEB=表示層
    2、BLL=業(yè)務(wù)邏輯層
    3、IDAL=數(shù)據(jù)訪問(wèn)層接口定義
    4、Model=業(yè)務(wù)實(shí)體
    5、DALFactory=數(shù)據(jù)層的抽象工廠(創(chuàng)建反射)
    6、SQLServerDAL=SQLServer數(shù)據(jù)訪問(wèn)層 / OracleDAL=Oracle數(shù)據(jù)訪問(wèn)層

    DBUtility 數(shù)據(jù)庫(kù)訪問(wèn)組件基礎(chǔ)類(lèi)

    二、項(xiàng)目引用關(guān)系
    1、Web 引用 BLL。
    2、BLL 引用 IDAL,Model,使用DALFactory創(chuàng)建實(shí)例。
    3、IDAL 引用 Model。
    4、Model 無(wú)引用。
    5、DALFactory 引用IDAL,通過(guò)讀取web.config里設(shè)置的程序集,加載類(lèi)的實(shí)例,返回給BLL使用。
    6、SQLServerDAL 引用 Model和IDAL,被DALFactory加載的程序集,實(shí)現(xiàn)接口里的方法。


    三、實(shí)現(xiàn)步驟
    1、創(chuàng)建Model,實(shí)現(xiàn)業(yè)務(wù)實(shí)體。
    2、創(chuàng)建IDAL,實(shí)現(xiàn)接口。
    3、創(chuàng)建SQLServerDAL,實(shí)現(xiàn)接口里的方法。
    4、增加web.config里的配置信息,為SQLServerDAL的程序集。
    5、創(chuàng)建DALFactory,返回程序集的指定類(lèi)的實(shí)例。
    6、創(chuàng)建BLL,調(diào)用DALFactory,得到程序集指定類(lèi)的實(shí)例,完成數(shù)據(jù)操作方法。
    7、創(chuàng)建WEB,調(diào)用BLL里的數(shù)據(jù)操作方法。

    注意:
    1、web.config里的程序集名稱(chēng)必須與SQLServerDAL里的輸出程序集名稱(chēng)一致。
    2、DALFactory里只需要一個(gè)DataAccess類(lèi),可以完成創(chuàng)建所有的程序集實(shí)例。
    3、項(xiàng)目創(chuàng)建后,注意修改各項(xiàng)目的默認(rèn)命名空間和程序集名稱(chēng)。
    4、注意修改解決方案里的項(xiàng)目依賴(lài)。
    5、注意在解決方案里增加各項(xiàng)目引用。

    posted @ 2007-12-26 17:05 風(fēng)雨兼程 閱讀(1565) | 評(píng)論 (0)編輯 收藏

    Getting Real 讀書(shū)筆記

    無(wú)論是創(chuàng)業(yè)還是做項(xiàng)目,無(wú)論是單機(jī)軟件還是 Web app,都需要遵循的就是滿(mǎn)足需求

    需求和開(kāi)發(fā)的矛盾,至少在我看來(lái),是產(chǎn)品開(kāi)發(fā)中的主要矛盾。提需求的覺(jué)得產(chǎn)品沒(méi)有滿(mǎn)足需求,開(kāi)發(fā)的覺(jué)得需求不明確或者胡來(lái)。最后的結(jié)果,要么是產(chǎn)品延期,要么是個(gè)破爛。

    是否有一些方法或者經(jīng)驗(yàn),可以指導(dǎo)我們更成功地開(kāi)發(fā) Web app 呢?或者不僅僅是開(kāi)發(fā),還包括設(shè)計(jì),推廣,人事……作為創(chuàng)業(yè)或者實(shí)踐的一整套指導(dǎo)

    這就是我想推薦給大家的《Getting Real》。

    Getting Real 是著名的 37signals 公司(Ruby on Rails 的締造者)去年撰寫(xiě)的一本書(shū),主要內(nèi)容是指導(dǎo)小型公司/團(tuán)體成功地商業(yè)運(yùn)作起 Web 產(chǎn)品,提供了包括相關(guān)理念,思路,人員,技術(shù),方法論,實(shí)例等等許多信息,非常適合 Web 開(kāi)發(fā)人員,產(chǎn)品人員和創(chuàng)業(yè)者參考。

    書(shū)專(zhuān)注于以下幾點(diǎn):
    1. 成功的商業(yè)產(chǎn)品,以客戶(hù)利益和感受至上。
    2. 小型的團(tuán)隊(duì),高靈活性和適應(yīng)性。
    3. 精簡(jiǎn)的產(chǎn)品,夠用好用的功能。
    4. 高效的設(shè)計(jì)和開(kāi)發(fā)過(guò)程,杜絕浪費(fèi)時(shí)間,減少需求和開(kāi)發(fā)的矛盾。
    5. 巧妙的推廣和售后支持。
    ……

    posted @ 2007-12-26 15:12 風(fēng)雨兼程 閱讀(259) | 評(píng)論 (0)編輯 收藏

    層隨著鼠標(biāo)移動(dòng)

    var c = document.getElementById("divTool");
     c.style.position = "absolute";
     var eT = obj.offsetTop; 
        var eH = obj.offsetHeight+eT; 
     c.style.left = window.event.clientX-event.offsetX+document.documentElement.scrollLeft-20;
        c.style.top = window.event.clientY-event.offsetY+document.documentElement.scrollTop+eH-8;


     c.style.display = "block";

    posted @ 2007-12-26 14:44 風(fēng)雨兼程 閱讀(563) | 評(píng)論 (0)編輯 收藏

    解決downlist 等優(yōu)先極高于其它控件,浮在其它控件上面

     <iframe style="position:absolute;z-index:9;width:expression(this.nextSibling.offsetWidth);height:expression(this.nextSibling.offsetHeight);top:expression(this.nextSibling.offsetTop);left:expression(this.nextSibling.offsetLeft);" frameborder="0" ></iframe>
      <div id="divTool" onmouseover="javascript:showdiv123()" onmouseout="javascript:HiddivTool()" class="class_title"  style="display:none">
    <table width="100" border="0"  align="center" cellpadding="0" cellspacing="0">
      <tr>
        <td height="20" colspan="2" bgcolor="ffffff" style="width: 100px" >&nbsp;&nbsp;<span class="t1" style="cursor:hand" name="layout/AddPage.aspx" onclick="javascript:openMyPage(this)">More tools</span></td>
      </tr>
      <tr>
        <td height="20" colspan="2"  bgcolor="ffffff"  style="width: 100px">&nbsp;&nbsp;<a href="#">About this tools</a></td>
      </tr><tr>
        <td height="8" colspan="2" bgcolor="ffffff" style="width: 100px"></td>
      </tr>
     
      </table>
    </div>

    posted @ 2007-12-26 14:35 風(fēng)雨兼程 閱讀(328) | 評(píng)論 (0)編輯 收藏

    在PetShop 4.0中ASP.NET緩存的實(shí)現(xiàn)

    PetShop作為一個(gè)B2C的寵物網(wǎng)上商店,需要充分考慮訪客的用戶(hù)體驗(yàn),如果因?yàn)閿?shù)據(jù)量大而導(dǎo)致Web服務(wù)器的響應(yīng)不及時(shí),頁(yè)面和查詢(xún)數(shù)據(jù)遲遲得不到結(jié)果,會(huì)因此而破壞客戶(hù)訪問(wèn)網(wǎng)站的心情,在耗盡耐心的等待后,可能會(huì)失去這一部分客戶(hù)。無(wú)疑,這是非常糟糕的結(jié)果。因而在對(duì)其進(jìn)行體系架構(gòu)設(shè)計(jì)時(shí),整個(gè)系統(tǒng)的性能就顯得殊為重要。然而,我們不能因噎廢食,因?yàn)閷?zhuān)注于性能而忽略數(shù)據(jù)的正確性。在PetShop 3.0版本以及之前的版本,因?yàn)锳SP.NET緩存的局限性,這一問(wèn)題并沒(méi)有得到很好的解決。PetShop 4.0則引入了SqlCacheDependency特性,使得系統(tǒng)對(duì)緩存的處理較之以前大為改觀。

    4.3.1  CacheDependency接口

    PetShop 4.0引入了SqlCacheDependency特性,對(duì)Category、Product和Item數(shù)據(jù)表對(duì)應(yīng)的緩存實(shí)施了SQL Cache Invalidation技術(shù)。當(dāng)對(duì)應(yīng)的數(shù)據(jù)表數(shù)據(jù)發(fā)生更改后,該技術(shù)能夠?qū)⑾嚓P(guān)項(xiàng)從緩存中移除。實(shí)現(xiàn)這一技術(shù)的核心是SqlCacheDependency類(lèi),它繼承了CacheDependency類(lèi)。然而為了保證整個(gè)架構(gòu)的可擴(kuò)展性,我們也允許設(shè)計(jì)者建立自定義的CacheDependency類(lèi),用以擴(kuò)展緩存依賴(lài)。這就有必要為CacheDependency建立抽象接口,并在web.config文件中進(jìn)行配置。

    在PetShop 4.0的命名空間PetShop.ICacheDependency中,定義了名為IPetShopCacheDependency接口,它僅包含了一個(gè)接口方法:
    public interface IPetShopCacheDependency
    {      
        AggregateCacheDependency GetDependency();
    }

    AggregateCacheDependency是.Net Framework 2.0新增的一個(gè)類(lèi),它負(fù)責(zé)監(jiān)視依賴(lài)項(xiàng)對(duì)象的集合。當(dāng)這個(gè)集合中的任意一個(gè)依賴(lài)項(xiàng)對(duì)象發(fā)生改變時(shí),該依賴(lài)項(xiàng)對(duì)象對(duì)應(yīng)的緩存對(duì)象都將被自動(dòng)移除。
    AggregateCacheDependency類(lèi)起到了組合CacheDependency對(duì)象的作用,它可以將多個(gè)CacheDependency對(duì)象甚至于不同類(lèi)型的CacheDependency對(duì)象與緩存項(xiàng)建立關(guān)聯(lián)。由于PetShop需要為Category、Product和Item數(shù)據(jù)表建立依賴(lài)項(xiàng),因而IPetShopCacheDependency的接口方法GetDependency()其目的就是返回建立了這些依賴(lài)項(xiàng)的AggregateCacheDependency對(duì)象。

    4.3.2  CacheDependency實(shí)現(xiàn)

    CacheDependency的實(shí)現(xiàn)正是為Category、Product和Item數(shù)據(jù)表建立了對(duì)應(yīng)的SqlCacheDependency類(lèi)型的依賴(lài)項(xiàng),如代碼所示:
    public abstract class TableDependency : IPetShopCacheDependency
    {
        // This is the separator that's used in web.config
        protected char[] configurationSeparator = new char[] { ',' };

        protected AggregateCacheDependency dependency = new AggregateCacheDependency();
        protected TableDependency(string configKey)
        {
            string dbName = ConfigurationManager.AppSettings["CacheDatabaseName"];
            string tableConfig = ConfigurationManager.AppSettings[configKey];
            string[] tables = tableConfig.Split(configurationSeparator);

            foreach (string tableName in tables)
                dependency.Add(new SqlCacheDependency(dbName, tableName));
        }
        public AggregateCacheDependency GetDependency()
       {
            return dependency;
        }
    }

    需要建立依賴(lài)項(xiàng)的數(shù)據(jù)庫(kù)與數(shù)據(jù)表都配置在web.config文件中,其設(shè)置如下:
    <add key="CacheDatabaseName" value="MSPetShop4"/>
    <add key="CategoryTableDependency" value="Category"/>
    <add key="ProductTableDependency" value="Product,Category"/>
    <add key="ItemTableDependency" value="Product,Category,Item"/>

    根據(jù)各個(gè)數(shù)據(jù)表間的依賴(lài)關(guān)系,因而不同的數(shù)據(jù)表需要建立的依賴(lài)項(xiàng)也是不相同的,從配置文件中的value值可以看出。然而不管建立依賴(lài)項(xiàng)的多寡,其創(chuàng)建的行為邏輯都是相似的,因而在設(shè)計(jì)時(shí),抽象了一個(gè)共同的類(lèi)TableDependency,并通過(guò)建立帶參數(shù)的構(gòu)造函數(shù),完成對(duì)依賴(lài)項(xiàng)的建立。由于接口方法GetDependency()的實(shí)現(xiàn)中,返回的對(duì)象dependency是在受保護(hù)的構(gòu)造函數(shù)創(chuàng)建的,因此這里的實(shí)現(xiàn)方式也可以看作是Template Method模式的靈活運(yùn)用。例如TableDependency的子類(lèi)Product,就是利用父類(lèi)的構(gòu)造函數(shù)建立了Product、Category數(shù)據(jù)表的SqlCacheDependency依賴(lài):
    public class Product : TableDependency
    {
        public Product() : base("ProductTableDependency") { }
    }

    如果需要自定義CacheDependency,那么創(chuàng)建依賴(lài)項(xiàng)的方式又有不同。然而不管是創(chuàng)建SqlCacheDependency對(duì)象,還是自定義的CacheDependency對(duì)象,都是將這些依賴(lài)項(xiàng)添加到AggregateCacheDependency類(lèi)中,因而我們也可以為自定義CacheDependency建立專(zhuān)門(mén)的類(lèi),只要實(shí)現(xiàn)IPetShopCacheDependency接口即可。

    4.3.3  CacheDependency工廠

    繼承了抽象類(lèi)TableDependency的Product、Category和Item類(lèi)均需要在調(diào)用時(shí)創(chuàng)建各自的對(duì)象。由于它們的父類(lèi)TableDependency實(shí)現(xiàn)了接口IPetShopCacheDependency,因而它們也間接實(shí)現(xiàn)了IPetShopCacheDependency接口,這為實(shí)現(xiàn)工廠模式提供了前提。

    在PetShop 4.0中,依然利用了配置文件和反射技術(shù)來(lái)實(shí)現(xiàn)工廠模式。命名空間PetShop.CacheDependencyFactory中,類(lèi)DependencyAccess即為創(chuàng)建IPetShopCacheDependency對(duì)象的工廠類(lèi):
    public static class DependencyAccess
    {       
        public static IPetShopCacheDependency CreateCategoryDependency()
        {
            return LoadInstance("Category");
        }
        public static IPetShopCacheDependency CreateProductDependency()
        {
            return LoadInstance("Product");
        }
        public static IPetShopCacheDependency CreateItemDependency()
        {
            return LoadInstance("Item");
        }
        private static IPetShopCacheDependency LoadInstance(string className)
        {
            string path = ConfigurationManager.AppSettings["CacheDependencyAssembly"];
            string fullyQualifiedClass = path + "." + className;
            return (IPetShopCacheDependency)Assembly.Load(path).CreateInstance(fullyQualifiedClass);
        }
    }
    整個(gè)工廠模式的實(shí)現(xiàn)如圖4-3所示:

    4-3.gif
     圖4-3 CacheDependency工廠

    雖然DependencyAccess類(lèi)創(chuàng)建了實(shí)現(xiàn)了IPetShopCacheDependency接口的類(lèi)Category、Product、Item,然而我們之所以引入IPetShopCacheDependency接口,其目的就在于獲得創(chuàng)建了依賴(lài)項(xiàng)的AggregateCacheDependency類(lèi)型的對(duì)象。我們可以調(diào)用對(duì)象的接口方法GetDependency(),如下所示:
    AggregateCacheDependency dependency = DependencyAccess.CreateCategoryDependency().GetDependency();

    為了方便調(diào)用者,似乎我們可以對(duì)DependencyAccess類(lèi)進(jìn)行改進(jìn),將原有的CreateCategoryDependency()方法,修改為創(chuàng)建AggregateCacheDependency類(lèi)型對(duì)象的方法。

    然而這樣的做法擾亂了作為工廠類(lèi)的DependencyAccess的本身職責(zé),且創(chuàng)建IPetShopCacheDependency接口對(duì)象的行為仍然有可能被調(diào)用者調(diào)用,所以保留原有的DependencyAccess類(lèi)仍然是有必要的。

    在PetShop 4.0的設(shè)計(jì)中,是通過(guò)引入Facade模式以方便調(diào)用者更加簡(jiǎn)單地獲得AggregateCacheDependency類(lèi)型對(duì)象。

    4.3.4  引入Facade模式

    利用Facade模式可以將一些復(fù)雜的邏輯進(jìn)行包裝,以方便調(diào)用者對(duì)這些復(fù)雜邏輯的調(diào)用。就好像提供一個(gè)統(tǒng)一的門(mén)面一般,將內(nèi)部的子系統(tǒng)封裝起來(lái),統(tǒng)一為一個(gè)高層次的接口。一個(gè)典型的Facade模式示意圖如下所示:

    4-4.gif
    圖4-4 Facade模式

    Facade模式的目的并非要引入一個(gè)新的功能,而是在現(xiàn)有功能的基礎(chǔ)上提供一個(gè)更高層次的抽象,使得調(diào)用者可以直接調(diào)用,而不用關(guān)心內(nèi)部的實(shí)現(xiàn)方式。以CacheDependency工廠為例,我們需要為調(diào)用者提供獲得AggregateCacheDependency對(duì)象的簡(jiǎn)便方法,因而創(chuàng)建了DependencyFacade類(lèi):
    public static class DependencyFacade
    {
        private static readonly string path = ConfigurationManager.AppSettings["CacheDependencyAssembly"];
        public static AggregateCacheDependency GetCategoryDependency()
        {
            if (!string.IsNullOrEmpty(path))
                return DependencyAccess.CreateCategoryDependency().GetDependency();
            else
                return null;
        }
        public static AggregateCacheDependency GetProductDependency()
        {
            if (!string.IsNullOrEmpty(path))
                return DependencyAccess.CreateProductDependency().GetDependency();
            else
                return null;
            }
        public static AggregateCacheDependency GetItemDependency()
        {
            if (!string.IsNullOrEmpty(path))
                return DependencyAccess.CreateItemDependency().GetDependency();
            else
                return null;
        }
    }

    DependencyFacade類(lèi)封裝了獲取AggregateCacheDependency類(lèi)型對(duì)象的邏輯,如此一來(lái),調(diào)用者可以調(diào)用相關(guān)方法獲得創(chuàng)建相關(guān)依賴(lài)項(xiàng)的AggregateCacheDependency類(lèi)型對(duì)象:
    AggregateCacheDependency dependency = DependencyFacade.GetCategoryDependency();

    比起直接調(diào)用DependencyAccess類(lèi)的GetDependency()方法而言,除了方法更簡(jiǎn)單之外,同時(shí)它還對(duì)CacheDependencyAssembly配置節(jié)進(jìn)行了判斷,如果其值為空,則返回null對(duì)象。

    在PetShop.Web的App_Code文件夾下,靜態(tài)類(lèi)WebUtility的GetCategoryName()和GetProductName()方法調(diào)用了DependencyFacade類(lèi)。例如GetCategoryName()方法:
    public static string GetCategoryName(string categoryId)
    {
         Category category = new Category();
         if (!enableCaching)
                return category.GetCategory(categoryId).Name;

         string cacheKey = string.Format(CATEGORY_NAME_KEY, categoryId);

         // 檢查緩存中是否存在該數(shù)據(jù)項(xiàng);
         string data = (string)HttpRuntime.Cache[cacheKey];
         if (data == null)
         {
               // 通過(guò)web.config的配置獲取duration值;
               int cacheDuration = int.Parse(ConfigurationManager.AppSettings["CategoryCacheDuration"]);
               // 如果緩存中不存在該數(shù)據(jù)項(xiàng),則通過(guò)業(yè)務(wù)邏輯層訪問(wèn)數(shù)據(jù)庫(kù)獲取;
               data = category.GetCategory(categoryId).Name;
               // 通過(guò)Facade類(lèi)創(chuàng)建AggregateCacheDependency對(duì)象;
               AggregateCacheDependency cd = DependencyFacade.GetCategoryDependency();
               // 將數(shù)據(jù)項(xiàng)以及AggregateCacheDependency 對(duì)象存儲(chǔ)到緩存中;
               HttpRuntime.Cache.Add(cacheKey, data, cd, DateTime.Now.AddHours(cacheDuration), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
          }
          return data;
    }

    GetCategoryName()方法首先會(huì)檢查緩存中是否已經(jīng)存在CategoryName數(shù)據(jù)項(xiàng),如果已經(jīng)存在,就通過(guò)緩存直接獲取數(shù)據(jù);否則將通過(guò)業(yè)務(wù)邏輯層調(diào)用數(shù)據(jù)訪問(wèn)層訪問(wèn)數(shù)據(jù)庫(kù)獲得CategoryName,在獲得了CategoryName后,會(huì)將新獲取的數(shù)據(jù)連同DependencyFacade類(lèi)創(chuàng)建的AggregateCacheDependency對(duì)象添加到緩存中。

    WebUtility靜態(tài)類(lèi)被表示層的許多頁(yè)面所調(diào)用,例如Product頁(yè)面:
    public partial class Products : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Page.Title = WebUtility.GetCategoryName(Request.QueryString["categoryId"]);
        }
    }

    顯示頁(yè)面title的邏輯是放在Page_Load事件方法中,因而每次打開(kāi)該頁(yè)面都要執(zhí)行獲取CategoryName的方法。如果沒(méi)有采用緩存機(jī)制,當(dāng)Category數(shù)據(jù)較多時(shí),頁(yè)面的顯示就會(huì)非常緩慢。

    4.3.5  引入Proxy模式

    業(yè)務(wù)邏輯層BLL中與Product、Category、Item有關(guān)的業(yè)務(wù)方法,其實(shí)現(xiàn)邏輯是調(diào)用數(shù)據(jù)訪問(wèn)層(DAL)對(duì)象訪問(wèn)數(shù)據(jù)庫(kù),以獲取相關(guān)數(shù)據(jù)。為了改善系統(tǒng)性能,我們就需要為這些實(shí)現(xiàn)方法增加緩存機(jī)制的邏輯。當(dāng)我們操作增加了緩存機(jī)制的業(yè)務(wù)對(duì)象時(shí),對(duì)于調(diào)用者而言,應(yīng)與BLL業(yè)務(wù)對(duì)象的調(diào)用保持一致。也即是說(shuō),我們需要引入一個(gè)新的對(duì)象去控制原來(lái)的BLL業(yè)務(wù)對(duì)象,這個(gè)新的對(duì)象就是Proxy模式中的代理對(duì)象。

    以PetShop.BLL.Product業(yè)務(wù)對(duì)象為例,PetShop為其建立了代理對(duì)象ProductDataProxy,并在GetProductByCategory()等方法中,引入了緩存機(jī)制,例如:
    public static class ProductDataProxy
    {

        private static readonly int productTimeout = int.Parse(ConfigurationManager.AppSettings["ProductCacheDuration"]);
        private static readonly bool enableCaching = bool.Parse(ConfigurationManager.AppSettings["EnableCaching"]);
           
        public static IList
    GetProductsByCategory(string category)
        {
            Product product = new Product();

            if (!enableCaching)
                return product.GetProductsByCategory(category);

            string key = "product_by_category_" + category;
            IList data = (IList )HttpRuntime.Cache[key];

            // Check if the data exists in the data cache
            if (data == null)
            {
                data = product.GetProductsByCategory(category);

                // Create a AggregateCacheDependency object from the factory
                AggregateCacheDependency cd = DependencyFacade.GetProductDependency();

                // Store the output in the data cache, and Add the necessary AggregateCacheDependency object
                HttpRuntime.Cache.Add(key, data, cd, DateTime.Now.AddHours(productTimeout), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
            }
            return data;
        }
    }

    與業(yè)務(wù)邏輯層Product對(duì)象的GetProductsByCategory()方法相比,增加了緩存機(jī)制。當(dāng)緩存內(nèi)不存在相關(guān)數(shù)據(jù)項(xiàng)時(shí),則直接調(diào)用業(yè)務(wù)邏輯層Product的GetProductsByCategory()方法來(lái)獲取數(shù)據(jù),并將其與對(duì)應(yīng)的AggregateCacheDependency對(duì)象一起存儲(chǔ)在緩存中。

    引入Proxy模式,實(shí)現(xiàn)了在緩存級(jí)別上對(duì)業(yè)務(wù)對(duì)象的封裝,增強(qiáng)了對(duì)業(yè)務(wù)對(duì)象的控制。由于暴露在對(duì)象外的方法是一致的,因而對(duì)于調(diào)用方而言,調(diào)用代理對(duì)象與真實(shí)對(duì)象并沒(méi)有實(shí)質(zhì)的區(qū)別。

    從職責(zé)分離與分層設(shè)計(jì)的角度分析,我更希望這些Proxy對(duì)象是被定義在業(yè)務(wù)邏輯層中,而不像在PetShop的設(shè)計(jì)那樣,被劃分到表示層UI中。此外,如果需要考慮程序的可擴(kuò)展性與可替換性,我們還可以為真實(shí)對(duì)象與代理對(duì)象建立統(tǒng)一的接口或抽象類(lèi)。然而,單以PetShop的表示層調(diào)用來(lái)看,采用靜態(tài)類(lèi)與靜態(tài)方法的方式,或許更為合理。我們需要謹(jǐn)記,“過(guò)度設(shè)計(jì)”是軟件設(shè)計(jì)的警戒線。

    如果需要對(duì)UI層采用緩存機(jī)制,將應(yīng)用程序數(shù)據(jù)存放到緩存中,就可以調(diào)用這些代理對(duì)象。以ProductsControl用戶(hù)控件為例,調(diào)用方式如下:
    productsList.DataSource = ProductDataProxy.GetProductsByCategory(categoryKey);

    productsList對(duì)象屬于自定義的CustomList類(lèi)型,這是一個(gè)派生自System.Web.UI.WebControls.DataList控件的類(lèi),它的DataSource屬性可以接受IList集合對(duì)象。
    不過(guò)在PetShop 4.0的設(shè)計(jì)中,對(duì)于類(lèi)似于ProductsControl類(lèi)型的控件而言,采用的緩存機(jī)制是頁(yè)輸出緩存。我們可以從ProductsControl.ascx頁(yè)面的Source代碼中發(fā)現(xiàn)端倪:
    <%@ OutputCache Duration="100000" VaryByParam="page;categoryId" %>

    與ASP.NET 1.x的頁(yè)輸出緩存不同的是,在ASP.NET 2.0中,為ASP.NET用戶(hù)控件新引入了CachePolicy屬性,該屬性的類(lèi)型為ControlCachePolicy類(lèi),它以編程方式實(shí)現(xiàn)了對(duì)ASP.NET用戶(hù)控件的輸出緩存設(shè)置。我們可以通過(guò)設(shè)置ControlCachePolicy類(lèi)的Dependency屬性,來(lái)設(shè)置與該用戶(hù)控件相關(guān)的依賴(lài)項(xiàng),例如在ProductsControl用戶(hù)控件中,進(jìn)行如下的設(shè)置:
    protected void Page_Load(object sender, EventArgs e)
    {
        this.CachePolicy.Dependency = DependencyFacade.GetProductDependency();
    }

    采用頁(yè)輸出緩存,并且利用ControlCachePolicy設(shè)置輸出緩存,能夠?qū)I(yè)務(wù)數(shù)據(jù)與整個(gè)頁(yè)面放入到緩存中。這種方式比起應(yīng)用程序緩存而言,在性能上有很大的提高。同時(shí),它又通過(guò)引入的SqlCacheDependency特性有效地避免了“數(shù)據(jù)過(guò)期”的缺點(diǎn),因而在PetShop 4.0中被廣泛采用。相反,之前為Product、Category、Item業(yè)務(wù)對(duì)象建立的代理對(duì)象則被“投閑散置”,僅僅作為一種設(shè)計(jì)方法的展示而“幸存”與整個(gè)系統(tǒng)的源代碼中。

    posted @ 2007-12-26 12:07 風(fēng)雨兼程 閱讀(1276) | 評(píng)論 (1)編輯 收藏

    IList GetCategories();的問(wèn)題

    petshop4.0中的一段代碼  
       
      public   interface   ICategory   {  
       
      ///   <summary>  
      ///   Method   to   get   all   categories  
      ///   </summary>  
                      ///   <returns>Interface   to   Model   Collection   Generic   of   categories</returns>  
                 
                     
      IList<CategoryInfo>   GetCategories();  
                     
       
                      ///   <summary>  
                      ///   Get   information   on   a   specific   category  
                      ///   </summary>  
                      ///   <param   name="categoryId">Unique   identifier   for   a   category</param>  
                      ///   <returns>Business   Entity   representing   an   category</returns>  
                      CategoryInfo   GetCategory(string   categoryId);  
      }  
       
       
      我知道IList<CategoryInfo>是范型  
      表示list中的item是CategoryInfo對(duì)象  
       
       
      請(qǐng)問(wèn)為什么用IList<CategoryInfo>  
      用List<CategoryInfo>可以嗎?  
       
      兩者有什么區(qū)別?謝謝  

    沒(méi)有什么區(qū)別,這樣寫(xiě)靈活性大,實(shí)現(xiàn)ilist接口的類(lèi)很多,你寫(xiě)成list后,也許以后你要改成非list的,就會(huì)要改很多代碼
    舉個(gè)例子  
       
      RenderControlToString(DataList   L//Control   C)  
       
      你認(rèn)為是寫(xiě)control還是寫(xiě)datalist代碼的通用性高?

      OOP編碼原則:盡可能用接口編程

    posted @ 2007-12-26 11:44 風(fēng)雨兼程 閱讀(471) | 評(píng)論 (0)編輯 收藏

    關(guān)于sqlhelper.cs

    public abstract class SqlHelper
              {
                  public static readonly string connectionString = ConfigurationManager.ConnectionStrings["SqlConnString"].ConnectionString;
            
                  SqlConnection conn;

                  #region open SqlConnection
                  public static void Open() {
                       conn = new SqlConnection(connectionString);
                       if (conn.State != ConnectionState.Open)
                          conn.Open();
                  }    
                  #endregion

                  #region close SqlConnection
                  public static void Close() {
                      if (conn != null)
                      {
                          conn.Close();
                          conn.Dispose();
                      }
                  }        
                  #endregion

                  #region prepare SqlCommand
                  private static void PrepareCommand(SqlCommand cmd, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) {
                      Open();
                      cmd.Connection = conn;
                      cmd.CommandType = cmdType;
                      cmd.CommandText = cmdText;

                      if (cmdParms != null)
                      {
                          foreach (SqlParameter parm in cmdParms)
                              cmd.Parameters.Add(parm);
                      }
                  }
                  #endregion

                  #region parm cache
                  /*
                   使用一個(gè)哈希表來(lái)保存緩存的參數(shù) 只緩存參數(shù)名
                   哈希表的特點(diǎn):一個(gè)鍵對(duì)應(yīng)一個(gè)值key對(duì)value(為object需要類(lèi)型轉(zhuǎn)化)        不能出現(xiàn)兩個(gè)相同的鍵 否則error
             
                   下面的哈希表parmCache定義為static即一次定義全局使用
                   所以可能會(huì)出現(xiàn)有人在讀的時(shí)候,有人在寫(xiě),一般會(huì)用Lock就像Asp中用Application["count"]來(lái)統(tǒng)計(jì)點(diǎn)擊數(shù)一樣
                   要先鎖后解鎖
                   但.net框架提供了Synchroized          sync和syncroize中文意思 同步,同時(shí)發(fā)生
                   來(lái)提供這一操作
                  */
                  private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());

                  public static void CacheParameters(string cacheKey, params SqlParameter[] commandParameters) {
                      parmCache[cacheKey] = commandParameters;
                  }

                  /*
                  1、為何要克隆呢 為何不直接return cachedParms
             
                  有一個(gè)參數(shù)數(shù)組
                  SqlParameter[] parms={
                  new SqlParameter("@num1",SqlDbType.Int,4),
                  new SqlParameter("@num2",SqlDbType.Int,4)
                  }
                  緩存該數(shù)組
                  用戶(hù)a和b都執(zhí)行插入操作
                  a用戶(hù)插入了1,1
                  b用戶(hù)插入了2,2
                  如果不用克隆的話(huà),參數(shù)數(shù)組只有一份
                  而2個(gè)用戶(hù)需要根據(jù)不同的情況賦于不同的值
                  所以就用了克隆了
            
                  2、(ICloneable)cachedParms[i]先將HashTable轉(zhuǎn)為ICloneable這樣HashTable就具有了Clone()克隆方法了
                  克隆一份后是什么類(lèi)型呢,,當(dāng)然要強(qiáng)制轉(zhuǎn)化為(SqlParameter)了
                  最后將它賦值給clonedParms[i]
                  */       
                  public static SqlParameter[] GetCachedParameters(string cacheKey) {
                      SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey];

                      if (cachedParms == null)
                          return null;
                      SqlParameter[] clonedParms = new SqlParameter[cachedParms.Length];

                      for (int i = 0; i < cachedParms.Length; i++)
                          clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone();

                      return clonedParms;
                  }
                  #endregion        
            
                  //below method support sqltext and procedure

                  #region ExecuteReader
                  /*
                   parms的作用,這也是一個(gè)知識(shí)點(diǎn)
                   舉例:
                   ExecuteReader(*,*,null)成功運(yùn)行
                   ExecuteReader(*,*,new SqlParameter(*))成功運(yùn)行
                   ExecuteReader(*,*,new SqlParameter(*),new SqlParameter(*))成功運(yùn)行
                   ExecuteReader(*,*,{new SqlParameter(*),new SqlParameter(*),})成功運(yùn)行
                   它讓參數(shù)類(lèi)型和參數(shù)個(gè)數(shù)任意
                   這可給了不是一般的好處,你不必為SqlParameter和SqlParameter[]進(jìn)行重載,寫(xiě)上兩個(gè)函數(shù)
                   又為null寫(xiě)上一個(gè)函數(shù),因?yàn)閚ull會(huì)不明確調(diào)用SqlParameter的函數(shù)還是SqlParameter[]的函數(shù)
                   啥你不知道我在說(shuō)什么,打屁屁,那回去看看c++的函數(shù)重載
                   */
                  public static SqlDataReader ExecuteReader(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {
                
                      SqlCommand cmd = new SqlCommand();

                      try {
                          PrepareCommand(cmd, null, cmdType, cmdText, commandParameters);
                          SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                          cmd.Parameters.Clear();
                          return rdr;
                      }
                      catch {
                          Close();
                          throw;
                      }
                  }
                  #endregion

                  #region ExecuteNonQuery
                  public static void ExecuteNonQuery(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {

                      SqlCommand cmd = new SqlCommand();

                      PrepareCommand(cmd, cmdType, cmdText, commandParameters);
                      cmd.ExecuteNonQuery();
                      cmd.Parameters.Clear();

                      Close();
                  }
                  #endregion

                  #region ExecuteScalar
                  public static object ExecuteScalar(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {

                      SqlCommand cmd = new SqlCommand();

                      PrepareCommand(cmd, cmdType, cmdText, commandParameters);
                      object val = cmd.ExecuteScalar();
                      cmd.Parameters.Clear();

                      Close();
                      return val;
                  }
                  #endregion


              }
    }

    posted @ 2007-12-26 10:30 風(fēng)雨兼程 閱讀(904) | 評(píng)論 (0)編輯 收藏

    框架怎樣實(shí)現(xiàn)高度隨內(nèi)容自動(dòng)增高

    main.htm:

    <html> 
        <head> 
           <meta  http-equiv='Content-Type'  content='text/html;  charset=gb2312' /> 
           <meta  name='author'  content='F.R.Huang(meizz梅花雪)//www.meizz.com' /> 
           <title>iframe自適應(yīng)加載的頁(yè)面高度</title> 
        </head> 
        
        <body>
            <div><iframe src="child.htm"></iframe></div>
        </body>
    </html>

    child.htm:

    <html> 
    <head> 
        <meta  http-equiv='Content-Type'  content='text/html;  charset=gb2312' /> 
        <meta  name='author'  content='F.R.Huang(meizz梅花雪)//www.meizz.com' /> 
        <title>iframe  自適應(yīng)其加載的網(wǎng)頁(yè)(多瀏覽器兼容)</title> 
        <script type="text/javascript">
        <!--
        function iframeAutoFit()
        {
            try
            {
                if(window!=parent)
                {
                    var a = parent.document.getElementsByTagName("IFRAME");
                    for(var i=0; i<a.length; i++) //author:meizz
                    {
                        if(a[i].contentWindow==window)
                        {
                            var h1=0, h2=0;
                            a[i].parentNode.style.height = a[i].offsetHeight +"px";
                            a[i].style.height = "10px";
                            if(document.documentElement&&document.documentElement.scrollHeight)
                            {
                                h1=document.documentElement.scrollHeight;
                            }
                            if(document.body) h2=document.body.scrollHeight;

                            var h=Math.max(h1, h2);
                            if(document.all) {h += 4;}
                            if(window.opera) {h += 1;}
                            a[i].style.height = a[i].parentNode.style.height = h +"px";
                        }
                    }
                }
            }
            catch (ex){}
        }
        if(window.attachEvent)
        {
            window.attachEvent("onload",  iframeAutoFit);
            //window.attachEvent("onresize",  iframeAutoFit);
        }
        else if(window.addEventListener)
        {
            window.addEventListener('load',  iframeAutoFit,  false);
            //window.addEventListener('resize',  iframeAutoFit,  false);
        }
        //-->
        </script> 
    </head> 
    <body>
        <table border="1" width="200" style="height: 400px; background-color: yellow">
            <tr>
                <td>iframe  自適應(yīng)其加載的網(wǎng)頁(yè)(多瀏覽器兼容,支持XHTML)</td>
            </tr>
        </table>
    </body> 
    </html>

     很多人反應(yīng)在IE7里使用它會(huì)死機(jī),那是因?yàn)樵谧赃m應(yīng)高度時(shí)觸發(fā)了 window.onresize 事件,而這個(gè)事件又去調(diào)用這個(gè)調(diào)整 <iframe> 高度的函數(shù),產(chǎn)生了死循環(huán)調(diào)用。

    posted @ 2007-04-29 18:03 風(fēng)雨兼程 閱讀(999) | 評(píng)論 (1)編輯 收藏

    怎樣向xml文檔插入HTML標(biāo)記

    CDATA 區(qū)段
           因?yàn)榫W(wǎng)頁(yè)中要顯示HTML的源代碼。而在XML中,要實(shí)現(xiàn)這樣的功能,就必須使用CDATA標(biāo)記。在CDATA標(biāo)記中的信息被解析器原封不動(dòng)地傳給應(yīng)用程序,并且不解析該段信息中的任何控制標(biāo)記。CDATA區(qū)域是由:![CDATA[”為開(kāi)始標(biāo)記,以“]]為結(jié)束標(biāo)記。例如:例2中的源碼,除了![CDATA[”“]]符號(hào),其余的內(nèi)容解析器將原封不動(dòng)地交給下游的應(yīng)用程序,即使CDATA區(qū)域中的開(kāi)始和結(jié)尾的空白以及換行字符等,都同樣會(huì)被轉(zhuǎn)交(注意CDATA是大寫(xiě)的字符)。 

        如同你在第三章中學(xué)到的,你不能直接將(<)或(&)符號(hào)放置在元素內(nèi)容中的字符數(shù)據(jù)里。要避開(kāi)這個(gè)限制的一種方法是使用字符參照(& #60;或& #38;)或預(yù)先定義的普通實(shí)體參照(& lt;或& amp;),如同你在第六章中將學(xué)到的。然而,如果你需要加入多個(gè)(<)或(&)字符,使用這些參照將變得不合適且會(huì)讓資料變得難以閱讀。在這種情況下,將包含限制字符的文字放置在CDATA 區(qū)段中將會(huì)比較容易完成工作。
        CDATA 區(qū)段的類(lèi)型
        CDATA 區(qū)段以字符「<![CDATA[」開(kāi)始,并以「]]>」字符結(jié)束。在這兩個(gè)定義符號(hào)之間,你可以輸入任何字符(包括「<」或「&」),除了「]]>」之外。(因?yàn)?,該字符?huì)被解釋成CDATA區(qū)段的結(jié)束。)所有位在CDATA 區(qū)段中的字符都被視為元素字符數(shù)據(jù)的字義 (literal) 部分,而不是XML 標(biāo)簽。
        下面是一個(gè)合法CDATA 區(qū)段的范例:
    <![CDATA [
    Here you can type any characters except two right brackets followed
    by a greater-than symbol.
    ]]>
    注意
        關(guān)鍵詞CDATA,就像其它你所見(jiàn)到的XML 關(guān)鍵詞,必須以大寫(xiě)字母撰寫(xiě)。
        如果你想包含一段原始碼或標(biāo)簽當(dāng)作被顯示在瀏覽器中元素的真實(shí)字符數(shù)據(jù)的一部份,你可以使用CDATA 區(qū)段來(lái)防止XML 解析器將「<」或「&」字符解釋成XML 卷標(biāo)。下面就是一個(gè)范例:
    <A-SECTION>
    The following is an example of a very simple HTML page:
    <![CDATA[
    <HTML>
    <HEAD>
    <T99vLE>R.Jones &Sons</T99vLE>
    </HEAD>
    <BODY>
    <P>Welcome to our home page!</P>
    </BODY>
    </HTML>
    ]]>
    </A-SECTION>
        例如,若沒(méi)有CDATA 區(qū)段,處理器會(huì)假設(shè)<HTML>是套迭的元素的起始部分,而不是A-SECTION 元素的字符數(shù)據(jù)的起始部分。
    注意
        既然你可以直接將「<」與「&」字符加入CDATA 區(qū)段中,你就不必使用字符參照(& #60;與&)或預(yù)先定義的普通實(shí)體參照(& lt;與& amp;),筆者將在第六章中解釋字符參照與實(shí)體參照。事實(shí)上,如果你使用這類(lèi)的參照,解析器會(huì)將參照中的每個(gè)字符照字面解釋?zhuān)也粫?huì)更換掉含有「<」或「&」字符的參照。
        你可以放置CDATA 區(qū)段的地方
        你可以將CDATA 區(qū)段放置在字符數(shù)據(jù)可以出現(xiàn)的任何地方-也就是說(shuō),在元素的內(nèi)容中卻不在XML 標(biāo)簽中。下面是一個(gè)合法放置CDATA 區(qū)段的范例
    <?xml version="1.0"?>
    <MUSICAL>
    <T99vLE_PAGE>

     

    <![CDATA[
    <Oklahoma!>
    By
    Rogers &Hammerstein
    ]]>
    </T99vLE_PAGE>
    <!--Other elements here...-->
    </MUSICAL>
        顯示于下頁(yè)的錯(cuò)誤型式XML 文件包含了兩個(gè)違法的CDATA 區(qū)段。第一個(gè)不是在元素的內(nèi)容中。第二個(gè)則是位在文件元素的內(nèi)容之中,但卻不是在起始標(biāo)簽中。
    <?xml version="1.0"?>
    <![CDATA[ ILLEGAL::not within element content!]]>
    <DOC_ELEMENT>
    <SUB_ELEMENT <![CDATA[ ILLEGAL::inside of markup!]]>>
    sub-element content...
    </SUB_ELEMENT>
    </DOC_ELEMENT>
    注意
        CDATA 區(qū)段不能成巢狀套迭。亦即,你不能將一個(gè)CDATA 區(qū)段放到另一個(gè)區(qū)段中。

    posted @ 2007-04-29 17:42 風(fēng)雨兼程 閱讀(1848) | 評(píng)論 (0)編輯 收藏

    三 生 三 世

    前生,你以緋紅的思念,偎依我的窗前,將一生的愛(ài)戀開(kāi)放成桃花一片。

    ????你深情的佇立在早春三月,以燦爛溫暖我冬季曾經(jīng)冰封的心河。你將錚錚的誓言,以千枝萬(wàn)條纏繞在我的窗前,你將依戀深鎖在每一朵花心,呈以幽香親吻我的氣息。

    ????隔窗,是我纖纖的倩影,以一雙翦水的眼眸將你一片迷醉的桃紅粉成癡癡的凝望。在微風(fēng)細(xì)雨里,你致以我呢喃的細(xì)語(yǔ),那雨滴落在花瓣上的顫音是你為我譜寫(xiě)的相思曲。懵懂的我,總是憑窗而立,期待一襲青衫從幽香裊繞的花樹(shù)下,以熱切的眼眸向我走來(lái)。紅塵中的我,卻看不穿你糾結(jié)滿(mǎn)樹(shù)的想我的情結(jié)。終究,你在屬于自己季節(jié)的尾聲,隔窗,用最后眷戀的眼光,在不舍與哀傷中碎落我的窗下,看著你飄零的身軀,撞入我心扉的是來(lái)得深刻而猛烈的疼痛,急促地伸出手,想接住你,在錯(cuò)過(guò)的瞬間,有淚從眼中滴落……。愛(ài),總在失去的瞬間才知道它的存在。含淚,我祈禱來(lái)生也盛開(kāi)成一簇桃花,與你臨風(fēng)偎依,還你一生的情。?
      
    ????前生,我是桃花一片,以最美的姿色開(kāi)滿(mǎn)你路過(guò)的青石小徑,將一生的眷戀開(kāi)放成寂寞的等待。等你瀟灑的身影路過(guò)時(shí),輕撫我的臉龐,給我一聲愛(ài)憐的贊嘆,我以香為魂,伴你在花叢中留戀,聽(tīng)你為我賦詩(shī),為我吹笛。當(dāng)你每次轉(zhuǎn)身離去時(shí),我在微風(fēng)中心碎的聲音,你是否聽(tīng)見(jiàn)?總在無(wú)你的夜晚獨(dú)自浴著冷月的清輝想你,思念便凋落成滿(mǎn)地憔悴的容顏,清晨,花瓣上的露珠便是我為你流了一夜的淚。?

    ???我寂寞而又充滿(mǎn)期待地等著你經(jīng)過(guò),貪戀地呼吸著有你的空氣,眷戀著你身上發(fā)出來(lái)的味道,有一種依偎的感覺(jué)和莫名的幸福。雖然我不能表達(dá)對(duì)你的所有的愛(ài)戀,只能無(wú)語(yǔ)地看著你來(lái)去匆忙的身影,你為我的每次駐足和停留,都讓我感動(dòng)和欣喜萬(wàn)分,你的憂(yōu)郁的長(zhǎng)嘆總牽動(dòng)我的心弦,在你看不見(jiàn)里為你暗自落淚。如果可以,我多么希望就這樣在這里靜默地守侯,守侯朝來(lái)暮去的時(shí)光里有你的身影陪伴,與你偕老。

    ???我只有一季短暫的生命和一顆愛(ài)你的心,在不屬于我的季節(jié)即將來(lái)臨之際,我將離去。雖然我有深深的眷戀和離別的傷痛,可是,生命不容我為你停留。就讓我在季節(jié)最后的晨光里,以飛舞的姿勢(shì)婆娑而落,在你嗚咽的笛音里慢慢凋零在你的指尖……。我祈禱來(lái)生不再為花,許我能語(yǔ)言可以向你傾訴。

    ???今生,我是桃樹(shù)下畫(huà)花的女子,就著一襲白色長(zhǎng)裙,拈一朵桃花簪入發(fā),染幾筆丹青,將你我的姻緣寫(xiě)進(jìn)花瓣,等著能解花語(yǔ)的你飄然而來(lái),執(zhí)我之手,與我傾訴,共我繾綣。

    ???不許愿來(lái)世相見(jiàn),不求一生擁有,只愿今生有緣能與你攜手相擁,走過(guò)一段人生。我以三生的情,換你一生的緣,只是不愿再錯(cuò)過(guò)生命中的一段情緣。

    posted @ 2007-02-26 14:05 風(fēng)雨兼程 閱讀(186) | 評(píng)論 (0)編輯 收藏

    一個(gè)關(guān)于模態(tài)彈出窗口刷新父窗體的問(wèn)題。急

    問(wèn):
    我在做一套系統(tǒng)的時(shí)候碰到這樣一個(gè)問(wèn)題。
    彈出的模態(tài)窗口不能刷新父窗體。例如我新增數(shù)據(jù)是在模態(tài)窗口而添加成功了關(guān)閉后父窗體只能手動(dòng)刷新。這樣就嚴(yán)重影響了一些效果。
    我嘗試過(guò)一些方法但是始終不對(duì)。請(qǐng)各位高手進(jìn)來(lái)一下。

    用OPEN打開(kāi)的不管是在關(guān)閉窗體時(shí)自動(dòng)刷新都沒(méi)有任何問(wèn)題。見(jiàn)下例

    父窗體代碼
    <%@ page contentType="text/html; charset=GBK" %>
    <html>
    <head>
    <title></title>
    </head>
    <body>
    <a href="javascript:void(0)" onclick="window.open('2.html','','')">open</a>
    </body>
    </html>

    子窗體代碼
    <%@ page contentType="text/html; charset=GBK" %>
    <html>
    <head>
    <title></title>
    </head>
    <body onUnload="opener.location.reload()">
    <!-
    用按紐直接刷新父窗體
    <a href="javascript:opener.location.reload()">刷新</a>
    ->
    </body>
    </html>

    ?

    換做模態(tài)后的程序。
    父窗體代碼
    <%@ page contentType="text/html; charset=GBK" %><HEAD>
    <body onUnload="opener.location.reload()">
    <script language="JavaScript">
    function showabout()
    {
    ? var returnValue=showModalDialog('2.html','','dialogWidth:520px;dialogHeight:510px;help:no;center:yes;resizable:no;status:no;scroll:no');
    }?
    void(0);
    </script>
    <a href="javascript:void(0)" onClick="showabout()">open</a>

    子窗體代碼
    <%@ page contentType="text/html; charset=GBK" %>
    <html>
    <head>
    <title></title>
    </head>
    <body onUnload="opener.location.reload()">
    <a href="javascript:opener.location.reload()">刷新</a>
    </body>
    </html>

    ?

    請(qǐng)各位參考一下上面的代碼,我感覺(jué)錯(cuò)誤好象是出在
    opener.location.reload()

    謝謝
    ______________________________________________________________________________________________
    答1:
    模態(tài)窗口不能在子窗口中直接刷新父窗口

    父窗體代碼
    <%@ page contentType="text/html; charset=GBK" %><HEAD>
    <body onUnload="opener.location.reload()">
    <script language="JavaScript">
    function showabout()
    {
    ? var returnValue=showModalDialog('2.html','','dialogWidth:520px;dialogHeight:510px;help:no;center:yes;resizable:no;status:no;scroll:no');
    ? location.reload()//模態(tài)窗口傳值下來(lái)后就可以刷新了.
    }?
    void(0);
    </script>
    <a href="javascript:void(0)" onClick="showabout()">open</a>

    子窗體代碼
    <%@ page contentType="text/html; charset=GBK" %>
    <html>
    <head>
    <title></title>
    </head>
    <body onUnload="opener.location.reload()">
    <a href="javascript:opener.location.reload()">刷新</a>//???在子窗口中不能刷新父窗口,只有window.close下去后才可刷新.
    </body>
    </html>

    ______________________________________________________________________________________________
    答2:
    模態(tài)對(duì)話(huà)框是不能用opener引用父窗口的,而是需要父窗口主動(dòng)傳遞指針變量的
    這個(gè)window.showModalDialog有第二個(gè)參數(shù),就是做這個(gè)用的,你需要把window穿過(guò)去,就是這樣
    var returnValue=showModalDialog('2.html',window,'dialogWidth:520px;dialogHeight:510px;help:no;center:yes;resizable:no;status:no;scroll:no');
    這樣在對(duì)話(huà)框中就可以引用父窗口對(duì)象,怎么引用呢,通過(guò)window.dialogArgument就可以應(yīng)用父窗口了。

    ______________________________________________________________________________________________
    答3:
    謝謝。我終于搞定了。
    上面的dialogArgument差個(gè)S
    我調(diào)了半天。發(fā)現(xiàn)在body里面應(yīng)該加上location
    也就是<body onUnload="window.dialogArguments.location.reload()">

    posted @ 2007-02-09 14:48 風(fēng)雨兼程 閱讀(5888) | 評(píng)論 (4)編輯 收藏

    asp.net中動(dòng)態(tài)變更CSS

    在asp.net中,有的時(shí)候要?jiǎng)討B(tài)變換CSS,比如有的時(shí)候做個(gè)性化頁(yè)面,可以這樣做
    <head>
    <link id="MyStyleSheet" rel="stylesheet" type="text/css" runat="server" />
    </head>
    之后,在要更換CSS的頁(yè)面中,使用如下代碼
    Sub Page_Load(Sender As Object, E As EventArgs)
    If Not (IsPostBack)
    MyStyleSheet.Attributes.Add("href","/css/flostyle.css")
    End If
    End Sub??

    posted @ 2007-02-09 13:09 風(fēng)雨兼程 閱讀(222) | 評(píng)論 (0)編輯 收藏

    動(dòng)態(tài)改變Asp.net頁(yè)面標(biāo)題

    1.引用命字空間
    use System.Web.UI.HtmlControls.HtmlGenericControl
    在Asp.net 中你可以使用HtmlGenericControl()來(lái)動(dòng)態(tài)改變頁(yè)面Title(標(biāo)題)



    2.為HTML Title標(biāo)簽設(shè)置ID,并將其作為服務(wù)器端運(yùn)行
    <HTML>
    ??<HEAD>
    ????<TITLE ID=MyPageTitle Runat=Server> </TITLE>
    ??</HEAD>
    ?<BODY>
    ??</BODY>
    </HTML>



    3.將Title標(biāo)設(shè)設(shè)為Runat=server后,就可以后臺(tái)代碼進(jìn)行訪問(wèn)~~,通過(guò)InnerText或InnerHtml
    來(lái)改變其值.
    public class Use_This : System.Web.UI.Page
    ?{
    ??
    Private System.Web.UI.HtmlControls.HtmlGenericControl SetMyTitle;
    ??private void Page_Load(object sender, System.EventArgs e)
    ??{

    ?? SetMyTitle.InnerText = "~哈哈~";

    ??}
    }


    posted @ 2007-02-09 13:08 風(fēng)雨兼程 閱讀(400) | 評(píng)論 (1)編輯 收藏

    怎樣實(shí)現(xiàn)動(dòng)態(tài)添加刪除表單中的行

    <script LANGUAGE="JAVASCRIPT">
    var i= 0;
    var a = 0;
    function insertRow(){
     var otr=myTable.insertRow(myTable.rows.length);
     var ocell=otr.insertCell(0);
     ocell.innerHTML="<input type=file name='f1'+a+''>"
     var ocell=otr.insertCell(1);
    ?? ocell.innerHTML="<input type=file name='f2'+a+''>"
    ?? var ocell=otr.insertCell(2);
    ?? ocell.innerHTML="<input type=button name='del'+a+'' value=刪除 onclick=myTable.deleteRow(event.srcElement.parentElement.parentElement.rowIndex)>"
    ?? i++;
    ?? a++;
    }
    </SCRIPT>
    </HEAD>
    <BODY>
    <table id="myTable" border=1 width=600 >
    </table>
    <input type=button onclick="insertRow()"  value="插入行">
    </BODY>

    2
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>添加刪除行</title>
    </head>

    <body><script LANGUAGE="JAVASCRIPT">
    var j= 1;
    var i= 0;
    var a = 0;
    function insertRow(){
     var otr=myTable.insertRow(myTable.rows.length);
     ??? var ocell=otr.insertCell(0);?????????????????????????????????????????
      ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text? size='12' maxlength='7'name='num"+a+"'>"
     ??? var ocell=otr.insertCell(1);
    ?? ocell.innerHTML="<select name='adsl"+a+"'><option value='1'>ADSL</option><option value='2'> LAN</option></select>"
    ????? var ocell=otr.insertCell(2);?????????????????????????????????????????
    ?? ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'value='"+j+"'>"
    ????? var ocell=otr.insertCell(3);?????????????????????????????????????????
    ?? ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'>"
    ????? var ocell=otr.insertCell(4);?????????????????????????????????????????
    ?? ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'>"
    ????? var ocell=otr.insertCell(5);?
    ?? ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'>"?????
    ???? var? ocell=otr.insertCell(6);
    ?? ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=button name='del'+a+'' value=刪除 onclick=myTable.deleteRow(event.srcElement.parentElement.parentElement.rowIndex)>"
    ?? j++;
    ?? i++;
    ?? a++;
    }
    </SCRIPT>
    </HEAD>
    <BODY>
    <table id="myTable"width="778" border="1" align="center" cellspacing="0" bordercolorlight="#66CC33" bordercolordark="ffffff">
    ? <tr>
    ??? <td><div align="center">號(hào)碼</div></td>
    ??? <td nowrap><div align="center">寬度類(lèi)型</div></td>
    ??? <td nowrap><div align="center">起始時(shí)間</div></td>
    ??? <td nowrap><div align="center">優(yōu)惠時(shí)間</div></td>
    ??? <td nowrap><div align="center">優(yōu)惠金額</div></td>
    ??? <td nowrap><div align="center">備注</div></td>
    ??? <td nowrap><div align="center">刪除</div></td>
    ? </tr>
    </table>
    <p align="center">
    ? <input type=button onclick="insertRow()"value="插入行">
    </p>

    <p>&nbsp;</p>
    </BODY>

    </body>
    </html>

    3
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>添加刪除行</title>
    </head>

    <body><script LANGUAGE="JAVASCRIPT">
    var i= 0;
    var a = 0;
    function insertRow(){
     var otr=myTable.insertRow(myTable.rows.length);
     ??? var ocell=otr.insertCell(0);?????????????????????????????????????????
      ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text? size='12' maxlength='7'name='num"+a+"'>"
     ??? var ocell=otr.insertCell(1);
    ?? ocell.innerHTML="<select onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'name='adsl"+a+"'><option value='1'>ADSL</option><option value='2'> LAN</option></select>"
    ????? var ocell=otr.insertCell(2);?????????????????????????????????????????
    ?? ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'value='"+a+"'>"
    ????? var ocell=otr.insertCell(3);?????????????????????????????????????????
    ?? ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'>"
    ????? var ocell=otr.insertCell(4);?????????????????????????????????????????
    ?? ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'>"
    ????? var ocell=otr.insertCell(5);?
    ?? ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'>"?????
    ???? var? ocell=otr.insertCell(6);
    ?? ocell.innerHTML="<input type=button name='del'+a+'' value=刪除 onclick=myTable.deleteRow(event.srcElement.parentElement.parentElement.rowIndex)>"

    ?? i++;
    ?? a++;
    }
    function deleteRow()
    {
    ?? tr=document.getElementById("myTable").rows;
    ?? if(tr.length>1)tr[tr.length-1].removeNode();
    }
    </SCRIPT>
    </HEAD>
    <BODY>
    <table id="myTable"width="778" border="1" align="center" cellspacing="0" bordercolorlight="#66CC33" bordercolordark="ffffff">
    ? <tr>
    ??? <td><div align="center">號(hào)碼</div></td>
    ??? <td nowrap><div align="center">寬度類(lèi)型</div></td>
    ??? <td nowrap><div align="center">起始時(shí)間</div></td>
    ??? <td nowrap><div align="center">優(yōu)惠時(shí)間</div></td>
    ??? <td nowrap><div align="center">優(yōu)惠金額</div></td>
    ??? <td nowrap><div align="center">備注</div></td>
    ??? <td nowrap><div align="center">刪除</div></td>
    ? </tr>
    </table>
    <p align="center">
    ? <input type=button onclick="insertRow()"value="插入行">
    ? <input type=button onclick="deleteRow()"value="刪除行">
    </p>

    <p>&nbsp;</p>
    </BODY>

    </body>
    </html>

    posted @ 2007-01-29 18:58 風(fēng)雨兼程 閱讀(1217) | 評(píng)論 (0)編輯 收藏

    文件上傳

    ?function OutputUpload(id,title) { var tblMain=document.getElementById("Table2"); var tbl=document.getElementById("Table3"); var isExsitfile=document.getElementById("file"+id); var text=document.createTextNode("上傳:"+title+"虛擬形象圖片"); if(isExsitfile==null) { var str= ""; tbl.rows[id].cells[0].insertAdjacentHTML("beforeEnd",str) ; tbl.rows[id].cells[0].appendChild(text); } else { tbl.rows[id].cells[0].removeChild(isExsitfile); tbl.rows[id].cells[0].innerText=""; } }

    if(Request.Form["CHK"]!=null)
    ???{?? string chkvalue=Request.Form["CHK"].ToString();
    ????string[] mylayer=chkvalue.Split(new char[]{','});
    ????string layer="";
    ????for(int i=0;i<mylayer.Length;i++)
    ????{?????
    ?????
    ?????if(layer!="")
    ?????{
    ??????layer+="_";
    ?????}
    ?????layer+=mylayer[i];
    ?????
    ????}
    ????ViewState["layer"]=layer;
    ??????
    ????//得到數(shù)據(jù)庫(kù)編號(hào)
    ????if(itemid1.ToString()==null)
    ????{
    ?????itemid1=itemid1+1;
    ????}
    ????else
    ????{
    ?????itemid1=GetItemID()+1;
    ????}
    ????System.Web.HttpFileCollection files=System.Web.HttpContext.Current.Request.Files;
    ????try
    ????{
    ?????for(int i=0;i<files.Count;i++)
    ?????{??
    ??????string fid=itemid1+".gif";
    ??????HttpPostedFile postedFile=files[i];
    ??????
    ??????if(postedFile.FileName.Length>0)
    ??????{
    ???????string fileName,fileExtension;
    ???????fileName=System.IO.Path.GetFileName(postedFile.FileName);
    ???????fileExtension=System.IO.Path.GetExtension(fileName);

    ???????if(fileExtension!=GlobalVars.FILETAILNAME[0])
    ???????{
    ????????Response.Write("<script>alert(\"文件格式不正確?。?!\")</script>");
    ????????return;
    ???????}
    ???????if(i==0)
    ???????{
    ????????//上傳圖片到服務(wù)器上??
    ????????BLL.Visual_Items bll=new BLL.Visual_Items();
    ????????bool tf=bll.Exists(this.txtName.Text);
    ????????if(tf==false)
    ????????{??
    ?????????if(System.IO.Directory.Exists(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\0"))
    ?????????{
    ??????????postedFile.SaveAs(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\0\\" + fid);?
    ?????????}
    ?????????else
    ?????????{
    ??????????System.IO.Directory.CreateDirectory(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\0");
    ??????????postedFile.SaveAs(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\0\\" + fid);?
    ?????????}
    ?????????// 把圖片的信息記錄保留到數(shù)據(jù)庫(kù)中
    ?????????string s="images/img_Visual/show/0/"+fid;
    ?????????AddData(s,itemid1,layer);

    ????????}
    ????????else
    ????????{
    ?????????this.Response.Write("<script>alert('數(shù)據(jù)庫(kù)已存在此條數(shù)據(jù)!')</script>");
    ????????}

    ???????}
    ???????else
    ???????{
    ????????if(System.IO.Directory.Exists(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\"+mylayer[i-1]))
    ????????{
    ?????????postedFile.SaveAs(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\"+mylayer[i-1]+"\\" + fid);
    ????????}
    ????????else
    ????????{
    ?????????System.IO.Directory.CreateDirectory(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\"+mylayer[i-1]);
    ?????????postedFile.SaveAs(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\"+mylayer[i-1]+"\\" + fid);

    ????????}
    ???????}
    ??????}
    ??????else
    ??????{
    ???????Response.Write("<script>alert(\"虛擬形象圖片不能為空!\")</script>");
    ???????return ;

    ??????}
    ?????}?
    ????}
    ????catch(Exception ex)
    ????{
    ?????string sRawURL = Request.RawUrl;

    ?????if(sRawURL.IndexOf("?") > -1)
    ?????{
    ??????sRawURL = sRawURL.Substring(0,sRawURL.IndexOf("?"));
    ?????}????
    ?????
    ?????Response.Write(ex.ToString());
    ????}?
    ???}
    ???else
    ???{
    ?????????????? Response.Write("<script>alert(\"請(qǐng)選擇虛擬形象所屬層?。")</script>");
    ???}

    posted @ 2006-12-16 11:31 風(fēng)雨兼程 閱讀(242) | 評(píng)論 (0)編輯 收藏

    構(gòu)建安全的數(shù)據(jù)訪問(wèn)

         摘要: 本頁(yè)內(nèi)容http://www.microsoft.com/china/technet/security/guidance/secmod87.mspx 本模塊內(nèi)容 ...  閱讀全文

    posted @ 2006-11-17 15:08 風(fēng)雨兼程 閱讀(429) | 評(píng)論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲中文字幕无码专区| 亚洲午夜免费视频| 成人性生活免费视频| 337p日本欧洲亚洲大胆色噜噜| 水蜜桃视频在线观看免费| 国产大片线上免费看| 十八禁的黄污污免费网站| 亚洲精品视频免费| 国产一级在线免费观看| 亚洲精品高清国产一久久| 7x7x7x免费在线观看| 亚洲国产日韩视频观看| 午夜免费福利网站| 全部在线播放免费毛片| 亚洲高清一区二区三区电影| 免费永久国产在线视频| 黄网站色成年片大免费高清 | 亚洲精品自偷自拍无码| 青青青国产色视频在线观看国产亚洲欧洲国产综合 | 四虎国产精品成人免费久久| 又黄又大又爽免费视频| h视频免费高清在线观看| 国产精品亚洲片在线| 我的小后妈韩剧在线看免费高清版| 亚洲精品456人成在线| 免费a级毛片视频| 成年免费a级毛片免费看无码| 亚洲人成电影亚洲人成9999网| 成年18网站免费视频网站| japanese色国产在线看免费| 亚洲精品自在线拍| 亚洲精品和日本精品| 18禁美女裸体免费网站| 看亚洲a级一级毛片| 亚洲AV无码乱码在线观看富二代 | 97国免费在线视频| 亚洲色偷偷偷综合网| 人人狠狠综合久久亚洲高清| 亚洲国产精品免费观看| 亚洲免费观看视频| 四虎影视久久久免费观看|