ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品免费大片,国内精品一区视频,精品三级在线http://www.aygfsteel.com/ljy032/archive/2008/01/04/172653.html风雨兼程风雨兼程Fri, 04 Jan 2008 01:43:00 GMThttp://www.aygfsteel.com/ljy032/archive/2008/01/04/172653.htmlhttp://www.aygfsteel.com/ljy032/comments/172653.htmlhttp://www.aygfsteel.com/ljy032/archive/2008/01/04/172653.html#Feedback0http://www.aygfsteel.com/ljy032/comments/commentRss/172653.htmlhttp://www.aygfsteel.com/ljy032/services/trackbacks/172653.htmlGoogle排名优化åQé¢å‘搜索引擎的¾|‘站设计

内容摘要åQ?br /> 目前中文¾|‘站在整个互联网中的影响˜q˜æ¯”较小åQŒè¿™ä¸»è¦æ˜¯ç”±äºŽä¸­æ–‡ç½‘ç«™æ€ÖM½“的水òq»I¼ˆæŠ€æœ¯ä¸ŠåQŒå†…容上åQ‰éƒ½˜q˜ç›¸å¯¹è½åŽé€ æˆçš„,最主要的表现有åQ?br />

  1. 行业知识åQšä¸çŸ¥é“搜烦引擎对吸引的新用æˆïLš„重要性,在搜索引擎排名服务中˜q½æ±‚“å‚ȝ“œç›¸å…³”åQŒè´­ä¹îC¸€äº›å…¶å®žæ²¡æœ‰å¤ªå¤šå®žé™…意义的行业关键词。其实能够用戯‚¾“入的关键词越多,其目标性越强,˜q™æ ·çš„客户ä­h倯D¶Šé«˜ã€‚用戯‚ƒ½å¤Ÿç›´æŽ¥å®šä½åˆ°äº§å“å…·ä½“内容™å‰|¯”到网站首™å‰|œ‰ä»·å€¼çš„多;
  2. 发布技术:¾|‘站的网™åµè¿›å…¥Google的烦引量非常ž®ï¼Œä¸»è¦æ˜¯ç”±äºŽå¤§é‡ä‹É用动态网™åµé€ æˆçš„。需要将动态页面链接改写成静态链æŽ?/a>åQ?
  3. ™åµé¢è®¾è®¡åQšé¡µé¢æ ‡é¢˜é‡å¤ï¼Œå…³é”®è¯ä¸½Hå‡ºåQŒè¿‡æ¸¡ä‹É用JavaScript脚本/囄¡‰‡/Flash½{‰ä¸é€‚合搜烦引擎索引的非文本形式åQ?
而以上这些问题的æ ÒŽœ¬åŽŸå› ˜q˜æ˜¯¾|‘站自èín¾~ÞZ¹æ—¥å¿—¾lŸè®¡åˆ†æžé€ æˆåQšå› æ­¤æ— æ³•看到SEO对网站自íw«äñ”生的巨大影响ã€?

SEO的目的是通过一些简单的½{–ç•¥åQŒè®©¾|‘站自èín的水òq›_œ¨äº’联¾|‘中有一个真实的体现ã€?br /> ¾|‘ç«™¾l“构设计中面向搜索引擎的优化注意事项包括åQ?/p>

åQˆæ³¨æ„ï¼šæœ¬ç½‘站设计本íw«å°±åˆ©ç”¨äº†å…¶ä¸­ä¸€äº›æ–¹æ³•)ã€?

什么是PageRank

Google½{‰æ–°ä¸€å¸¦æœç´¢å¼•擎的优势之一在于不仅索引量很大,而且˜q˜å°†æœ€å¥½çš„¾l“果排在搜烦¾l“果的最前面åQŒå…·ä½“的原理可以参è€?a >Google の秘å¯?- PageRank 徹底解説一文,PageRank½Ž€å•的说类ä¼égºŽ¿U‘技论文中的引用机制åQšè°çš„论文被引用‹Æ¡æ•°å¤šï¼Œè°å°±æ˜¯æƒå¨ã€‚在互联¾|‘上PageRankž®±æ˜¯åŸÞZºŽ¾|‘页中相互链接关¾pȝš„分析得出的ã€?br />

此外åQŒä»Žè®¡ç®—æ–ÒŽ³•角度阐述PageRank机制˜q˜æœ‰˜q™ç¯‡æ–‡ç« åQ?a >http://pr.efactory.de/里面有更详细的PageRank½Ž—法说明和各¿Uæ¸…æ™°çš„ž®åž‹ä¸ªæ¡ˆåˆ†æžåQ?br />
比如åQšå­™åµä¸­å¯ÆDˆªæ¡çš„重要æ€?br /> B <=> A => C  
Vs  
B <=> A <=> C   åQˆå¥½åQ?br />
™åµé¢æ•°é‡å› ç´ åQ?br /> B <=> A <=> C
Vs
F <=\   /=> G
B <=> A <=> C   åQˆå¥½åQ?br /> D <=/   \=> E

一个意想不到的¾l“论åQ?br /> (B <=> A <=> C)      ( E <=> D <=> F)
Vs
(B <=> A <=> C)  <=> ( E <=> D <=> F)
PageRank升高的只是被链接çš?个首™åµAå’ŒDåQŒè€Œç½‘站子™åµé¢çš„PageRankòq›_‡ä¼šç•¥æœ‰ä¸‹é™ã€‚同æ—Óž¼šä¸€ä¸ªç½‘站进入Google的烦引量­‘Šå¤§å…¶å—¾cÖM¼¼å› ç´ å½±å“­‘Šå°ã€?br /> PageRank不对¿U°çš„™åµé¢äº’链åQ?br /> Google会用BadRank之类的算法进行纠正,而且一个网™å늝€æœ‰æ¥è‡?#8220;与其自èín不相¿U?#8221;的高PageRank站点的链接,而自íw«åˆ¾~ºå°‘­‘›_¤Ÿæ•°é‡å’Œè´¨é‡çš„反相链接的话åQŒå…¶PageRankä¼šè‡ªåŠ¨é™ä½ŽäØ“0åQŒA(pr=7) <=> B(pr=0)
½Ž€å•的说就是:偶尔要被权威站点反相链接不算敎ͼŒè¦è¢«­‘›_¤Ÿå¤šçš„æƒå¨ç«™ç‚¹å¼•用才能提高自èín¾|‘页的PageRankã€?br /> Web­‘…链分析½Ž—法¾lÆD¿°åQˆå—京大学论文) 更多论文可以通过搜烦åQ?#8220;filetype:pdf google pagerank anchor text bayesian”得到

链接ž®±æ˜¯ä¸€åˆ?/a>

在互联网的æ“v‹z‹ä¸­åQŒæœ€é‡è¦çš„就是互联互通,不被其他¾|‘站引用的网站就æ˜?#8220;信息孤岛”ã€?#8220;酒好也怕藏的深”åQŒä¹Ÿè®¸è¿™è¯è¯´èµäh¥æœ‰ç‚¹åƒåžƒåœùN‚®ä»¶å¹¿å‘Šï¼Œä½†äº‹å®žå°±æ˜¯è¿™æ —÷€‚所以如果做¾|‘站的目的不是孤芌™‡ªèµï¼Œž®±éœ€è¦ç§¯æžçš„æŽ¨å¹¿è‡ªå·±çš„网站ã€?span style="font-weight: bold">
通过搜烦引擎推广自己需要注意以下几个方面:

  1. 以量取胜åQšä¸ä¸€å®šåР入传¾lŸé—¨æˆïL½‘站的分类目录才是¾|‘站推广åQŒæ¥è‡ªå…¶ä»–网站的ä»ÖM½•反相链接都是有用çš?br /> ¾|‘站推广比较¾lå…¸çš„æ–¹å¼å°±æ˜¯åŠ å…¥æ¯”è¾ƒå¤§åž‹é—¨æˆïL½‘站的分类目录åQŒæ¯”如:Yahoo!åQ?a >dmoz.org½{‰ã€‚其实这里有一个误区:不一定非要加入大型网站的分类目录才是¾|‘站推广åQŒå› ä¸ºçŽ°åœ¨æœç´¢å¼•æ“Žå·²¾lä¸å†åªæ˜¯ç½‘站目录的索引åQŒè€Œæ˜¯æ›´å…¨é¢çš„¾|‘页索引åQŒæ‰€ä»¥æ— è®ºæ¥è‡ªå…¶ä»–网站ä“Q何地方的反相链接都是非常有ä­h值的åQŒå“ªæ€•是出现在新é—ÀLŠ¥é“ï¼Œè®ºå›åQŒé‚®ä»¶åˆ—表归档中。BloggeråQˆWeblog的简¿UŽÍ¼‰ä»¬ä¹Ÿè®¸æœ€æ·±åˆ»åœ°ç†è§£äº†“链接ž®±æ˜¯ä¸€åˆ?#8221;˜q™å¥è¯çš„含义åQŒç”±äºŽBlog的内容之间有大量的相互链接(他们之间利用RSS很容易进行链接大量传播)åQŒå› æ­¤æœ€¾lå¸¸è¢«å¼•用的Blog™åµé¢åœ¨æœç´¢å¼•擎中的排名往往比一些大型商业网站的™åµé¢˜q˜è¦é«˜ã€‚而WIKI˜q™æ ·çš„æ–‡æ¡£ç®¡ç†ç³»¾lŸæ›´åŠ çªå‡ÞZº†è‰¯å¥½¾l“æž„åQŒè‰¯å¥½å¼•用的特征。而目前很多网站通过在各¿UWIKI/留言½¿ä¸­çŒæ³¨åžƒåœ¾ç•™è¨€çš„æ–¹æ³•,˜q™ç§æ–¹å¼æ˜¯éžå¸æ€¸å¯å–的。这¿Ué“¾æŽ¥ä¸½E›_®šåQ?
  2. 以质取胜åQšè¢«PageRank高的¾|‘站引用能更快地提高PageRank
    数量只是关键因素之一åQŒæ¥è‡ªPageRank高的™åµé¢çš„链接还能更快的提高被链接目标的PageRankåQŒæˆ‘只是ž®†ä¸€äº›æ–‡ç« æŠ•½E¿åœ¨äº?a class=" snap_noshots" >ZDNet中国上,ç”׃ºŽ™åµé¢ä¸Šæœ‰æ–‡ç« å‡ºå¤„链接åQŒç›¸åº”网™åµå’Œ¾|‘站整体的PageRank˜q‡äº†ä¸€ŒD‰|—¶é—´åŽž®±æœ‰äº†å¾ˆå¤§çš„æå‡ã€‚有时候被什么样的网站引用有时候比引用‹Æ¡æ•°å¤šæ›´é‡è¦ã€‚这里我要特别感谢的是,当时ZDNet中国是唯一遵åó@了我的版权声明的要求表明了文章出处,òq¶ä¸”有反盔R“¾æŽ¥çš„¾|‘ç«™ã€?br /> 按照˜q™ä¸ªåŽŸåˆ™åQšèƒ½å¤Ÿååˆ—Yahoo!å’ŒDMOZ˜q™æ ·çš„大型权威目录的å¤?层是非常有ä­h值的ã€?
  3. 了解搜烦引擎çš?价倯D§‚"åQ?br /> Lucene½Ž€ä»?/a>˜q™ç¯‡æ–‡ç« è¢«Jakarta.apache.orgçš?a >lucene™å¹ç›®å¼•用以后åQŒè¿™½‹‡æ–‡ç« å°±æˆäؓ了所有页面中PageRank最高的™åµé¢åQŒè€ŒGoogle支持的一些项目,比如åQ?a >Folding@HomeåQŒè®©æˆ‘一直怀疑他们对政府åQŒæ•™è‚²å’Œéžç›ˆåˆ©ç»„¾l‡çš„站点有特别加分,毕竟.org .edu才代表了互联¾|‘的实质åQšåˆ†æƒå’Œå…׃ínã€?br /> 但更合理的解释是åQ?org很多都是开放技术åã^台的开发者,他们会在首页˜q™æ ·çš„地方加入Powered By Apache, Power by FreeBSD之类的链接表½Cºå¯¹å…¶ä»–开源åã^台的ž®Šé‡åQŒæ‰€ä»¥è±¡Apache, PHP, FreeBSD˜q™æ ·çš„开源站点在GOOGLE中都有非帔R«˜çš„PageRank。而在.edu˜q™äº›ç«™ç‚¹ä¸­ï¼Œå¾ˆå¤šéƒ½æ˜¯å­¦æœ¯æ€§æ¯”è¾ƒå¼ºçš„æ–‡æ¡£ï¼Œä»¥è¶…é“¾æŽ¥å½¢å¼æ ‡æ˜Žå‚è€ƒæ–‡çŒ®çš„å‡ºå¤„å·²ç»æˆäØ“ä¸€¿Uä¹ æƒ¯ï¼Œè€Œè¿™ä¹Ÿæ— ç–‘正是PageRank最好的依据ã€?br /> 注意åQšä¸è¦é€šè¿‡Link Farm提高自èín的站ç‚ÒŽŽ’åï¼šGoogle会惩¾|šé‚£äº›ä¸»åŠ¨é“¾æŽ¥åˆ°Link Farm站点以提高自íw«æŽ’名站点,相应站点的页面将不会被收入到索引中。但如果你的™åµé¢è¢«åˆ«çš„Link Farm链接了也不必担心åQŒå› ä¸ø™¿™¿Uè¢«åŠ¨çš„é“¾æŽ¥æ˜¯ä¸ä¼šè¢«æƒ©ç½šçš„ã€?/span>
  4. 不要吝啬¾l™å…¶ä»–网站的链接åQšå¦‚果一个网™åµåªæœ‰å¤§é‡çš„˜q›å…¥é“¾æŽ¥åQŒè€Œç¼ºä¹å¯¼å‡ºé“¾æŽ¥ï¼Œä¹Ÿä¼šè¢«æœç´¢å¼•擎认为是没有价值的站点。保证你的网站能够帮助搜索引擎更准确地判断哪些是对用æˆähœ€æœ‰ä­h值的信息åQŒä¹Ÿž®±æ˜¯è¯´å¦‚果你的网站只有外部反向链接而没有导出链接的话,也会对你的网站在搜烦¾l“果中的表现带来负面影响。当然网站中˜qžä¸€ä¸ªå¯¼å‡ºé“¾æŽ¥éƒ½æ²¡æœ‰çš„æƒ…况非常罕见,除非你是åˆÀL„˜q™ä¹ˆåšã€‚正常情况下大家都会自然地在¾|‘页中加上一些其他网站的链接åQŒå¸¦é¢†è®¿é—®è€…去到我们认为重要或能够提供更多有ä­hå€ég¿¡æ¯çš„地方åQ?

另外在推òq¿è‡ªå·Þq½‘站之前也讔R¦–先需要了解自å·Þq½‘站目前在一些搜索引擎中的知名度åQŒåŽŸç†éžå¸¸ç®€å•ï¼Œå¯ä»¥å‚è€?a >如何评ä­h¾|‘站的ähæ°?/a>一文ã€?/p>

¾|‘站推广只是手段åQŒå¦‚何突出内宏V€è®©éœ€è¦ç›¸å…³ä¿¡æ¯çš„用户能够ž®½å¿«çš„æ‰¾åˆîC½ çš„网站才是目的,PageRanké«˜åÆˆä¸ä»£è¡¨åƒYahoo!˜q™æ ·çš„é—¨æˆïL«™ç‚¹å°±èƒ½åœ¨æ‰€æœ‰æœç´¢ç»“果中排名靠前åQŒå› ä¸ºæœç´¢å¼•擎的¾l“果是搜索关键词在页面中的匹配度和页面的PageRank相结合的排名¾l“果。因此第二个要点åQšå¦‚何突出关键词ã€?br />

如何½Hå‡ºå…³é”®è¯ï¼šé¢å‘主题(Theme)的关键词匚w…

  1.  Theme Engine正在逐步­‘…过PRåQŒæˆä¸ºç»“果排序中更主要的因素åQŒå¯ä»¥æ¯”较一下以下现象:
    • ä¸ÞZ»€ä¹ˆæŸ¥“æ–°é—»”åQ?#8220;æ±½èžR”之类的文字,各种门户¾|‘站的首™åµä¸åœ¨ç¬¬ä¸€ä½ï¼Ÿè¦çŸ¥é“他们的™åµé¢ä¸­éƒ½æœ‰ç›¸åº”频道的链接文字çš?
    • 一½‹‡æ–°é—»é¡µé¢ä¸­åQŒæœç´¢å¼•擎如何不通过模板匚w…åQŒè‡ªåŠ¨å°†æ–°é—»çš„ä¸»ä½“å’Œ™åµé¢ä¸­çš„™åµå¤´åQŒæ ç›®å¯¼èˆªæ¡åQŒé¡µž®„¡­‰éƒ¨åˆ†çš„内容区分开的?
    其实以上问题都可以归¾l“䨓¾|‘页内容摘要的提取策略和关键词在其中的命中:
    首先ž®†èƒ½å¤Ÿæ˜qîC¸€ä¸ªé¡µé¢å†…容的分成以下几种¾cÕdž‹åQ?br />
    1. é“‘Ö…¥æ–‡å­—描述åQšinbound link text
      http://www.searchenginedictionary.com/terms-inbound-link.shtml
    2. HTML™åµé¢æ ‡é¢˜åQštitle 好标题一般会ž®†é¡µé¢ä¸­æœ€é‡è¦çš„关键词攑֜¨æœ€å‰é¢åQŒæ¯”如:ABC-10型吸ž®˜å™¨ - XX家电åŸ?
    3. HTML内容ä¸ÖM½“åQšcontent text
    4. é“‘Ö‡ºæ–‡å­—åQšoutbound link text
    如果按照以下规则åQ?br /> 一个页面中关键词命中权重:铑օ¥æ–‡å­— > HTML标题文字 > HTML™åµé¢ä¸ÖM½“内容 >> 出链文字åQŒä»¥ä¸ŠçŽ°è±¡å°±æ¯”è¾ƒå¥½è§£é‡Šäº†ã€?br /> é“‘Ö…¥æ–‡å­—是页面上看不见的åQŒä½†é“‘Ö…¥æ–‡å­—对被链接™åµé¢æœ‰å·¨å¤§çš„作用åQšåœ¨çŽîC»£æœçƒ¦å¼•擎在关键词匚w…çš„过½E‹ä¸­åQŒåŒ¹é…çš„˜q‡ç¨‹ä¸åªçœ‹å½“前页面的内容摘要åQšå¾ˆå¤§ç¨‹åº¦ä¸ŠåQŒä¸åªçœ‹˜q™ä¸ª¾|‘页自己说自己有什么内容,˜q˜è¦çœ‹åˆ«äººå¦‚何链接时åQŒå¦‚何描˜qîC½ çš„网站别人怎么¿U°å‘¼ä½ ï¼Œæ¯”你自己说自己更重要。ã€?br /> 比如查:“世界卫生¾l„织”åQŒè¿”回结果中æœ?http://www.who.int/ 而这个页面中是没有中文的åQŒä¹‹æ‰€ä»¥èƒ½åŒšw…ä¸Šï¼Œæ˜¯å› ä¸ºå¾ˆå¤šé“¾æŽ¥å®ƒçš„中文网站ä‹É用了åQ?lt;a >世界卫生¾l„织</a>åQŒæ‰€ä»¥ï¼Œ˜q™ä¸ª™åµé¢ä¸­ä¸å­˜åœ¨çš„中文关键词也成ä¸ÞZº†™åµé¢æ‘˜è¦çš„一部分。这样一惻I¼Œž®±å¯ä»¥çŸ¥é“é“¾å‡ºé“¾æŽ¥çš„æ–‡å­—å…¶å®žæ˜¯äØ“è¢«é“¾æŽ¥çš„å­é¢‘é“é¦–™å‰|ˆ–者内容详情页服务的。对自èín™åµé¢çš„关键词密度只有负面的媄响,˜q™ä¹Ÿæ˜¯Google廸™®®ä¸€ä¸ªé¡µé¢ä¸­é“¾æŽ¥ä¸è¦­‘…过100个的原因åQšä»–æ ÒŽœ¬ä¸çƒ¦å¼?00个链接以后的内容。按照以上规则,搜烦引擎ž®†ä¸€½‹‡æ–°é—»è¯¦æƒ…页中的新闻内容提取出来ž®±æ˜¯æŠŠé¡µé¢ä¸Šæ‰€æœ‰å¸¦HTTP链接的文字都åŽÀLމåQŒå°±æ˜¯æ–°é—ȝš„内容部分了,更精¼‹®ä¸€äº›å¯ä»¥é€šè¿‡å–最长文本段落等½{–略实现åQ›è€Œå¾ˆå¤šç½‘站首™å‰|ˆ–频道首页中几乎全部都是链接,¾lè¿‡æœçƒ¦å¼•擎分析的结果就是:什么内容也没有åQŒèƒ½å¤Ÿè¢«å‘½ä¸­çš„关键词仅仅是别人链接你用的“¾|‘站首页”和频道标题Title中的站点名称½{‰çš„几个关键词,而页面中其他的文字则˜qœè¿œä¸å¦‚相应子频道和具体内容™åµé¢çš„匹配度高,而搜索引擎能够通过以上规则åQŒè®©ç”¨æˆ·æ›´å¿«çš„直接定位到有具体内容的内容详情™åµé¢ã€‚因此希望通过一个首™åµï¼Œž®½å¯èƒ½å¤šçš„命中所有希望推òq¿çš„关键词是不可能的ã€?a >让网™åµå°½å¯èƒ½å¤šçš„˜q›å…¥æœçƒ¦å¼•擎的烦å¼?/a>åQŒç„¶åŽæŠŠæ¡å¥½æ•´ä¸ª¾|‘站的主题风格是非常重要的,让网站的主题关键词能够比较均匀的按照金字塔模式分布到网站中可以参考:¾|‘站的主题金字塔设计          ¾|‘站名称åQˆç”¨æˆ·é€šè¿‡1åQ?个抽象关键词åQ?br />          /       \
        子频é?   子频é? åQˆç”¨æˆ·é€šè¿‡2åQ?个关键词命中åQ?br />    /    \      /    \
    产品1  产品2 文章1 文章2 (用户通过3åQ?个关键词命中åQšè¿™¿Uç”¨æˆähœ€æœ‰ä­hå€?

  2. 不要½Iºç€æ ‡é¢˜åQšç©ºç€<title></title>无异于浪费了最有ä­h值的一块阵圎ͼ›
    不要使用meta keywords/description
    传统的页面中åQŒHTML™åµé¢ä¸­ä¼šæœ‰ç±»ä¼ég»¥ä¸‹çš„隐含信息åQŒç”¨äºŽè¯´æ˜Žå½“前网™å늚„主要内容关键字:
    <header>
        <meta name="keyword" content="mp3 download music...">
    </header>
    后来ç”׃ºŽ˜q™ç§äººå·¥æ·ÕdŠ å…³é”®è¯çš„æ–¹å¼è¢«æ»¥ç”¨ï¼Œå¤§é‡¾|‘é¡µä¸­äØ“äº†æé«˜è¢«æœçƒ¦å¼•æ“Žå‘½ä¸­çš„æ¦‚çŽ‡ï¼Œ¾lå¸¸æ·ÕdŠ ä¸€äº›å’Œå®žé™…¾|‘页内容无关的热门关键比如:“music mp3 download”½{‰ï¼Œæ‰€ä»¥æ–°ä¸€ä»£çš„æœçƒ¦å¼•擎已经不再兛_¿ƒ™åµé¢å¤´æ–‡ä»¶ä¸­çš„ähå·¥meta keyword声明åQŒè€Œé¡µé¢æ ‡é¢˜åœ¨æœçƒ¦å¼•擎的关键词的命中命中过½E‹ä¸­å¾€å¾€æœ‰ç€æ›´é«˜çš„æ¯”重,如果一个关键词在标题中命中会比在页面中命中有更高的得分åQŒä»Žè€Œåœ¨ç›¸åº”的搜索结果排名中更靠前ã€?
  3. 标题长度和内容:不要˜q‡é•¿åQŒä¸€èˆ¬åœ¨40个字(80个字èŠ?以内åQŒåƈ充分½Hå‡ºå…³é”®è¯çš„æ¯”重åQ?br /> 如果更长的标题搜索引擎一般会忽略掉,所以要ž®½å¯èƒ½å°†ä¸»è¦å…³é”®è¯æ”¾åœ¨æ ‡é¢˜é å‰çš„位置。省略掉不必要的形容词吧åQŒæ¯•竟用户主要通过名词来找到需要的内容。标题内容:ž®½é‡ç”¨ä¸€äº›åˆ«äººå¯ä»¥é€šè¿‡å…³é”®è¯æ‰¾åˆ°çš„字眼åQˆä¹Ÿåˆ«å¤ª˜q‡å¤´åQŒå¦‚æžœæ ‡é¢˜ä¸­çš„å­—çœÆD¶…˜q?半内容中都没有,有可能被搜烦引擎排除出烦引)åQŒå› æ­¤åŸºäºŽweb日志中来自其他搜索引擎的关键词查询统计非常必要ã€?
  4. 如果¾|‘页很多的话åQŒå°½é‡ä‹É用不同的¾|‘页标题åQŒäº‰å–让自己¾|‘站的内å®ÒŽ›´å¤šçš„˜q›å…¥æœçƒ¦å¼•擎索引范围åQ?br /> å› äØ“æœçƒ¦å¼•æ“Žä¼šæ ¹æ®é¡µé¢å†…å®¹çš„ç›æ€¼¼åº¦æŠŠä¸€äº›å†…容当成重复页面排除出索引范围åQ?br /> http://www.chedong.com/phpMan.php是我的网站上的一个小应用åQšä¸€ä¸ªweb界面的unix命ä×o手册åQˆman pageåQ‰ï¼Œåœ¨ä»¥å‰çš„设计中所有动态页面ä‹É用的都是同样的标题:"phpMan: man page /perldoc /info page web interface" åQŒGoogle索引了大¾U?000多个™åµé¢åQŒåŽæ¥æˆ‘ž®†é¡µé¢æ ‡é¢˜æ”¹æˆäº†"phpMan:  [命ä×o名]"˜q™æ ·çš„æ ¼å¼ï¼Œæ¯”如åQ?phpMan: ls"åQŒè¿™æ ·å¤§éƒ¨åˆ†åŠ¨æ€é¡µé¢çš„æ ‡é¢˜ž®±éƒ½ä¸ä¸€æ ·äº†åQŒä¸€ä¸ªæœˆåŽGoogle从这个页面入口烦引了大约6000个页面。因此,如果¾|‘站中很多网™åµéƒ½ä½¿ç”¨ç›¸åŒçš„æ ‡é¢˜ï¼Œæ¯”如åQ?#8220;新闻频道”åQ?#8220;论坛”åQŒè¿™äº›é¡µé¢ä¸­å¾ˆå¤§ä¸€éƒ¨åˆ†ž®×ƒ¼šè¢«æŽ’重机制忽略掉ã€?
  5. 除了<title></title>外,˜q˜å¯ä»¥ç”¨<h1></h1>标题行突出内容主题,加强标题的效果;
    在我的网站设计中åQšæˆ‘ä¼šæŠŠç”?lt;h1>[标题]</h1>˜q™æ ·çš„æ¨¡æ¿æŠŠæ ‡é¢˜½Hå‡ºæ˜„¡¤ºåQŒè€Œä¸æ˜¯é€šè¿‡æ”¹å˜å­—体的方式突出标题ã€?

å…¶ä»–¾|‘站设计提示

  1. 静态链接:Blog¾|‘站另外一个优势在于其¾|‘页是静态链接:动态网™åµå åˆ°æ•´ä¸ªäº’联网内容çš?0åQ…以上ã€?span style="font-weight: bold">各个搜烦引擎其实能够表现的都只不˜q‡æ˜¯äº’联¾|‘的冰山一è§?3-5%)åQŒä¸åŒçš„只是谁让优质¾|‘页排名靠前的策略更优秀而已åQ?/span>å¤§éƒ¨åˆ†æœç´¢å¼•æ“Žéƒ½è®¤äØ“é™æ€é“¾æŽ¥çš„¾|‘页是优质网™åµï¼ŒGoogle在优先抓取烦引的¾|‘页ä¸?0%以上是不带参数链接的静态网™åüc€‚而且即ä‹É同样的内容,静态网™åµä¹Ÿä¼šæ¯”动态网™å‰|ƒé‡é«˜åQšå¾ˆå®ÒŽ˜“理解åQšquery?a=1&b=2˜q™æ ·çš„链接由于参数顺序颠倒的query?b=2&a=1完全相同。尽量ä‹É用静态网™åµï¼šç›®å‰èƒ½å¤ŸåŠ¨æ€ç½‘™åµè¿›è¡Œå…¨é¢çš„索引˜q˜æ¯”较难åQŒè€Œå³ä½¿æ˜¯Google也更不会索引所有的内容åQŒå› æ­¤å¾ˆž®‘会对参数超˜q?个的动态网™åµè¿›è¡Œè¿›ä¸€æ­¥çš„æŠ“取和分析。以下是一个phpBB论坛™åµé¢˜q”回的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
        
    ä¸ÞZº†é¿å…éšç§é—®é¢˜åQšGooglebot可以通过寚w¡µé¢http header中的session idå’Œsession cookie˜q›è¡Œä¸€äº›ç”„别,˜q™æ ·å¾ˆå¤šéœ€è¦è®¤è¯ä¿¡æ¯çš„论坛内容ž®±æ— æ³•进入烦引了ã€?br /> æ€ÖM½“上说Google喜欢新的åQŒé™æ€çš„内容。因此无è®ÞZ»Žæ•ˆçŽ‡ä¸Šè®²˜q˜æ˜¯æ–¹ä¾¿æœçƒ¦å¼•擎收录åQšä‹É用内容发布系¾lŸå°†¾|‘站内容发布成静态网™åµéƒ½æ˜¯éžå¸¸å¿…要的åQŒä»ŽæŸç§½E‹åº¦ä¸Šè¯´google friendly = anonymous cache friendlyã€?br /> 比如åQšhttp://www.chedong.com/phpMan.php/man/intro/3
    比http://www.chedong.com/phpMan.php?mode=man&parameter=intro&section=3˜q™æ ·çš„链接更å®ÒŽ˜“˜q›å…¥æœçƒ¦å¼•擎的烦引。而且在URL中的命中也能½Hå‡ºå…³é”®è¯ã€?
  2. 能够˜q›å…¥Google索引的页面数量越多越好。用¾cÖM¼¼ä»¥ä¸‹çš„脚本可以统计自å·Þqš„¾|‘站被搜索引擎烦引的情况ã€?
    #!/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. ¾|‘站目录¾l“构要扁òq»I¼Œå› äؓ每深一¾U§ç›®å½•,PAGERANK降低1åQ?个档‹Æ¡ã€‚假è®ùN¦–™å‰|˜¯3åQŒå…¶å­å¯èƒ½ç›®å½•å°±æ˜?了,更深可能ž®±æ— æ³•列入评¾U§èŒƒå›´äº†ã€?br />
  4. 表现和内容的分离åQ?#8220;¾l¿è‰²”¾|‘页
    ¾|‘页中的javascriptå’Œcssž®½å¯èƒ½å’Œ¾|‘页分离åQŒä¸€æ–šw¢æé«˜ä»£ç é‡ç”¨åº¦ï¼ˆä¹Ÿæ–¹ä¾‰K¡µé¢ç¼“存)åQŒå¦å¤–一斚w¢åQŒç”±äºŽæœ‰æ•ˆå†…容占¾|‘页长度的百分比高,也能提高相关关键词在™åµé¢ä¸­çš„æ¯”重也增加了。æ€ÖM¹‹åQŒåº”该鼓励遵循w3c的规范,使用更规范的XHTMLå’ŒXMLä½œäØ“æ˜„¡¤ºæ ¼å¼ä¾¿äºŽå†…容更长旉™—´çš„保存ã€?
  5. 让所有的™åµé¢éƒ½æœ‰èƒ½å¤Ÿå¿«é€Ÿå…¥å£ï¼šç«™ç‚¹åœ°å›¾åQŒæ–¹ä¾¿ç½‘™å늈¬è™«ï¼ˆspideråQ‰å¿«é€ŸéåŽ†ç½‘ç«™æ‰€æœ‰éœ€è¦å‘å¸ƒçš„å†…å®¹ã€‚å¦‚æžœé¦–™åµå°±æ˜¯ç”¨Flash或图片进入的话,无异于将搜烦引擎拒之门外åQŒé™¤äº†UI设计的用户友好外åQŒspider friendly也是非常重要的ã€?
  6. 保持¾|‘站自èínçš„å¥åºøP¼š¾lå¸¸åˆ©ç”¨åé“¾‹‚€æŸ¥å·¥å…?/a>‹‚€æŸ¥ç½‘站中是否有死链ã€?
  7. 保持¾|‘页内容/链接的稳定性和持久性:在搜索引擎烦引中¾|‘页存在的历史也是一个比较重要的因素åQŒè€Œä¸”历史比较久的¾|‘页被链接的几率­‘Šé«˜ã€‚äØ“äº†ä¿è¯è‡ªå·Þq½‘™åµèƒ½å¤Ÿè¢«æ¯”较持久的被其他¾|‘站的页面引用,如果自己¾|‘页中有链接更新æ—Óž¼Œæœ€å¥½èƒ½ä¿ç•™æ—§çš„™åµé¢òq¶åšå¥½é“¾æŽ¥è{向,以保持内容的˜qžç®‹æ€§ã€‚要知道åQŒæŠŠä¸€ä¸ªç½‘站和内容在搜索引擎中的排å?#8220;培养”的很高是一仉™žå¸æ€¸å®ÒŽ˜“的事情,谁都不希望好不容易自å·Þqš„内容被别人找åˆîCº†åQŒç‚¹å‡Õd´æ˜?#8220;404 ™åµé¢ä¸å­˜åœ?#8221;吧,因此站点½Ž¡ç†å‘˜å¯¹è‡ªèín站点error.log的分析也是非常必要的ã€?
  8. æ–‡äšg¾cÕdž‹å› ç´ åQšGoogle有对PDF, Word(Power Point, Excel), PS文档的烦引能力,ç”׃ºŽ˜q™ç§æ–‡æ¡£çš„内å®Òޝ”一般的HTML¾lè¿‡äº†æ›´å¤šçš„æ•´ç†åQŒå­¦æœ¯ä­hå€ég¸€èˆ¬æ¯”较高åQŒæ‰€ä»¥è¿™äº›ç±»åž‹çš„æ–‡æ¡£å¤©ç”Ÿž®±æ¯”一般的HTML¾cÕdž‹çš„æ–‡æ¡?PageRank要高。因此,对于比较重要的文档:技术白皮书åQŒFAQåQŒå®‰è£…æ–‡æ¡£ç­‰å»ø™®®ä½¿ç”¨PDF PS½{‰é«˜¾U§æ ¼å¼å­˜å–,˜q™æ ·åœ¨æœç´¢ç»“果中也能获得比较靠前的位¾|®ã€?
  9. 常常能发现门æˆïL«™ç‚¹çš„一条新é—Õd¾€å¾€æ¯”其他站点的首页排名˜q˜è¦é å‰ã€‚因此一个站ç‚ÒŽ€ÖM½“PageRank提高了以后,往往自èínä¸€äº›åÆˆä¸é‡è¦çš„å†…å®¹ä¹Ÿä¼šè¢«åŒé‚£äº›é«˜PageRank的内容一起带入被搜烦引擎优先查询的列表中。这æ ïL»å¸”R€ æˆå¾ˆå¤šå¤§çš„开发站点的邮äšg列表归档往往比其他站点的首页PageRank˜q˜è¦é«˜ã€?

知己知彼——站点访问统�日志分析挖掘的重要�/a>

¾|‘站设计不仅仅只是被动的˜qŽåˆæœçƒ¦å¼•擎的烦引,更重要是充分利用搜烦引擎带来的流量进行更深层‹Æ¡çš„ç”¨æˆ·è¡ŒäØ“åˆ†æžã€‚ç›®å‰ï¼Œæ¥è‡ªæœçƒ¦å¼•æ“Žå…³é”®è¯ç»Ÿè®¡å‡ ä¹Žæ˜¯å„ç§WEBæ—¥å¿—åˆ†æžå·¥å…·çš„æ ‡å‡†åŠŸèƒ½ï¼Œç›æ€¿¡å•†ä¸šæ—¥å¿—¾lŸè®¡å·¥å…·åœ¨è¿™æ–šw¢åº”该会有更强化的实现。WEB日志¾lŸè®¡˜q™ä¸ªåŠŸèƒ½å¦‚æ­¤é‡è¦åQŒä»¥è‡³äºŽæ–°çš„RedHat 8中已¾lå°†æ—¥å¿—分析工具webalizerä½œäØ“æ ‡å‡†çš„æœåŠ¡å™¨é…ç½®åº”ç”¨ä¹‹ä¸€ã€?br />

以Apache/webalizerä¸ÞZ¾‹åQŒå…·ä½“的做法如下åQ?
  1. 记录讉K—®æ¥æºåQ?br /> 在Apache配置文äšg中设¾|®æ—¥å¿—æ ¼å¼äØ“combined格式åQŒè¿™æ ïLš„æ—¥å¿—中会包含扩展信息åQšå…¶ä¸­æœ‰ä¸€ä¸ªå­—ŒDµå°±æ˜¯ç›¸åº”访问的转向来源åQ?HTTP_REFERERåQŒå¦‚果用æˆäh˜¯ä»ŽæŸä¸ªæœç´¢å¼•擎的搜烦¾l“果中找åˆîCº†ä½ çš„¾|‘页òq¶ç‚¹å‡»è¿‡æ¥ï¼Œæ—¥å¿—中记录的HTTP_REFERERž®±æ˜¯ç”¨æˆ·åœ¨æœç´¢å¼•擎结果页面的URLåQŒè¿™ä¸ªURL中包含了用户查询的关键词ã€?br />
  2. 在webalizer中缺省配¾|®é’ˆå¯Òސœç´¢å¼•擎的¾lŸè®¡åQšå¦‚何提取HTTP_REFERER中的关键è¯?br /> webalizer中缺省有针对yahoo, google½{‰å›½é™…流行搜索引擎的查询格式åQšè¿™é‡Œæˆ‘增加了针对国内门æˆïL«™ç‚¹çš„æœçƒ¦å¼•擎参数讄¡½®
    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=

通过˜q™æ ·è®„¡½®webalizer¾lŸè®¡æ—¶å°±ä¼šå°†HTTP_REFERER中来自搜索引擎的URL中的keyword提取出来åQŒæ¯”如:所有来è‡?google.com链接中,参数q的值都ž®†è¢«ä½œäؓ关键词统计下来:åQŒä»Žæ±‡æ€È»Ÿè®¡ç»“果中åQŒå°±å¯ä»¥å‘现用户是根据什么关键词扑ֈ°ä½ çš„‹Æ¡æ•°åQŒä»¥åŠæ‰¾åˆîC½ çš„用æˆähœ€æ„Ÿå…´­‘£çš„æ˜¯é‚£äº›å…³é”®è¯½{‰ï¼Œ˜q›ä¸€æ­¥çš„åQŒåœ¨webalizer中有讄¡½®˜q˜å¯ä»¥å°†¾lŸè®¡¾l“果倒出成CSV格式的日志,便于以后导入数据库进行历史统计,做更深层‹Æ¡çš„æ•°æ®æŒ–掘½{‰ã€?/p>

以前通过WEB日志的用户分析主要是½Ž€å•çš„åŸÞZºŽæ—¥å¿—中的讉K—®æ—‰™—´/IP地址来源½{‰ï¼Œå¾ˆæ˜Žæ˜¾ï¼ŒåŸÞZºŽæœçƒ¦å¼•擎关键词的¾lŸè®¡èƒ½å¾—到的分析¾l“果更丰富、更直观。因此,搜烦引擎服务的潜在商业ä­h值几乎是不言而喻的,也许˜q™ä¹Ÿæ˜?a >Yahoo! Altavista½{‰ä¼ ¾lŸæœç´¢å¼•擎网站在门户模式后重新开始重视搜索引擎市场的原因åQŒçœ‹çœ?a >Google的年度关键词¾lŸè®¡ž®ÞqŸ¥é“了åQŒåœ¨äº’联¾|‘上有谁比搜索引擎更了解用户对什么更感兴­‘£å‘¢åQ?br />

è¯ïLœ‹æœ¬ç«™çš„反盔R“¾æŽ¥ç»Ÿè®¡ï¼šhttp://www.chedong.com/log/2003_6.log
需要注意的是:ç”׃ºŽGoogle针对Windows 2000中的IE使用的是UTF-8方式的编码,因此很多¾lŸè®¡æœ‰æ—¶å€™éœ€è¦åœ¨UTF-8方式下查看才是正¼‹®å­—½W¦æ˜¾½Cºã€‚从¾lŸè®¡ä¸­èƒ½å¤Ÿæ„Ÿå—到åQšåœ¨ä½¿ç”¨æ°´åã^比较高的IT开发äh员中Googleå·²ç»æˆäØ“æœ€å¸¸ç”¨çš„æœç´¢å¼•æ“Žã€‚è€Œä‹É用百度的用户也已¾lå¤§å¤§è¶…˜q‡äº†ä¼ ç»Ÿçš„æœç‹ï¼Œæ–°æµª½{‰é—¨æˆïL«™ç‚¹ï¼Œå› æ­¤ä¼ ç»Ÿé—¨æˆ·¾|‘站在搜索引擎上的优势将是非常脆å¼Þqš„。而从技术的发展­‘‹åŠ¿æ¥çœ‹åQŒä»¥åŽè¿˜ä¼šæœ‰æ›´å¤šçš„利用互联网媒体做更深层‹Æ¡æ•°æ®æŒ–掘的服务模式出现åQ?br />

 

转蝲自cnblog.org—â€?#8220;½Hå‘”文字可能揭示½C¾ä¼š­‘‹åŠ¿

åœ?#8220;新科学家”(New Scientist)在线杂志上,公布了康奈尔大学的一个新研究成果åQŒå¼•人注目,也许与Google æ”¶è´­Pyra 的动机有兟ë€?/span>

˜q™æ‰€å¤§å­¦çš„计½Ž—机¿U‘å­¦å®?Jon Klenberg 开发了一个计½Ž—机½Ž—法åQŒèƒ½å¤Ÿè¯†åˆ«ä¸€½‹‡æ–‡ç« ä¸­æŸäº›æ–‡å­—çš?#8220;½Hå‘”增长åQŒè€Œä¸”他发玎ͼŒ˜q™äº›“½Hå‘”增长的文字可以用来快速识别最新的­‘‹åŠ¿å’Œçƒ­ç‚šw—®é¢˜ï¼Œå› æ­¤èƒ½å¤Ÿæ›´æœ‰æ•ˆåœ°½{›é€‰é‡è¦ä¿¡æ¯ã€‚过åŽÕd¾ˆå¤šæœç´¢æŠ€æœ¯éƒ½é‡‡ç”¨äº†ç®€å•计½Ž—æ–‡å­?词组出现频率的方法,却忽略了文字使用增加的速率ã€?/span>

Jon 特别指出åQŒè¿™¿Uæ–¹æ³•可以应用到大量Weblog上,以跟ítªç¤¾ä¼šè¶‹åŠ¿ï¼Œ˜q™å¯¹å•†ä¸šåº”用也很有潜力。例如,òq¿å‘Šå•†å¯ä»¥ä»Žæˆåƒä¸Šä¸‡çš„个人Blog 中快速找到潜在的需求风ž®šã€‚而且只要Blog 覆盖话题范围­‘›_¤Ÿå¤§ï¼ˆå®žé™…上发展趋势确实如此)åQŒè¿™™åÒŽŠ€æœ¯å¯¹æ”¿æ²»ã€ç¤¾ä¼šã€æ–‡åŒ–å’Œ¾læµŽ½{‰é¢†åŸŸä¹Ÿéƒ½ä¼šæœ‰å®žé™…意义了ã€?/span>

虽然Google 新闻的内部算法至今没有公开åQŒä½†æ˜¯äh们猜‹¹‹è¿™¿Uå®Œå…¨ç”±æœºå™¨æ‰€æœé›†çš„头条新é—Õdº”当不是Google搜烦引擎中惯用的鸽子½Ž—法åQŒå¾ˆå¯èƒ½ä¸Žè¿™¿U?#8220;½Hå‘”判断½Ž—法有关。如此说来,Googleæ”¶è´­Blog工具供应商的丑֊¨¼‹®å®ž˜q˜æœ‰æ›´æ·±å±‚次的远见了ã€?/span>

- NewScientist.com news,
- ˜q˜æ²¡æœ‰å†™å®Œè¿™äº›ä»‹¾lï¼Œåœ?SlashDot 上也看到了很多有兌™¿™ä¸ªå‘现的讨论

附:Google官方的站点设计指�/a>

  • Make a site with a clear hierarchy and text links. Every page should be reachable from at least one static text link.  让网站有着清晰的结构和文本链接åQŒæ‰€æœ‰çš„™åµé¢è‡›_°‘要有一个静态文本链接入å?br /> æ‰Ò޳¨åQšå°½é‡ä¸è¦ç”¨å›„¡‰‡å’Œ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ä¾›ä¸€ä¸ªç«™ç‚¹åœ°å›¾ï¼šè½¬å‘¾|‘站的重要部分。如果站点地å›ùN¡µé¢è¶…˜q?00个链接,则需要将™åµé¢åˆ†æˆå¤šä¸ª™åµé¢ã€?br /> æ‰Ò޳¨åQšçƒ¦å¼•页不要­‘…过100个链接:SPIDER只考虑™åµé¢ä¸­å¤´100个链æŽ?
  • Create a useful, information-rich site and write pages that clearly and accurately describe your content.
    用一些有用的åQŒä¿¡æ¯é‡ä¸°å¯Œçš„站点,清晰òq¶æ­£¼‹®çš„æè¿°ä½ çš„信息ã€?
  • Think about the words users would type to find your pages, and make sure that your site actually includes those words within it.
    惛_ƒç”¨æˆ·å¯èƒ½ç”¨æ¥æ‰‘Öˆ°ä½ çš„关键词,òq¶ä¿è¯è¿™äº›å…³é”®è¯åœ¨ç½‘站中出现ã€?br /> æ‰Ò޳¨åQšå°‘ç”?#8220;最å¤?#8221;åQ?#8220;最å¥?#8221;之类的åŞ容词åQŒç”¨ç”¨æˆ·æœ€å…›_¿ƒçš„词åQŒæ¯”如:下蝲åQŒæ­Œæ˜Ÿåå­—,而不是一些抽象名词ã€?
  • Try to use text instead of images to display important names, content, or links. The Google crawler doesn't recognize text contained in images.
    ž®½å¯èƒ½ä‹É用文本,而不是图片显½Cºé‡è¦çš„名称åQŒå†…容和链接。GOOGLE的机器äh不认识图片中的文字ã€?
  • Make sure that your TITLE and ALT tags are descriptive and accurate.
    保证åQšé¡µé¢çš„TITLEå’ŒALT标记正确的精¼‹®æ˜q?
  • Check for broken links and correct HTML.
    ‹‚€æŸ¥åé“‘ÖÆˆä¿®æ­£˜q™äº›HTML错误ã€?
  • 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.
    如果你打½Ž—ä‹É用动态页面:链接中包å??"åQŒå¿…™åÖMº†è§£ï¼šòq‰™žæ‰€æœ‰çš„æœçƒ¦å¼•擎的机器äh能想对待静态页面一样对待动态页面,保持动态页面的参数ž®½å¯èƒ½çš„ž®‘也会很有帮助ã€?
  • Keep the links on a given page to a reasonable number (fewer than 100).
    让一个页面中的链接少äº?00个ã€?br /> æ‰Ò޳¨åQšç”¨lynx -dump http://www.chedong.com 可以模拟从robot角度看到的页面。其最后有链接¾lŸè®¡

输出¾cÖM¼¼åQ?br />
   [1]Google Free Search _______________________________ Google Search
   (_) Search WWW (_) Search chedong.com

   æ›?æ–?[2]站点地图 / Site Map [3]ç•?­a€½?/ Guest Book [4]意见反馈 /
   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/
    ...

搜烦引擎的宗旨在于提取互联网中质量最好的内容提供¾l™ç”¨æˆøP¼Œä»ÖM½•有利于帮助用戯‚Ž·å¾—ç›¸å¯¹å…¬æ­£ï¼Œä¼˜è´¨å†…å®¹çš„ç­–ç•¥éƒ½æ˜¯æœç´¢å¼•æ“Žè¿½æ±‚ç›®æ ‡ã€‚PageRank是一个非常好的策略,但是òq‰™žæ‰€æœ‰ç­–略都是基于非常复杂的½Ž—法ã€?br /> 从搜索引擎看来什么是互联¾|‘中“å¥?#8221;的内容呢åQ?

 

参考资料:

面向Google搜烦引擎的网站设计优�br /> http://www.google-search-engine-optimization.com/



如何评ä­h一个网站的人气
http://www.chedong.com/tech/link_pop_check.html

如何提高¾|‘站在Google中的排名——面向搜索引擎的òq¿å‘Šæ¨¡å¼
http://www.chedong.com/tech/google_ads.html

如何提高¾|‘站在Google中的排名——面向搜索引擎的¾|‘站链接设计
http://www.chedong.com/tech/google_url.html

Google不断改进相应的算法:HillTop
Hilltop: A Search Engine based on Expert Documents

Google の秘�- PageRank 徹底解説
http://www.kusastro.kyoto-u.ac.jp/~baba/wais/pagerank.html
˜q™ç¯‡æ–‡ç« æ˜¯åœ¨æŸ?Google PageRank"的时候查到的åQŒè¿™½‹‡æ–‡ç« ä¸ä»…有一个算法说明,也是一个Googleçš„weblogåQŒè®°å½•了很多关于Google的新é—Õd’Œä¸€äº›å¸‚场动态信息ã€?br /> Google 的秘å¯? PageRank å½Õdº•解说 中文ç‰?/a>

更详¾l†çš„PageRank½Ž—法说明åQ?br /> http://pr.efactory.de/

WEB日志¾lŸè®¡å·¥å…·AWStatsçš„ä‹É用:增加了Unicode的解码和中国主要门户搜烦的定ä¹?/a>
http://www.chedong.com/tech/awstats.html

Robots的说明:
http://bar.baidu.com/robots/
http://www.google.com/bot.html
搜烦引擎通过一¿Uç¨‹åºrobotåQˆåˆ¿U°spideråQ‰ï¼Œè‡ªåŠ¨è®‰K—®äº’联¾|‘上的网™åµåƈ获取¾|‘页信息。您可以在您的网站中创徏一个纯文本文äšg robots.txtåQŒåœ¨˜q™ä¸ªæ–‡äšg中声明该¾|‘站中哪些内容可以被robot讉K—®åQŒå“ªäº›ä¸å¯ä»¥ã€?/p>

反Google站点åQšè§‚点也很有­‘?br /> http://www.google-watch.org/

关于Google的WebLog
http://google.blogspace.com/

关于Googleçš„HillTop½Ž—法

搜烦引擎相关论坛
http://searchengineforums.com/
http://searchenginewatch.com
http://www.webmasterworld.com/



风雨兼程 2008-01-04 09:43 发表评论
]]>
开发电子商务网站对数据库表的设è®?/title><link>http://www.aygfsteel.com/ljy032/archive/2008/01/02/172214.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Wed, 02 Jan 2008 07:20:00 GMT</pubDate><guid>http://www.aygfsteel.com/ljy032/archive/2008/01/02/172214.html</guid><wfw:comment>http://www.aygfsteel.com/ljy032/comments/172214.html</wfw:comment><comments>http://www.aygfsteel.com/ljy032/archive/2008/01/02/172214.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ljy032/comments/commentRss/172214.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ljy032/services/trackbacks/172214.html</trackback:ping><description><![CDATA[¾pȝ»Ÿåˆ†æž <p>  功能需求分æž?/p> <p>  (1):产品展示åQŒæŒ‰ç…§åˆ†¾cÕd±•½Cºå…¨éƒ¨äñ”品,和对应的相关信息ã€?/p> <p>  (2):增加产品的展½Cºç›¸å…›_º¦åQŒè¯¸å¦‚最æ–îCñ”品报道,¾|‘站的新闻,促销信息ã€?/p> <p>  (3):购物车,跟踪用户的购物情å†?/p> <p>  (4):¾l“算中心åQšå¤„理用户帐单,购物处理</p> <p>  (5):反馈互动区,可以留言</p> <p>  (6):会员信息模块åQŒå¯ä»¥æ³¨å†?/p> <p>  数据需求分æž?/p> <p>ã€€ã€€æ•°æ®åº“è¡¨è®¾è®¡å®šäØ“8个表实现åQ?/p> <p>  ccdot_user{用户信息表}:</p> <p>  ------szd_userid[PK]</p> <p>  ------szd_username[用户ID]</p> <p>  ------szd_password[用户密码]</p> <p>  ------szd_name[用户真是信息]</p> <p>  ------szd_question[丢失密码问题]</p> <p>  ------szd_answer[用户回答½{”案åQŒç”¨äºŽæ‰¾å¯†ç ]</p> <p>  ------szd_sex[性别]</p> <p>  ------szd_phone[电话]</p> <p>  ------szd_email[电子邮äšg]</p> <p>  ------szd_address[地址]</p> <p>  ------szd_post[邮编]</p> <p>  ------szd_province[省䆾]</p> <p>  ------szd_city[城市]</p> <p>  ------szd_mark[标记]</p> <p>  ccdot_aclass{产品大类} </p> <p>  ------szd_aclassid[PK]</p> <p>  ------szd_aclassname[名称]</p> <p>  ccdot_bclass{产品ž®ç±»} </p> <p>  ------szd_bclassid[pk]</p> <p>  ------szd_aclassid[å…Œ™”大类szd_aclassid]</p> <p>  ------szd_bclassname[名称]</p> <p>  ccdot_poduct{产品信息} </p> <p>  ------szd_productid[pk]</p> <p>  ------szd_bclassid[å…Œ™”ž®ç±»çš„szd_bclassid]</p> <p>  ------szd_pname[名称]</p> <p>  ------szd_pdetail[产品信息]</p> <p>  ------szd_pprice[一般ä­hæ ¼]</p> <p>  ------szd_pmemderprice[会员价]</p> <p>  ------szd_pfewprice[å·®ä­h]</p> <p>  ------szd_ppicture[囄¡‰‡]</p> <p>  ------szd_ptime[æ·ÕdŠ æ—‰™—´]</p> <p>  ------szd_stock[产品库存]</p> <p>  ------szd_phit[产品点击‹Æ¡æ•°]</p> <p>  ------szd_pdetail1[其他产品描述]</p> <p>  ccdot_news{æ–°é—»} </p> <p>  ------szd_newsid[PK]</p> <p>  ------szd_title[标题]</p> <p>  ------szd_content[内容]</p> <p>  ------szd_time[æ·ÕdŠ æ—‰™—´]</p> <p>  ------szd_type[¾cÕdž‹]</p> <p>  ccdot_guest{评论} </p> <p>  ------szd_gid[PK]</p> <p>  ------szd_gname[æ˜ëЧ°]</p> <p>  ------szd_gcontent[留言内容]</p> <p>  ------szd_productid[å…Œ™”产品的主键]</p> <p>  ------szd_gtime[留言旉™—´]</p> <p>  ------szd_gip[留言者ip]</p> <p>  ccdot_orderlist{订单列表} </p> <p>  ------szd_orderlistid[PK]</p> <p>  ------szd_orderid[å…Œ™”详细订单的主键]</p> <p>  ------szd_productid[å…Œ™”产品的主键]</p> <p>  ------szd_quantity[所定数目]</p> <p>  ------szd_unitcost[单ä­h]</p> <p>  ------szd_productname[产品名称]</p> <p>  ccdot_orders{订单信息表} </p> <p>  ------szd_orderid[PK]</p> <p>  ------szd_userid[å…Œ™”用户主键]</p> <p>  ------szd_orderdate[订单日期]</p> <p>  ------szd_linkman[联系人]</p> <p>  ------szd_email[联系人email]</p> <p>  ------szd_phone[联系电话]</p> <p>  ------szd_postalcode[送货处邮¾~–]</p> <p>  ------szd_address[送货地址]</p> <p>  ------szd_result[处理¾l“æžœ]</p> <p>  ------szd_remark[备注]</p> <p>  ------szd_songhuoqixian[送货期限]</p> <p>  ------szd_songhuofangshi[发货方式]</p> <p>  ------szd_fukuanfangshi[付款方式]</p> <p>  ------szd_error[意外说明]</p> <!-- 分页 --><!-- 分页end --> <img src ="http://www.aygfsteel.com/ljy032/aggbug/172214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ljy032/" target="_blank">风雨兼程</a> 2008-01-02 15:20 <a href="http://www.aygfsteel.com/ljy032/archive/2008/01/02/172214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>petshop4.0设计说明asp.net初学è€?/title><link>http://www.aygfsteel.com/ljy032/archive/2007/12/26/170637.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Wed, 26 Dec 2007 09:05:00 GMT</pubDate><guid>http://www.aygfsteel.com/ljy032/archive/2007/12/26/170637.html</guid><wfw:comment>http://www.aygfsteel.com/ljy032/comments/170637.html</wfw:comment><comments>http://www.aygfsteel.com/ljy032/archive/2007/12/26/170637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ljy032/comments/commentRss/170637.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ljy032/services/trackbacks/170637.html</trackback:ping><description><![CDATA[petshop4.0设计说明 <br /> 一、项目名¿U°åŠæè¿°åQ?实现步骤为:4-3-6-5-2-1)<br /> 1、WEBåQè¡¨½Cºå±‚<br /> 2、BLLåQä¸šåŠ¡é€»è¾‘å±?br /> 3、IDALåQæ•°æ®è®¿é—®å±‚接口定义<br /> 4、ModelåQä¸šåŠ¡å®žä½?br /> 5、DALFactoryåQæ•°æ®å±‚的抽象工åŽ?创徏反射)<br /> 6、SQLServerDALåQSQLServer数据讉K—®å±?/ OracleDALåQOracle数据讉K—®å±? <p>DBUtility 数据库访问组件基¼‹€¾c?/p> <p>二、项目引用关¾p?br /> 1、Web 引用 BLLã€?br /> 2、BLL 引用 IDALåQŒModelåQŒä‹É用DALFactory创徏实例ã€?br /> 3、IDAL 引用 Modelã€?br /> 4、Model 无引用ã€?br /> 5、DALFactory 引用IDALåQŒé€šè¿‡è¯Õd–web.config里设¾|®çš„½E‹åºé›†ï¼ŒåŠ è²¾cȝš„实例åQŒè¿”回给BLL使用ã€?br /> 6、SQLServerDAL 引用 Modelå’ŒIDALåQŒè¢«DALFactory加蝲的程序集åQŒå®žçŽ°æŽ¥å£é‡Œçš„æ–¹æ³•ã€?</p> <p><br /> 三、实现步éª?br /> 1、创建ModelåQŒå®žçŽîC¸šåŠ¡å®žä½“ã€?br /> 2、创建IDALåQŒå®žçŽ°æŽ¥å£ã€?br /> 3、创建SQLServerDALåQŒå®žçŽ°æŽ¥å£é‡Œçš„æ–¹æ³•ã€?br /> 4、增加web.config里的配置信息åQŒäØ“SQLServerDAL的程序集ã€?br /> 5、创建DALFactoryåQŒè¿”回程序集的指定类的实例ã€?br /> 6、创建BLLåQŒè°ƒç”¨DALFactoryåQŒå¾—到程序集指定¾cȝš„实例åQŒå®Œæˆæ•°æ®æ“ä½œæ–¹æ³•ã€?br /> 7、创建WEBåQŒè°ƒç”¨BLL里的数据操作æ–ÒŽ³•ã€?/p> <p>注意åQ?br /> 1、web.config里的½E‹åºé›†å¿U°å¿…™åÖM¸ŽSQLServerDAL里的输出½E‹åºé›†å¿UîC¸€è‡´ã€?br /> 2、DALFactory里只需要一个DataAccess¾c»ï¼Œå¯ä»¥å®Œæˆåˆ›å¾æ‰€æœ‰çš„½E‹åºé›†å®žä¾‹ã€?br /> 3、项目创建后åQŒæ³¨æ„ä¿®æ”¹å„™å¹ç›®çš„默认命名空间和½E‹åºé›†å¿U°ã€?br /> 4、注意修改解å†Ïx–¹æ¡ˆé‡Œçš„项目依赖ã€?br /> 5、注意在解决æ–ÒŽ¡ˆé‡Œå¢žåР各™å¹ç›®å¼•用ã€?/p> <img src ="http://www.aygfsteel.com/ljy032/aggbug/170637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ljy032/" target="_blank">风雨兼程</a> 2007-12-26 17:05 <a href="http://www.aygfsteel.com/ljy032/archive/2007/12/26/170637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Getting Real è¯ÖM¹¦½W”è®° http://www.aygfsteel.com/ljy032/archive/2007/12/26/170599.html风雨兼程风雨兼程Wed, 26 Dec 2007 07:12:00 GMThttp://www.aygfsteel.com/ljy032/archive/2007/12/26/170599.htmlhttp://www.aygfsteel.com/ljy032/comments/170599.htmlhttp://www.aygfsteel.com/ljy032/archive/2007/12/26/170599.html#Feedback0http://www.aygfsteel.com/ljy032/comments/commentRss/170599.htmlhttp://www.aygfsteel.com/ljy032/services/trackbacks/170599.html满èƒö需æ±?/span>ã€?br />
需求和开发的矛盾åQŒè‡³ž®‘在我看来,是äñ”品开发中的主要矛盾ã€?span style="color: red">提需求的觉得产品没有满èƒö需求,开发的觉得需求不明确或者胡来。最后的¾l“æžœåQŒè¦ä¹ˆæ˜¯äº§å“å»¶æœŸåQŒè¦ä¹ˆæ˜¯ä¸ªç ´çƒ?/span>ã€?br />
是否有一些方法或者经验,可以指导我们更成功地开å?Web app 呢?或者不仅仅是开发,˜q˜åŒ…括设计,推广åQŒähäº?#8230;…ä½œäØ“åˆ›ä¸šæˆ–è€…å®žè·ëŠš„一整套指导åQ?br />
˜q™å°±æ˜¯æˆ‘æƒÏxŽ¨èç»™å¤§å®¶çš„ã€?a target="_blank">Getting Real》ã€?br />
Getting Real 是著名的 37signals 公司åQˆRuby on Rails 的缔造者)åŽÕd¹´æ’°å†™çš„一本书åQŒä¸»è¦å†…å®ÒŽ˜¯æŒ‡å¯¼ž®åž‹å…¬å¸/团体成功地商业运作è“v Web 产品åQŒæä¾›äº†åŒ…括相关理念åQŒæ€èµ\åQŒäh员,技术,æ–ÒŽ³•论,实例½{‰ç­‰è®¸å¤šä¿¡æ¯åQŒéžå¸”R€‚合 Web 开发äh员,产品人员和创业者参考ã€?br />
书专注于以下几点åQ?br /> 1. 成功的商业äñ”品,以客户利益和感受至上ã€?br /> 2. ž®åž‹çš„团队,高灵‹zÀL€§å’Œé€‚应性ã€?br /> 3. ¾_„¡®€çš„äñ”品,够用好用的功能ã€?br /> 4. 高效的设计和开发过½E‹ï¼Œæœç»‹¹ªè´¹æ—‰™—´åQŒå‡ž®‘需求和开发的矛盾ã€?br /> 5. 巧妙的推òq¿å’Œå”®åŽæ”¯æŒã€?br /> ……


风雨兼程 2007-12-26 15:12 发表评论
]]>
层随着鼠标¿UÕdЍhttp://www.aygfsteel.com/ljy032/archive/2007/12/26/170591.html风雨兼程风雨兼程Wed, 26 Dec 2007 06:44:00 GMThttp://www.aygfsteel.com/ljy032/archive/2007/12/26/170591.htmlhttp://www.aygfsteel.com/ljy032/comments/170591.htmlhttp://www.aygfsteel.com/ljy032/archive/2007/12/26/170591.html#Feedback0http://www.aygfsteel.com/ljy032/comments/commentRss/170591.htmlhttp://www.aygfsteel.com/ljy032/services/trackbacks/170591.html  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";

风雨兼程 2007-12-26 14:44 发表评论
]]>
解决downlist ½{‰ä¼˜å…ˆæžé«˜äºŽå…¶å®ƒæŽ§äšgåQŒæÕQ在其它控件上é?/title><link>http://www.aygfsteel.com/ljy032/archive/2007/12/26/170583.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Wed, 26 Dec 2007 06:35:00 GMT</pubDate><guid>http://www.aygfsteel.com/ljy032/archive/2007/12/26/170583.html</guid><wfw:comment>http://www.aygfsteel.com/ljy032/comments/170583.html</wfw:comment><comments>http://www.aygfsteel.com/ljy032/archive/2007/12/26/170583.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ljy032/comments/commentRss/170583.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ljy032/services/trackbacks/170583.html</trackback:ping><description><![CDATA[ <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><br />   <div id="divTool" onmouseover="javascript:showdiv123()" onmouseout="javascript:HiddivTool()" class="class_title"  style="display:none"><br /> <table width="100" border="0"  align="center" cellpadding="0" cellspacing="0"><br />   <tr><br />     <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><br />   </tr> <br />   <tr><br />     <td height="20" colspan="2"  bgcolor="ffffff"  style="width: 100px">&nbsp;&nbsp;<a href="#">About this tools</a></td><br />   </tr><tr><br />     <td height="8" colspan="2" bgcolor="ffffff" style="width: 100px"></td><br />   </tr> <br />   <br />   </table><br /> </div> <img src ="http://www.aygfsteel.com/ljy032/aggbug/170583.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ljy032/" target="_blank">风雨兼程</a> 2007-12-26 14:35 <a href="http://www.aygfsteel.com/ljy032/archive/2007/12/26/170583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在PetShop 4.0中ASP.NET¾~“存的实çŽ?http://www.aygfsteel.com/ljy032/archive/2007/12/26/170547.html风雨兼程风雨兼程Wed, 26 Dec 2007 04:07:00 GMThttp://www.aygfsteel.com/ljy032/archive/2007/12/26/170547.htmlhttp://www.aygfsteel.com/ljy032/comments/170547.htmlhttp://www.aygfsteel.com/ljy032/archive/2007/12/26/170547.html#Feedback1http://www.aygfsteel.com/ljy032/comments/commentRss/170547.htmlhttp://www.aygfsteel.com/ljy032/services/trackbacks/170547.htmlPetShopä½œäØ“ä¸€ä¸ªB2Cçš„å® ç‰©ç½‘ä¸Šå•†åº—ï¼Œéœ€è¦å……åˆ†è€ƒè™‘è®¿å®¢çš„ç”¨æˆ·ä½“éªŒï¼Œå¦‚æžœå› äØ“æ•°æ®é‡å¤§è€Œå¯¼è‡´Web服务器的响应不及æ—Óž¼Œ™åµé¢å’ŒæŸ¥è¯¢æ•°æ®è¿Ÿ˜qŸå¾—不到¾l“æžœåQŒä¼šå› æ­¤è€Œç ´åå®¢æˆ¯‚®¿é—®ç½‘站的心情åQŒåœ¨è€—尽耐心的等待后åQŒå¯èƒ½ä¼šå¤±åŽ»˜q™ä¸€éƒ¨åˆ†å®¢æˆ·ã€‚无疑,˜q™æ˜¯éžå¸¸¾pŸç³•的结果。因而在对其˜q›è¡Œä½“系架构设计æ—Óž¼Œæ•´ä¸ª¾pȝ»Ÿçš„æ€§èƒ½ž®±æ˜¾å¾—殊为重要。然而,我们不能因噎废食åQŒå› ä¸ÞZ¸“注于性能而忽略数据的正确性。在PetShop 3.0ç‰ˆæœ¬ä»¥åŠä¹‹å‰çš„ç‰ˆæœ¬ï¼Œå› äØ“ASP.NET¾~“存的局限性,˜q™ä¸€é—®é¢˜òq¶æ²¡æœ‰å¾—到很好的解决。PetShop 4.0则引入了SqlCacheDependencyç‰ÒŽ€§ï¼Œä½¿å¾—¾pȝ»Ÿå¯¹ç¼“å­˜çš„å¤„ç†è¾ƒä¹‹ä»¥å‰å¤§äØ“æ”¹è§‚ã€?/p>

4.3.1  CacheDependency接口

PetShop 4.0引入了SqlCacheDependencyç‰ÒŽ€§ï¼Œå¯¹Category、Productå’ŒItem数据表对应的¾~“存实施了SQL Cache Invalidation技术。当对应的数据表数据发生更改后,该技术能够将相关™å¹ä»Ž¾~“存中移除。实现这一技术的核心是SqlCacheDependency¾c»ï¼Œå®ƒç‘ô承了CacheDependency¾c…R€‚ç„¶è€ŒäØ“äº†ä¿è¯æ•´ä¸ªæž¶æž„çš„å¯æ‰©å±•æ€§ï¼Œæˆ‘ä»¬ä¹Ÿå…è®¸è®¾è®¡è€…å¾ç«‹è‡ªå®šä¹‰çš„CacheDependency¾c»ï¼Œç”¨ä»¥æ‰©å±•¾~“存依赖。这ž®±æœ‰å¿…要为CacheDependency建立抽象接口åQŒåƈ在web.configæ–‡äšg中进行配¾|®ã€?/p>

在PetShop 4.0的命名空间PetShop.ICacheDependency中,定义了名为IPetShopCacheDependency接口åQŒå®ƒä»…包含了一个接口方法:
public interface IPetShopCacheDependency
{      
    AggregateCacheDependency GetDependency();
}

AggregateCacheDependencyæ˜?Net Framework 2.0新增的一个类åQŒå®ƒè´Ÿè´£ç›‘视依赖™å¹å¯¹è±¡çš„集合。当˜q™ä¸ªé›†åˆä¸­çš„ä»ÀL„ä¸€ä¸ªä¾èµ–项对象发生改变æ—Óž¼Œè¯¥ä¾èµ–项对象对应的缓存对象都ž®†è¢«è‡ªåЍ¿U»é™¤ã€?br /> AggregateCacheDependency¾c»è“våˆîCº†¾l„合CacheDependency对象的作用,它可以将多个CacheDependency对象甚至于不同类型的CacheDependency对象与缓存项建立兌™”。由于PetShopéœ€è¦äØ“Category、Productå’ŒItem数据表徏立依赖项åQŒå› è€ŒIPetShopCacheDependency的接口方法GetDependency()其目的就是返回徏立了˜q™äº›ä¾èµ–™å¹çš„AggregateCacheDependency对象ã€?/p>

4.3.2  CacheDependency实现

CacheDependencyçš„å®žçŽ°æ­£æ˜¯äØ“Category、Productå’ŒItem数据表徏立了对应的SqlCacheDependency¾cÕdž‹çš„依赖项åQŒå¦‚代码所½Cºï¼š
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;
    }
}

需要徏立依赖项的数据库与数据表都配¾|®åœ¨web.configæ–‡äšg中,其设¾|®å¦‚下:
<add key="CacheDatabaseName" value="MSPetShop4"/>
<add key="CategoryTableDependency" value="Category"/>
<add key="ProductTableDependency" value="Product,Category"/>
<add key="ItemTableDependency" value="Product,Category,Item"/>

æ ÒŽ®å„个数据表间的依赖关¾p»ï¼Œå› è€Œä¸åŒçš„æ•°æ®è¡¨éœ€è¦å¾ç«‹çš„依赖™å¹ä¹Ÿæ˜¯ä¸ç›¸åŒçš„,从配¾|®æ–‡ä»¶ä¸­çš„value值可以看出。然而不½Ž¡å¾ç«‹ä¾èµ–é¡¹çš„å¤šå¯¡ï¼Œå…¶åˆ›å»ºçš„è¡ŒäØ“é€»è¾‘éƒ½æ˜¯ç›æ€¼¼çš„,因而在设计æ—Óž¼ŒæŠ½è±¡äº†ä¸€ä¸ªå…±åŒçš„¾c»TableDependencyåQŒåƈ通过建立带参数的构造函敎ͼŒå®Œæˆå¯¹ä¾èµ–项的徏立。由于接口方法GetDependency()的实çŽîC¸­åQŒè¿”回的对象dependency是在受保护的构造函数创建的åQŒå› æ­¤è¿™é‡Œçš„实现方式也可以看作是Template Method模式的灵‹z»è¿ç”¨ã€‚例如TableDependency的子¾c»ProductåQŒå°±æ˜¯åˆ©ç”¨çˆ¶¾cÈš„æž„造函数徏立了Product、Category数据表的SqlCacheDependency依赖åQ?br /> public class Product : TableDependency
{
    public Product() : base("ProductTableDependency") { }
}

如果需要自定义CacheDependencyåQŒé‚£ä¹ˆåˆ›å»ÞZ¾èµ–项的方式又有不同。然而不½Ž¡æ˜¯åˆ›å¾SqlCacheDependency对象åQŒè¿˜æ˜¯è‡ªå®šä¹‰çš„CacheDependency对象åQŒéƒ½æ˜¯å°†˜q™äº›ä¾èµ–™åÒŽ·»åŠ åˆ°AggregateCacheDependency¾cÖM¸­åQŒå› è€Œæˆ‘ä»¬ä¹Ÿå¯ä»¥ä¸ø™‡ªå®šä¹‰CacheDependency建立专门的类åQŒåªè¦å®žçްIPetShopCacheDependency接口卛_¯ã€?/p>

4.3.3  CacheDependency工厂

¾l§æ‰¿äº†æŠ½è±¡ç±»TableDependencyçš„Product、Categoryå’ŒItem¾cÕd‡éœ€è¦åœ¨è°ƒç”¨æ—¶åˆ›å»ºå„自的对象。由于它们的父类TableDependency实现了接口IPetShopCacheDependencyåQŒå› è€Œå®ƒä»¬ä¹Ÿé—´æŽ¥å®žçŽ°äº†IPetShopCacheDependency接口åQŒè¿™ä¸ºå®žçŽ°å·¥åŽ‚æ¨¡å¼æä¾›äº†å‰æã€?/p>

在PetShop 4.0中,依然利用了配¾|®æ–‡ä»¶å’Œåå°„技术来实现工厂模式。命名空间PetShop.CacheDependencyFactory中,¾c»DependencyAccesså³äØ“åˆ›å¾IPetShopCacheDependency对象的工厂类åQ?br /> 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);
    }
}
整个工厂模式的实现如å›?-3所½Cºï¼š

