﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-woaidongmao-随笔分类-Web 开发</title><link>http://www.cppblog.com/woaidongmao/category/9243.html</link><description>文章均收录自他人博客，但不喜标题前加-[转贴]，因其丑陋，见谅！~</description><language>zh-cn</language><lastBuildDate>Tue, 26 May 2009 10:51:18 GMT</lastBuildDate><pubDate>Tue, 26 May 2009 10:51:18 GMT</pubDate><ttl>60</ttl><item><title>CSS+DIV布局心得 </title><link>http://www.cppblog.com/woaidongmao/archive/2009/05/25/85708.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Mon, 25 May 2009 07:29:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/05/25/85708.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/85708.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/05/25/85708.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/85708.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/85708.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="BACKGROUND: white; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 160%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">CSS+DIV</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">布局已经变成白菜一样了，到处都是<span lang=EN-US>CSS+DIV</span>布局，去面试一个做网页的公司，肯定会问，你会<span lang=EN-US>CSS+DIV</span>布局不。到底啥是<span lang=EN-US>CSS+DIV</span>布局呢？传统上都是以用<span lang=EN-US>TABLE</span>布局的，<span lang=EN-US>TABLE</span>布局的要点是有两个，第一：适当的地方合并行和列，第二：懂<span lang=EN-US>TABLE</span>嵌套<span lang=EN-US>Table</span>。<span lang=EN-US><br></span>而且还可以直接在页面上控制<span lang=EN-US>Table</span>的高度长度。<span lang=EN-US>TABLE</span>布局最大的缺点，除了沉长的<span lang=EN-US>TR,TD</span>之外，言论最多的就是<span lang=EN-US>SEO</span>里对<span lang=EN-US>Table</span>布局的鄙视。大部分<span lang=EN-US>SEO</span>人都会觉得<span lang=EN-US>Table</span>布局不利于<span lang=EN-US>SEO</span>优化。这点。。到真是有点关系，我试过两个完全一样的网站，一个是用<span lang=EN-US>Table</span>布局的，我是用<span lang=EN-US>CSS+DIV</span>布局的，并适当的使用了<span lang=EN-US>H</span>标记，在<span lang=EN-US>GOOGLE</span>搜索上，我<span lang=EN-US>CSS+div</span>布局的网站要比<span lang=EN-US>Table</span>布局的要靠前。。。至于为什么，那个不是本文的重点。。忽略掉。<span lang=EN-US><br><br>&nbsp;&nbsp; CSS+DIV</span>布局最大的特点就是<span lang=EN-US>HTML</span>文件里的代码相对比较少，但是也造成了浏览器布局问题。。网上很多人都在说，我布局在<span lang=EN-US>IE</span>里显示正常，在<span lang=EN-US>FF</span>下全部变形了。其实造成这样问题的原因是你写的<span lang=EN-US>CSS</span>并不标准，可以说你写的<span lang=EN-US>CSS</span>都是根绝<span lang=EN-US>IE</span>的标准来写的，而不是<span lang=EN-US>CSS2.0</span>的国际标准，无论是<span lang=EN-US>IE</span>还是<span lang=EN-US>FF</span>（<span lang=EN-US>3.0</span>版前的我没留意）都是支持<span lang=EN-US>CSS2.0</span>的，但是在技术上，<span lang=EN-US>IE</span>有写模糊功能，可以令到非标准的<span lang=EN-US>CSS</span>布局也能正确解析，一下是我写<span lang=EN-US>CSS</span>代码的五个习惯，我不敢说我这五个习惯都是好习惯，至少我写的<span lang=EN-US>CSS</span>布局不会产生不良效果，也就是我写的<span lang=EN-US>CSS</span>有跨<span lang=EN-US>l</span>浏览器能力。<span lang=EN-US><br><br></span>第一：容器类<span lang=EN-US>DIV</span>必须要有<span lang=EN-US>5</span>个东西<span lang=EN-US>{margin</span>，<span lang=EN-US>padding</span>，<span lang=EN-US>width</span>，<span lang=EN-US>height</span>，<span lang=EN-US>overflow}</span>，什么叫容器类，就是这个<span lang=EN-US>DIV</span>只是用来放内部的<span lang=EN-US>DIV</span>的，也可以说是一个定位的<span lang=EN-US>div..</span>例如：我们经常使用居中，一般是这样做的<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: #eeeeee; MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; LINE-HEIGHT: 160%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><v:shape id=_x0000_i1025 style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/None.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image001.gif"></v:imagedata></v:shape></span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: maroon; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">body<br><v:shape id=Codehighlighter1_5_145_Open_Image style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1026"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image002.gif"></v:imagedata></v:shape><v:shape id=Codehighlighter1_5_145_Closed_Image style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1027"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image003.gif"></v:imagedata></v:shape></span><span lang=EN-US style="BORDER-RIGHT: gray 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: gray 1pt solid; DISPLAY: none; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; BACKGROUND: white; PADDING-BOTTOM: 0cm; BORDER-LEFT: gray 1pt solid; COLOR: #4b4b4b; LINE-HEIGHT: 160%; PADDING-TOP: 0cm; BORDER-BOTTOM: gray 1pt solid; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hide: all; mso-border-alt: solid gray .75pt">{<v:shape id=_x0000_i1028 style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"> <v:imagedata o:href="http://www.cppblog.com/Images/dot.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image004.gif"></v:imagedata></v:shape>}</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">{</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br><v:shape id=_x0000_i1029 style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image005.gif"></v:imagedata></v:shape>&nbsp;&nbsp;&nbsp;&nbsp;font-size</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">:</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;12px</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">;</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br><v:shape id=_x0000_i1030 style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image005.gif"></v:imagedata></v:shape>&nbsp;&nbsp;&nbsp;&nbsp;margin</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">:</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;0px</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">;</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br><v:shape id=_x0000_i1031 style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image005.gif"></v:imagedata></v:shape>&nbsp;&nbsp;&nbsp;&nbsp;padding</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">:</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;0px</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">;</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br><v:shape id=_x0000_i1032 style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image005.gif"></v:imagedata></v:shape>&nbsp;&nbsp;&nbsp;&nbsp;height</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">:</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;100%</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">;</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br><v:shape id=_x0000_i1033 style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image005.gif"></v:imagedata></v:shape>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">:</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;100%</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">;</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br><v:shape id=_x0000_i1034 style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image005.gif"></v:imagedata></v:shape>&nbsp;&nbsp;&nbsp;&nbsp;overflow</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">:</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;auto</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">;</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br><v:shape id=_x0000_i1035 style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image005.gif"></v:imagedata></v:shape>&nbsp;&nbsp;&nbsp;&nbsp;text-align</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">:</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;center</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">;</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br><v:shape id=_x0000_i1036 style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image005.gif"></v:imagedata></v:shape>&nbsp;&nbsp;&nbsp;&nbsp;display</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">:</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;block</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">;</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br><v:shape id=_x0000_i1037 style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image006.gif"></v:imagedata></v:shape></span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">}</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: maroon; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br><v:shape id=Codehighlighter1_147_278_Open_Image style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1038"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image002.gif"></v:imagedata></v:shape><v:shape id=Codehighlighter1_147_278_Closed_Image style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1039"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image003.gif"></v:imagedata></v:shape></span><span lang=EN-US style="BORDER-RIGHT: gray 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: gray 1pt solid; DISPLAY: none; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; BACKGROUND: white; PADDING-BOTTOM: 0cm; BORDER-LEFT: gray 1pt solid; COLOR: #4b4b4b; LINE-HEIGHT: 160%; PADDING-TOP: 0cm; BORDER-BOTTOM: gray 1pt solid; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hide: all; mso-border-alt: solid gray .75pt">/**/</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: green; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">/*---body</span><span style="FONT-SIZE: 12pt; COLOR: green; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">我是作为最顶层容器的<span lang=EN-US>---</span>所以它具备了我需要的所有东西，实现的效果是居中，我加上了<span lang=EN-US>display:&nbsp;block;</span>虽然这个是一个默认属性，但是我们不能保证所有浏览器都是默认，（如果是所有浏览器都默认的，我自己写个浏览器的默认为<span lang=EN-US>none</span>的给你耍）<span lang=EN-US>*/</span></span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: maroon; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br><v:shape id=_x0000_i1040 style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/None.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image001.gif"></v:imagedata></v:shape>#body_Div<br><v:shape id=Codehighlighter1_290_391_Open_Image style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1041"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image002.gif"></v:imagedata></v:shape><v:shape id=Codehighlighter1_290_391_Closed_Image style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1042"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image003.gif"></v:imagedata></v:shape></span><span lang=EN-US style="BORDER-RIGHT: gray 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: gray 1pt solid; DISPLAY: none; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; BACKGROUND: white; PADDING-BOTTOM: 0cm; BORDER-LEFT: gray 1pt solid; COLOR: #4b4b4b; LINE-HEIGHT: 160%; PADDING-TOP: 0cm; BORDER-BOTTOM: gray 1pt solid; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hide: all; mso-border-alt: solid gray .75pt">{<v:shape id=_x0000_i1043 style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"> <v:imagedata o:href="http://www.cppblog.com/Images/dot.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image004.gif"></v:imagedata></v:shape>}</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">{</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br><v:shape id=_x0000_i1044 style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image005.gif"></v:imagedata></v:shape>&nbsp;&nbsp;&nbsp;&nbsp;margin</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">:</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;0px&nbsp;auto</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">;</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br><v:shape id=_x0000_i1045 style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image005.gif"></v:imagedata></v:shape>&nbsp;&nbsp;&nbsp;&nbsp;padding</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">:</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;0px</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">;</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br><v:shape id=_x0000_i1046 style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image005.gif"></v:imagedata></v:shape>&nbsp;&nbsp;&nbsp;&nbsp;text-align</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">:</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;left</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">;</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br><v:shape id=_x0000_i1047 style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image005.gif"></v:imagedata></v:shape>&nbsp;&nbsp;&nbsp;&nbsp;width</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">:</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;1003px</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">;</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br><v:shape id=_x0000_i1048 style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image005.gif"></v:imagedata></v:shape>&nbsp;&nbsp;&nbsp;&nbsp;height</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">:</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">100%</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">;</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br><v:shape id=_x0000_i1049 style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image005.gif"></v:imagedata></v:shape>&nbsp;&nbsp;&nbsp;&nbsp;overflow</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">:</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">auto</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">;</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br><v:shape id=_x0000_i1050 style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image006.gif"></v:imagedata></v:shape></span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">}</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: maroon; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br><v:shape id=Codehighlighter1_393_595_Open_Image style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1051"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image002.gif"></v:imagedata></v:shape><v:shape id=Codehighlighter1_393_595_Closed_Image style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1052"><v:imagedata o:href="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image003.gif"></v:imagedata></v:shape></span><span lang=EN-US style="BORDER-RIGHT: gray 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: gray 1pt solid; DISPLAY: none; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; BACKGROUND: white; PADDING-BOTTOM: 0cm; BORDER-LEFT: gray 1pt solid; COLOR: #4b4b4b; LINE-HEIGHT: 160%; PADDING-TOP: 0cm; BORDER-BOTTOM: gray 1pt solid; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hide: all; mso-border-alt: solid gray .75pt">/**/</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: green; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">/*</span><span style="FONT-SIZE: 12pt; COLOR: green; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">这个是核心层，多有的元素基本都是在这个层里的，这个层也具备了我想要的属性，<span lang=EN-US>text-align:&nbsp;left;&nbsp;</span>因为在上层我把文本对齐成为居中，所以这个层我要把它还原为左对齐<span lang=EN-US>margin:&nbsp;0px&nbsp;auto;&nbsp;</span>一般<span lang=EN-US>IE</span>的<span lang=EN-US>CSS</span>编写者不会有这个<span lang=EN-US>auto</span>值的，在<span lang=EN-US>IE</span>会自动，但是在<span lang=EN-US>FF</span>如果少了<span lang=EN-US>auto</span>你将会发现<span lang=EN-US>FF</span>里你的核心部分不是居中的。所以要做到通用，我们就必须要加上<span lang=EN-US>auto</span>值，<span lang=EN-US>IE</span>也支持<span lang=EN-US>auto</span>值<span lang=EN-US>*/</span></span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br></span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">第二：浮动对象，都拥有独立的父<span lang=EN-US>DIV</span>；关于这点。。有意见的人可能不少，持有的观点就是，<span lang=EN-US>&#8220;</span>你这样做只会令<span lang=EN-US>DIV</span>过分的多，过于复杂<span lang=EN-US>&#8221;</span>，其实，我也不想这样做，但是<span lang=EN-US>- -</span>！<span lang=EN-US>IE</span>对于浮动对象的<span lang=EN-US>{margin</span>，<span lang=EN-US>padding}</span>存在<span lang=EN-US>BUG</span>所以为了减少一切可能的出错，我唯有多花费一点代码，说实在的我只是想它更健康。这个父<span lang=EN-US>DIV</span>主要作用其实就是令到内部浮动对象更可控制，这个父<span lang=EN-US>DIV</span>就是一个单纯的容器<span lang=EN-US>DIV<br><br></span>第三：所有的浮动都需要闭合；这个有经验的人都知道。。用完浮动你肯定需要把它闭合掉的，不闭合，可能不同浏览器在解析的时候会把你的浮动变成向下默认，（可以这样解析：就是元素内部的子元素都默认具有浮动属性）<span lang=EN-US><br><br></span>第四：一个行向浮动如果超过<span lang=EN-US>3</span>个那么请使用<span lang=EN-US>UL</span>来实现浮动<span lang=EN-US><br><br></span>第五：灵活使用类选择，我个人的做法是，所有的<span lang=EN-US>id</span>选择器都是用于布局的，类选择器都是用于呈现效果的，这样做的好处就是，当你想要的效果出现问题的时候，更快速地找到错误。这个是我有意识的把<span lang=EN-US>&#8220;</span>架构<span lang=EN-US>&#8221;</span>和<span lang=EN-US>&#8220;</span>内容<span lang=EN-US>&#8221;</span>分离。</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial"><o:p></o:p></span></p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/85708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-05-25 15:29 <a href="http://www.cppblog.com/woaidongmao/archive/2009/05/25/85708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cmd 使用javac编译，如果改变了环境变量，需要cmd重开才可</title><link>http://www.cppblog.com/woaidongmao/archive/2009/05/24/85623.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Sun, 24 May 2009 09:53:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/05/24/85623.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/85623.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/05/24/85623.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/85623.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/85623.html</trackback:ping><description><![CDATA[<p>将 环境变量CLASSPATH，变更了一下，但是不重新开一个cmd窗口，运用javac编译的话，编译总是失败，重新开一个后编译，则成功</p> <p>.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\lib\servlet-api.jar;<br>.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;D:\apache-tomcat-6.0.18\lib\<font color="#ff0000">servlet-api.</font>jar</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/85623.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-05-24 17:53 <a href="http://www.cppblog.com/woaidongmao/archive/2009/05/24/85623.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP从小到大的应用方法</title><link>http://www.cppblog.com/woaidongmao/archive/2009/04/29/81468.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 29 Apr 2009 09:23:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/04/29/81468.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/81468.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/04/29/81468.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/81468.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/81468.html</trackback:ping><description><![CDATA[<p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/JSP_F466/image_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="480" alt="image" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/JSP_F466/image_thumb.png" width="841" border="0"></a></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/81468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-04-29 17:23 <a href="http://www.cppblog.com/woaidongmao/archive/2009/04/29/81468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat的reloadable设置</title><link>http://www.cppblog.com/woaidongmao/archive/2009/04/29/81450.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 29 Apr 2009 08:00:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/04/29/81450.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/81450.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/04/29/81450.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/81450.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/81450.html</trackback:ping><description><![CDATA[<p>&nbsp; <p><font size="4">修改文件：C:\jakarta-tomcat-5.0.28\conf\server.xml</font> <p><font size="4">插入位置：</font> <p><font size="4">&lt;Host name="localhost" debug="0" appBase="webapps"<br> unpackWARs="true" autoDeploy="true"<br> xmlValidation="false" xmlNamespaceAware="false"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">&lt;Context path="/myapp"&nbsp; docBase="C:/jakarta-tomcat-5.0.28/webapps/myapp"&nbsp; debug="0" reloadable="true"/&gt;</font></font> <p><font size="4"></font>&nbsp;</p> <p><font size="4">参考URL</font></p> <p><a title="http://hi.baidu.com/net_plz/blog/item/966ee6dc25f908a5cc116635.html" href="http://hi.baidu.com/net_plz/blog/item/966ee6dc25f908a5cc116635.html">http://hi.baidu.com/net_plz/blog/item/966ee6dc25f908a5cc116635.html</a></p> <p><a title="http://blog.163.com/jianhuren2005@126/blog/static/1715817120071015115620650/" href="http://blog.163.com/jianhuren2005@126/blog/static/1715817120071015115620650/">http://blog.163.com/jianhuren2005@126/blog/static/1715817120071015115620650/</a></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/81450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-04-29 16:00 <a href="http://www.cppblog.com/woaidongmao/archive/2009/04/29/81450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat+JSP经典配置实例</title><link>http://www.cppblog.com/woaidongmao/archive/2009/04/27/81224.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Mon, 27 Apr 2009 08:44:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/04/27/81224.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/81224.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/04/27/81224.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/81224.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/81224.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="LINE-HEIGHT: 150%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">　　经常看到<span lang=EN-US>jsp</span>的初学者问<span lang=EN-US>tomcat</span>下如何配置<span lang=EN-US>jsp</span>、<span lang=EN-US>servlet</span>和<span lang=EN-US>bean</span>的问题，于是总结了一下如何<span lang=EN-US>tomcat</span>下配置<span lang=EN-US>jsp</span>、<span lang=EN-US>servlet</span>和<span lang=EN-US>ben</span>，希望对那些初学者有所帮助。<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<strong>一、开发环境配置</strong><span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　第一步：<span lang=EN-US><a href="http://download.chinaitlab.com/" target=_blank><span lang=EN-US><span lang=EN-US>下载</span></span></a>j2sdk</span>和<span lang=EN-US>tomcat</span>：到<span lang=EN-US>sun</span>官方站（<span lang=EN-US>http://java.sun.com/j2se/<st1:chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on">1.5.0</st1:chsdate>/download.jsp</span>）<span lang=EN-US><a href="http://download.chinaitlab.com/" target=_blank><span lang=EN-US><span lang=EN-US>下载</span></span></a>j2sdk</span>，注意<span lang=EN-US><a href="http://download.chinaitlab.com/" target=_blank><span lang=EN-US><span lang=EN-US>下载</span></span></a></span>版本为<span lang=EN-US><a href="http://windows.chinaitlab.com/" target=_blank>Windows</a> Offline Installation</span>的<span lang=EN-US>SDK</span>，同时最好下载<span lang=EN-US>J2SE 1.5.0 Documentation</span>，然后到<span lang=EN-US>tomcat</span>官方站点（<span lang=EN-US>http://jakarta.apache.org/site/downloads/downloads_tomcat-5.cgi</span>）下载<span lang=EN-US>tomcat</span>（下载最新<span lang=EN-US>5.5.9</span>版本的<span lang=EN-US>tomcat</span>）；<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　第二步：安装和配置你的<span lang=EN-US>j2sdk</span>和<span lang=EN-US>tomcat</span>：执行<span lang=EN-US>j2sdk</span>和<span lang=EN-US>tomcat</span>的安装程序，然后按默认设置进行安装即可。<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>1.</span>安装<span lang=EN-US>j2sdk</span>以后，需要配置一下环境变量，在我的电脑<span lang=EN-US>-&gt;</span>属性<span lang=EN-US>-&gt;</span>高级<span lang=EN-US>-&gt;</span>环境变量<span lang=EN-US>-&gt;</span>系统变量中添加以下环境变量<span lang=EN-US>(</span>假定你的<span lang=EN-US>j2sdk</span>安装在<span lang=EN-US>c:\j2sdk1.5.0</span>）：<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>JAVA_HOME=c:\j2sdk1.5.0<br></span>　　<span lang=EN-US>classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;</span>（<span lang=EN-US>.;</span>一定不能少，因为它代表当前路径<span lang=EN-US>)<br></span>　　<span lang=EN-US>path=%JAVA_HOME%\bin<br></span>　　<span lang=EN-US><br></span>　　接着可以写一个简单的<span lang=EN-US>java</span>程序来<span lang=EN-US><a href="http://softtest.chinaitlab.com/" target=_blank><span lang=EN-US><span lang=EN-US>测试</span></span></a>J2SDK</span>是否已安装成功：<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>public class Test{<br></span>　　<span lang=EN-US>public static void main(String args[]){<br></span>　　<span lang=EN-US>System.out.println("This is a test program.");<br></span>　　<span lang=EN-US>}<br></span>　　<span lang=EN-US>}<br></span>　　<span lang=EN-US><br></span>　　将上面的这段程序保存为文件名为<span lang=EN-US>Test.java</span>的文件。<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　然后打开命令提示符窗口，<span lang=EN-US>cd</span>到你的<span lang=EN-US>Test.java</span>所在目录，然后键入下面的命令<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>javac Test.java<br></span>　　<span lang=EN-US>java Test<br></span>　　<span lang=EN-US><br></span>　　此时如果看到打印出来<span lang=EN-US>This is a test program.</span>的话说明安装成功了，如果没有打印出这句话，你需要仔细检查一下你的配置情况。<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>2.</span>安装<span lang=EN-US>Tomcat</span>后，在我的电脑<span lang=EN-US>-&gt;</span>属性<span lang=EN-US>-&gt;</span>高级<span lang=EN-US>-&gt;</span>环境变量<span lang=EN-US>-&gt;</span>系统变量中添加以下环境变量<span lang=EN-US>(</span>假定你的<span lang=EN-US>tomcat</span>安装在<span lang=EN-US>c:\tomcat)</span>：<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>CATALINA_HOME=c:\tomcat<br></span>　　<span lang=EN-US>CATALINA_BASE=c:\tomcat<br></span>　　<span lang=EN-US><br></span>　　然后修改环境变量中的<span lang=EN-US>classpath</span>，把<span lang=EN-US>tomat</span>安装目录下的<span lang=EN-US>common\lib</span>下的<span lang=EN-US>(</span>可以根据实际追加<span lang=EN-US>)servlet.jar</span>追加到<span lang=EN-US>classpath</span>中去，修改后的<span lang=EN-US>classpath</span>如下：<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\lib\<span style="COLOR: red">servlet-api.jar</span>;<br></span>　　<span lang=EN-US><br></span>　　接着可以启动<span lang=EN-US>tomcat</span>，在<span lang=EN-US>IE</span>中访问<span lang=EN-US>http://localhost:8080</span>，如果看到<span lang=EN-US>tomcat</span>的欢迎页面的话说明安装成功了。<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　第三步：建立自己的<span lang=EN-US>jsp app</span>目录<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>1.</span>到<span lang=EN-US>Tomcat</span>的安装目录的<span lang=EN-US>webapps</span>目录，可以看到<span lang=EN-US>ROOT</span>，<span lang=EN-US>examples, tomcat-docs</span>之类<span lang=EN-US>Tomcat</span>自带的的目录；<span lang=EN-US><br></span>　　<span lang=EN-US>2.</span>在<span lang=EN-US>webapps</span>目录下新建一个目录，起名叫<span lang=EN-US>myapp</span>；<span lang=EN-US><br></span>　　<span lang=EN-US>3.myapp</span>下新建一个目录<span lang=EN-US>WEB-INF</span>，注意，目录名称是区分大小写的；<span lang=EN-US><br></span>　　<span lang=EN-US>4.WEB-INF</span>下新建一个文件<span lang=EN-US>web.xml</span>，内容如下：<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br></span>　　<span lang=EN-US>&lt;!DOCTYPE web-app<br></span>　　<span lang=EN-US>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br></span>　　<span lang=EN-US>"http://java.sun.com/dtd/web-app_2_3.dtd"&gt;<br></span>　　<span lang=EN-US>&lt;web-app&gt;<br></span>　　<span lang=EN-US>&lt;display-name&gt;My Web Application&lt;/display-name&gt;<br></span>　　<span lang=EN-US>&lt;description&gt;<br></span>　　<span lang=EN-US>A application for test.<br></span>　　<span lang=EN-US>&lt;/description&gt;<br></span>　　<span lang=EN-US>&lt;/web-app&gt;<br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>5.</span>在<span lang=EN-US>myapp</span>下新建一个<span lang=EN-US><a href="http://softtest.chinaitlab.com/" target=_blank><span lang=EN-US><span lang=EN-US>测试</span></span></a></span>的<span lang=EN-US>jsp</span>页面，文件名为<span lang=EN-US>index.jsp</span>，文件内容如下：<span lang=EN-US><br></span>　　<span lang=EN-US>&lt;html&gt;&lt;body&gt;&lt;center&gt;<br></span>　　<span lang=EN-US>Now time is: &lt;%=new java.util.Date()%&gt;<br></span>　　<span lang=EN-US>&lt;/center&gt;&lt;/body&gt;&lt;/html&gt;<br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>6.</span>重启<span lang=EN-US>Tomcat<br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>7.</span>打开浏览器，输入<span lang=EN-US>http://localhost:8080/myapp/index.jsp </span>看到当前时间的话说明就成功了。<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　第四步：建立自己的<span lang=EN-US>Servlet</span>：<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>1.</span>用你最熟悉的编辑器（建议使用有语法检查的<span lang=EN-US>java ide</span>）新建一个<span lang=EN-US>servlet</span>程序，文件名为<span lang=EN-US>Test.java</span>，文件内容如下：<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>package test;<br></span>　　<span lang=EN-US>import java.io.IOException;<br></span>　　<span lang=EN-US>import java.io.PrintWriter;<br></span>　　<span lang=EN-US>import javax.servlet.ServletException;<br></span>　　<span lang=EN-US>import javax.servlet.http.HttpServlet;<br></span>　　<span lang=EN-US>import javax.servlet.http.HttpServletRequest;<br></span>　　<span lang=EN-US>import javax.servlet.http.HttpServletResponse;<br></span>　　<span lang=EN-US>public class Test extends HttpServlet {<br></span>　　<span lang=EN-US>protected void doGet(HttpServletRequest request, HttpServletResponse response)<br></span>　　<span lang=EN-US>throws ServletException, IOException {<br></span>　　<span lang=EN-US>PrintWriter out=response.getWriter();<br></span>　　<span lang=EN-US>out.println("&lt;html&gt;&lt;body&gt;&lt;h1&gt;This is a servlet test.&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;");<br></span>　　<span lang=EN-US>out.flush();<br></span>　　<span lang=EN-US>}<br></span>　　<span lang=EN-US>}<br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>2 .</span>编译<span lang=EN-US><br></span>　　将<span lang=EN-US>Test.java</span>放在<span lang=EN-US>c:\test</span>下，使用如下命令编译：<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>C:\Test&gt;javac Test.java<br></span>　　<span lang=EN-US><br></span>　　然后在<span lang=EN-US>c:\Test</span>下会产生一个编译后的<span lang=EN-US>servlet</span>文件：<span lang=EN-US>Test.class<br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>3 .</span>将结构<span lang=EN-US>test\Test.class</span>剪切到<span lang=EN-US>%CATALINA_HOME%\webapps\myapp\WEB-INF\classes</span>下，也就是剪切那个<span lang=EN-US>test</span>目录到<span lang=EN-US>classes</span>目录下，如果<span lang=EN-US>classes</span>目录不存在，就新建一个。现在<span lang=EN-US>webapps\myapp\WEB-INF\classes</span>下有<span lang=EN-US>test\Test.class</span>的文件目录结构<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>4 .</span>修改<span lang=EN-US>webapps\myapp\WEB-INF\web.xml</span>，添加<span lang=EN-US>servlet</span>和<span lang=EN-US>servlet-mapping<br></span>　　<span lang=EN-US><br></span>　　编辑后的<span lang=EN-US>web.xml</span>如下所示，红色为添加的内容<span lang=EN-US>:<br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br></span>　　<span lang=EN-US>&lt;!DOCTYPE web-app<br></span>　　<span lang=EN-US>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br></span>　　<span lang=EN-US>"http://java.sun.com/dtd/web-app_2_3.dtd"&gt;<br></span>　　<span lang=EN-US>&lt;web-app&gt;<br></span>　　<span lang=EN-US>&lt;display-name&gt;My Web Application&lt;/display-name&gt;<br></span>　　<span lang=EN-US>&lt;description&gt;<br></span>　　<span lang=EN-US>A application for test.<br></span>　　<span lang=EN-US>&lt;/description&gt;<br></span>　　<span lang=EN-US>&lt;servlet&gt;<br></span>　　<span lang=EN-US>&lt;servlet-name&gt;Test&lt;/servlet-name&gt;<br></span>　　<span lang=EN-US>&lt;display-name&gt;Test&lt;/display-name&gt;<br></span>　　<span lang=EN-US>&lt;description&gt;A test Servlet&lt;/description&gt;<br></span>　　<span lang=EN-US>&lt;servlet-class&gt;test.Test&lt;/servlet-class&gt;<br></span>　　<span lang=EN-US>&lt;/servlet&gt;<br></span>　　<span lang=EN-US>&lt;servlet-mapping&gt;<br></span>　　<span lang=EN-US>&lt;servlet-name&gt;Test&lt;/servlet-name&gt;<br></span>　　<span lang=EN-US>&lt;url-pattern&gt;/Test&lt;/url-pattern&gt;<br></span>　　<span lang=EN-US>&lt;/servlet-mapping&gt;<br></span>　　<span lang=EN-US>&lt;/web-app&gt;<br></span>　　<span lang=EN-US><br></span>　　这段话中的<span lang=EN-US>servlet</span>这一段声明了你要调用的<span lang=EN-US>Servlet</span>，而<span lang=EN-US>servlet-mapping</span>则是将声明的<span lang=EN-US>servlet"</span>映射<span lang=EN-US>"</span>到地址<span lang=EN-US>/Test</span>上<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>5 .</span>好了，重启动<span lang=EN-US>Tomcat</span>，启动浏览器，输入<span lang=EN-US>http://localhost:8080/myapp/Test </span>如果看到输出<span lang=EN-US>This is a servlet test.</span>就说明编写的<span lang=EN-US>servlet</span>成功了。<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　注意：修改了<span lang=EN-US>web.xml</span>以及新加了<span lang=EN-US>class</span>，都要重启<span lang=EN-US>Tomcat<br></span>　　<span lang=EN-US><br></span>　　第四步：建立自己的<span lang=EN-US>Bean</span>：<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>1.</span>用你最熟悉的编辑器（建议使用有语法检查的<span lang=EN-US>java ide</span>）新建一个<span lang=EN-US>java</span>程序，文件名为<span lang=EN-US>TestBean.java</span>，文件内容如下：<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>package test;<br></span>　　<span lang=EN-US>public class TestBean{<br></span>　　<span lang=EN-US>private String name = null;<br></span>　　<span lang=EN-US>public TestBean(String strName_p){<br></span>　　<span lang=EN-US>this.name=strName_p;<br></span>　　<span lang=EN-US>}<br></span>　　<span lang=EN-US>public void setName(String strName_p){<br></span>　　<span lang=EN-US>this.name=strName_p;<br></span>　　<span lang=EN-US>}<br></span>　　<span lang=EN-US>public String getName(){<br></span>　　<span lang=EN-US>return this.name;<br></span>　　<span lang=EN-US>}<br></span>　　<span lang=EN-US>}<br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>2 .</span>编译<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　将<span lang=EN-US>TestBean.java</span>放在<span lang=EN-US>c:\test</span>下，使用如下命令编译：<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>C:\Test&gt;javac TestBean.java<br></span>　　<span lang=EN-US><br></span>　　然后在<span lang=EN-US>c:\Test</span>下会产生一个编译后的<span lang=EN-US>bean</span>文件：<span lang=EN-US>TestBean.class<br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>3 .</span>将<span lang=EN-US>TestBean.class</span>文件剪切到<span lang=EN-US> %CATALINA_HOME%\webapps\myapp\WEB-INF\classes\test</span>下，<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>4 .</span>新建一个<span lang=EN-US>TestBean.jsp</span>文件，文件内容为：<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>&lt;%@ page import="test.TestBean" %&gt;<br></span>　　<span lang=EN-US>&lt;html&gt;&lt;body&gt;&lt;center&gt;<br></span>　　<span lang=EN-US>&lt;%<br></span>　　<span lang=EN-US>TestBean testBean=new TestBean("This is a test java bean.");<br></span>　　<span lang=EN-US>%&gt;<br></span>　　<span lang=EN-US><a href="http://java.chinaitlab.com/" target=_blank>Java</a> bean name is: &lt;%=testBean.getName()%&gt;<br></span>　　<span lang=EN-US>&lt;/center&gt;&lt;/body&gt;&lt;/html&gt;<br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>5 .</span>好了，重启<span lang=EN-US>Tomcat</span>，启动浏览器，输入<span lang=EN-US>http://localhost:8080/myapp/TestBean.jsp </span>如果看到输出<span lang=EN-US><a href="http://java.chinaitlab.com/" target=_blank>Java</a> bean name is: This is a test java bean.</span>就说明编写的<span lang=EN-US>Bean</span>成功了。<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　这样就完成了整个<span lang=EN-US>Tomcat</span>下的<span lang=EN-US>jsp</span>、<span lang=EN-US>servlet</span>和<span lang=EN-US>javabean</span>的配置。接下来需要做的事情就是多看书、多读别人的好代码，自己多动手写代码以增强自己在这方面开发的能力了。<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<span lang=EN-US>jvm</span>应填写到<span lang=EN-US><br></span>　　<span lang=EN-US>c:\j2sdk\bin<br></span>　　<span lang=EN-US><br></span>　　给你一个简单的配置：：：：<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　<strong><span lang=EN-US>JSP</span>环境配置心得</strong><span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　首先要说的是，使用<span lang=EN-US>jdk+tomcat</span>完全可以配置我们的<span lang=EN-US>jsp<a href="http://server.chinaitlab.com/" target=_blank><span lang=EN-US><span lang=EN-US>服务器</span></span></a></span>，不再需要其实任何东东，有很多文章介绍了<span lang=EN-US>Apache</span>，其实根本用不着，一般的学习调试<span lang=EN-US>tomcat</span>完全可以胜任了。<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　安装<span lang=EN-US>jdk</span>后，<span lang=EN-US>tomcat</span>在安装之前会自动找到<span lang=EN-US>jdk</span>的安装路径，一路点击<span lang=EN-US>"</span>下一步<span lang=EN-US>"</span>，经过一段时间的文件复制，最后<span lang=EN-US>"close"</span>，完成<span lang=EN-US>comcat</span>的安装。<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　您最好去下载一个版本较高的<span lang=EN-US>tomcat</span>，比如<span lang=EN-US>4.1</span>以上的，因为它不需要设置太多的系统变量，右击<span lang=EN-US>"</span>我的电脑<span lang=EN-US>"</span>，选择<span lang=EN-US>"</span>属性<span lang=EN-US>"-&gt;"</span>高级<span lang=EN-US>"-&gt;"</span>环境变量<span lang=EN-US>"-&gt;"</span>系统变量<span lang=EN-US>"</span>，新建一个<span lang=EN-US>TOMCAT_HOME</span>，值设置成你的<span lang=EN-US>tomcat</span>所在的路径，比如：<span lang=EN-US>D:\Program Files\Apache Group\Tomcat 5.5</span>，配置完成。<span lang=EN-US><br></span>　　<span lang=EN-US><br></span>　　从开始菜单中找到<span lang=EN-US>tomcat</span>选项，一般打开顺序是：开始<span lang=EN-US>-&gt;</span>程序<span lang=EN-US>-&gt;Apache Tomcat 5.5</span>，选择<span lang=EN-US>"Start Tomcat"</span>，让<span lang=EN-US>jsp<a href="http://server.chinaitlab.com/" target=_blank><span lang=EN-US><span lang=EN-US>服务器</span></span></a></span>开始运行，此时会打开一个类似<span lang=EN-US>Dos</span>的窗口，会显示一些相关的信息。<span lang=EN-US>&lt;</span></span><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><o:p></o:p></span></p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/81224.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-04-27 16:44 <a href="http://www.cppblog.com/woaidongmao/archive/2009/04/27/81224.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>40 个轻量级 JavaScript 库</title><link>http://www.cppblog.com/woaidongmao/archive/2009/03/06/75790.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 06 Mar 2009 15:36:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/03/06/75790.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/75790.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/03/06/75790.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/75790.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/75790.html</trackback:ping><description><![CDATA[<p><a title="http://www.comsharp.com/GetKnowledge/zh-CN/TeamBlogTimothyPage_K741.aspx" href="http://www.comsharp.com/GetKnowledge/zh-CN/TeamBlogTimothyPage_K741.aspx">http://www.comsharp.com/GetKnowledge/zh-CN/TeamBlogTimothyPage_K741.aspx</a></p> <p>流行的 JavaScript 库不胜枚举，jQuery, MooTools, Prototype, Dojo, YUI。这些 JavaScript 库功能丰富，加上它们的插件，几乎能胜任任何工作，然而这是有代价的，这些库往往导致你的网页尺寸臃肿。在某些场合，如果你只想完成特定的工作，可以使用一些功能更专一的轻量库，本文介绍了40个非常出色的轻量级 JavaScript 库。 <p>这是本文的第一部分，第二部分请参阅<a href="http://www.comsharp.com/GetKnowledge/zh-CN/TeamBlogTimothyPage_K742.aspx">40 个轻量级 JavaScript 库（下）</a>。 <h4>1. 表单相关</h4> <p><a href="http://www.formassembly.com/wForms/"><strong>wForms</strong></a><br>一个低调的开源项目，简化了绝大多数常用 JavaScript 表单功能，包含可以直接使用的表单验证功能，另外，还包含强大的表单同步以及表单条件判断功能。 <p><a href="http://www.formassembly.com/wForms/"><img height="116" alt="wForms" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-05/wforms.gif" width="480" border="0"></a> <p><a href="http://www.drlongghost.com/validanguage.php"><strong>Validanguage</strong></a><br>又一个低调的 JavaScript 表单验证框架。它拥有集成逻辑，一些设置可以针对全局，单个表单或单个对象。提供两个API，集成 AJAX 支持，缓存，以及回调函数。它提供类似 HTML 的 API 语句，以及面向对象的 JavaScript API 。 <p><a href="http://www.drlongghost.com/validanguage.php"><img height="116" alt="Validanguage" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-05/validanguage.gif" width="480" border="0"></a> <p><a href="http://www.livevalidation.com/"><strong>LiveValidation</strong></a><br>一个轻量的表单验证库。除了传统的验证功能，还提供实时验证，可以一边输入一遍验证。<strong>Ruby on Rails</strong> 用户可能会发现这个库非常好用，因为他们的命名规则和参数十分近似。该库既有独立版本，又有一个 Prototype 版本。 <p><a href="http://www.livevalidation.com/"><img height="116" alt="LiveValidation" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-05/live-validation.gif" width="480"></a> <p><a href="http://yav.sourceforge.net/en/index.html"><strong>yav</strong></a><br>一个强大，灵活，可扩展的表单验证库。支持各种场合，从简单的如日期，电子邮件地址以及整数的验证，到复杂的，如正则表达式。内置 AJAX 支持，输出的错误消息可以定位到对象级。 <p><a href="http://www.pengoworks.com/index.cfm?action=get:qforms"><strong>qForms</strong></a><br>处理表单的整套方案。功能包括各种验证规则，防止多次发布的机制，以及锁定或解锁制定输入框。 <p><a href="http://code.google.com/p/formreform/"><strong>formreform</strong></a><br>不基于 table 的多栏设计向来是一个挑战。这个微型库将传统的表单变成漂亮的多栏形式。<a href="http://code.google.com/p/formreform/"><img height="116" alt="formreform" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-05/formreform.gif" width="480" border="0"></a> <h4>2. 动画相关</h4> <p><a href="http://fx.inetcat.com/"><strong>$fx()</strong></a><br>一个用来让 HTML 对象运动的轻量库。你可以在一个时间轴上改变任何 CSS 属性，对于复杂动画，你可以将各种效果结合起来，将对象分组，让它们并行运动。 <p><a href="http://fx.inetcat.com/"><img height="116" alt="$fx() JavaScript Animation Library" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-05/fx-javascript-animations.jpg" width="480" border="0"></a> <p><a href="http://coderepos.org/share/wiki/JSTweener"><strong>JSTweener</strong></a><br>一个生成中间帧的 JavaScript 库，它的 API 类似著名的中间帧引擎 <a href="http://code.google.com/p/tweener/">Tweener</a>。你可以指定动画时间，定义切换效果以及时延。在几乎任何点都可以触动事件。 <p><a href="http://coderepos.org/share/wiki/JSTweener"><img alt="JSTweener" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-05/jstweener.gif" border="0"></a> <p><a href="http://developers.facebook.com/animation/"><strong>Facebook Animation</strong></a><br>一个强大的，用来创建可定制的，基于 CSS 的动画。在 Facebook 动画中，几行代码就可以改善 UI。语法和 FBJS （用于 Facebook 的库）一样。 <p><a href="http://ryanmorr.com/archives/fx-lightweight-and-standalone"><strong>FX</strong></a><br>一个语法类似 YUI 的轻量 JavaScript 库，可以为几乎任何 CSS 属性创建中间帧。支持颜色和滚动动画，为对象设置 to 和 from 值就可以了。 <h4>3. 视觉与图形效果</h4> <p><a href="http://www.jscharts.com/"><strong>JS charts</strong></a><br>支持柱状图，圆饼图以及简单的曲线图。直接将这个库插入网页，然后从 XML 文件或 JavaScript 数组变量调用数据。PNG 格式，兼容所有主要浏览器。 <p><a href="http://www.jscharts.com/"><img height="116" alt="JS Charts" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-05/js-charts.jpg" width="480" border="0"></a> <p><a href="http://www.c3dl.org/"><strong>Canvas 3D JS Library (C3DL)</strong></a><br><strong>C3DL</strong> 使 3D 程序的编写变得简单。提供一套数学，场景与 3D 对象类，可以直接在浏览器中开发 3D 内容，不需要很深的 3D 知识。 <p><a href="http://www.c3dl.org/"><img height="116" alt="C3DL" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-05/c3dl.jpg" width="480" border="0"></a> <p><a href="http://ejohn.org/blog/processingjs/"><strong>Processing.js</strong></a><br>这是 <a href="http://processing.org/">Processing 语言</a>在 JavaScript 的移植。2D输出功能丰富。提供了绘图，色彩处理，字体，对象等处理函数。 <p><a href="http://ejohn.org/blog/processingjs/"><img height="116" alt="Processing.js" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-05/processing-js.gif" width="480" border="0"></a> <p><a href="http://raphaeljs.com/"><strong>Rapha?l</strong></a><br>一个让人惊叹的 JavaScript 库，可以在 Web 上实现矢量图。使用 SVG, VML 创建的图形可以被更改或绑定事件。功能极其丰富，包括旋转，动画，缩放等。 <p><a href="http://raphaeljs.com/"><img height="116" alt="Raphael: Vectors With JavaScript" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-05/raphael-js.jpg" width="480" border="0"></a> <p><a href="http://www.nihilogic.dk/labs/imagefx/"><strong>ImageFX</strong></a><br>该 JavaScript 库为图片添加效果，如虚化，锐化，浮雕，加亮等。ImageFX 使用画布对象实现这些效果，兼容所有主流浏览器。这个库非常容易使用，只要将 .js 库文件插入网页，调用那些函数即可。 <p><a href="http://www.nihilogic.dk/labs/imagefx/"><img height="116" alt="Imagefx" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-05/imagefx.jpg" width="480" border="0"></a> <p><a href="http://www.pixastic.com/"><strong>Pixastic</strong></a><br><strong>Pixastic</strong> 使用 HTML5 画布对象，允许对原始像素进行操作。效果包括去饱和度，灰度级，反转，亮度，对比度调整，色调，饱和度调整，以及浮雕，虚化等效果。因为用到了 HTML 5 的画布对象，因此还无法兼容所有浏览器。 <p><a href="http://cow.neondragon.net/stuff/reflection/"><strong>Reflection.js</strong></a><br>一个很低调的 JavaScript 自动实现倒影效果。倒影的高度，透明度可以调整。支持所有主流浏览器，文件尺寸小于5K。 <p><a href="http://cow.neondragon.net/stuff/reflection/"><img height="116" alt="Reflection.js" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-05/reflection-js.jpg" width="480" border="0"></a> <h4>4. 数据库</h4> <p><a href="http://taffydb.com/"><strong>Taffy DB</strong></a><br>一个 JavaScript 库，可以看作浏览器中的 SQL Server，或高级数组管理器。在使用了 AJAX 的程序中，可以用作数据库层，可以创建，读取，编辑，删除数据，使用循环，排序以及高级查询。 <p><a href="http://www.activerecordjs.org/"><strong>ActiveRecord.js</strong></a><br>这个库支持 Google Gears 以及 Chrome，Aptana Jaxer, Adobe AIR 以及任何支持 HTML 5 SQL 细则的平台（目前有 Webkit 以及 iPhone）。可以自动创建表，验证和同步数据。 <p><img height="116" alt="ActiveRecord.js" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-05/activerecord-js.gif" width="480"> <p>&nbsp;</p> <p>&nbsp;</p> <p><a title="http://www.comsharp.com/GetKnowledge/zh-CN/TeamBlogTimothyPage_K742.aspx" href="http://www.comsharp.com/GetKnowledge/zh-CN/TeamBlogTimothyPage_K742.aspx">http://www.comsharp.com/GetKnowledge/zh-CN/TeamBlogTimothyPage_K742.aspx</a></p> <p>流行的 JavaScript 库不胜枚举，jQuery, MooTools, Prototype, Dojo, YUI。这些 JavaScript 库功能丰富，加上它们的插件，几乎能胜任任何工作，然而这是有代价的，这些库往往导致你的网页尺寸臃肿。在某些场合，如果你只想完成特定的工作，可以使用一些功能更专一的轻量库，本文介绍了40个非常出色的轻量级 JavaScript 库。 <p>这是本文的第二部分，第一部分参见<a href="http://www.comsharp.com/GetKnowledge/zh-CN/TeamBlogTimothyPage_K741.aspx">40 个轻量级 JavaScript 库 （上）</a>。 <h4>5. 字符串与数学函数</h4> <p><a href="http://www.datejs.com/"><strong>Date.js</strong></a><br>和日期打交道不是件容易事，有很多格式要处理。<strong>Datejs</strong> 可以很好地处理简单或复杂的日期函数。可以将日期解析出诸如“Next thursday”，“+2 years”一类的格式，也支持所有日期形式，如 2009.01.08, 12/6/2001。 <p><a href="http://www.datejs.com/"><img height="116" alt="Datejs" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-06/datejs.jpg" width="480" border="0"></a> <p><a href="http://sylvester.jcoglan.com/"><strong>Sylvester</strong></a><br>一个处理矢量和点阵的数学 JavaScript 库，包含多维矢量和点阵建模类，以及在3D空间的一些模型。 <p><a href="http://sylvester.jcoglan.com/"><img height="116" alt="Sylvester" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-06/sylvester.gif" width="480" border="0"></a> <p><a href="http://ejohn.org/projects/javascript-pretty-date/"><strong>Pretty Date</strong> </a><br>一个很出色的 JavaScript 库，用一种很漂亮，很友好的方式显示日期，如下图所示。 <p><a href="http://ejohn.org/projects/javascript-pretty-date/"><img height="116" alt="Pretty Date" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-06/pretty-date.gif" width="480"></a> <p><a href="http://stevenlevithan.com/regex/xregexp/"><strong>XRegExp</strong></a><br>JavaScript 中的 RegExp 对象已经支持正则表达式，<strong>XRegExp</strong> 增加了更多未来浏览器可能包含的功能（ECMAScript 4 - ES4）。该库对 RegExp 对象进行缓存，重用并增加了众多新功能。 <p><a href="http://www.fliquidstudios.com/projects/javascript-url-library/"><strong>JavaScript URL Library</strong></a><br>一个用来处理 URL 的 JavaScript 库，可以对 URL 中的任意部分进行处理。 <h4>6. Fonts</h4> <p><a href="http://typeface.neocracy.org/"><strong>typeface.js</strong></a><br>这个库可以让你在网页中使用任意字体，但和 <a href="http://www.mikeindustries.com/blog/sifr/">sIFR</a> 以及 <a href="http://facelift.mawhorter.net/">FLIR</a> 这些基于 Flash 的方案不一样，<strong>typeface.js</strong> 100% 基于 JavaScript，只需将你的字体文件上传到一个<a href="http://typeface.neocracy.org/fonts.html">基于 Web 的生成器</a>那里，再将生成的 JavaScript 文件下载回来包含到网页中即可。 <p><a href="http://typeface.neocracy.org/"><img height="116" alt="Typeface.js" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-06/typeface-js.gif" width="480" border="0"></a> <p><a href="http://cufon.shoqolate.com/generate/"><strong>Cufón</strong></a><br>和 typeface.js 很相像，<strong>Cufón</strong> 也可以让你在网页中使用任意字体，同样，它也是使用一个生成器，将字体转换成 VML，将生成的 .js 文件包含到网页即可。 <h4>7. 调试与记录</h4> <p><a href="http://www.gscottolson.com/blackbirdjs/"><strong>Blackbird</strong></a><br>人们经常使用 Alert() 调试 JavaScript 程序，<strong>Blackbird</strong> 提供了一个漂亮的控制台记录，查看，过滤程序的运行。 <p><a href="http://www.gscottolson.com/blackbirdjs/"><img height="116" alt="Blackbird" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-06/blackbird.jpg" width="288" border="0"></a> <p><a href="http://www.nitobibug.com/"><strong>NitobiBug</strong></a><br>基于浏览器的跨浏览器 javaScript 对象记录与检查工具。 <p><a href="http://www.nitobibug.com/"><img height="116" alt="NitobiBug" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-06/nitobibug.jpg" width="480" border="0"></a> <p><a href="http://getfirebug.com/lite.html"><strong>Firebug Lite</strong></a><br>目前最好的 JavaScript 调试工具非 <strong>Firebug</strong> 莫属，然而该工具只支持 FireFox，将 <strong>Firebug Lite</strong> .js 文件插入你的网页，就可以在所有浏览器都实现 FireBug 功能。 <p><a href="http://getfirebug.com/lite.html"><img height="116" alt="Firebug Lite" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-06/firebug-lite.jpg" width="480" border="0"></a> <h4>8. 其它</h4> <p><a href="http://code.google.com/p/swfobject/"><strong>swfobject</strong></a><a href="http://www.danvk.org/wp/dragtable/"></a><br>这是一个最受欢迎的对 Flash 对象进行引用的方法。可以生成标准 swf 引用代码，并探测用户播放器版本。如果用户版本不支持，会显示备用内容。 <p><a href="http://code.google.com/p/swfobject/"><img height="116" alt="swfobject" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-06/swjobject.jpg" width="480" border="0"></a> <p><a href="http://www.kryogenix.org/code/browser/sorttable/"><strong>sorttable</strong></a><strong> 与 </strong><a href="http://www.danvk.org/wp/dragtable/"><strong>dragtable</strong></a><br>不管你喜欢与否，table 仍然是最好的表现数据的方式，但可以更好地利用。<strong>sorttable</strong> 可以让表格数据排序，只需在 table 上加一个 class="sortable" 标志，还可以排除指定的栏。<strong>dragtable</strong> 让表格的栏可以拖动，在表格上加上 class="dragable" 标志即可，这两个类可以结合起来使用，只需加上 class="sortable dragtable" 即可。 <p><a href="http://dillerdesign.com/experiment/DD_roundies/"><strong>DD_roundies</strong></a><strong> 与 </strong><a href="http://www.dillerdesign.com/experiment/DD_belatedPNG/"><strong>DD_belatedPNG</strong></a><br><strong>DD_roundies</strong> 可以不依赖图片实现圆角功能，只面向 IE， 通过 VML 实现，其它浏览器会被略过，因为那些浏览器本身支持 CSS 圆角。 <p><a href="http://dillerdesign.com/experiment/DD_roundies/"><img height="116" alt="JavaScript Rounded Corners" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-06/javascript-round-corners.jpg" width="480" border="0"></a> <p><strong>DD_belatedPNG</strong> 是为了解决 IE6 对 PNG 支持不好问题而开发的，不管 PNG 图片用于 src 还是 background-image，<strong>DD_belatedPNG</strong> 都能提供修补。 <p><a href="http://www.leigeber.com/2008/04/custom-javascript-dialog-boxes/"><strong>Custom JavaScript Dialog Boxes</strong></a><br>一个只有 4.5K 的轻量 JavaScript 库，可以创建用户定制对话框，可显示4种类型的消息框，alerts, warnings, prompts, success。可以设定消息框标题，内容，以及过多长时间显示。 <p><a href="http://www.leigeber.com/2008/04/custom-javascript-dialog-boxes/"><img height="116" alt="Custom Dialog Boxes" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-06/custom-dialog-boxes.jpg" width="480" border="0"></a> <p><a href="http://www.tommysmind.com/gamejs/"><strong>GameJS</strong></a><br><strong>GameJS</strong> 是微软的 <a href="http://www.xna.com/">XNA 游戏框架</a>在 JavaScript 上的移植，使用 canvas 对象作为输出设备。JavaScript 不是最佳游戏平台，但对那些帧率较低的游戏也没有问题。 <p><a href="http://www.tommysmind.com/gamejs/"><img height="116" alt="GameJS" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-06/gamejs.jpg" width="480" border="0"></a> <p><a href="http://www.openjs.com/scripts/events/keyboard_shortcuts/"><strong>Shortcuts.js</strong></a><br>从 Google Reader 和 Gmail 开始，Web 程序中的快捷键开始流行起来。<strong>Shorcuts.js</strong> 让快捷键的处理变得简单。 <p><a href="http://mapstraction.com/"><strong>Mapstraction</strong></a><br>有不少地图提供商都提供不同 API，如果你要更换提供商，比如从 Google Maps 到 MapQuest，需要更新代码，<strong>Mapstraction</strong> 提供了常用地图提供商的 API，只需该一行代码就能完成转换。 <p><a href="http://mapstraction.com/"><img height="116" alt="Mapstraction" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-06/mapstraction.jpg" width="480" border="0"></a> <p><a href="http://amberjack.org/"><strong>Amberjack</strong></a><br>一个只有 4K 的微型 JavaScript 库，可以为你的网站添加漂亮的教程功能，一个模式窗口会以教程的形式显示任意内容，教程中的步骤可以通过手工编码实现或<a href="http://amberjack.org/wizard/">在线自动生成</a>。可以使用<a href="http://amberjack.org/skins/">主题</a>或 CSS 控制内容的格式。 <p><a href="http://amberjack.org/"><img height="116" alt="Amberjack" src="http://www.comsharp.com/Writable/Resource/_random_/2009-03-06/amberjack.jpg" width="480" border="0"></a> <p><a href="http://jsload.net/"><strong>JsLoad</strong></a><br>JsLoad 可以从 Google server 远程加载各种 JavaScript 库，可以自动加载各种版本的支撑库。</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/75790.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-03-06 23:36 <a href="http://www.cppblog.com/woaidongmao/archive/2009/03/06/75790.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>page rank 介绍</title><link>http://www.cppblog.com/woaidongmao/archive/2009/01/05/71206.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Mon, 05 Jan 2009 02:39:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/01/05/71206.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/71206.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/01/05/71206.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/71206.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/71206.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">PageRank</span>是<span lang="EN-US">Google</span>算法的重要内容。<span lang="EN-US">2001</span>年<span lang="EN-US">9</span>月被授予美国专利，专利人是<span lang="EN-US">Google</span>创始人之一拉里<span lang="EN-US">·</span>佩奇（<span lang="EN-US">Larry Page</span>）。因此，<span lang="EN-US">PageRank</span>里的<span lang="EN-US">page</span>不是指网页，而是指佩奇，即这个等级方法是以佩奇来命名的。<span lang="EN-US"><?xml:namespace prefix = o /><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US"><a href="http://baike.baidu.com/view/105.htm" target="_blank">Google</a></span>的<span lang="EN-US">PageRank</span>根据网站的外部链接和内部链接的数量和质量俩衡量网站的价值。<span lang="EN-US">PageRank</span>背后的概念是，每个到页面的链接都是对该页面的一次投票，被链接的越多，就意味着被其他网站投票越多。这个就是所谓的<span lang="EN-US">“</span>链接流行度<span lang="EN-US">”——</span>衡量多少人愿意将他们的网站和你的网站挂钩。<span lang="EN-US">PageRank</span>这个概念引自学术中一篇论文的被引述的频度<span lang="EN-US">——</span>即被别人引述的次数越多，一般判断这篇论文的权威性就越高。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">Google</span>有一套自动化方法来计算这些投票。<span lang="EN-US">Google</span>的<span lang="EN-US">PageRank</span>分值从<span lang="EN-US">0</span>到<span lang="EN-US">10</span>；<span lang="EN-US">PageRank</span>为<span lang="EN-US">10</span>表示最佳，但非常少见，类似里氏震级（<span lang="EN-US">Richter scale</span>），<span lang="EN-US">PageRank</span>级别也不是线性的，而是按照一种指数刻度。这是一种奇特的数学术语，意思是<span lang="EN-US">PageRank4</span>不是比<span lang="EN-US">PageRank3</span>好一级<span lang="EN-US">——</span>而可能会好<span lang="EN-US">6</span>到<span lang="EN-US">7</span>倍。因此，一个<span lang="EN-US">PageRank5</span>的网页和<span lang="EN-US">PageRank8</span>的网页之间的差距会比你可能认为的要大的多。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">PageRank</span>较高的页面的排名往往要比<span lang="EN-US">PageRank</span>较低的页面高，而这导致了人们对链接的着魔。在整个<span lang="EN-US">SEO</span>社区，人们忙于争夺、交换甚至销售链接，它是过去几年来人们关注的焦点，以至于<span lang="EN-US">Google</span>修改了他的系统，并开始放弃某些类型的链接。比如，被人们广泛接受的一条规定，来自缺乏内容的<span lang="EN-US">“link farm”</span>（链接工厂）网站的链接将不会提供页面的<span lang="EN-US">PageRank</span>，从<span lang="EN-US">PageRank</span>较高的页面得到链接但是内容不相关（比如说某个流行的漫画书网站链接到一个叉车规范页面），也不会提供页面的<span lang="EN-US">PageRank</span>。<span lang="EN-US">Google</span>选择降低了<span lang="EN-US">PageRank</span>对更新频率，以便不鼓励人们不断的对其进行监测。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">Google PageRank</span>一般一年更新四次，所以刚上线的新网站不可能获得<span lang="EN-US">PR</span>值。你的网站很可能在相当长的时间里面看不到<span lang="EN-US">PR</span>值的变化，特别是一些新的网站。<span lang="EN-US">PR</span>值暂时没有，这不是什么不好的事情，耐心等待就好了。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　为您的网站获取外部链接是一件好事，但是无视其他<span lang="EN-US">SEO</span>领域的工作而进行急迫的链接建设就是浪费时间，要时刻保持一个整体思路并记住以下几点：<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">·Google</span>的排名算法并不是完全基于外部链接的<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">·</span>高<span lang="EN-US">PageRank</span>并不能保证<span lang="EN-US">Google</span>高排名<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">·PageRank</span>值更新的比较慢，今天看到的<span lang="EN-US">PageRank</span>值可能是三个月前的值<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　因此我们不鼓励刻意的去追求<span lang="EN-US">PageRank</span>，因为决定排名的因素可以有上百种。尽管如此，<span lang="EN-US">PageRank</span>还是一个用来了解<span lang="EN-US">Google</span>对您的网站页面如何评价的相当好的指示，建议网站设计者要充分认识<span lang="EN-US">PageRank</span>在<span lang="EN-US">Google</span>判断网站质量中的重要作用，从设计前的考虑到后期网站更新都要给予<span lang="EN-US">PageRank</span>足够的分析，很好的利用。我们要将<span lang="EN-US">PageRank</span>看作是一种业余爱好而不是一种信仰。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">---------------------------------------------------------------------------------------------------------------------<o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　通过对由超过<span lang="EN-US"> 50,000 </span>万个变量和<span lang="EN-US"> 20 </span>亿个词汇组成的方程进行计算，<span lang="EN-US">PageRank </span>能够对网页的重要性做出客观的评价。<span lang="EN-US">PageRank </span>并不计算直接链接的数量，而是将从网页<span lang="EN-US"> A </span>指向网页<span lang="EN-US"> B </span>的链接解释为由网页<span lang="EN-US"> A </span>对网页<span lang="EN-US"> B </span>所投的一票。这样，<span lang="EN-US">PageRank </span>会根据网页<span lang="EN-US"> B </span>所收到的投票数量来评估该页的重要性。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　此外，<span lang="EN-US">PageRank </span>还会评估每个投票网页的重要性，因为某些网页的投票被认为具有较高的价值，这样，它所链接的网页就能获得较高的价值。重要网页获得的<span lang="EN-US"> PageRank</span>（网页排名）较高，从而显示在搜索结果的顶部。<span lang="EN-US">Google </span>技术使用网上反馈的综合信息来确定某个网页的重要性。搜索结果没有人工干预或操纵，这也是为什么<span lang="EN-US"> Google </span>会成为一个广受用户信赖、不受付费排名影响且公正客观的信息来源。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　－－－－－－－－－－－－－－－<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　其实简单说就是民主表决。打个比方，假如我们要找李开复博士，有一百个人举手说自己是李开复。那么谁是真的呢？也许有好几个真的，但即使如此谁又是大家真正想找的呢？<span lang="EN-US">:-) </span>如果大家都说在<span lang="EN-US"> Google </span>公司的那个是真的，那么他就是真的。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　在互联网上，如果一个网页被很多其它网页所链接，说明它受到普遍的承认和信赖，那么它的排名就高。这就是<span lang="EN-US"> Page Rank </span>的核心思想。 当然<span lang="EN-US"> Google </span>的<span lang="EN-US"> Page Rank </span>算法实际上要复杂得多。比如说，对来自不同网页的链接对待不同，本身网页排名高的链接更可靠，于是给这些链接予较大的权重。<span lang="EN-US">Page Rank </span>考虑了这个因素，可是现在问题又来了，计算搜索结果的网页排名过程中需要用到网页本身的排名，这不成了先有鸡还是先有蛋的问题了吗？<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">Google </span>的两个创始人拉里<span lang="EN-US">·</span>佩奇（<span lang="EN-US">Larry Page </span>）和谢尔盖<span lang="EN-US">·</span>布林<span lang="EN-US"> (Sergey Brin) </span>把这个问题变成了一个二维矩阵相乘的问题，并且用迭代的方法解决了这个问题。他们先假定所有网页的排名是相同的，并且根据这个初始值，算出各个网页的第一次迭代排名，然后再根据第一次迭代排名算出第二次的排名。他们两人从理论上证明了不论初始值如何选取，这种算法都保证了网页排名的估计值能收敛到他们的真实值。值得一提的事，这种算法是完全没有任何人工干预的。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　理论问题解决了，又遇到实际问题。因为互联网上网页的数量是巨大的，上面提到的二维矩阵从理论上讲有网页数目平方之多个元素。如果我们假定有十亿个网页，那么这个矩阵就有一百亿亿个元素。这样大的矩阵相乘，计算量是非常大的。拉里和谢尔盖两人利用稀疏矩阵计算的技巧，大大的简化了计算量，并实现了这个网页排名算法。今天<span lang="EN-US"> Google </span>的工程师把这个算法移植到并行的计算机中，进一步缩短了计算时间，使网页更新的周期比以前短了许多。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　我来<span lang="EN-US"> Google </span>后，拉里<span lang="EN-US"> (Larry) </span>在和我们几个新员工座谈时，讲起他当年和谢尔盖<span lang="EN-US">(Sergey) </span>是怎么想到网页排名算法的。他说：<span lang="EN-US">"</span>当时我们觉得整个互联网就像一张大的图 （<span lang="EN-US">Graph)</span>，每个网站就像一个节点，而每个网页的链接就像一个弧。我想，互联网可以用一个图或者矩阵描述，我也许可以用这个发现做个博士论文。<span lang="EN-US">" </span>他和谢尔盖就这样发明了<span lang="EN-US"> Page Rank </span>的算法。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　网页排名的高明之处在于它把整个互联网当作了一个整体对待。它无意识中符合了系统论的观点。相比之下，以前的信息检索大多把每一个网页当作独立的个体对待，很多人当初只注意了网页内容和查询语句的相关性，忽略了网页之间的关系。 <span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　今天，<span lang="EN-US">Google </span>搜索引擎比最初复杂、完善了许多。但是网页排名在<span lang="EN-US"> Google </span>所有算法中依然是至关重要的。在学术界<span lang="EN-US">, </span>这个算法被公认为是文献检索中最大的贡献之一，并且被很多大学引入了信息检索课程<span lang="EN-US"> (Information Retrieval) </span>的教程。 <span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　如何提高你网页的<span lang="EN-US"> PR </span>值？<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　什么是<span lang="EN-US">PR</span>值呢<span lang="EN-US">? PR</span>值全称为<span lang="EN-US">PageRank</span>，<span lang="EN-US">PR</span>是英文<span lang="EN-US">Pagerank </span>的缩写形式，<span lang="EN-US">Pagerank</span>取自<span lang="EN-US">Google</span>的创始人<span lang="EN-US">LarryPage</span>，它是<span lang="EN-US">Google</span>排名运算法则（排名公式）的一部分，<span lang="EN-US">Pagerank</span>是<span lang="EN-US">Google</span>对网页重要性的评估，是<span lang="EN-US">Google</span>用来衡量一个网站的好坏的唯一标准。<span lang="EN-US">PageRank(</span>网页级别<span lang="EN-US">)</span>是<span lang="EN-US">Google</span>用于评测一个网页<span lang="EN-US">“</span>重要性<span lang="EN-US">”</span>的一种方法。在揉合了诸如<span lang="EN-US">Title</span>标识和<span lang="EN-US">Keywords</span>标识等所有其它因素之后，<span lang="EN-US">Google</span>通过<span lang="EN-US">PageRank</span>来调整结果，使那些更具<span lang="EN-US">“</span>重要性<span lang="EN-US">”</span>的网页在搜索结果中另网站排名获得提升，从而提高搜索结果的相关性和质量。<span lang="EN-US"> PR</span>值的级别从<span lang="EN-US">1</span>到<span lang="EN-US">10</span>级，<span lang="EN-US">10</span>级为满分。<span lang="EN-US">PR</span>值越高说明该网页越受欢迎。<span lang="EN-US">Google</span>把自己的网站的<span lang="EN-US">PR</span>值定到<span lang="EN-US">10</span>，这说明<span lang="EN-US">Google</span>这个网站是非常受欢迎的，也可以说这个网站非常重要。<span lang="EN-US">Google</span>大受青睐的另一个原因就是它的网站索引速度。向<span lang="EN-US">Google</span>提交你的网站直到为<span lang="EN-US">Google</span>收录，一般只需两个星期。如果你的网站已经为<span lang="EN-US">Google</span>收录，那么通常<span lang="EN-US">Google</span>会每月一次遍历和更新<span lang="EN-US">(</span>重新索引<span lang="EN-US">)</span>你的网站信息。不过对于那些<span lang="EN-US">PR</span>值<span lang="EN-US">(Pagerank)</span>较高的网站，<span lang="EN-US">Google</span>索引周期会相应的短一些。一个<span lang="EN-US">PR</span>值为<span lang="EN-US">1</span>的网站表明这个网站不太具有流行度，而<span lang="EN-US">PR</span>值为<span lang="EN-US">7</span>到<span lang="EN-US">10</span>则表明这个网站非常受欢迎。<span lang="EN-US">PR</span>值最高为<span lang="EN-US">10</span>，一般<span lang="EN-US">PR</span>值达到<span lang="EN-US">4</span>，就算是一个不错的网站了。那么<span lang="EN-US">PR</span>值都受那些因素影响呢？下面我们一起来看看。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　第一：网站外部链接的数量和质量<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　在计算网站排名时，<span lang="EN-US">Pagerank</span>会将网站的外部链接数考虑进去。并不能说一个网站的外部链接数越多其<span lang="EN-US">PR</span>值就越高，如果这样的话，一个网站尽可能获得最多的外部链接就<span lang="EN-US">OK</span>了，有这种想法是错误的。<span lang="EN-US">Google</span>对一个网站上的外部链接数的重视程度并不意味着你因此可以不求策略地与任何网站建立连接。这是因为<span lang="EN-US">Google</span>并不是简单地由计算网站的外部链接数来决定其等级。<span lang="EN-US">Google</span>的<span lang="EN-US">Pagerank</span>系统不单考虑一个网站的外部链接质量，也会考虑其数量。这个问题看来很有复杂。首先让我们来解释一下什么是阻尼因数<span lang="EN-US">(damping factor)</span>。阻尼因素就是当你投票或链接到另外一个站点时所获得的实际<span lang="EN-US">PR</span>分值。阻尼因数一般是<span lang="EN-US">0.85</span>。当然比起你网站的实际<span lang="EN-US">PR</span>值，它就显得微不足道了。 <span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　现在让我们来看看这个<span lang="EN-US">PR</span>分值的计算公式：<span lang="EN-US">PR(A)=(1-d)+d(PR(t1)/C(t1)+...+PR(tn)/C(tn)) </span>公式解释：其中<span lang="EN-US">PR(A)</span>表示的是从一个外部链接站点<span lang="EN-US">t1</span>上，依据<span lang="EN-US">Pagerank?</span>系统给你的网站所增加的<span lang="EN-US">PR</span>分值；<span lang="EN-US">PR(t1)</span>表示该外部链接网站本身的<span lang="EN-US">PR</span>分值；<span lang="EN-US">C(t1)</span>则表示该外部链接站点所拥有的外部链接数量。大家要谨记：一个网站的投票权值只有该网站<span lang="EN-US">PR</span>分值的<span lang="EN-US">0.85</span>， <span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　那么，是不是说对一个网站而言，它所拥有的较高网站质量和较高<span lang="EN-US">PR</span>分值的外部链接数量越多就越好呢？错，因为－<span lang="EN-US">Google</span>的<span lang="EN-US">Pagerank</span>系统不单考虑一个网站的外部链接质量，也会考虑其数量<span lang="EN-US">.</span>比方说，对一个有一定<span lang="EN-US">PR</span>值的网站<span lang="EN-US">X</span>来说，如果你的网站<span lang="EN-US">Y</span>是它的唯一一个外部链接，那么<span lang="EN-US">Google</span>就相信网站<span lang="EN-US">X</span>将你的网站<span lang="EN-US">Y</span>视做它最好的一个外部链接，从而会给你的网站<span lang="EN-US">Y</span>更多的分值。可是，如果网站<span lang="EN-US">X</span>上已经有<span lang="EN-US">49</span>个外部链接，那么<span lang="EN-US">Google</span>就相信网站<span lang="EN-US">X</span>只是将你的网站视做它第<span lang="EN-US">50</span>个好的网站。因而你的外部链接站点上的外部链接数越多，你所能够得到的<span lang="EN-US">PR</span>分值反而会越低，它们呈反比关系。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　说它对是因为－一般情况下，一个<span lang="EN-US">PR</span>分值大于等于<span lang="EN-US">6</span>的外部链接站点，可显著提升你的<span lang="EN-US">PR</span>分值。但如果这个外部链接站点已经有<span lang="EN-US">100</span>个其它的外部链接时，那你能够得到的<span lang="EN-US">PR</span>分值就几乎为零了。同样，如果一个外部链接站点的<span lang="EN-US">PR</span>值仅为<span lang="EN-US">2</span>，但你却是它的唯一一个外部链接，那么你所获得的<span lang="EN-US">PR</span>值要远远大于那个<span lang="EN-US">PR</span>值为<span lang="EN-US">6</span>，外部链接数为<span lang="EN-US">100</span>的网站。 <span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　而且这个<span lang="EN-US">0.85</span>的权值平均分配给其链接的每个外部网站。 <span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　第二：<span lang="EN-US">Google</span>在你的网站抓取的页面数<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">Google</span>在你的网站抓取的页面数，数目越多，<span lang="EN-US">Pagerank</span>值越高。但通常<span lang="EN-US">Google</span>并不会主动抓取你的网站的所有页面，尤其是网址里带有<span lang="EN-US">“?”</span>的动态链接，<span lang="EN-US">Google</span>不主动，那就要我们主动了，最笨的办法是把网站所有的页面都提交给<span lang="EN-US">Google</span>，但我想没有谁真会这么做，但页面不多的话可以试试。更好的办法是制作一个静态<span lang="EN-US">Html</span>页面，通常被称作<span lang="EN-US">“</span>网站地图<span lang="EN-US">”</span>或<span lang="EN-US">“</span>网站导航<span lang="EN-US">”</span>，它里面包含你要添加的所有网址，然后把这个静态页面提交给<span lang="EN-US">Google</span>。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　第三：网站被世界三大知名网站<span lang="EN-US"> DMOZ</span>，<span lang="EN-US">Yahoo</span>和<span lang="EN-US">Looksmart </span>收录<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　众所周知，<span lang="EN-US">Google</span>的<span lang="EN-US">Pagerank</span>系统对那些门户网络目录如<span lang="EN-US">DMOZ</span>，<span lang="EN-US">Yahoo</span>和<span lang="EN-US">Looksmart</span>尤为器重。特别是对<span lang="EN-US">DMOZ</span>。一个网站上的<span lang="EN-US">DMOZ</span>链接对<span lang="EN-US">Google</span>的<span lang="EN-US">Pagerank?</span>来说，就好像一块金子一样珍贵。如果你的网站为<span lang="EN-US">ODP</span>收录，则可有效提升你的页面等级。向<span lang="EN-US">ODP</span>提交你的站点并为它收录，其实并不是一件难事，只是要多花点时间而已。只要确保你的网站提供了良好的内容，然后在<span lang="EN-US">ODP</span>合适的目录下点击<span lang="EN-US">"</span>增加站点<span lang="EN-US">"</span>，按照提示一步步来就<span lang="EN-US">OK</span>了。至少要保证你的索引页<span lang="EN-US">(INDEX PAGE)</span>被收录进去。所以，如果你的网站内容涉及完全不同的几块内容，你可以把每个内容的网页分别向<span lang="EN-US">ODP</span>提交－不过请记住<span lang="EN-US">"</span>欲速则不达<span lang="EN-US">"</span>。等到<span lang="EN-US">Google</span>对其目录更新后，你就能看到你的<span lang="EN-US">PR</span>值会有什么变化了。如果你的网站为<span lang="EN-US">Yahoo</span>和<span lang="EN-US">Looksmart</span>所收录，那么你的<span lang="EN-US">PR</span>值会得到显著提升。如果你的网站是非商业性质的或几乎完全是非商业性质的内容，那么你可以通过<span lang="EN-US">zeall.com</span>使你的网站为著名的网络目录<span lang="EN-US">Looksmart</span>所收录。<span lang="EN-US">Looksmart</span>也是从<span lang="EN-US">Zeal</span>网络目录获得非商业搜索列表。 <span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">Google PR</span>值的更新周期是多长时间？<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　一般情况下<span lang="EN-US">PR</span>值更新的周期是<span lang="EN-US">2.5</span>～<span lang="EN-US">3</span>个月！最近一次<span lang="EN-US">PR</span>更新是<span lang="EN-US">2008</span>年<span lang="EN-US">1</span>月中旬。 <span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">PageRank</span>相关算法总结：<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">1.PageRank<o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　基本思想：如果网页<span lang="EN-US">T</span>存在一个指向网页<span lang="EN-US">A</span>的连接，则表明<span lang="EN-US">T</span>的所有者认为<span lang="EN-US">A</span>比较重要，从而把<span lang="EN-US">T</span>的一部分重要性得分赋予<span lang="EN-US">A</span>。这个重要性得分值为：<span lang="EN-US">PR</span>（<span lang="EN-US">T</span>）<span lang="EN-US">/C(T)<o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　其中<span lang="EN-US">PR</span>（<span lang="EN-US">T</span>）为<span lang="EN-US">T</span>的<span lang="EN-US">PageRank</span>值，<span lang="EN-US">C(T)</span>为<span lang="EN-US">T</span>的出链数，则<span lang="EN-US">A</span>的<span lang="EN-US">PageRank</span>值为一系列类似于<span lang="EN-US">T</span>的页面重要性得分值的累加。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　优点：是一个与查询无关的静态算法，所有网页的<span lang="EN-US">PageRank</span>值通过离线计算获得；有效减少在线查询时的计算量，极大降低了查询响应时间。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　不足：人们的查询具有主题特征，<span lang="EN-US">PageRank</span>忽略了主题相关性，导致结果的相关性和主题性降低；另外，<span lang="EN-US">PageRank</span>有很严重的对新网页的歧视。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">2.Topic-Sensitive PageRank</span>（主题敏感的<span lang="EN-US">PageRank</span>）<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　基本思想：针对<span lang="EN-US">PageRank</span>对主题的忽略而提出。核心思想：通过离线计算出一个<span lang="EN-US">PageRank</span>向量集合，该集合中的每一个向量与某一主题相关，即计算某个页面关于不同主题的得分。主要分为两个阶段：主题相关的<span lang="EN-US">PageRank</span>向量集合的计算和在线查询时主题的确定。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　优点：根据用户的查询请求和相关上下文判断用户查询相关的主题（用户的兴趣）返回查询结果准确性高。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　不足：没有利用主题的相关性来提高链接得分的准确性。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">3.Hilltop<o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　基本思想：与<span lang="EN-US">PageRank</span>的不同之处：仅考虑专家页面的链接。主要包括两个步骤：专家页面搜索和目标页面排序。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　优点：相关性强，结果准确。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　不足：专家页面的搜索和确定对算法起关键作用，专家页面的质量决定了算法的准确性，而专家页面的质量和公平性难以保证；忽略了大量非专家页面的影响，不能反应整个<span lang="EN-US">Internet</span>的民意；当没有足够的专家页面存在时，返回空，所以<span lang="EN-US">Hilltop</span>适合对于查询排序进行求精。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　那么影响<span lang="EN-US">google PageRank</span>的因素有哪些呢<span lang="EN-US">?<o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">1 </span>与<span lang="EN-US">pr</span>高的网站做链接<span lang="EN-US">:<o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">2 </span>内容质量高的网站链接<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">3</span>加入搜索引擎分类目录<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">4 </span>加入免费开源目录<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">5 </span>你的链接出现在流量大、知名度高、频繁更新的重要网站上<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">6google</span>对<span lang="EN-US">DPF</span>格式的文件比较看重。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">7</span>安装<span lang="EN-US">Google</span>工具条<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">8</span>域名和<span lang="EN-US">tilte</span>标题出现关键词与<span lang="EN-US">meta</span>标签等<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">9</span>反向连接数量和反向连接的等级<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">10Google</span>抓取您网站的页面数量<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">11</span>导出链接数量<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">PageRank</span>科学排名遏止关键字垃圾<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　目前，五花八门的网站为争夺网上排名采用恶意点击和输入关键字垃圾的手段来吸引网民的眼球，无论对于互联网企业还是互联网用户，这都不是一个好现象。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　为了解决这样的问题，<span lang="EN-US">Google </span>创始人之一拉里<span lang="EN-US">.</span>佩奇（<span lang="EN-US">Larry Page</span>）发明了一种算法<span lang="EN-US">PageRank</span>，是由搜索引擎根据网页之间相互的超链接进行计算的网页排名。它经常和搜索引擎优化有关。<span lang="EN-US">PageRank </span>系统目前被<span lang="EN-US">Google </span>用来体现网页的相关性和重要性，以便科学排名，遏止关键字垃圾。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">PageRank</span>这个概念引自一篇学术论文的被媒体转载的频度，一般被转载的次数越多，这篇论文的权威性就越高，价值也就越高。<span lang="EN-US">PageRank</span>是<span lang="EN-US">1998</span>年在斯坦福大学问世的，<span lang="EN-US">2001<o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　年<span lang="EN-US">9 </span>月被授予美国专利。如今它在<span lang="EN-US"> Google </span>所有算法中依然是至关重要的。在学术界<span lang="EN-US">, </span>这个算法被公认为是文献检索中最大的贡献之一，并且被很多大学引入了信息检索课程<span lang="EN-US">(Information Retrieval) </span>的教程。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">PageRank </span>通过对由超过<span lang="EN-US"> 5 </span>亿个变量和<span lang="EN-US"> 20 </span>亿个词汇组成的方程进行计算，能科学公正地标识网页的等级或重要性。<span lang="EN-US">PR</span>级别为<span lang="EN-US">1</span>到<span lang="EN-US">10</span>，<span lang="EN-US">PR</span>值越高说明该网页越重要。例如：一个<span lang="EN-US">PR </span>值为<span lang="EN-US">1 </span>的网站表明这个网站不太具有流行度，而<span lang="EN-US">PR </span>值为<span lang="EN-US">7</span>到<span lang="EN-US">10</span>则表明这个网站极其重要。<span lang="EN-US">PageRank</span>级别不是一般的算术级数，而是按照一种几何级数来划分的。<span lang="EN-US">PageRank3 </span>不是比<span lang="EN-US">PageRank2 </span>好一级，而可能会好到数倍。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">PageRank</span>根据网站的外部链接和内部链接的数量和质量来衡量网站的价值。<span lang="EN-US">PageRank</span>的概念是，每个到页面的链接都是对该页面的一次投票，被链接得越多，就意味着被其他网站投票越多。<span lang="EN-US">Google </span>有一套自动化方法来计算这些投票，但<span lang="EN-US">Google </span>的排名算法不完全基于外部链接。<span lang="EN-US">PageRank </span>对来自不同网页的链接会区别对待，来自网页本身排名高的链接更受青睐，给这些链接有较大的权重。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　同时，<span lang="EN-US">Google </span>不只是看一个网站的投票数量，或者这个网站的外部链接数量。它会对那些投票的网站进行分析。如果这些网站的<span lang="EN-US">PR </span>值比较高，则其投票的网站可从中受益。因此，<span lang="EN-US">Google </span>的技术专家提醒人们，在建设网站的外部链接时，应尽可能瞄准那些<span lang="EN-US">PR </span>值高且外部链接数又少的网站。这样的外部链接站点越多，你的<span lang="EN-US">PR </span>值就会越高，从而使得你的<span lang="EN-US">Google </span>排名得到显著提升。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">PageRank</span>的另一作用是对关键字垃圾起到巨大的遏制作用。眼下，一些垃圾网站为了提高点击率，用一些与站点内容无关的关键字垃圾壮声威，比如用明星的名字、用公共突<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　发事件称谓等。这些网页的目的或是为了骗取广告点击，或是为了传播病毒。还有一些无赖式的博客评论也从中搅局，在网上招摇过市，骗取网民的注意力，这也被网络技术人员<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　视为垃圾。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">PageRank</span>目前使用一种基于信任和名誉的算法帮助遏止关键字垃圾，它忽视这些关键字垃圾的存在，以网页相互链接评级别论高低。<span lang="EN-US">Google </span>排名之所以大受追捧，是由于它并非<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　只使用关键字或代理搜索技术， 而是将自身建立在高级的网页级别技术基础之上。 别的搜索引擎提供给搜索者的是多种渠道值为<span lang="EN-US"> 8 </span>的网站信息得来的一个粗略的搜索结果，而<span lang="EN-US">Google </span>提供给它的搜索者的则是它自己产生的高度精确的搜索结果。这就是为什么网站管理员会千方百计去提高自己网站在<span lang="EN-US">Google </span>的排名了。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; letter-spacing: 0.4pt; mso-bidi-font-family: arial">　　<span lang="EN-US">PageRank</span>一般一年更新四次，所以刚上线的新网站不可能获得<span lang="EN-US">PR </span>值。不过<span lang="EN-US">PR </span>值暂时没有，并不是什么不好的事情，耐心等待就能得到<span lang="EN-US">Google </span>的青睐。</span><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: arial"><o:p></o:p></span></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/71206.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-01-05 10:39 <a href="http://www.cppblog.com/woaidongmao/archive/2009/01/05/71206.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OpenID使用手册</title><link>http://www.cppblog.com/woaidongmao/archive/2009/01/05/71185.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Sun, 04 Jan 2009 16:18:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/01/05/71185.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/71185.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/01/05/71185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/71185.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/71185.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 什么是OpenID?OpenID是一种开放、离散式的用于用户数字标识的开源框架。请让我们思考自己所拥有的在线帐号种类：博客、wiki、to-do list、个人相册。在网络应用日益充斥的今天，这些个人在线帐号可谓不胜枚举，而对帐号的需要也同样无处不在，乃至当我们想在好友博客上进行评论时都需要注册成为该博客系统的用户。于是作为终端用户，我们不得不在每个网站上设置帐号，并管理众多的帐号。而采用Open...&nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2009/01/05/71185.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/71185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-01-05 00:18 <a href="http://www.cppblog.com/woaidongmao/archive/2009/01/05/71185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深度优先搜索和广度优先搜索</title><link>http://www.cppblog.com/woaidongmao/archive/2009/01/04/71164.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Sun, 04 Jan 2009 13:03:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/01/04/71164.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/71164.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/01/04/71164.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/71164.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/71164.html</trackback:ping><description><![CDATA[<table class="MsoNormalTable" style="width: 100%; mso-cellspacing: 0cm; mso-padding-alt: 0cm 0cm 0cm 0cm" cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr style="height: 64.5pt; mso-yfti-irow: 0; mso-yfti-firstrow: yes"> <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; width: 425.45pt; padding-top: 0cm; height: 64.5pt" valign="top" width="567"> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">一、深度优先搜索<span lang="EN-US">&nbsp;<br>&nbsp;&nbsp;&nbsp; </span>深度优先搜索就是在搜索树的每一层始终先只扩展一个子节点，不断地向纵深前进直到不能再前进（到达叶子节点或受到深度限制）时，才从当前节点返回到上一级节点，沿另一方向又继续前进。这种方法的搜索树是从树根开始一枝一枝逐渐形成的。 <span lang="EN-US"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>深度优先搜索亦称为纵向搜索。由于一个有解的问题树可能含有无穷分枝，深度优先搜索如果误入无穷分枝（即深度无限），则不可能找到目标节点。所以，深度优先搜索策略是不完备的。另外，应用此策略得到的解不一定是最佳解（最短路径）。<span lang="EN-US"> <br><br></span>二、<span lang="EN-US">&nbsp;&nbsp;&nbsp; </span>重排九宫问题游戏<span lang="EN-US"> <br></span>在一个<span lang="EN-US">3</span>乘<span lang="EN-US">3</span>的九宫中有<span lang="EN-US">1-8</span>的<span lang="EN-US">8</span>个数及一个空格随机摆放在其中的格子里。如下面左图所示。现在要求实现这样的问题：将该九宫调整为如下图右图所示的形式。调整规则是：每次只能将与空格（上，下或左，右）相临的一个数字平移到空格中。试编程实现。<span lang="EN-US"> <br><br>| 2 | 8&nbsp; | 3 |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 1 | 2 | 3 | <br>- <br>| 1 |&nbsp;&nbsp;&nbsp;&nbsp; | 4 |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 8 |&nbsp;&nbsp;&nbsp; | 4 | <br><br>| 7 | 6&nbsp; | 5 |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 7 | 6 | 5 | <br><br></span>深度优先搜索的路径示意图：<span lang="EN-US"><br style="mso-special-character: line-break"><br style="mso-special-character: line-break"><?xml:namespace prefix = o /><o:p></o:p></span></span></p></td></tr> <tr style="height: 15pt; mso-yfti-irow: 1; mso-yfti-lastrow: yes"> <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm; height: 15pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体"><a href="http://www.java3z.com/cwbwebhome/article/article1/images/deep.gif" target="_blank"><span style="mso-ignore: vglayout"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/f237e4d8e644_12765/clip_image001_2.gif"><img onmousewheel="return bbimg(this)" title="点击在新窗口查看原始图片" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px; zoom: 10%" height="185" alt="clip_image001" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/f237e4d8e644_12765/clip_image001_thumb.gif" width="244" border="0" v:shapes="_x0000_i1025"></a></span></a><o:p></o:p></span></p></td></tr></tbody></table> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">　 <span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">三、广度优先搜索<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">在深度优先搜索算法中，是深度越大的结点越先得到扩展。如果在搜索中把算法改为按结点的层次进行搜索，本层的结点没有搜索处理完时，不能对下层结点进行处理，即深度越小的结点越先得到扩展，也就是说先产生的结点先得以扩展处理，这种搜索算法称为广度优先搜索法。 <span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">广度优先搜索路径示意图：<span lang="EN-US"><br><br><a href="http://www.java3z.com/cwbwebhome/article/article1/images/guang.gif" target="_blank"><span style="mso-ignore: vglayout"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/f237e4d8e644_12765/clip_image003_2.jpg"><img onmousewheel="return bbimg(this)" title="点击在新窗口查看原始图片" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px; zoom: 180%" height="436" alt="clip_image003" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/f237e4d8e644_12765/clip_image003_thumb.jpg" width="504" border="0" v:shapes="_x0000_i1026"></a></span></a><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">&nbsp;<o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">四、航班问题（来自《<span lang="EN-US">The Art of Java</span>》<span lang="EN-US">)<br>&nbsp;&nbsp;&nbsp; </span>一位顾客要预定一张从<span lang="EN-US">New York</span>到<span lang="EN-US">Los Angeles</span>的航班机票，下面是航班线路，请你为顾客找一种购票方案。<span lang="EN-US"><o:p></o:p></span></span></p> <table class="MsoNormalTable" style="width: 435.75pt; mso-cellspacing: 1.5pt" cellpadding="0" width="581" border="1"> <tbody> <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes"> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 196.5pt; padding-top: 0.75pt" width="262"> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">航班<span lang="EN-US"><o:p></o:p></span></span></p></td> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 227.25pt; padding-top: 0.75pt" width="303"> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">距离<span lang="EN-US"><o:p></o:p></span></span></p></td></tr> <tr style="mso-yfti-irow: 1"> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">New York</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">到<span lang="EN-US">Chicago<o:p></o:p></span></span></p></td> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">900</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">英里<span lang="EN-US"><o:p></o:p></span></span></p></td></tr> <tr style="mso-yfti-irow: 2"> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">Chicago</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">到<span lang="EN-US">Denver<o:p></o:p></span></span></p></td> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">1000</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">英里<span lang="EN-US"><o:p></o:p></span></span></p></td></tr> <tr style="mso-yfti-irow: 3"> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">New York</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">到<span lang="EN-US">Toronto<o:p></o:p></span></span></p></td> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">500</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">英里<span lang="EN-US"><o:p></o:p></span></span></p></td></tr> <tr style="mso-yfti-irow: 4"> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">New York</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">到<span lang="EN-US">Denver <o:p></o:p></span></span></p></td> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">1800</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">英里<span lang="EN-US"><o:p></o:p></span></span></p></td></tr> <tr style="mso-yfti-irow: 5"> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">Toronto</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">到<span lang="EN-US">Calgary<o:p></o:p></span></span></p></td> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">1700</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">英里<span lang="EN-US"><o:p></o:p></span></span></p></td></tr> <tr style="mso-yfti-irow: 6"> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">Toronto</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">到<span lang="EN-US">Los Angeles <o:p></o:p></span></span></p></td> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">2500</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">英里<span lang="EN-US"><o:p></o:p></span></span></p></td></tr> <tr style="mso-yfti-irow: 7"> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">Toronto</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">到<span lang="EN-US">Chicago<o:p></o:p></span></span></p></td> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">500</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">英里<span lang="EN-US"><o:p></o:p></span></span></p></td></tr> <tr style="mso-yfti-irow: 8"> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">Denver</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">到<span lang="EN-US">Urbana<o:p></o:p></span></span></p></td> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">1000</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">英里<span lang="EN-US"><o:p></o:p></span></span></p></td></tr> <tr style="mso-yfti-irow: 9"> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">Denver</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">到<span lang="EN-US">Houston<o:p></o:p></span></span></p></td> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">1000</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">英里<span lang="EN-US"><o:p></o:p></span></span></p></td></tr> <tr style="mso-yfti-irow: 10"> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">Houston</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">到<span lang="EN-US">Los Angeles <o:p></o:p></span></span></p></td> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">1500</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">英里<span lang="EN-US"><o:p></o:p></span></span></p></td></tr> <tr style="mso-yfti-irow: 11; mso-yfti-lastrow: yes"> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">Denver</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">到<span lang="EN-US">Los Angeles <o:p></o:p></span></span></p></td> <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt"> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">1000</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">英里<span lang="EN-US"><o:p></o:p></span></span></p></td></tr></tbody></table> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">下面是用深度优先搜索求解的程序<span lang="EN-US">:<o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">// Find connections using a depth-first search.<br>import java.util.*;<br>import java.io.*;<br>// Flight information.<br>class FlightInfo {<br><span style="mso-spacerun: yes">&nbsp; </span>String from;<br><span style="mso-spacerun: yes">&nbsp; </span>String to;<br><span style="mso-spacerun: yes">&nbsp; </span>int distance;<br><span style="mso-spacerun: yes">&nbsp; </span>boolean skip; // used in backtracking<br><span style="mso-spacerun: yes">&nbsp; </span>FlightInfo(String f, String t, int d) {<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>from = f;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>to = t;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>distance = d;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>skip = false;<br><span style="mso-spacerun: yes">&nbsp; </span>}<br>}<br>class Depth {<br><span style="mso-spacerun: yes">&nbsp; </span>final int MAX = 100;<br><span style="mso-spacerun: yes">&nbsp; </span>// This array holds the flight information.<br><span style="mso-spacerun: yes">&nbsp; </span>FlightInfo flights[] = new FlightInfo[MAX]; <br><span style="mso-spacerun: yes">&nbsp; </span>int numFlights = 0; // number of entries in flight array<br><span style="mso-spacerun: yes">&nbsp; </span>Stack btStack = new Stack(); // backtrack stack<br><span style="mso-spacerun: yes">&nbsp; </span>public static void main(String args[])<br><span style="mso-spacerun: yes">&nbsp; </span>{<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>String to, from;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>Depth ob = new Depth();<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>BufferedReader br = new <br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>BufferedReader(new InputStreamReader(System.in)); <br><span style="mso-spacerun: yes">&nbsp;</span><br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>ob.setup();<span style="mso-spacerun: yes">&nbsp; </span><br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>try { <br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.print("From? ");<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>from = br.readLine(); <br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.print("To? ");<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>to = br.readLine(); <br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ob.isflight(from, to);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(ob.btStack.size() != 0)<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ob.route(to);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>} catch (IOException exc) { <br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println("Error on input.");<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp; </span><br><span style="mso-spacerun: yes">&nbsp; </span>// Initialize the flight database.<br><span style="mso-spacerun: yes">&nbsp; </span>void setup()<br><span style="mso-spacerun: yes">&nbsp; </span>{<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<?xml:namespace prefix = st1 /><st1:state w:st="on">New York</st1:state>", "<st1:city w:st="on"><st1:place w:st="on">Chicago</st1:place></st1:city>", 900);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<st1:city w:st="on">Chicago</st1:city>", "<st1:city w:st="on"><st1:place w:st="on">Denver</st1:place></st1:city>", 1000);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<st1:state w:st="on">New York</st1:state>", "<st1:city w:st="on"><st1:place w:st="on">Toronto</st1:place></st1:city>", 500);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<st1:state w:st="on">New York</st1:state>", "<st1:city w:st="on"><st1:place w:st="on">Denver</st1:place></st1:city>", 1800);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<st1:city w:st="on">Toronto</st1:city>", "<st1:city w:st="on"><st1:place w:st="on">Calgary</st1:place></st1:city>", 1700);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<st1:city w:st="on">Toronto</st1:city>", "<st1:city w:st="on"><st1:place w:st="on">Los Angeles</st1:place></st1:city>", 2500);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<st1:city w:st="on">Toronto</st1:city>", "<st1:city w:st="on"><st1:place w:st="on">Chicago</st1:place></st1:city>", 500);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<st1:city w:st="on">Denver</st1:city>", "<st1:city w:st="on"><st1:place w:st="on">Urbana</st1:place></st1:city>", 1000);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<st1:city w:st="on">Denver</st1:city>", "<st1:city w:st="on"><st1:place w:st="on">Houston</st1:place></st1:city>", 1000);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<st1:city w:st="on">Houston</st1:city>", "<st1:city w:st="on"><st1:place w:st="on">Los Angeles</st1:place></st1:city>", 1500);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<st1:city w:st="on">Denver</st1:city>", "<st1:city w:st="on"><st1:place w:st="on">Los Angeles</st1:place></st1:city>", 1000);<br><span style="mso-spacerun: yes">&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp; </span><br><span style="mso-spacerun: yes">&nbsp; </span>// Put flights into the database.<br><span style="mso-spacerun: yes">&nbsp; </span>void addFlight(String from, String to, int dist)<br><span style="mso-spacerun: yes">&nbsp; </span>{<br><span style="mso-spacerun: yes">&nbsp; </span><br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>if(numFlights &lt; MAX) {<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>flights[numFlights] =<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>new FlightInfo(from, to, dist);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>numFlights++;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>else System.out.println("Flight database full.\n");<br><span style="mso-spacerun: yes">&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp; </span>// Show the route and total distance.<br><span style="mso-spacerun: yes">&nbsp; </span>void route(String to)<br><span style="mso-spacerun: yes">&nbsp; </span>{<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>Stack rev = new Stack();<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>int dist = 0;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>FlightInfo f;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>int num = btStack.size();<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>// Reverse the stack to display route.<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>for(int i=0; i &lt; num; i++) <br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>rev.push(btStack.pop());<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>for(int i=0; i &lt; num; i++) {<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>f = (FlightInfo) rev.pop();<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.print(f.from + " to ");<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>dist += f.distance;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>System.out.println(to);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>System.out.println("Distance is " + dist);<br><span style="mso-spacerun: yes">&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp; </span>/* If there is a flight between from and to,<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>return the distance of flight;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>otherwise, return 0. */<br><span style="mso-spacerun: yes">&nbsp; </span>int match(String from, String to)<br><span style="mso-spacerun: yes">&nbsp; </span>{<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>for(int i=numFlights-1; i &gt; -1; i--) {<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(flights[i].from.equals(from) &amp;&amp;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>flights[i].to.equals(to) &amp;&amp;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>!flights[i].skip)<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>flights[i].skip = true; // prevent reuse<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return flights[i].distance;<br><span style="mso-spacerun: yes">&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>return 0; // not found <br><span style="mso-spacerun: yes">&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp; </span><br><span style="mso-spacerun: yes">&nbsp; </span>// Given from, find any connection.<br><span style="mso-spacerun: yes">&nbsp; </span>FlightInfo find(String from)<br><span style="mso-spacerun: yes">&nbsp; </span>{<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>for(int i=0; i &lt; numFlights; i++) {<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(flights[i].from.equals(from) &amp;&amp;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>!flights[i].skip)<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>FlightInfo f = new FlightInfo(flights[i].from,<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>flights[i].to,<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>flights[i].distance);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>flights[i].skip = true; // prevent reuse<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return f;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>return null;<br><span style="mso-spacerun: yes">&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp; </span><br><span style="mso-spacerun: yes">&nbsp; </span>// Determine if there is a route between from and to. <br><span style="mso-spacerun: yes">&nbsp; </span>void isflight(String from, String to)<br><span style="mso-spacerun: yes">&nbsp; </span>{<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>int dist;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>FlightInfo f;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>// See if at destination.<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>dist = match(from, to);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>if(dist != 0) {<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>btStack.push(new FlightInfo(from, to, dist));<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>// Try another connection.<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>f = find(from);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>if(f != null) {<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>btStack.push(new FlightInfo(from, to, f.distance));<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>isflight(f.to, to);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>else if(btStack.size() &gt; 0) {<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// Backtrack and try another connection.<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>f = (FlightInfo) btStack.pop();<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>isflight(f.from, f.to);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp; </span>}<br>}<span style="mso-spacerun: yes">&nbsp; </span><br><span style="mso-spacerun: yes">&nbsp; </span><o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体"><a href="http://www.java3z.com/cwbwebhome/article/article1/images/3.gif" target="_blank"><span style="mso-ignore: vglayout"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/f237e4d8e644_12765/clip_image004_2.gif"><img onmousewheel="return bbimg(this)" title="点击在新窗口查看原始图片" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px; zoom: 60%" height="433" alt="clip_image004" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/f237e4d8e644_12765/clip_image004_thumb.gif" width="446" border="0" v:shapes="_x0000_i1027"></a></span></a><o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">解释：<span lang="EN-US">isflight()</span>方法用递归方法进行深度优先搜索，它先调用<span lang="EN-US">match()</span>方法检查航班的数据库，判断在<span lang="EN-US">from</span>和<span lang="EN-US">to</span>之间有没有航班可达。如果有，则获取目标信息，并将该线路压入栈中，然后返回（找到一个方案）。否则，就调用<span lang="EN-US">find()</span>方法查找<span lang="EN-US">from</span>与任意其它城市之间的线路，如果找到一条就返回描述该线路的<span lang="EN-US">FlightInfo</span>对象，否则返回<span lang="EN-US">null</span>。如果存在这样的一条线路，那么就把该线路保存在<span lang="EN-US">f</span>中，并将当前航班信息压到栈的顶部，然后递归调用<span lang="EN-US">isflight()</span>方法<span lang="EN-US"> ,</span>此时保存在<span lang="EN-US">f.to</span>中的城市成为新的出发城市<span lang="EN-US">.</span>否则就进行回退<span lang="EN-US">,</span>弹出栈顶的第一个节点<span lang="EN-US">,</span>然后递归调用<span lang="EN-US">isflight()</span>方法。该过程将一直持续到找到目标为止。 <span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">&nbsp; <o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">程序运行结果：<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体"><br>C:\java&gt;java Depth<br>From? <st1:state w:st="on"><st1:place w:st="on">New York</st1:place></st1:state><br>To? <st1:city w:st="on"><st1:place w:st="on">Los Angeles</st1:place></st1:city><br><st1:state w:st="on">New York</st1:state> to <st1:city w:st="on">Chicago</st1:city> to <st1:city w:st="on">Denver</st1:city> to <st1:city w:st="on"><st1:place w:st="on">Los Angeles</st1:place></st1:city><br>Distance is 2900<o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">C:\java&gt;<o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">深度优先搜索能够找到一个解，同时，对于上面这个特定问题，深度优先搜索没有经过回退，一次就找到了一个解；但如果数据的组织方式不同，寻找解时就有可能进行多次回退。因此这个例子的输出并不具有普遍性。而且，在搜索一个很长，但是其中并没有解的分支的时候，深度优先搜索的性能将会很差，在这种情况下，深度优先搜索不仅在搜索这条路径时浪费时间，而且还在向目标的回退中浪费时间。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">再看对这个例子使用广度优先搜索的程序：<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">// Find connections using a breadth-first search.<br>import java.util.*;<br>import java.io.*;<br>// Flight information.<br>class FlightInfo {<br><span style="mso-spacerun: yes">&nbsp; </span>String from;<br><span style="mso-spacerun: yes">&nbsp; </span>String to;<br><span style="mso-spacerun: yes">&nbsp; </span>int distance;<br><span style="mso-spacerun: yes">&nbsp; </span>boolean skip; // used in backtracking<br><span style="mso-spacerun: yes">&nbsp; </span>FlightInfo(String f, String t, int d) {<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>from = f;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>to = t;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>distance = d;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>skip = false;<br><span style="mso-spacerun: yes">&nbsp; </span>}<br>}<br>class Breadth {<br><span style="mso-spacerun: yes">&nbsp; </span>final int MAX = 100;<br><span style="mso-spacerun: yes">&nbsp; </span>// This array holds the flight information.<br><span style="mso-spacerun: yes">&nbsp; </span>FlightInfo flights[] = new FlightInfo[MAX]; <br><span style="mso-spacerun: yes">&nbsp; </span>int numFlights = 0; // number of entries in flight array<br><span style="mso-spacerun: yes">&nbsp; </span>Stack btStack = new Stack(); // backtrack stack<br><span style="mso-spacerun: yes">&nbsp; </span>public static void main(String args[])<br><span style="mso-spacerun: yes">&nbsp; </span>{<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>String to, from;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>Breadth ob = new Breadth();<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>BufferedReader br = new <br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>BufferedReader(new InputStreamReader(System.in)); <br><span style="mso-spacerun: yes">&nbsp;</span><br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>ob.setup();<span style="mso-spacerun: yes">&nbsp; </span><br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>try { <br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.print("From? ");<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>from = br.readLine(); <br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.print("To? ");<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>to = br.readLine(); <br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ob.isflight(from, to);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(ob.btStack.size() != 0)<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ob.route(to);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>} catch (IOException exc) { <br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println("Error on input.");<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp; </span><br><span style="mso-spacerun: yes">&nbsp; </span>// Initialize the flight database.<br><span style="mso-spacerun: yes">&nbsp; </span>void setup()<br><span style="mso-spacerun: yes">&nbsp; </span>{<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<st1:state w:st="on">New York</st1:state>", "<st1:city w:st="on"><st1:place w:st="on">Chicago</st1:place></st1:city>", 900);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<st1:city w:st="on">Chicago</st1:city>", "<st1:city w:st="on"><st1:place w:st="on">Denver</st1:place></st1:city>", 1000);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<st1:state w:st="on">New York</st1:state>", "<st1:city w:st="on"><st1:place w:st="on">Toronto</st1:place></st1:city>", 500);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<st1:state w:st="on">New York</st1:state>", "<st1:city w:st="on"><st1:place w:st="on">Denver</st1:place></st1:city>", 1800);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<st1:city w:st="on">Toronto</st1:city>", "<st1:city w:st="on"><st1:place w:st="on">Calgary</st1:place></st1:city>", 1700);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<st1:city w:st="on">Toronto</st1:city>", "<st1:city w:st="on"><st1:place w:st="on">Los Angeles</st1:place></st1:city>", 2500);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<st1:city w:st="on">Toronto</st1:city>", "<st1:city w:st="on"><st1:place w:st="on">Chicago</st1:place></st1:city>", 500);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<st1:city w:st="on">Denver</st1:city>", "<st1:city w:st="on"><st1:place w:st="on">Urbana</st1:place></st1:city>", 1000);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<st1:city w:st="on">Denver</st1:city>", "<st1:city w:st="on"><st1:place w:st="on">Houston</st1:place></st1:city>", 1000);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<st1:city w:st="on">Houston</st1:city>", "<st1:city w:st="on"><st1:place w:st="on">Los Angeles</st1:place></st1:city>", 1500);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>addFlight("<st1:city w:st="on">Denver</st1:city>", "<st1:city w:st="on"><st1:place w:st="on">Los Angeles</st1:place></st1:city>", 1000);<br><span style="mso-spacerun: yes">&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp; </span><br><span style="mso-spacerun: yes">&nbsp; </span>// Put flights into the database.<br><span style="mso-spacerun: yes">&nbsp; </span>void addFlight(String from, String to, int dist)<br><span style="mso-spacerun: yes">&nbsp; </span>{<span style="mso-spacerun: yes">&nbsp; </span><br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>if(numFlights &lt; MAX) {<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>flights[numFlights] =<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>new FlightInfo(from, to, dist);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>numFlights++;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>else System.out.println("Flight database full.\n");<br><span style="mso-spacerun: yes">&nbsp;</span><span style="mso-spacerun: yes">&nbsp;</span>}<br><span style="mso-spacerun: yes">&nbsp; </span>// Show the route and total distance.<br><span style="mso-spacerun: yes">&nbsp; </span>void route(String to)<br><span style="mso-spacerun: yes">&nbsp; </span>{<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>Stack rev = new Stack();<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>int dist = 0;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>FlightInfo f;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>int num = btStack.size();<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>// Reverse the stack to display route.<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>for(int i=0; i &lt; num; i++) <br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>rev.push(btStack.pop());<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>for(int i=0; i &lt; num; i++) {<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>f = (FlightInfo) rev.pop();<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.print(f.from + " to ");<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>dist += f.distance;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>System.out.println(to);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>System.out.println("Distance is " + dist);<br><span style="mso-spacerun: yes">&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp; </span>/* If there is a flight between from and to,<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>return the distance of flight;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>otherwise, return 0. */<br><span style="mso-spacerun: yes">&nbsp; </span>int match(String from, String to)<br><span style="mso-spacerun: yes">&nbsp; </span>{<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>for(int i=numFlights-1; i &gt; -1; i--) {<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(flights[i].from.equals(from) &amp;&amp;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>flights[i].to.equals(to) &amp;&amp;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>!flights[i].skip)<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>flights[i].skip = true; // prevent reuse<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return flights[i].distance;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>return 0; // not found <br><span style="mso-spacerun: yes">&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp; </span><br><span style="mso-spacerun: yes">&nbsp; </span>// Given from, find any connection.<br><span style="mso-spacerun: yes">&nbsp; </span>FlightInfo find(String from)<br><span style="mso-spacerun: yes">&nbsp; </span>{<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>for(int i=0; i &lt; numFlights; i++) {<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(flights[i].from.equals(from) &amp;&amp;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>!flights[i].skip)<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>FlightInfo f = new FlightInfo(flights[i].from,<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>flights[i].to,<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>flights[i].distance);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>flights[i].skip = true; // prevent reuse<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return f;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>return null;<br><span style="mso-spacerun: yes">&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp; </span><br><span style="mso-spacerun: yes">&nbsp; </span>/* Determine if there is a route between from and to<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>using breadth-first search. */<br><span style="mso-spacerun: yes">&nbsp; </span>void isflight(String from, String to)<br><span style="mso-spacerun: yes">&nbsp; </span>{<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>int dist, dist2;<br><span style="mso-spacerun: yes">&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;</span>FlightInfo f;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>// This stack is needed by the breadth-first search.<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>Stack resetStck = new Stack();<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>// See if at destination.<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>dist = match(from, to);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>if(dist != 0) {<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>btStack.push(new FlightInfo(from, to, dist));<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>/* Following is the first part of the breadth-first<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>modification.<span style="mso-spacerun: yes">&nbsp; </span>It checks all connecting flights<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>from a specified node. */<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>while((f = find(from)) != null) {<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>resetStck.push(f);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if((dist = match(f.to, to)) != 0) {<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp; </span>resetStck.push(f.to);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>btStack.push(new FlightInfo(from, f.to, f.distance));<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>btStack.push(new FlightInfo(f.to, to, dist));<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>/* The following code resets the skip fields set by<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>preceding while loop. This is also part of the<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>breadth-first modifiction. */<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>int i = resetStck.size();<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>for(; i!=0; i--)<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>resetSkip((FlightInfo) resetStck.pop());<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>// Try another connection.<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>f = find(from);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>if(f != null) {<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>btStack.push(new FlightInfo(from, to, f.distance));<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>isflight(f.to, to);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>else if(btStack.size() &gt; 0) {<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// Backtrack and try another connection.<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>f = (FlightInfo) btStack.pop();<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>isflight(f.from, f.to);<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp; </span>}<br><span style="mso-spacerun: yes">&nbsp; </span>// Reset skip field of specified flight.<br><span style="mso-spacerun: yes">&nbsp; </span>void resetSkip(FlightInfo f) {<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>for(int i=0; i&lt; numFlights; i++)<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(flights[i].from.equals(f.from) &amp;&amp;<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>flights[i].to.equals(f.to))<br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>flights[i].skip = false;<br><span style="mso-spacerun: yes">&nbsp; </span>}<br>}<o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">程序运行结果：<span lang="EN-US"><br><br>C:\java&gt;java Breadth<br>From? New York<br>To? Los Angeles<br>New York to Toronto to Los Angeles<br>Distance is 3000 <o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">C:\java&gt;<o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">它找到了一个合理的解，但这不具有一般性。因为找到的第一条路径取决于信息的物理组织形式。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体"><a href="http://www.java3z.com/cwbwebhome/article/article1/images/2.gif" target="_blank"><span style="mso-ignore: vglayout"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/f237e4d8e644_12765/clip_image005_2.gif"><img onmousewheel="return bbimg(this)" title="点击在新窗口查看原始图片" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px; zoom: 60%" height="408" alt="clip_image005" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/f237e4d8e644_12765/clip_image005_thumb.gif" width="516" border="0" v:shapes="_x0000_i1028"></a></span></a><o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">&nbsp;<o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">如果目标在搜索空间中隐藏得不是太深，那么广度优先搜索的性能会很好。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体"><o:p>&nbsp;</o:p></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/71164.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-01-04 21:03 <a href="http://www.cppblog.com/woaidongmao/archive/2009/01/04/71164.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Larbin 一种高效的搜索引擎爬虫工具</title><link>http://www.cppblog.com/woaidongmao/archive/2009/01/04/71122.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Sun, 04 Jan 2009 06:12:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/01/04/71122.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/71122.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/01/04/71122.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/71122.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/71122.html</trackback:ping><description><![CDATA[<p style="line-height: 150%"><span style="color: black">我就在这里对<span lang="EN-US">larbin</span>做一个简单的介绍。因为相对于复杂的系统来讲，<span lang="EN-US">larbin</span>具有高度的可配置性，和良好的工作效率。１］<span lang="EN-US">larbin</span>的简介<span lang="EN-US"><br>larbin</span>是一种开源的网络爬虫<span lang="EN-US">/</span>网络蜘蛛，由法国的年轻人<span lang="EN-US"> Sébastien Ailleret</span>独立开发。<span lang="EN-US">larbin</span>目的是能够跟踪页面的<span lang="EN-US">url</span>进行扩展的抓取，最后为搜索引擎提供广泛的数据来源。<span lang="EN-US"><?xml:namespace prefix = o /><o:p></o:p></span></span></p> <p style="line-height: 150%"><span lang="EN-US" style="color: black">Larbin</span><span style="color: black">只是一个爬虫，也就是说<span lang="EN-US">larbin</span>只抓取网页，至于如何<span lang="EN-US">parse</span>的事情则由用户自己完成。另外，如何存储到数据库以及建立索引的事情<span lang="EN-US"> larbin</span>也不提供。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span lang="EN-US" style="color: black">latbin</span><span style="color: black">最初的设计也是依据设计简单但是高度可配置性的原则，因此我们可以看到，一个简单的<span lang="EN-US">larbin</span>的爬虫可以每天获取５００万的网页，实在是非常高效。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span lang="EN-US" style="color: black">2] Larbin</span><span style="color: black">的性能特征<span lang="EN-US"><br></span>高效是我对<span lang="EN-US"> larbin </span>的评价。<span lang="EN-US"><br></span>今年四月份的时候我对<span lang="EN-US">larbin</span>的性能做过一个测试，<span lang="EN-US">luliang.dhs.org</span>是我自己常用的服务器，<span lang="EN-US">CPU </span>为<?xml:namespace prefix = st1 /><st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1" unitname="g"><span lang="EN-US">1G</span></st1:chmetcnv>，内存<span lang="EN-US">512</span>，其它的性能一般，因为是三年前购置的。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black">我将我自己的网页 六翼作为入口，运行<span lang="EN-US">larbin</span>进行５层内的<span lang="EN-US">url</span>的抓取。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black">当时纪录的一些数据：<span lang="EN-US"><br>Internet IO: 500-700k/per second </span>（我想大约我的网络下载的瓶颈了吧）<span lang="EN-US"><br>CPU top: 5%-15%<br>disk consume: <st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1" unitname="m">1M</st1:chmetcnv>/s </span>，基本上一个小时爬<span lang="EN-US"> 3</span>个<span lang="EN-US">G </span>的网页。差不多<span lang="EN-US">20</span>万的页面<span lang="EN-US"><br>url </span>解析<span lang="EN-US">: 200</span>万－<span lang="EN-US">300</span>万每小时<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span lang="EN-US" style="color: black">3] larbin </span><span style="color: black">的作用<span lang="EN-US"><br></span>很多人初见<span lang="EN-US"> larbin </span>不知道从哪里下手，那么我来简单介绍一下<span lang="EN-US"> larbin </span>的功能和实际应用。<span lang="EN-US"><br>1. larbin </span>获取单个、确定网站的所有联结，甚至可以镜像一个网站。<span lang="EN-US"><br>2. larbin</span>建立<span lang="EN-US"> url </span>列表群，例如针对所有的网页进行<span lang="EN-US"> url retrive</span>后，进行<span lang="EN-US">xml</span>的联结的获取。或者是<span lang="EN-US"> mp3 </span>。<span lang="EN-US"><br>3. larbin </span>定制后可以作为搜索引擎的信息的来源（例如可以将抓取下来的网页每<span lang="EN-US">2000</span>一组存放在一系列的目录结构里面）。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black">总归，<span lang="EN-US">larbin</span>应当是一个被广大搜索引擎爱好者应当引起注意的一个产品，虽然其功能逐渐被<span lang="EN-US"> Nutch </span>所接受和替代，但是其在爬虫上的优美设计的确值得称道。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 9pt; color: black; line-height: 150%; font-family: arial; mso-bidi-font-size: 10.0pt"><o:p>&nbsp;</o:p></span></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/71122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-01-04 14:12 <a href="http://www.cppblog.com/woaidongmao/archive/2009/01/04/71122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>larbin结构分析</title><link>http://www.cppblog.com/woaidongmao/archive/2009/01/04/71121.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Sun, 04 Jan 2009 06:10:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/01/04/71121.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/71121.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/01/04/71121.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/71121.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/71121.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体">互联网是一个庞大的非结构化的数据库，将数据有效的检索并组织呈现出来有着巨大的应用前景，尤其是类似<span lang="EN-US">RSS</span>的以<span lang="EN-US">XML</span>为基础的结构化的数据越来越多，内<span lang="EN-US"><br></span>容的组织方式越来越灵活，检索组织并呈现会有着越来越广泛的应用范围，同时在时效性和可读性上也会有越来越高的要求。这一切的基础是爬虫，信息的来源入<span lang="EN-US"><br></span>口。一个高效，灵活可扩展的爬虫对以上应用都有着无可替代的重要意义。<span lang="EN-US"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>要设计一个爬虫，首先需要考虑的效率。对于网络而言，基于<span lang="EN-US">TCP/IP</span>的通信编程有几种方法。<span lang="EN-US"><br></span>第一种是单线程阻塞，这是最简单也最容易实现的一种，一个例子：在<span lang="EN-US">Shell</span>中通过<span lang="EN-US">curl</span>，<span lang="EN-US">pcregrep</span>等一系统命令可以直接实现一个简单的<span lang="EN-US"><br></span>爬虫，但同时它的效率问题也显而易见：由于是阻塞方式读取，<span lang="EN-US">dns</span>解析，建立连接，写入请求，读取结果这些步骤上都会产生时间的延迟，从而无法有效的利用<span lang="EN-US"><br></span>服务器的全部资源。<span lang="EN-US"><br></span>第二种是多线程阻塞。建立多个阻塞的线程，分别请求不同的<span lang="EN-US">url</span>。相对于第一种方法，它可以更有效的利用机器的资源，特别是网络资源，因为无数线程<span lang="EN-US"><br></span>在同时工作，所以网络会比较充分的利用，但同时对机器<span lang="EN-US">CPU</span>资源的消耗也是比较大，在用户级多线程间的频繁切换对于性能的影响已经值得我们考虑。<span lang="EN-US"><br></span>第三种是单线程非阻塞。这是目前使用的比较多的一种做法，无论在<span lang="EN-US">client</span>还是<span lang="EN-US">server</span>都有着广泛的应用。在一个线程内打开多个非阻塞的连<span lang="EN-US"><br></span>接，通过<span lang="EN-US">poll/epoll/select</span>对连接状态进行判断，在第一时间响应请求，不但充分利用了网络资源，同时也将本机<span lang="EN-US">CPU</span>资源的消耗降至最低。<span lang="EN-US"><br></span>这种方法需要对<span lang="EN-US">dns</span>请求，连接，读写操作都采用异步非阻塞操作，其中第一种比较复杂，可以采用<span lang="EN-US">adns</span>作为解决方案，后面三个操作相对简单可以直接在程<span lang="EN-US"><br></span>序内实现。<span lang="EN-US"><br></span>效率问题解决后就需要考虑具体的设计问题了。<span lang="EN-US"><br>url</span>肯定需要一个单独的类进行处理，包括显示，分析<span lang="EN-US">url</span>，得到主机，端口，文件数据。<span lang="EN-US"><br></span>然后需要对<span lang="EN-US">url</span>进行排重，需要一个比较大的<span lang="EN-US">url Hash</span>表。<span lang="EN-US"><br></span>如果还要对网页内容进行排重，则还需要一个<span lang="EN-US">Document Hash</span>表。<span lang="EN-US"><br></span>爬过的<span lang="EN-US">url</span>需要记录下来，由于量比较大，我们将它写到磁盘上，所以还需要一个<span lang="EN-US">FIFO</span>的类<span lang="EN-US">(</span>记作<span lang="EN-US">urlsDisk)</span>。<span lang="EN-US"><br></span>现在需要爬的<span lang="EN-US">url</span>同样需要一个<span lang="EN-US">FIFO</span>类来处理，重新开始时，<span lang="EN-US">url</span>会从定时从爬过的<span lang="EN-US">url<br>FIFO</span>里取出来，写到这个<span lang="EN-US">FIFO</span>里。正在运行的爬虫需要从这个<span lang="EN-US">FIFO</span>里读数据出来，加入到主机类的<span lang="EN-US">url</span>列表里。当然，也会从前一个<span lang="EN-US">FIFO</span>里直接<span lang="EN-US"><br></span>读<span lang="EN-US">url</span>出来，不过优先级应该比这个里面出来的<span lang="EN-US">url</span>低，毕竟是已经爬过的。<span lang="EN-US"><br></span>爬虫一般是对多个网站进行爬取，但在同时站点内<span lang="EN-US">dns</span>的请求可以只做一次，这就需要将主机名独立于<span lang="EN-US">url</span>，单独有一个类进行处理。<span lang="EN-US"><br></span>主机名解析完成后需要有一个解析完成的<span lang="EN-US">IP</span>类与之应用，用于<span lang="EN-US">connect</span>的时候使用。<span lang="EN-US"><br>HTML</span>文档的解析类也要有一个，用来分析网页，取出里面的<span lang="EN-US">url</span>，加入到<span lang="EN-US">urlsDisk</span>。<span lang="EN-US"><br></span>再加上一些字符串，调度类，一个简单的爬虫基本上就完成了。<span lang="EN-US"><br></span>以上基本上是<span lang="EN-US">Larbin</span>的设计思路，<span lang="EN-US">Larbin</span>在具体实现上还有一些特殊的处理，例如带了一个<span lang="EN-US">webserver</span>，以及对特殊文件的处理。<span lang="EN-US"><br>Larbin</span>有一点设计不不太好，就是慢的访问会越来越多，占用大量的连接，需要改进，另外如果对于大规模的爬虫，这仅仅实现了抓取的部分，要分布式的扩<span lang="EN-US"><br></span>展还需要增加<span lang="EN-US">url</span>的集中管理与调度以及前台<span lang="EN-US">spider</span>的分布式算法。<span lang="EN-US"><br>Larbin</span>网站爬虫简明使用说明<span lang="EN-US"><br>larbin</span>是一种爬虫工具，我也是前段时间网上看到<span lang="EN-US"> Larbin </span>一种高效的搜索引擎爬虫工具 一文时才知道有这么个东西，初步认定，我比较喜欢这个<span lang="EN-US"><br></span>工具<span lang="EN-US">(</span>比起<span lang="EN-US">nutch</span>的<span lang="EN-US">crawl</span>来说<span lang="EN-US">),</span>因为它是<span lang="EN-US">C++</span>写的，类似<span lang="EN-US">C</span>嘛，我熟，可以自己改改，顺便学习一下<span lang="EN-US">C++(</span>几年来的经验告诉我说：改别人的东西<span lang="EN-US"><br></span>来学一种技术比从头写<span lang="EN-US">helloworld</span>快很多<span lang="EN-US">)</span>。于是开始了我艰辛的<span lang="EN-US">larbin</span>试用之旅。<span lang="EN-US"> <br></span>　　回头看看自己遇到的问题都是由于没认真看文档引起的，唉，老毛病了。下次即使是<span lang="EN-US">E</span>文的也得好好看，不能盲目的试，浪费时间。<span lang="EN-US">&nbsp; <br></span>　　<span lang="EN-US">larbin</span>官方地址：<span lang="EN-US">http://larbin.sourceforge.net/index-eng.html <br><a href="http://www.chinakdd.com/" target="_blank"><span style="color: black; text-decoration: none; text-underline: none"><br></span></a><br><br></span>　　一，编译<span lang="EN-US">&nbsp; <br></span>　　这也好说，<span lang="EN-US">whahahaha</span>，那是！因为从官方网站下下来的代码不能编译通过<span lang="EN-US">(linux gcc</span>下<span lang="EN-US">) <br><a href="http://www.chinakdd.com/" target="_blank"><span style="color: black; text-decoration: none; text-underline: none"><br></span></a><br><br></span>　　<span lang="EN-US">./configure&nbsp; <br></span>　　<span lang="EN-US">make <br><a href="http://www.chinakdd.com/" target="_blank"><span style="color: black; text-decoration: none; text-underline: none"><br></span></a><br><br></span>　　<span lang="EN-US">gcc -O3 -Wall -D_REENTRANT -c -o parse.o parse.c&nbsp; <br></span>　　<span lang="EN-US">parse.c:115: error: conflicting types for ’adns__parse_domain’&nbsp; <br><a href="http://www.chinakdd.com/" target="_blank"><span style="color: black; text-decoration: none; text-underline: none"><br></span></a><br><br></span>　　<span lang="EN-US">internal.h:571: error: previous declaration of ’adns__parse_domain’ was here <br><a href="http://www.chinakdd.com/" target="_blank"><span style="color: black; text-decoration: none; text-underline: none"><br></span></a><br><br></span>　　<span lang="EN-US">parse.c:115: error: conflicting types for ’adns__parse_domain’ <br></span>　　<span lang="EN-US">internal.h:571: error: previous declaration of ’adns__parse_domain’ was here&nbsp; <br><a href="http://www.chinakdd.com/" target="_blank"><span style="color: black; text-decoration: none; text-underline: none"><br></span></a><br><br></span>　　<span lang="EN-US">gmake[1]: *** [parse.o] </span>错误<span lang="EN-US"> 1&nbsp; <br></span>　　<span lang="EN-US">gmake[1]: Leaving directory `/home/leo/leo/larbin-<?xml:namespace prefix = st1 /><st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">2.6.3</st1:chsdate>/adns’ <br></span>　　<span lang="EN-US">make: *** [all] </span>错误<span lang="EN-US"> 2&nbsp; <br></span>　　函数原型和定义不一致这个好改：<span lang="EN-US"> <br><a href="http://www.chinakdd.com/" target="_blank"><span style="color: black; text-decoration: none; text-underline: none"><br></span></a><br><br></span>　　打开<span lang="EN-US">./adns/internal.h</span>文件，把<span lang="EN-US">568</span>－<span lang="EN-US">571</span>行直接注释掉就行了。<span lang="EN-US">&nbsp;&nbsp; <br></span>　　二，运行<span lang="EN-US">&nbsp; <br></span>　　这个就不说了，<span lang="EN-US">./larbin</span>就运行了，<span lang="EN-US">larbin.conf</span>中先进行配置就可以了，这个配置就不说了。。<span lang="EN-US">&nbsp; <br></span>　　运行后可以<span lang="EN-US">http://host:8081 </span>看运行状态，不错的想法。<span lang="EN-US"> larbin.conf</span>中有个：<span lang="EN-US">inputPort 1976</span>配置，<span lang="EN-US"><br></span>就是可以运行时增加要抓取的<span lang="EN-US">URL</span>，这个想法非常好，可是？怎么加呢？象起初那样：<span lang="EN-US">http://host:1976</span>那样是不行的，报错？？？试了好久没<span lang="EN-US"><br></span>结果，最后<span lang="EN-US">GDB</span>跟踪了一下，唉，原来直接<span lang="EN-US">telnet host 1976</span>进行增加就可以了。后来看到文档里写的亲亲楚楚，晕倒。。。。。<span lang="EN-US">&nbsp; <br><a href="http://www.chinakdd.com/" target="_blank"><span style="color: black; text-decoration: none; text-underline: none"><br></span></a><br><br></span>　　三，结果<span lang="EN-US"> <br></span>　　哈哈，下班后找了台机子跑了起来，那晚睡觉的时候都梦见自己的搜索引擎赶<span lang="EN-US">GOOGLE</span>超<span lang="EN-US">BAIDU</span>了，那个兴奋啊。<span lang="EN-US"> <br><a href="http://www.chinakdd.com/" target="_blank"><span style="color: black; text-decoration: none; text-underline: none"><br></span></a><br><br></span>　　第二天上班的时候取看结果，发现目录下除了些<span lang="EN-US">fifo*</span>文件外什么都没有，那个郁闷。没办法啊，再看文档<span lang="EN-US"> How to customize Larbin </span>发现这么段说明：<span lang="EN-US">&nbsp; <br></span>　　<span lang="EN-US">The first thing you can define is the module you want to use for<br>ouput. This defines what you want to do with the pages larbin gets.<br>Here are the different options : <br><a href="http://www.chinakdd.com/" target="_blank"><span style="color: black; text-decoration: none; text-underline: none"><br></span></a><br><br></span>　　<span lang="EN-US">DEFAULT_OUTPUT : This module mainly does nothing, except statistics.&nbsp; <br></span>　　<span lang="EN-US">SIMPLE_SAVE : This module saves pages on disk. It stores 2000 files per directory (with an index). <br><a href="http://www.chinakdd.com/" target="_blank"><span style="color: black; text-decoration: none; text-underline: none"><br></span></a><br><br></span>　　<span lang="EN-US">MIRROR_SAVE : This module saves pages on disk with the hierarchy of the site they come from. It uses one directory per site.&nbsp; <br></span>　　<span lang="EN-US">STATS_OUTPUT : This modules makes some stats on the pages. In<br>order to see the results, see http://localhost:8081/output.html.&nbsp; <br></span>　　靠，默认什么都没输出，于是认真的看了官方网站上仅有的两个文档，修改了<span lang="EN-US">options.h</span>再编译，终于有结果了。<span lang="EN-US"> <br><a href="http://www.chinakdd.com/" target="_blank"><span style="color: black; text-decoration: none; text-underline: none"><br></span></a><br><br></span>　　我的<span lang="EN-US">option</span>中改了：<span lang="EN-US"> <br><a href="http://www.chinakdd.com/" target="_blank"><span style="color: black; text-decoration: none; text-underline: none"><br></span></a><br><br></span>　　<span lang="EN-US">SIMPLE_SAVE </span>简单输出一个目录两千个文件，包含索引。<span lang="EN-US">&nbsp; <br></span>　　<span lang="EN-US">CGILEVEL</span>＝<span lang="EN-US">0 </span>处理服务器端程序，也就是但<span lang="EN-US">url</span>中包含<span lang="EN-US">? &amp; = </span>之类的<span lang="EN-US">querString</span>时也处理。<span lang="EN-US">&nbsp; <br></span>　　<span lang="EN-US">NO_DUP <br><a href="http://www.chinakdd.com/" target="_blank"><span style="color: black; text-decoration: none; text-underline: none"><br></span></a><br><br></span>　　其余可根据各自需要修改，详见：<span lang="EN-US"> How to customize Larbin </span>一文。<span lang="EN-US"> <br><a href="http://www.chinakdd.com/" target="_blank"><span style="color: black; text-decoration: none; text-underline: none"><br></span></a><br><br></span>　　四，问题<span lang="EN-US"> <br><a href="http://www.chinakdd.com/" target="_blank"><span style="color: black; text-decoration: none; text-underline: none"><br></span></a><br><br></span>　　在使用过程中发现，在抓网页的时候，如果<span lang="EN-US">URL</span>中包含未编码<span lang="EN-US">(encodurl)</span>中文时，无法抓取，简单的看了一下在：<span lang="EN-US"><br>src/utils/url.cc</span>中的<span lang="EN-US">fileNormalize </span>有涉及。于是写了个<span lang="EN-US">encodurl</span>函数加在<span lang="EN-US">url</span>类的构造函数里，问题就解决了。<span lang="EN-US"><br><a href="http://www.chinakdd.com/" target="_blank"><span style="color: black; text-decoration: none; text-underline: none"><br></span></a><br><br></span>　　由于需要比较好的可定制性，这个工具似乎还不大满足我的需求，最终我没使用她，而是自己用<span lang="EN-US">perl</span>在<span lang="EN-US">WWW:SimpleRobot</span>的基础上搞了个适合我的。。再说了<span lang="EN-US">perl</span>在字符窜处理上应该不比<span lang="EN-US">C</span>＋＋慢，总的来说那个小工具性能还不错。。呵呵。<span lang="EN-US"> <br><a href="http://www.chinakdd.com/" target="_blank"><span style="color: black; text-decoration: none; text-underline: none"><br></span></a><br><br></span>　　不过还是把这些写出来，给没看文档的朋友（希望很少），也警示自己一定要认真看文档。</span><span lang="EN-US" style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; mso-bidi-font-family: arial"><?xml:namespace prefix = o /><o:p></o:p></span></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/71121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-01-04 14:10 <a href="http://www.cppblog.com/woaidongmao/archive/2009/01/04/71121.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解析cookie欺骗实现过程及具体应用</title><link>http://www.cppblog.com/woaidongmao/archive/2009/01/03/71072.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Sat, 03 Jan 2009 08:44:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/01/03/71072.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/71072.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/01/03/71072.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/71072.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/71072.html</trackback:ping><description><![CDATA[<p style="line-height: 150%"><span style="color: black">　　 正如我们所知道的，在<span lang="EN-US"><a href="http://www.3800hk.com"><span lang="EN-US" style="color: black"><span lang="EN-US">网络</span></span></a></span>词汇中，<span lang="EN-US">cookie</span>是一个特殊的信息，虽然只是<span lang="EN-US"><a href="http://www.3800hk.com"><span lang="EN-US" style="color: black"><span lang="EN-US">服务</span></span></a></span>器存于用户计算机上的一个文本文件，但由于其内容的不寻常性<span lang="EN-US">(</span>与<span lang="EN-US"><a href="http://www.3800hk.com"><span lang="EN-US" style="color: black"><span lang="EN-US">服务</span></span></a></span>器有一定的互交性，且常会存储用户名，甚至口令，或是其它一些敏感信息，例如在江湖或是一些社区中，常会用<span lang="EN-US">cookie</span>来保存用户集分，等级等等<span lang="EN-US">)</span>。因而成为一些高手关注的对像，借此来取得特殊权限，甚至攻克整个网站。本人出些拙作，以<span lang="EN-US">java script</span>中对<span lang="EN-US">cookie</span>的应用，来说初步说明<span lang="EN-US">cookie</span>欺骗的实现过程及具体应用。<span lang="EN-US"> <br></span>　　<span lang="EN-US"> <br></span>　　一、<span lang="EN-US">cookie</span>的建立<span lang="EN-US"> <br></span>　　<span lang="EN-US"> <br></span>　　在讲如何建立<span lang="EN-US">cookie</span>之前，我们先来了解一下<span lang="EN-US">cookie</span>的基本格式：<span lang="EN-US"> <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">cookiename+cookievalue;expire=expirationdategmt;path=urlpath;domain=sitedomain <br></span>　　<span lang="EN-US"> <br></span>　　其中各项以<span lang="EN-US">;</span>分开，首先是指定<span lang="EN-US">cookie</span>的名称，并为其赋值。接下来分别是<span lang="EN-US">cookie</span>的有效期，<span lang="EN-US">url</span>路径以及<span lang="EN-US"><a href="http://www.3800hk.com"><span lang="EN-US" style="color: black"><span lang="EN-US">域名</span></span></a></span>，在这几项中，除了第一项以外，其它部分均为可先项。<span lang="EN-US"><?xml:namespace prefix = o /><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black">　　下面我们来看一段代码，了解一下<span lang="EN-US">cookie</span>究竟是怎样建立的：<span lang="EN-US"> <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">&lt;HTML&gt; <br></span>　　<span lang="EN-US">&lt;HEAD&gt; <br></span>　　<span lang="EN-US">&lt;TITLE&gt;Set a cookie based on a form&lt;/TITLE&gt; <br></span>　　<span lang="EN-US">&lt;SCRIPT LANGUAGE="java script" TYPE="TEXT/java script"&gt; <br></span>　　<span lang="EN-US">&lt;!-- Hide script from older browsers <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">expireDate = new Date <br></span>　　<span lang="EN-US">expireDate.setMonth(expireDate.getMonth()+6) <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">userName = "" <br></span>　　<span lang="EN-US">if (documents .cookie != "") { <br></span>　　<span lang="EN-US">userName = documents .cookie.split("=")[1] <br></span>　　<span lang="EN-US">} <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">function setCookie() { <br></span>　　<span lang="EN-US">userName = document.myform.nameField.value <br></span>　　<span lang="EN-US">documents .cookie = "userName="+userName+";expires=" + expireDate.toGMTString() <br></span>　　<span lang="EN-US">} <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">// End hiding script --&gt; <br></span>　　<span lang="EN-US">&lt;/SCRIPT&gt; <br></span>　　<span lang="EN-US">&lt;/HEAD&gt; <br></span>　　<span lang="EN-US">&lt;BODY BGCOLOR="WHITE" onLoad="document.myform.nameField.value = userName"&gt; <br></span>　　<span lang="EN-US">&lt;form NAME="myform"&gt; <br></span>　　<span lang="EN-US">&lt;H1&gt;Enter your name:&lt;INPUT TYPE="TEXT" NAME="nameField" onBlur="setCookie()"&gt;&lt;/H1&gt; <br></span>　　<span lang="EN-US">&lt;/form&gt; <br></span>　　<span lang="EN-US">&lt;/BODY&gt; <br></span>　　<span lang="EN-US">&lt;/HTML&gt; <br></span>　　这是一锻简单的建立<span lang="EN-US">cookie</span>的脚本。<span lang="EN-US"> <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">1</span>，<span lang="EN-US">&lt;SCRIPT LANGUAGE="java script" TYPE="TEXT/java script"&gt; <br></span>　　<span lang="EN-US"> <br></span>　　脚本开始的标记，由此一句告诉浏览器以下将是<span lang="EN-US">java script. <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">2,&lt;!-- Hide script from older browsers <br></span>　　<span lang="EN-US"> <br></span>　　为了防止浏览器不能识别脚本，而让浏览器误以为是<span lang="EN-US">HTML</span>注释而忽略它。<span lang="EN-US"> <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">3</span>，<span lang="EN-US">expireDate = new Date <br></span>　　<span lang="EN-US"> <br></span>　　获取当前日期，并存入变量<span lang="EN-US">expireDate</span>中。<span lang="EN-US"> <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">4</span>，<span lang="EN-US">expireDate.setMonth(expireDate.getMonth()+6) <br></span>　　<span lang="EN-US"> <br></span>　　获取当前月份值，将其加<span lang="EN-US">6</span>后设置为<span lang="EN-US">expireDate</span>的月份总值部分。这意味着本<span lang="EN-US">cookie</span>的有效期为<span lang="EN-US">6</span>个月。<span lang="EN-US"> <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">5</span>，<span lang="EN-US">if (documents .cookie != "") <br></span>　　<span lang="EN-US"> <br></span>　　如果<span lang="EN-US">document</span>的值不为空，相当于检查用户硬盘上是否已经有了<span lang="EN-US">cookie</span>。<span lang="EN-US"> <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">6</span>，<span lang="EN-US">userName = documents .cookie.split("=")[1] <br></span>　　<span lang="EN-US"> <br></span>　　此处用到了<span lang="EN-US">split("=")</span>函数，它的功能是把<span lang="EN-US">cookie</span>记录分割为数组，<span lang="EN-US">cookie</span>的名为<span lang="EN-US">cookie[0],</span>值为<span lang="EN-US">cookie[1],</span>以此累推。所以此处<span lang="EN-US">documents .cookie.split("=")[1]</span>返回的值是此<span lang="EN-US">cookie</span>的值。在此句中将值赋给了变量<span lang="EN-US">username</span>。<span lang="EN-US"> <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">7</span>，<span lang="EN-US">function setCookie() <br></span>　　<span lang="EN-US"> <br></span>　　设置名为<span lang="EN-US">setCookie</span>的函数。<span lang="EN-US"> <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">8</span>，<span lang="EN-US">documents .cookie = "userName="+userName+";expires=" + expireDate.toGMTString() <br></span>　　<span lang="EN-US"> <br></span>　　此句是将设置好的<span lang="EN-US">cookie</span>写入用户硬盘。<span lang="EN-US">expireDate.toGMTString()</span>把<span lang="EN-US">expireDate</span>中的值转换为文本字符串，这样才能写入<span lang="EN-US">cookie</span>中。<span lang="EN-US"> <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">9</span>，<span lang="EN-US">onLoad="document.myform.nameField.value = userName" <br></span>　　<span lang="EN-US"> <br></span>　　当页面载入时，把<span lang="EN-US">username</span>的值写入文本框<span lang="EN-US">(</span>如果有的话<span lang="EN-US">)</span>。<span lang="EN-US"> <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">10</span>，<span lang="EN-US">onBlur="setCookie()" <br></span>　　<span lang="EN-US"> <br></span>　　当用户离开文本框时，<span lang="EN-US">onBlur</span>调用函数<span lang="EN-US">setCookie</span>。<span lang="EN-US"> <br></span>　　<span lang="EN-US"> <br></span>　　结合上面的注释，读那段代码相信不成问题吧<span lang="EN-US">!</span>既然我们可以建立<span lang="EN-US">cookie</span>，那么读取也不是什么难事，请接着往下看<span lang="EN-US">!<o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black">　　<strong><span style="font-family: 宋体; mso-bidi-font-family: 宋体">二、读取和显示<span lang="EN-US">cookie </span></span></strong><b><span lang="EN-US"><br></span></b>　　<span lang="EN-US"> <br></span>　　一般来说，<span lang="EN-US">cookie</span>的作者并不希望<span lang="EN-US">cookie</span>被显示出来，这是当然的<span lang="EN-US">!</span>天知道里面写了些什么<span lang="EN-US">!</span>？然而这也是我们想要读出它的原因<span lang="EN-US">!~~~:D <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">&lt;HTML&gt; <br></span>　　<span lang="EN-US">&lt;HEAD&gt; <br></span>　　<span lang="EN-US">&lt;TITLE&gt;Cookie Check&lt;/TITLE&gt; <br></span>　　<span lang="EN-US">&lt;/HEAD&gt; <br></span>　　<span lang="EN-US">&lt;BODY BGCOLOR="WHITE"&gt; <br></span>　　<span lang="EN-US">&lt;H2&gt; <br></span>　　<span lang="EN-US">&lt;SCRIPT LANGUAGE="java script" TYPE="TEXT/java script"&gt; <br></span>　　<span lang="EN-US">&lt;!-- Hide script from older browsers <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">if (documents .cookie == "") { <br></span>　　<span lang="EN-US">document.write("There are no cookies here") <br></span>　　<span lang="EN-US">} <br></span>　　<span lang="EN-US">else { <br></span>　　<span lang="EN-US">thisCookie = documents .cookie.split("; ") <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">for (i=0; i&lt;thisCookie.length; i++) { <br></span>　　<span lang="EN-US">document.write("Cookie name is ’"+thisCookie.split("=")[0]) <br></span>　　<span lang="EN-US">document.write("’, and the value is ’"+thisCookie.split("=")[1]+"’&lt;BR&gt;") <br></span>　　<span lang="EN-US">} <br></span>　　<span lang="EN-US">} <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">// End hiding script --&gt; <br></span>　　<span lang="EN-US">&lt;/SCRIPT&gt; <br></span>　　<span lang="EN-US">&lt;/H2&gt; <br></span>　　<span lang="EN-US">&lt;/BODY&gt; <br></span>　　<span lang="EN-US">&lt;/HTML&gt; <br></span>　　<span lang="EN-US"> <br></span>　　以上的便是一段读取<span lang="EN-US">cookie</span>的名字和值的脚本。上文中解释过的语句在此不多赘述，且看有什么新的语法：<span lang="EN-US"> <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">1</span>，<span lang="EN-US">thisCookie = documents .cookie.split("; ")[</span>注意：并非前文中出现过的<span lang="EN-US">split("=")</span>。<span lang="EN-US"> <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">split("; ")</span>可以产生数组的结果，本句中，由<span lang="EN-US">documents .cookie.split("; ")</span>来获取<span lang="EN-US">cookie</span>的值，并将这个数组赋值缎带变量：<span lang="EN-US">thisCookie</span>。<span lang="EN-US"> <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">2</span>，<span lang="EN-US">for (i=0; i&lt;thisCookie.length; i++) <br></span>　　<span lang="EN-US"> <br></span>　　设置计算器变量<span lang="EN-US">i</span>的值为<span lang="EN-US">0</span>，如果其值小于<span lang="EN-US">thisCookie.length(thisCookie</span>中值的个数<span lang="EN-US">)</span>，将<span lang="EN-US">i</span>的值加<span lang="EN-US">1</span>。<span lang="EN-US"> <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">3</span>，<span lang="EN-US">document.write("Cookie name is ’"+thisCookie.split("=")[0]) <br></span>　　<span lang="EN-US"> <br></span>　　此句中<span lang="EN-US">thisCookie.split("=")[0]</span>较难理解，上面的脚本中，<span lang="EN-US">thiscookie</span>已经被赋值为一个数组的值，那么<span lang="EN-US">thisCookie</span>是指数组中第<span lang="EN-US">i</span>个值，也就是第<span lang="EN-US">i</span>个<span lang="EN-US">cookie</span>，而由上文可知<span lang="EN-US">split("=")[0]</span>是指<span lang="EN-US">cookie</span>的名字。<span lang="EN-US"><br><br></span>　　这样<span lang="EN-US">thisCookie.split("=")[0]</span>便是第<span lang="EN-US">i</span>的<span lang="EN-US">cookie</span>中<span lang="EN-US">cookie</span>的名字<span lang="EN-US">! <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">4,document.write("’, and the value is ’"+thisCookie.split("=")[1] <br></span>　　<span lang="EN-US"> <br></span>　　跟<span lang="EN-US">3</span>极为相似，即是第<span lang="EN-US">i</span>个<span lang="EN-US">cookie</span>中<span lang="EN-US"> cookie</span>的值。<span lang="EN-US"> <br></span>　　<span lang="EN-US"> <br></span>　　到此，我们已经熟悉了如何建立<span lang="EN-US">cookie</span>以及它的读取。这些也正是<span lang="EN-US">cookie</span>欺骗也需要的主要<span lang="EN-US"><a href="http://www.3800hk.com"><span lang="EN-US" style="color: black"><span lang="EN-US">技术</span></span></a>!<o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black">　　<strong><span style="font-family: 宋体; mso-bidi-font-family: 宋体">三、<span lang="EN-US">cookie</span>欺骗的实现 </span></strong><b><span lang="EN-US"><br></span></b>　　<span lang="EN-US"> <br></span>　　要做到<span lang="EN-US">cookie</span>欺骗，最重要的是理解目标<span lang="EN-US">cookie</span>中的储值情况，并设法改变它。由上面的学习我们知道，基于<span lang="EN-US">cookie</span>的格式所限，一般来说，只有在<span lang="EN-US">Cookie.split("=")[0]</span>和<span lang="EN-US">Cookie.split("=")[1]</span>中的值对我们才是有用的。也就是说只需改变这两处或是处的值即可达到我们的目的。<span lang="EN-US"> <br><br></span>　　而在实际操作中，还得先解决另一个问题。由于受浏览器的内部<span lang="EN-US">cookie</span>机制所限，每个<span lang="EN-US">cookie</span>只能被它的原<span lang="EN-US"><a href="http://www.3800hk.com"><span lang="EN-US" style="color: black"><span lang="EN-US">服务</span></span></a></span>器所访问<span lang="EN-US">!</span>可我们总不能跑到人家<span lang="EN-US"><a href="http://www.3800hk.com"><span lang="EN-US" style="color: black"><span lang="EN-US">服务</span></span></a></span>器上操作吧<span lang="EN-US">!</span>这里就需要一个小技巧了。<span lang="EN-US"><br><br></span>　　在上面我们提到过<span lang="EN-US">cookie</span>的格式，最后两项中分别是它的<span lang="EN-US">url</span>路径和<span lang="EN-US"><a href="http://www.3800hk.com"><span lang="EN-US" style="color: black"><span lang="EN-US">域名</span></span></a></span>。不难想到，<span lang="EN-US"><a href="http://www.3800hk.com"><span lang="EN-US" style="color: black"><span lang="EN-US">服务</span></span></a></span>器对<span lang="EN-US">cookie</span>的识别靠的就是这个<span lang="EN-US">! <br><br></span>　　而在平时，我们要浏览一个网站时，输入的<span lang="EN-US">url</span>便是它的<span lang="EN-US"><a href="http://www.3800hk.com"><span lang="EN-US" style="color: black"><span lang="EN-US">域名</span></span></a></span>，需要经过<span lang="EN-US"><a href="http://www.3800hk.com"><span lang="EN-US" style="color: black"><span lang="EN-US">域名</span></span></a></span>管理系统<span lang="EN-US">dns</span>将其转化为<span lang="EN-US">IP</span>地址后进行连接的。这其中就有一个空当。如果能在<span lang="EN-US">dns</span>上做手脚，把目标<span lang="EN-US"><a href="http://www.3800hk.com"><span lang="EN-US" style="color: black"><span lang="EN-US">域名</span></span></a></span>的<span lang="EN-US">IP</span>地址对应到其它站点上，我们便可以非法访问目标站点的<span lang="EN-US">cookie</span>了<span lang="EN-US">! <br><br></span>　　做到这一点并不难，当然我不并不是要去操纵<span lang="EN-US">dns</span>，而且那也是不可能的事情。在<span lang="EN-US">win9</span>下的安装目录下，有一 名为<span lang="EN-US">hosts.sam</span>的文件，以文本方式打开后会看到这样的格式：<span lang="EN-US"><br><br></span>　　<span lang="EN-US">127.0.0.1 lockhost #</span>注释<span lang="EN-US"> <br><br></span>　　利用它，我们便可以实现<span lang="EN-US"><a href="http://www.3800hk.com"><span lang="EN-US" style="color: black"><span lang="EN-US">域名</span></span></a></span>解析的本地化<span lang="EN-US">!</span>而且其优先权高于<span lang="EN-US"><a href="http://www.3800hk.com"><span lang="EN-US" style="color: black"><span lang="EN-US">网络</span></span></a></span>中的<span lang="EN-US">dns! <br><br></span>　　具体使用时，只需将<span lang="EN-US">IP</span>和<span lang="EN-US"><a href="http://www.3800hk.com"><span lang="EN-US" style="color: black"><span lang="EN-US">域名</span></span></a></span>依上面的格式添加，并另存为<span lang="EN-US">hosts</span>即可<span lang="EN-US">!(</span>注意：此文件无后赘名，并非<span lang="EN-US">hosts.sam </span>文件本身<span lang="EN-US">!) <br></span>　　<span lang="EN-US"> <br></span>　　到此，<span lang="EN-US">cookie</span>欺骗所需的所以知识已经齐备。下面以一个<span lang="EN-US">“</span>假<span lang="EN-US">”</span>的例子，演示一下如何进入实战<span lang="EN-US">.(</span>不便给出真实地址，以免引起犯罪<span lang="EN-US">!~~~:P) <br></span>　　假设目标站点是 <span lang="EN-US"><a href="http://www.xxx.com/"><span style="color: black">www.xxx.com</span></a> <br></span>　　<span lang="EN-US"><a href="http://www.self.com/"><span style="color: black">www.self.com</span></a></span>是自己的站点。<span lang="EN-US">(</span>可以用来存放欺骗目标所需的文件，用来读取和修改对方的<span lang="EN-US">cookie.) <br><br></span>　　首先<span lang="EN-US">ping</span>出<span lang="EN-US"><a href="http://www.self.com/"><span style="color: black">www.self.com</span></a></span>的<span lang="EN-US">IP</span>地址：<span lang="EN-US"><br><br></span>　　<span lang="EN-US">ping <a href="http://www.self.com/"><span style="color: black">www.self.com</span></a> <br></span>　　<span lang="EN-US"> <br></span>　　<span lang="EN-US">Reply from <?xml:namespace prefix = st1 /><st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">12.34.56</st1:chsdate>.78: bytes=32 time=20ms TTL=244 <br></span>　　<span lang="EN-US"> <br></span>　　然后修改<span lang="EN-US">hosts.sam</span>文件如下：<span lang="EN-US"> <br></span>　　<span lang="EN-US"> <br></span><st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">　　<span lang="EN-US">12.34.56</span></st1:chsdate><span lang="EN-US">.78 <a href="http://www.xxx.com/"><span style="color: black">www.xxx.com</span></a> <br></span>　　并保存为<span lang="EN-US">hosts</span>。<span lang="EN-US"> <br></span>　　<span lang="EN-US"> <br></span>　　将用来读取<span lang="EN-US">cookie</span>的页面传至<span lang="EN-US"><a href="http://www.self.com/"><span style="color: black">www.self.com</span></a>(</span>脚本如二所示<span lang="EN-US">)</span>。<span lang="EN-US"> <br></span>　　此时连上<span lang="EN-US"><a href="http://www.xxx.com/"><span style="color: black">www.xxx.com</span></a></span>。由于我们已经对<span lang="EN-US">hosts</span>动过手脚，这时来到的并不是<span lang="EN-US"><a href="http://www.xxx.com/"><span style="color: black">www.xxx.com</span></a></span>，而是<span lang="EN-US"><a href="http://www.self.com/"><span style="color: black">www.self.com</span></a> <br><br></span>　　<span lang="EN-US"><a href="http://www.xxx.com/"><span style="color: black">www.xxx.com</span></a></span>设在本地的<span lang="EN-US">cookie</span>便可被读出<span lang="EN-US">!~~:D <br><br></span>　　然后根据具体情况修改一的脚本，用同样的方法，向此<span lang="EN-US">cookie</span>中写入<span lang="EN-US"><a href="http://www.3800hk.com"><span lang="EN-US" style="color: black"><span lang="EN-US">数据</span></span></a></span>。修改完毕后，删掉<span lang="EN-US">hosts</span>文件，再重新进入<span lang="EN-US"><a href="http://www.xxx.com/"><span style="color: black">www.xxx.com</span></a></span>，此时已经大功告成，可享受你的<span lang="EN-US">hack</span>成果了<span lang="EN-US">!~~~:) <br></span>　　<span lang="EN-US"> <br></span>　　<strong><span style="font-family: 宋体; mso-bidi-font-family: 宋体">编后</span></strong><b><span lang="EN-US"><br><br></span></b>　　<span lang="EN-US">cookie</span>欺骗是一种发现较早，且较难使用的<span lang="EN-US">hack</span>手法，除了<span lang="EN-US">java script </span>可以控制以外，<span lang="EN-US">asp</span>等也可以用来对其进进设置。所以在此声明，未必能对所有站点有较。但<span lang="EN-US"><a href="http://www.3800hk.com"><span lang="EN-US" style="color: black"><span lang="EN-US">技术</span></span></a></span>真实，无须置疑<span lang="EN-US">! <br></span>　　<span lang="EN-US"> <br></span>　　补充：在<span lang="EN-US">win2000</span>中<span lang="EN-US">hosts</span>文件的建立与<span lang="EN-US">win98</span>不同，需要<span lang="EN-US">c:\winnt\system32\drivers\etc</span>文件夹中创建<span lang="EN-US">!<o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; color: black; line-height: 150%; font-family: arial"><o:p>&nbsp;</o:p></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></span></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/71072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-01-03 16:44 <a href="http://www.cppblog.com/woaidongmao/archive/2009/01/03/71072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpWatch工具简介及使用技巧</title><link>http://www.cppblog.com/woaidongmao/archive/2009/01/03/71070.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Sat, 03 Jan 2009 07:42:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/01/03/71070.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/71070.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/01/03/71070.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/71070.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/71070.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HttpWatch download url:http://y8r9wg.blu.livefilestore.com/y1pO-ZAVV79QPsLDCb1ZVjNP8xc9kFEG7X2zsGQohemNzLBxxJdHkg-aEalzIwYH0uImhbgqrTd5ak/HttpWatch.Professional.v5.2.16%E6%B3%A8%E5%86%8C%E7%89%88.rar?...&nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2009/01/03/71070.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/71070.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-01-03 15:42 <a href="http://www.cppblog.com/woaidongmao/archive/2009/01/03/71070.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Yahoo!网站性能最佳体验的34条黄金守则</title><link>http://www.cppblog.com/woaidongmao/archive/2009/01/03/71069.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Sat, 03 Jan 2009 07:35:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/01/03/71069.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/71069.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/01/03/71069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/71069.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/71069.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Yahoo!的Exceptional Performance团队为改善Web性能带来最佳实践。他们为此进行了一系列的实验、开发了各种工具、写了大量的文章和博客并在各种会议上参与探讨。最佳实践的核心就是旨在提高网站性能。Excetional Performance团队总结出了一系列可以提高网站速度的方法。可以分为7大类34条。包括内容、服...&nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2009/01/03/71069.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/71069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-01-03 15:35 <a href="http://www.cppblog.com/woaidongmao/archive/2009/01/03/71069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>给Tomcat，Apache配置gzip压缩(HTTP压缩)功能</title><link>http://www.cppblog.com/woaidongmao/archive/2009/01/03/71064.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Sat, 03 Jan 2009 06:13:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/01/03/71064.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/71064.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/01/03/71064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/71064.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/71064.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HTTP 压缩可以大大提高浏览网站的速度。相对于普通的浏览过程HTML ,CSS,Javascript , Text ，它可以节省40%左右的流量。更为重要的是，它可以对动态生成的，包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩，压缩效率惊人一，对于Tomcat5.0以后的版本是支持对输出内容进行压缩的.　使用的是gzip压缩格式下面是tomca...&nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2009/01/03/71064.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/71064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-01-03 14:13 <a href="http://www.cppblog.com/woaidongmao/archive/2009/01/03/71064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>介绍两个b/s开发中我常用到的小工具</title><link>http://www.cppblog.com/woaidongmao/archive/2009/01/03/71063.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Sat, 03 Jan 2009 06:11:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/01/03/71063.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/71063.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/01/03/71063.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/71063.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/71063.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="margin-left: 1.45pt; text-indent: 24pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">第一个是微软的一个小东西<span lang="EN-US">,</span>利用这个能够很轻松的掌握网页的<span lang="EN-US">DOM</span>结构<span lang="EN-US">,</span>对应那些结构比较复制的网页分析很有特效<span lang="EN-US">.<?xml:namespace prefix = o /><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 1.45pt; text-indent: 24pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/bs_C772/clip_image002_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; width: 666px; border-bottom: 0px; height: 500px" height="504" alt="clip_image002" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/bs_C772/clip_image002_thumb.jpg" width="670" border="0" v:shapes="_x0000_i1025"></a><o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 1.45pt; text-indent: 24pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;<o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 1.45pt; text-indent: 24pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">iedevtoolbar</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">下载地址如下<span lang="EN-US">:<o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 1.45pt; text-indent: 24pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">本地（较老版本）：<span lang="EN-US"><a href="http://files.cnblogs.com/JustinYoung/iedevtoolbar.rar"><span style="color: #a91718; text-decoration: none; text-underline: none">http://files.cnblogs.com/JustinYoung/iedevtoolbar.rar</span></a><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 1.45pt; text-indent: 24pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">官方（最新版本）：<span lang="EN-US"><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e59c3964-672d-4511-bb3e-2d5e1db91038&amp;DisplayLang=en"><span style="color: #a91718; text-decoration: none; text-underline: none">http://www.microsoft.com/downloads/details.aspx?FamilyID=e59c3964-672d-4511-bb3e-2d5e1db91038&amp;DisplayLang=en</span></a><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 1.45pt; text-indent: 24pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;<o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 1.45pt; text-indent: 24pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">第二个是<span lang="EN-US">httpwatchpro,</span>这个工具主要功能是监视<span lang="EN-US">http</span>的数据<span lang="EN-US">,</span>但是它也能让你看到相关网页或者样式表文件的内容<span lang="EN-US">.<o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 1.45pt; text-indent: 24pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/bs_C772/clip_image004_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; width: 645px; border-bottom: 0px; height: 485px" height="489" alt="clip_image004" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/bs_C772/clip_image004_thumb.jpg" width="649" border="0" v:shapes="_x0000_i1026"></a><o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 1.45pt; text-indent: 24pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;<o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 1.45pt; text-indent: 24pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">httpwatchpro</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">下载下载地址如下<span lang="EN-US">:<o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 1.45pt; text-indent: 24pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">大小限制，分卷压缩。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 1.45pt; text-indent: 24pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><a href="http://files.cnblogs.com/JustinYoung/httpwatchpro-v4.1.part1.rar"><span style="color: #a91718; text-decoration: none; text-underline: none">http://files.cnblogs.com/JustinYoung/httpwatchpro-v4.1.part1.rar</span></a><o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 1.45pt; text-indent: 24pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><a href="http://files.cnblogs.com/JustinYoung/httpwatchpro-v4.1.part2.rar"><span style="color: #a91718; text-decoration: none; text-underline: none">http://files.cnblogs.com/JustinYoung/httpwatchpro-v4.1.part2.rar</span></a><o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 1.45pt; text-indent: 24pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;<o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 1.45pt; text-indent: 24pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">这两个软件都很简单<span lang="EN-US">,</span>只有简单的几个英文单词<span lang="EN-US">,</span>所以也没有必要用汉化版<span lang="EN-US">.</span>估计也没有人会去做汉化版<span lang="EN-US">.</span>但是真是这些简单小巧的软件让我们的工作效率有了很大的提高<span lang="EN-US">.</span>工欲善其事<span lang="EN-US">,</span>必先善其器<span lang="EN-US">.<o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 1.45pt; text-indent: 24pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;<o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 1.45pt; text-indent: 24pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">KeyWord</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">：<span lang="EN-US">web</span>开发工具<span lang="EN-US">,web</span>开发小软件<span lang="EN-US">,</span>网页开发工具<span lang="EN-US">,</span>网页开发小软件<span lang="EN-US">,iedevtoolbar</span>下载<span lang="EN-US">,iedevtoolbar</span>教程<span lang="EN-US">,iedevtoolbar</span>使用<span lang="EN-US">,iedevtoolbar</span>帮助<span lang="EN-US">,httpwatch</span>下载<span lang="EN-US">,httpwatch</span>教程<span lang="EN-US">,httpwatch</span>帮助<span lang="EN-US">,httpwatch</span>使用<span lang="EN-US">,httpwatchpro</span>下载<span lang="EN-US">,httpwatchpro</span>教程<span lang="EN-US">,httpwatchpro</span>帮助<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/71063.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-01-03 14:11 <a href="http://www.cppblog.com/woaidongmao/archive/2009/01/03/71063.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何提高网页的效率（下篇）&amp;mdash;&amp;mdash;Use YSlow to know why your web Slow</title><link>http://www.cppblog.com/woaidongmao/archive/2009/01/03/71062.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Sat, 03 Jan 2009 06:09:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/01/03/71062.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/71062.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/01/03/71062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/71062.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/71062.html</trackback:ping><description><![CDATA[<p></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">网站最重要的东西是什么？<span lang="EN-US"><br>——</span>内容？<span lang="EN-US">SEO</span>（搜索引擎优化）？<span lang="EN-US">UE</span>（用户体验）？都不对！是速度！<span lang="EN-US"><br></span>内容再丰富的网站，如果慢到无法访问也是毫无意义的； <span lang="EN-US">SEO</span>做的再好的网站，如果搜索蜘蛛抓不到也是白搭<span lang="EN-US">(</span>页面效率和搜索蜘蛛之间的关系，需要进一步的确认，此为和上篇保持统一<span lang="EN-US">)</span>；<span lang="EN-US"> UE</span>设计的再人性化的网站，如果用户连看都看不到也是空谈。 <span lang="EN-US"><?xml:namespace prefix = o /><o:p></o:p></span></span></p> <p style="line-height: 150%">所以网页的效率绝对是最值得关注的方面。虽然我们在<span lang="EN-US"><a title="《如何提高网页的效率(上篇)&mdash;&mdash;提高网页效率的14条准则》" href="http://www.cnblogs.com/JustinYoung/archive/2007/11/20/speeding-up-web-site-14rule.html" target="_blank"> <span lang="EN-US"><span lang="EN-US">《如何提高网页的效率（上篇）——</span></span><span lang="EN-US"><span lang="EN-US">提高网页效率的14</span></span><span lang="EN-US"><span lang="EN-US">条准则》</span></span></a></span>提到了如何提高网页效率的<span lang="EN-US">14</span>条准则，但是如何知道我们现在的网页的效率到底如何？到底处于怎样一个级别？又有哪些方面做的不够好，需要改进呢？也许，你会说，问一下用户不就知道了吗？但是相比感性比例占据太大的用户感受而言，理性的工具和数据更具有说服力。本篇就将向你介绍一款评测网页效率的工具<span lang="EN-US">——YSlow</span>（<span lang="EN-US">why slow</span>，这个名字起的太好了）。<span lang="EN-US"><o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体"><a title="yslow,yslow Logo" href="http://justinyoung.cnblogs.com/" target="_blank"><span style="text-decoration: none; text-underline: none"><span style="mso-ignore: vglayout"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image001_2.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="36" alt="clip_image001" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image001_thumb.gif" width="36" border="0" v:shapes="_x0000_i1025"></a></span></span></a><br>yslow<o:p></o:p></span></p> <p style="line-height: 150%"><span lang="EN-US"><a title="YSlow" href="http://developer.yahoo.com/yslow/" target="_blank">YSlow</a></span>是由<span lang="EN-US"><a title="Yahoo开发者团队" href="http://developer.yahoo.com/" target="_blank">Yahoo<span lang="EN-US"><span lang="EN-US">开发者团队</span></span></a></span>发布的一款基于<span lang="EN-US">Firebug</span>的插件。而<span lang="EN-US"><a title="Firebug" href="https://addons.mozilla.org/en-US/firefox/addon/5369" target="_blank">Firebug</a> </span>又是一款基于<span lang="EN-US">FireFox</span>的插件。所以说<span lang="EN-US">YSlow</span>是一款基于<span lang="EN-US">FireFox</span>插件的插件。虽然有点绕，但是最终说明的问题是：<span lang="EN-US"><o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 11.25pt; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 10pt; line-height: 150%; font-family: symbol; mso-bidi-font-family: symbol; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: symbol"><span style="mso-list: ignore">·<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">很遗憾，微软的<span lang="EN-US">IE</span>系列浏览器不能使用<span lang="EN-US">YSlow</span>。 <span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 11.25pt; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 10pt; line-height: 150%; font-family: symbol; mso-bidi-font-family: symbol; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: symbol"><span style="mso-list: ignore">·<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体">YSlow</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">只能使用在<span lang="EN-US">FireFox</span>浏览器上。 <span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 11.25pt; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 10pt; line-height: 150%; font-family: symbol; mso-bidi-font-family: symbol; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: symbol"><span style="mso-list: ignore">·<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">如果要想使用<span lang="EN-US">YSlow</span>，那么你必须先安装<span lang="EN-US">FireFox</span>。 <span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 11.25pt; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 10pt; line-height: 150%; font-family: symbol; mso-bidi-font-family: symbol; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: symbol"><span style="mso-list: ignore">·<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">如果要想使用<span lang="EN-US">YSlow</span>，那么你就要安装<span lang="EN-US">FireFox</span>上的<span lang="EN-US">Firebug</span>插件。 <span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%">这看上去好像有点令人沮丧，但是事实上它并不像想象中的那么麻烦，只要按照下面的步骤你将能很快的使用<span lang="EN-US">YSlow</span>：<span lang="EN-US"><o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 24pt; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体"><span style="mso-list: ignore">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">到<span lang="EN-US"><a href="http://www.mozilla.net.cn/firefox/">http://www.mozilla.net.cn/firefox/</a><a href="http://www.mozilla.net.cn/firefox/" target="_blank"><span style="text-decoration: none; text-underline: none"><span style="mso-ignore: vglayout"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image002_2.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="16" alt="clip_image002" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image002_thumb.gif" width="16" border="0" v:shapes="_x0000_i1026"></a></span></span></a> </span>下载最新版的<span lang="EN-US">FireFox</span>，并安装它。当然如果你已经安装了<span lang="EN-US">FireFox</span>可以跳过此步。 <span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 24pt; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体"><span style="mso-list: ignore">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">到<span lang="EN-US"><a href="https://addons.mozilla.org/en-US/firefox/addon/1843/">https://addons.mozilla.org/en-US/firefox/addon/1843/</a><a href="https://addons.mozilla.org/en-US/firefox/addon/1843/" target="_blank"><span style="text-decoration: none; text-underline: none"><span style="mso-ignore: vglayout"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image002_4.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="16" alt="clip_image002" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image002_thumb_1.gif" width="16" border="0" v:shapes="_x0000_i1027"></a></span></span></a> </span>下载最新版的<span lang="EN-US">Firebug</span>，并安装它。当然如果你已经安装了<span lang="EN-US">Firebug</span>可以跳过此步。 <span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 24pt; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体"><span style="mso-list: ignore">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">到<span lang="EN-US"><a href="https://addons.mozilla.org/en-US/firefox/addon/5369/">https://addons.mozilla.org/en-US/firefox/addon/5369/</a><a href="https://addons.mozilla.org/en-US/firefox/addon/5369/" target="_blank"><span style="text-decoration: none; text-underline: none"><span style="mso-ignore: vglayout"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image002_6.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="16" alt="clip_image002" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image002_thumb_2.gif" width="16" border="0" v:shapes="_x0000_i1028"></a></span></span></a> </span>下载最新版的<span lang="EN-US">YSlow</span>，并安装它。当然如果你已经安装了<span lang="EN-US">YSlow</span>可以跳过此步。 <span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体"><a title="web标准设计" href="http://justinyoung.cnblogs.com/"><span style="text-decoration: none; text-underline: none"><span style="mso-ignore: vglayout"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image003_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="359" alt="clip_image003" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image003_thumb.jpg" width="518" border="0" v:shapes="_x0000_i1029"></a></span></span></a><br></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">图<span lang="EN-US">2</span>：在菜单中先打开<span lang="EN-US">Firebug</span>插件<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">这时候打开<span lang="EN-US">FireFox</span>，你将在【工具】菜单中看到【<span lang="EN-US">firebug</span>】（如图<span lang="EN-US">2</span>）。打开<span lang="EN-US">firebug</span>，然后在<span lang="EN-US">firebug</span>中点击<span lang="EN-US">YSlow</span>菜单，便看进入<span lang="EN-US">YSlow</span>的主界面（如图<span lang="EN-US">3</span>）。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体"><a title="点击小图查看完整大图" href="http://www.cnblogs.com/JustinYoung/archive/2007/11/28/pic/02.jpg" target="_blank"><span style="text-decoration: none; text-underline: none"><span style="mso-ignore: vglayout"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image005_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="252" alt="clip_image005" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image005_thumb.jpg" width="624" border="0" v:shapes="_x0000_i1030"></a></span></span></a><br></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">图<span lang="EN-US">3</span>：在菜单中先打开<span lang="EN-US">Firebug</span>插件<span lang="EN-US">(</span>点击小图查看完整大图<span lang="EN-US">)<o:p></o:p></span></span></p> <h4 style="line-height: 150%">点击【<span lang="EN-US">Performace</span>】菜单<span lang="EN-US"><o:p></o:p></span></h4> <p style="line-height: 150%"><span lang="EN-US">YSlow</span>便开始分析此页的效率，并从<span lang="EN-US">13</span>个最影响网页效率的方面给出评估（如图<span lang="EN-US">4</span>）。<span lang="EN-US"><o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体"><a title="web标准设计" href="http://justinyoung.cnblogs.com/"><span style="text-decoration: none; text-underline: none"><span style="mso-ignore: vglayout"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image006_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="432" alt="clip_image006" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image006_thumb.jpg" width="488" border="0" v:shapes="_x0000_i1031"></a></span></span></a><br></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">图<span lang="EN-US">4</span>：<span lang="EN-US">YSlow</span>给出的本页面效率评估<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%">可以看出来，<span lang="EN-US">YSlow</span>评估的依据就是我们在<span lang="EN-US"><a title="《如何提高网页的效率(上篇)&mdash;&mdash;提高网页效率的14条准则》" href="http://www.cnblogs.com/JustinYoung/archive/2007/11/20/speeding-up-web-site-14rule.html" target="_blank"> <span lang="EN-US"><span lang="EN-US">《如何提高网页的效率（上篇）——</span></span><span lang="EN-US"><span lang="EN-US">提高网页效率的14</span></span><span lang="EN-US"><span lang="EN-US">条准则》</span></span></a></span>中提到的前面<span lang="EN-US">13</span>条。前面蓝色的字母表示这一条准则的得分。<span lang="EN-US">A</span>最高。点击右面的三角形可以得到更多的信息和建议，有些信息里面还有<span lang="EN-US">“</span>放大镜<span lang="EN-US">” </span>图标，点击也将展示更为详细的信息和建议。（如图<span lang="EN-US">5</span>所示）<span lang="EN-US"><o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体"><a title="web标准设计" href="http://justinyoung.cnblogs.com/"><span style="text-decoration: none; text-underline: none"><span style="mso-ignore: vglayout"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image007_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="366" alt="clip_image007" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image007_thumb.jpg" width="497" border="0" v:shapes="_x0000_i1032"></a></span></span></a><br></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">图<span lang="EN-US">5</span>：<span lang="EN-US">YSlow</span>可以给出每条准则的详细评估信息和建议<span lang="EN-US"><o:p></o:p></span></span></p> <h4 style="line-height: 150%">点击【<span lang="EN-US">Stats</span>】菜单<span lang="EN-US"><o:p></o:p></span></h4> <p style="line-height: 150%">这个视图会告诉你页面的总体统计信息。包括页面大小、<span lang="EN-US">css</span>样式表大小、脚本文件大小、总体图片大小、<span lang="EN-US">flash</span>文件大小和<span lang="EN-US">css</span>中用到的图片文件大小。还会告诉你，哪些东西被缓存了，缓存了多少等等。<span lang="EN-US"><o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体"><a title="web标准设计" href="http://justinyoung.cnblogs.com/"><span style="text-decoration: none; text-underline: none"><span style="mso-ignore: vglayout"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image008_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="413" alt="clip_image008" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image008_thumb.jpg" width="527" border="0" v:shapes="_x0000_i1033"></a></span></span></a><br></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">图<span lang="EN-US">6</span>：【<span lang="EN-US">Stats</span>】视图信息<span lang="EN-US"><o:p></o:p></span></span></p> <h4 style="line-height: 150%">点击【<span lang="EN-US">Components</span>】菜单<span lang="EN-US"><o:p></o:p></span></h4> <p style="line-height: 150%">这个视图是一个页面所有部件的信息列表。从中我们可以得知每个部件的各种详细信息。如：类型、<span lang="EN-US">URL</span>、<span lang="EN-US">Expires</span>数据、状态、大小、读取时间、<span lang="EN-US">ETag</span>信息等等。通过对这个列表的分析，我们就可以知道到底是什么东西最耗费我们的资源，从而有针对性的进行优化。<span lang="EN-US"><o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体"><a title="firefox,firebug,yslow" href="http://justinyoung.cnblogs.com/images/cnblogs_com/justinyoung/2007/yslow11.jpg"><span style="text-decoration: none; text-underline: none"><span style="mso-ignore: vglayout"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image010_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="341" alt="clip_image010" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image010_thumb.jpg" width="624" border="0" v:shapes="_x0000_i1034"></a></span></span></a><br></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">图<span lang="EN-US">7</span>：【<span lang="EN-US">Components</span>】视图信息，点击<span lang="EN-US">“</span>放大镜<span lang="EN-US">”</span>图标我们可以知道更详细的信息（点击小图查看完整大图）<span lang="EN-US"><o:p></o:p></span></span></p> <h4 style="line-height: 150%">点击【<span lang="EN-US">Tools</span>】菜单<span lang="EN-US"><o:p></o:p></span></h4> <p style="line-height: 150%">【<span lang="EN-US">Tools</span>】菜单包含<span lang="EN-US">4</span>个子菜单，就是<span lang="EN-US">4</span>个实用工具。【<span lang="EN-US">JSLine</span>】工具会生成<span lang="EN-US">JSLine</span>报表，报表是对本网页中<span lang="EN-US">JS</span>脚本的分析报告，包含错误和建议。【<span lang="EN-US">ALL JS</span>】工具，将生成本页面所有脚本代码便于阅读和打印的报表页面。【<span lang="EN-US">ALL CSS</span>】工具，将生成本页面所有<span lang="EN-US">CSS</span>样式表代码便于阅读和打印的报表页面。【<span lang="EN-US">Printable View</span>】将【<span lang="EN-US">Performance</span>】和【<span lang="EN-US">Stats</span>】视图中的信息生成一份更适合阅读和打印的报表页面。<span lang="EN-US"><o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体"><a title="web标准设计" href="http://justinyoung.cnblogs.com/"><span style="text-decoration: none; text-underline: none"><span style="mso-ignore: vglayout"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image011_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="132" alt="clip_image011" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image011_thumb.jpg" width="489" border="0" v:shapes="_x0000_i1035"></a></span></span></a><br></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">图<span lang="EN-US">8</span>：【<span lang="EN-US">Tools</span>】菜单，包含了<span lang="EN-US">4</span>个子菜单<span lang="EN-US"><o:p></o:p></span></span></p> <h4 style="line-height: 150%">点击【<span lang="EN-US">Help</span>】菜单<span lang="EN-US"><o:p></o:p></span></h4> <p style="line-height: 150%">【<span lang="EN-US">Help</span>】主要是些常用的帮助途径的入口。从这里你可以很方面的访问<span lang="EN-US">YSlow</span>的官方网络和博客。如果你还对<span lang="EN-US">YSlow</span>的使用有什么疑惑的话，那么在这里你将获得满意的解答。<span lang="EN-US"><o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体"><a title="web标准设计" href="http://justinyoung.cnblogs.com/"><span style="text-decoration: none; text-underline: none"><span style="mso-ignore: vglayout"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image012_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="208" alt="clip_image012" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/UseYSlowtoknowwhyyourwebSlow_C6D2/clip_image012_thumb.jpg" width="534" border="0" v:shapes="_x0000_i1036"></a></span></span></a><br></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">图<span lang="EN-US">8</span>：【<span lang="EN-US">Help</span>】菜单是些常用的帮助入口<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/71062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-01-03 14:09 <a href="http://www.cppblog.com/woaidongmao/archive/2009/01/03/71062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何提高网页的效率（上篇）&amp;mdash;&amp;mdash;提高网页效率的14条准则</title><link>http://www.cppblog.com/woaidongmao/archive/2009/01/03/71061.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Sat, 03 Jan 2009 06:05:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/01/03/71061.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/71061.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/01/03/71061.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/71061.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/71061.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 网站最基本的东西是什么？ 网站最基本的东西是什么？——内容？SEO（搜索引擎优化）？UE（用户体验）？都不对！是速度！内容再丰富的网站，如果慢到无法访问也是毫无意义的； SEO做的再好的网站，如果搜索蜘蛛抓不到也是白搭； UE设计的再人性化的网站，如果用户连看都看不到也是空谈。所以网页的效率绝对是最值得关注的方面。如何才能提高一个网页的效率呢？Steve Souders(Steve Souders...&nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2009/01/03/71061.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/71061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-01-03 14:05 <a href="http://www.cppblog.com/woaidongmao/archive/2009/01/03/71061.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>