4-3.gif
 å›?-3 CacheDependency工厂

虽然DependencyAccess¾cÕdˆ›å»ÞZº†å®žçŽ°äº†IPetShopCacheDependency接口的类Category、Product、ItemåQŒç„¶è€Œæˆ‘们之所以引入IPetShopCacheDependency接口åQŒå…¶ç›®çš„ž®±åœ¨äºŽèŽ·å¾—åˆ›å»ÞZº†ä¾èµ–™å¹çš„AggregateCacheDependency¾cÕdž‹çš„对象。我们可以调用对象的接口æ–ÒŽ³•GetDependency()åQŒå¦‚下所½Cºï¼š
AggregateCacheDependency dependency = DependencyAccess.CreateCategoryDependency().GetDependency();

ä¸ÞZº†æ–¹ä¾¿è°ƒç”¨è€…,ä¼ég¹Žæˆ‘们可以对DependencyAccess¾c»è¿›è¡Œæ”¹˜q›ï¼Œž®†åŽŸæœ‰çš„CreateCategoryDependency()æ–ÒŽ³•åQŒä¿®æ”¹äؓ创徏AggregateCacheDependency¾cÕdž‹å¯¹è±¡çš„æ–¹æ³•ã€?/p>

然而这æ ïLš„做法æ‰îCؕ了作为工厂类的DependencyAccess的本íw«èŒè´£ï¼Œä¸”创建IPetShopCacheDependency接口对象的行ä¸ÞZ»ç„¶æœ‰å¯èƒ½è¢«è°ƒç”¨è€…调用,所以保留原有的DependencyAccess¾cÖM»ç„¶æ˜¯æœ‰å¿…要的ã€?/p>

在PetShop 4.0的设计中åQŒæ˜¯é€šè¿‡å¼•å…¥Facade模式以方便调用者更加简单地获得AggregateCacheDependency¾cÕdž‹å¯¹è±¡ã€?/p>

4.3.4  引入Facade模式

利用Facade模式可以ž®†ä¸€äº›å¤æ‚的逻辑˜q›è¡ŒåŒ…装åQŒä»¥æ–¹ä¾¿è°ƒç”¨è€…对˜q™äº›å¤æ‚逻辑的调用。就好像提供一个统一的门面一般,ž®†å†…部的子系¾lŸå°è£…è“v来,¾lŸä¸€ä¸ÞZ¸€ä¸ªé«˜å±‚次的接口。一个典型的Facade模式½Cºæ„å›‘Ö¦‚下所½Cºï¼š

4-4.gif
�-4 Facade模式

Facadeæ¨¡å¼çš„ç›®çš„åÆˆéžè¦å¼•å…¥ä¸€ä¸ªæ–°çš„åŠŸèƒ½ï¼Œè€Œæ˜¯åœ¨çŽ°æœ‰åŠŸèƒ½çš„åŸºç¡€ä¸Šæä¾›ä¸€ä¸ªæ›´é«˜å±‚‹Æ¡çš„æŠ½è±¡åQŒä‹É得调用者可以直接调用,而不用关心内部的实现方式。以CacheDependency工厂ä¸ÞZ¾‹åQŒæˆ‘ä»¬éœ€è¦äØ“è°ƒç”¨è€…æä¾›èŽ·å¾—AggregateCacheDependency对象的简便方法,因而创å»ÞZº†DependencyFacade¾c»ï¼š
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¾cÕd°è£…了获取AggregateCacheDependency¾cÕdž‹å¯¹è±¡çš„逻辑åQŒå¦‚此一来,调用者可以调用相å…Ïx–¹æ³•获得创建相关依赖项的AggregateCacheDependency¾cÕdž‹å¯¹è±¡åQ?br /> AggregateCacheDependency dependency = DependencyFacade.GetCategoryDependency();

比è“v直接调用DependencyAccess¾cȝš„GetDependency()æ–ÒŽ³•而言åQŒé™¤äº†æ–¹æ³•æ›´½Ž€å•之外,同时它还对CacheDependencyAssembly配置节进行了判断åQŒå¦‚果其å€égØ“½Iºï¼Œåˆ™è¿”回null对象ã€?/p>

在PetShop.Webçš„App_Codeæ–‡äšg夹下åQŒé™æ€ç±»WebUtilityçš„GetCategoryName()å’ŒGetProductName()æ–ÒŽ³•调用了DependencyFacade¾c…R€‚例如GetCategoryName()æ–ÒŽ³•åQ?br /> 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);

     // ‹‚€æŸ¥ç¼“存中是否存在该数据项;
     string data = (string)HttpRuntime.Cache[cacheKey];
     if (data == null)
     {
           // 通过web.config的配¾|®èŽ·å–durationå€?
           int cacheDuration = int.Parse(ConfigurationManager.AppSettings["CategoryCacheDuration"]);
           // 如果¾~“存中不存在该数据项åQŒåˆ™é€šè¿‡ä¸šåŠ¡é€»è¾‘å±‚è®¿é—®æ•°æ®åº“èŽ·å–;
           data = category.GetCategory(categoryId).Name;
           // 通过Facade¾cÕdˆ›å»ºAggregateCacheDependency对象;
           AggregateCacheDependency cd = DependencyFacade.GetCategoryDependency();
           // ž®†æ•°æ®é¡¹ä»¥åŠAggregateCacheDependency 对象存储到缓存中;
           HttpRuntime.Cache.Add(cacheKey, data, cd, DateTime.Now.AddHours(cacheDuration), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
      }
      return data;
}

GetCategoryName()æ–ÒŽ³•首先会检查缓存中是否已经存在CategoryName数据™å¹ï¼Œå¦‚果已经存在åQŒå°±é€šè¿‡¾~“存直接获取数据åQ›å¦åˆ™å°†é€šè¿‡ä¸šåŠ¡é€»è¾‘å±‚è°ƒç”¨æ•°æ®è®¿é—®å±‚è®‰K—®æ•°æ®åº“获得CategoryNameåQŒåœ¨èŽ·å¾—äº†CategoryName后,会将新获取的数据˜qžåŒDependencyFacade¾cÕdˆ›å»ºçš„AggregateCacheDependency对象æ·ÕdŠ åˆ°ç¼“å­˜ä¸­ã€?/p>

WebUtility静态类被表½Cºå±‚的许多页面所调用åQŒä¾‹å¦‚Product™åµé¢åQ?br /> public partial class Products : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Page.Title = WebUtility.GetCategoryName(Request.QueryString["categoryId"]);
    }
}

昄¡¤º™åµé¢title的逻辑是放在Page_Load事äšgæ–ÒŽ³•中,因而每‹Æ¡æ‰“开该页面都要执行获取CategoryName的方法。如果没有采用缓存机åˆÓž¼Œå½“Category数据较多æ—Óž¼Œ™åµé¢çš„æ˜¾½Cºå°±ä¼šéžå¸¸ç¼“æ…¢ã€?/p>

4.3.5  引入Proxy模式

业务逻辑层BLL中与Product、Category、Item有关的业务方法,其实现逻辑是调用数据访问层åQˆDALåQ‰å¯¹è±¡è®¿é—®æ•°æ®åº“åQŒä»¥èŽ·å–ç›¸å…³æ•°æ®ã€‚äØ“äº†æ”¹å–„ç³»¾lŸæ€§èƒ½åQŒæˆ‘ä»¬å°±éœ€è¦äØ“˜q™äº›å®žçްæ–ÒŽ³•增加¾~“存机制的逻辑。当我们操作增加了缓存机制的业务对象æ—Óž¼Œå¯¹äºŽè°ƒç”¨è€…而言åQŒåº”与BLL业务对象的调用保持一致。也åÏx˜¯è¯ß_¼Œæˆ‘们需要引入一个新的对象去控制原来的BLL业务对象åQŒè¿™ä¸ªæ–°çš„对象就是Proxy模式中的代理对象ã€?/p>

以PetShop.BLL.Product业务对象ä¸ÞZ¾‹åQŒPetShop为其建立了代理对象ProductDataProxyåQŒåƈ在GetProductByCategory()½{‰æ–¹æ³•中åQŒå¼•入了¾~“存机制åQŒä¾‹å¦‚:
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;
    }
}

与业务逻辑层Product对象的GetProductsByCategory()æ–ÒŽ³•相比åQŒå¢žåŠ äº†¾~“存机制。当¾~“存内不存在相关数据™åÒŽ—¶åQŒåˆ™ç›´æŽ¥è°ƒç”¨ä¸šåŠ¡é€»è¾‘å±‚Productçš„GetProductsByCategory()æ–ÒŽ³•来获取数据,òq¶å°†å…¶ä¸Žå¯¹åº”çš„AggregateCacheDependency对象一起存储在¾~“存中ã€?/p>

引入Proxy模式åQŒå®žçŽîCº†åœ¨ç¼“å­˜çñ”别上对业务对象的ž®è£…åQŒå¢žå¼ÞZº†å¯¹ä¸šåŠ¡å¯¹è±¡çš„æŽ§åˆ¶ã€‚ç”±äºŽæš´éœ²åœ¨å¯¹è±¡å¤–çš„æ–ÒŽ³•是一致的åQŒå› è€Œå¯¹äºŽè°ƒç”¨æ–¹è€Œè¨€åQŒè°ƒç”¨ä»£ç†å¯¹è±¡ä¸ŽçœŸå®žå¯¹è±¡òq¶æ²¡æœ‰å®žè´¨çš„区别ã€?/p>

从职责分¼›ÖM¸Žåˆ†å±‚设计的角度分析,我更希望˜q™äº›Proxy对象是被定义在业务逻辑层中åQŒè€Œä¸åƒåœ¨PetShopçš„è®¾è®¡é‚£æ øP¼Œè¢«åˆ’分到表示层UI中。此外,如果需要考虑½E‹åºçš„可扩展性与可替换性,我们˜q˜å¯ä»¥äؓ真实对象与代理对象徏立统一的接口或抽象¾c…R€‚然而,单以PetShop的表½Cºå±‚调用来看åQŒé‡‡ç”¨é™æ€ç±»ä¸Žé™æ€æ–¹æ³•的方式åQŒæˆ–许更为合理。我们需要è°}讎ͼŒ“˜q‡åº¦è®¾è®¡”是èÊY件设计的警戒¾Uѝ€?/p>

如果需要对UI层采用缓存机åˆÓž¼Œž®†åº”用程序数据存攑ֈ°¾~“存中,ž®±å¯ä»¥è°ƒç”¨è¿™äº›ä»£ç†å¯¹è±¡ã€‚以ProductsControl用户控äšgä¸ÞZ¾‹åQŒè°ƒç”¨æ–¹å¼å¦‚下:
productsList.DataSource = ProductDataProxy.GetProductsByCategory(categoryKey);

productsList对象属于自定义的CustomList¾cÕdž‹åQŒè¿™æ˜¯ä¸€ä¸ªæ´¾ç”Ÿè‡ªSystem.Web.UI.WebControls.DataList控äšg的类åQŒå®ƒçš„DataSource属性可以接受IList集合对象ã€?br /> 不过在PetShop 4.0的设计中åQŒå¯¹äºŽç±»ä¼égºŽProductsControl¾cÕdž‹çš„æŽ§ä»¶è€Œè¨€åQŒé‡‡ç”¨çš„¾~“存机制是页输出¾~“存。我们可以从ProductsControl.ascx™åµé¢çš„Source代码中发现端倪:
<%@ OutputCache Duration="100000" VaryByParam="page;categoryId" %>

与ASP.NET 1.x的页输出¾~“存不同的是åQŒåœ¨ASP.NET 2.0中,为ASP.NET用户控äšg新引入了CachePolicy属性,该属性的¾cÕdž‹ä¸ºControlCachePolicy¾c»ï¼Œå®ƒä»¥¾~–程方式实现了对ASP.NET用户控äšg的输出缓存设¾|®ã€‚我们可以通过讄¡½®ControlCachePolicy¾cȝš„Dependency属性,来设¾|®ä¸Žè¯¥ç”¨æˆähŽ§ä»¶ç›¸å…³çš„ä¾èµ–™å¹ï¼Œä¾‹å¦‚在ProductsControl用户控äšg中,˜q›è¡Œå¦‚下的设¾|®ï¼š
protected void Page_Load(object sender, EventArgs e)
{
    this.CachePolicy.Dependency = DependencyFacade.GetProductDependency();
}

采用™åµè¾“出缓存,òq¶ä¸”利用ControlCachePolicy讄¡½®è¾“出¾~“å­˜åQŒèƒ½å¤Ÿå°†ä¸šåŠ¡æ•°æ®ä¸Žæ•´ä¸ªé¡µé¢æ”¾å…¥åˆ°¾~“存中。这¿Uæ–¹å¼æ¯”起应用程序缓存而言åQŒåœ¨æ€§èƒ½ä¸Šæœ‰å¾ˆå¤§çš„æé«˜ã€‚同æ—Óž¼Œå®ƒåˆé€šè¿‡å¼•入的SqlCacheDependencyç‰ÒŽ€§æœ‰æ•ˆåœ°é¿å…äº?#8220;数据˜q‡æœŸ”的缺点,因而在PetShop 4.0中被òq¿æ³›é‡‡ç”¨ã€‚相反,之前为Product、Category、Item业务对象建立的代理对象则è¢?#8220;投闲散置”åQŒä»…仅作ä¸ÞZ¸€¿Uè®¾è®¡æ–¹æ³•的展示è€?#8220;òq¸å­˜”与整个系¾lŸçš„æºä»£ç ä¸­ã€?/p>

风雨兼程 2007-12-26 12:07 发表评论
]]>
IList<CategoryInfo> GetCategories();的问é¢?/title><link>http://www.aygfsteel.com/ljy032/archive/2007/12/26/170538.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Wed, 26 Dec 2007 03:44:00 GMT</pubDate><guid>http://www.aygfsteel.com/ljy032/archive/2007/12/26/170538.html</guid><wfw:comment>http://www.aygfsteel.com/ljy032/comments/170538.html</wfw:comment><comments>http://www.aygfsteel.com/ljy032/archive/2007/12/26/170538.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ljy032/comments/commentRss/170538.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ljy032/services/trackbacks/170538.html</trackback:ping><description><![CDATA[petshop4.0中的一ŒDµä»£ç ?  <br />     <br />   public   interface   ICategory   {   <br />     <br />   ///   <summary>   <br />   ///   Method   to   get   all   categories   <br />   ///   </summary>   <br />                   ///   <returns>Interface   to   Model   Collection   Generic   of   categories</returns>   <br />               <br />                   <br />   IList<CategoryInfo>   GetCategories();   <br />                   <br />     <br />                   ///   <summary>   <br />                   ///   Get   information   on   a   specific   category   <br />                   ///   </summary>   <br />                   ///   <param   name="categoryId">Unique   identifier   for   a   category</param>   <br />                   ///   <returns>Business   Entity   representing   an   category</returns>   <br />                   CategoryInfo   GetCategory(string   categoryId);   <br />   }   <br />     <br />     <br />   我知道IList<CategoryInfo>是范åž?  <br />   表示list中的item是CategoryInfo对象   <br />     <br />     <br />   请问ä¸ÞZ»€ä¹ˆç”¨IList<CategoryInfo>   <br />   用List<CategoryInfo>可以吗?   <br />     <br />   两者有什么区别?谢谢   <br /> <br /> 没有什么区别,˜q™æ ·å†™çµ‹zÀL€§å¤§åQŒå®žçްilist接口的类很多åQŒä½ å†™æˆlist后,也许以后你要æ”ÒŽˆéžlist的,ž®×ƒ¼šè¦æ”¹å¾ˆå¤šä»£ç <br /> 举个例子   <br />     <br />   RenderControlToString(DataList   L//Control   C)   <br />     <br />   你认为是写control˜q˜æ˜¯å†™datalist代码的通用性高?<br /> <br />   OOP¾~–码原则:ž®½å¯èƒ½ç”¨æŽ¥å£¾~–程<br /> <img src ="http://www.aygfsteel.com/ljy032/aggbug/170538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ljy032/" target="_blank">风雨兼程</a> 2007-12-26 11:44 <a href="http://www.aygfsteel.com/ljy032/archive/2007/12/26/170538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于sqlhelper.cs http://www.aygfsteel.com/ljy032/archive/2007/12/26/170508.html风雨兼程风雨兼程Wed, 26 Dec 2007 02:30:00 GMThttp://www.aygfsteel.com/ljy032/archive/2007/12/26/170508.htmlhttp://www.aygfsteel.com/ljy032/comments/170508.htmlhttp://www.aygfsteel.com/ljy032/archive/2007/12/26/170508.html#Feedback0http://www.aygfsteel.com/ljy032/comments/commentRss/170508.htmlhttp://www.aygfsteel.com/ljy032/services/trackbacks/170508.htmlpublic 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
              /*
               使用一个哈希表来保存缓存的参数 只缓存参数名
               哈希表的特点:一个键对应一个值key对value(为object需要类型è{åŒ?        不能出现两个相同的键 否则error
         
               下面的哈希表parmCache定义为static即一‹Æ¡å®šä¹‰å…¨å±€ä½¿ç”¨
               所以可能会出现有äh在读的时候,有äh在写åQŒä¸€èˆ¬ä¼šç”¨Lockž®±åƒAsp中用Application["count"]来统计点å‡ÀL•°ä¸€æ ?br />                要先锁后解锁
               ä½?net框架提供了Synchroized          syncå’Œsyncroize中文意æ€?同步åQŒåŒæ—¶å‘ç”?br />                来提供这一操作
              */
              private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());

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

              /*
              1ã€äØ“ä½•è¦å…‹éš†å‘?ä¸ÞZ½•不直接return cachedParms
         
              有一个参数数¾l?br />               SqlParameter[] parms={
              new SqlParameter("@num1",SqlDbType.Int,4),
              new SqlParameter("@num2",SqlDbType.Int,4)
              }
              ¾~“存该数¾l?br />               用户aå’Œb都执行插入操ä½?br />               a用户插入äº?,1
              b用户插入äº?,2
              如果不用克隆的话åQŒå‚æ•°æ•°¾l„只有一ä»?br />               è€?个用户需要根据不同的情况赋于不同的å€?br />               所以就用了克隆äº?br />         
              2ã€?ICloneable)cachedParms[i]先将HashTableè½¬äØ“ICloneable˜q™æ ·HashTablež®±å…·æœ‰äº†Clone()克隆æ–ÒŽ³•äº?br />               克隆一份后是什么类型呢åQŒï¼Œå½“然要强制è{åŒ–äØ“(SqlParameter)äº?br />               最后将它赋值给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的作用,˜q™ä¹Ÿæ˜¯ä¸€ä¸ªçŸ¥è¯†ç‚¹
               举例:
               ExecuteReader(*,*,null)成功˜qè¡Œ
               ExecuteReader(*,*,new SqlParameter(*))成功˜qè¡Œ
               ExecuteReader(*,*,new SqlParameter(*),new SqlParameter(*))成功˜qè¡Œ
               ExecuteReader(*,*,{new SqlParameter(*),new SqlParameter(*),})成功˜qè¡Œ
               它让参数¾cÕdž‹å’Œå‚æ•îC¸ªæ•îC“Qæ„?br />                ˜q™å¯¾l™äº†ä¸æ˜¯ä¸€èˆ¬çš„好处åQŒä½ ä¸å¿…为SqlParameterå’ŒSqlParameter[]˜q›è¡Œé‡è²åQŒå†™ä¸Šä¸¤ä¸ªå‡½æ•?br />                åˆäØ“null写上一个函敎ͼŒå› äØ“null会不明确调用SqlParameter的函数还是SqlParameter[]的函æ•?br />                啥你不知道我在说什么,打屁å±?那回åŽÈœ‹çœ‹c++的函数重è½?br />                */
              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


          }
}



风雨兼程 2007-12-26 10:30 发表评论
]]>
框架怎样实现高度随内容自动增é«?/title><link>http://www.aygfsteel.com/ljy032/archive/2007/04/29/114626.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Sun, 29 Apr 2007 10:03:00 GMT</pubDate><guid>http://www.aygfsteel.com/ljy032/archive/2007/04/29/114626.html</guid><wfw:comment>http://www.aygfsteel.com/ljy032/comments/114626.html</wfw:comment><comments>http://www.aygfsteel.com/ljy032/archive/2007/04/29/114626.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ljy032/comments/commentRss/114626.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ljy032/services/trackbacks/114626.html</trackback:ping><description><![CDATA[<p>main.htm:</p> <p><html>  <br>    <head>  <br>       <meta  http-equiv='Content-Type'  content='text/html;  charset=gb2312' />  <br>       <meta  name='author'  content='F.R.Huang(meizz梅花é›?//www.meizz.com' />  <br>       <title>iframe自适应加蝲的页面高åº?lt;/title>  <br>    </head>  <br>     <br>    <body><br>        <div><iframe src="child.htm"></iframe></div><br>    </body><br></html></p> <p>child.htm:</p> <p><html>  <br><head>  <br>    <meta  http-equiv='Content-Type'  content='text/html;  charset=gb2312' />  <br>    <meta  name='author'  content='F.R.Huang(meizz梅花é›?//www.meizz.com' />  <br>    <title>iframe  自适应其加载的¾|‘页(多浏览器兼容)</title>  <br>    <script type="text/javascript"><br>    <!--<br>    function iframeAutoFit()<br>    {<br>        try<br>        {<br>            if(window!=parent)<br>            {<br>                var a = parent.document.getElementsByTagName("IFRAME");<br>                for(var i=0; i<a.length; i++) //author:meizz<br>                {<br>                    if(a[i].contentWindow==window)<br>                    {<br>                        var h1=0, h2=0;<br>                        a[i].parentNode.style.height = a[i].offsetHeight +"px";<br>                        a[i].style.height = "10px";<br>                        if(document.documentElement&&document.documentElement.scrollHeight)<br>                        {<br>                            h1=document.documentElement.scrollHeight;<br>                        }<br>                        if(document.body) h2=document.body.scrollHeight;</p> <p>                        var h=Math.max(h1, h2);<br>                        if(document.all) {h += 4;}<br>                        if(window.opera) {h += 1;}<br>                        a[i].style.height = a[i].parentNode.style.height = h +"px";<br>                    }<br>                }<br>            }<br>        }<br>        catch (ex){}<br>    }<br>    if(window.attachEvent)<br>    {<br>        window.attachEvent("onload",  iframeAutoFit);<br>        //window.attachEvent("onresize",  iframeAutoFit);<br>    }<br>    else if(window.addEventListener)<br>    {<br>        window.addEventListener('load',  iframeAutoFit,  false);<br>        //window.addEventListener('resize',  iframeAutoFit,  false);<br>    }<br>    //--><br>    </script>  <br></head>  <br><body><br>    <table border="1" width="200" style="height: 400px; background-color: yellow"><br>        <tr><br>            <td>iframe  自适应其加载的¾|‘页(多浏览器兼容åQŒæ”¯æŒXHTML)</td><br>        </tr><br>    </table><br></body>  <br></html></p> <p> å¾ˆå¤šäººååº”在IE7里ä‹Éç”¨å®ƒä¼šæ­»æœºï¼Œé‚£æ˜¯å› äØ“åœ¨è‡ªé€‚åº”é«˜åº¦æ—¶è§¦å‘äº† window.onresize 事äšgåQŒè€Œè¿™ä¸ªäº‹ä»¶åˆåŽ»è°ƒç”¨è¿™ä¸ªè°ƒæ•?<iframe> 高度的函敎ͼŒäº§ç”Ÿäº†æ­»å¾ªçŽ¯è°ƒç”¨ã€?/p> <img src ="http://www.aygfsteel.com/ljy032/aggbug/114626.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ljy032/" target="_blank">风雨兼程</a> 2007-04-29 18:03 <a href="http://www.aygfsteel.com/ljy032/archive/2007/04/29/114626.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> Ö÷Õ¾Ö©Öë³ØÄ£°å£º <a href="http://" target="_blank">ÎåÕ¯ÏØ</a>| <a href="http://" target="_blank">¹ãÎ÷</a>| <a href="http://" target="_blank">ºÏ½­ÏØ</a>| <a href="http://" target="_blank">ÎÄ»¯</a>| <a href="http://" target="_blank">ÔªÀÊÇø</a>| <a href="http://" target="_blank">ÐÂÃÜÊÐ</a>| <a href="http://" target="_blank">Áúº£ÊÐ</a>| <a href="http://" target="_blank">ÎÚ³ľÆëÊÐ</a>| <a href="http://" target="_blank">³àË®ÊÐ</a>| <a href="http://" target="_blank">½­±±Çø</a>| <a href="http://" target="_blank">Ò˾ýÏØ</a>| <a href="http://" target="_blank">ÌØ¿ËË¹ÏØ</a>| <a href="http://" target="_blank">ÎÂÈªÏØ</a>| <a href="http://" target="_blank">ÄÏÆ¤ÏØ</a>| <a href="http://" target="_blank">Î¼Ô´ÏØ</a>| <a href="http://" target="_blank">¶ëüɽÊÐ</a>| <a href="http://" target="_blank">ÈýÔ­ÏØ</a>| <a href="http://" target="_blank">л¯ÏØ</a>| <a href="http://" target="_blank">º£ÄþÊÐ</a>| <a href="http://" target="_blank">°ØÏçÏØ</a>| <a href="http://" target="_blank">¤Î÷ÏØ</a>| <a href="http://" target="_blank">°²ÒåÏØ</a>| <a href="http://" target="_blank">Ö¾µ¤ÏØ</a>| <a href="http://" target="_blank">ÈýÃ÷ÊÐ</a>| <a href="http://" target="_blank">ÌåÓý</a>| <a href="http://" target="_blank">ÈéɽÊÐ</a>| <a href="http://" target="_blank">Âê¶àÏØ</a>| <a href="http://" target="_blank">ÁúÑÒÊÐ</a>| <a href="http://" target="_blank">µ¤°ÍÏØ</a>| <a href="http://" target="_blank">ºç¿ÚÇø</a>| <a href="http://" target="_blank">ÍÅ·çÏØ</a>| <a href="http://" target="_blank">ͨÁÉÊÐ</a>| <a href="http://" target="_blank">ÑĮ̀ÊÐ</a>| <a href="http://" target="_blank">×Þ³ÇÊÐ</a>| <a href="http://" target="_blank">Î÷ÃË</a>| <a href="http://" target="_blank">ÎÞ¼«ÏØ</a>| <a href="http://" target="_blank">Ëç·ÒºÓÊÐ</a>| <a href="http://" target="_blank">ÃÉÒõÏØ</a>| <a href="http://" target="_blank">¾¸ÓîÏØ</a>| <a href="http://" target="_blank">¶õÂ×´º×ÔÖÎÆì</a>| <a href="http://" target="_blank">°×ÀÊÏØ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>