﻿<?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>语源科技BlogJava-空谷幽人</title><link>http://www.blogjava.net/wingwing/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 08:26:05 GMT</lastBuildDate><pubDate>Thu, 23 Apr 2026 08:26:05 GMT</pubDate><ttl>60</ttl><item><title>如何在RCP中正确加入project explorer view</title><link>http://www.blogjava.net/wingwing/archive/2010/09/16/332201.html</link><dc:creator>Li Ya Qiang</dc:creator><author>Li Ya Qiang</author><pubDate>Thu, 16 Sep 2010 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/wingwing/archive/2010/09/16/332201.html</guid><wfw:comment>http://www.blogjava.net/wingwing/comments/332201.html</wfw:comment><comments>http://www.blogjava.net/wingwing/archive/2010/09/16/332201.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wingwing/comments/commentRss/332201.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wingwing/services/trackbacks/332201.html</trackback:ping><description><![CDATA[原创，转载请注明出处。<br />
<br />
今天都在折腾project explorer，主要是在RCP里加入project explorer以后，不能正常显示，同时刷新的时候又清空那个view，非常奇怪。<br />
<br />
最后按照eclipse.org的help的指导设置成功，<br />
http://help.eclipse.org/ganymede/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/cnf.htm<br />
<br />
主要是要在自己的WorkbenchAdvisor类里面重写的initialize(IWorkbenchConfigurer configurer)的方法。<br />
<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;initialize(IWorkbenchConfigurer&nbsp;configurer)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IDE.registerAdapters();<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">final</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;ICONS_PATH&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">icons/full/</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">final</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;PATH_OBJECT&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;ICONS_PATH&nbsp;</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">obj16/</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bundle&nbsp;ideBundle&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;Platform.getBundle(IDEWorkbenchPlugin.IDE_WORKBENCH);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;declareWorkbenchImage(configurer,&nbsp;ideBundle,<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IDE.SharedImages.IMG_OBJ_PROJECT,&nbsp;PATH_OBJECT&nbsp;</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">prj_obj.gif</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;declareWorkbenchImage(configurer,&nbsp;ideBundle,<br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IDE.SharedImages.IMG_OBJ_PROJECT_CLOSED,&nbsp;PATH_OBJECT<br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);">&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 style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">cprj_obj.gif</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">13</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">super</span><span style="color: rgb(0, 0, 0);">.initialize(configurer);<br />
</span><span style="color: rgb(0, 128, 128);">14</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;configurer.setSaveAndRestore(</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">);&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">15</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">16</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">17</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;declareWorkbenchImage(IWorkbenchConfigurer&nbsp;configurer_p,<br />
</span><span style="color: rgb(0, 128, 128);">18</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bundle&nbsp;ideBundle,&nbsp;String&nbsp;symbolicName,&nbsp;String&nbsp;path,&nbsp;</span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);">&nbsp;shared)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">19</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL&nbsp;url&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;ideBundle.getEntry(path);<br />
</span><span style="color: rgb(0, 128, 128);">20</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImageDescriptor&nbsp;desc&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;ImageDescriptor.createFromURL(url);<br />
</span><span style="color: rgb(0, 128, 128);">21</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;configurer_p.declareImage(symbolicName,&nbsp;desc,&nbsp;shared);<br />
</span><span style="color: rgb(0, 128, 128);">22</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
然后是覆盖getDefaultPageInput方法如下<br />
<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><span style="color: rgb(0, 128, 128);">1</span>&nbsp;<span style="color: rgb(0, 0, 0);">@Override<br />
</span><span style="color: rgb(0, 128, 128);">2</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;IAdaptable&nbsp;getDefaultPageInput()&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;ResourcesPlugin.getWorkspace().getRoot();<br />
</span><span style="color: rgb(0, 128, 128);">4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
<br />
这次得到的教训就是以后有什么问题首先查询eclipse.org，要不浪费太多时间了。<br />
<br />
<img src ="http://www.blogjava.net/wingwing/aggbug/332201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wingwing/" target="_blank">Li Ya Qiang</a> 2010-09-16 17:02 <a href="http://www.blogjava.net/wingwing/archive/2010/09/16/332201.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PPK on JavaScript 笔记 4 （转载）</title><link>http://www.blogjava.net/wingwing/archive/2010/08/21/329553.html</link><dc:creator>Li Ya Qiang</dc:creator><author>Li Ya Qiang</author><pubDate>Sat, 21 Aug 2010 14:42:00 GMT</pubDate><guid>http://www.blogjava.net/wingwing/archive/2010/08/21/329553.html</guid><wfw:comment>http://www.blogjava.net/wingwing/comments/329553.html</wfw:comment><comments>http://www.blogjava.net/wingwing/archive/2010/08/21/329553.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wingwing/comments/commentRss/329553.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wingwing/services/trackbacks/329553.html</trackback:ping><description><![CDATA[<p>第4章 准备</p>
<p>准备阶段最重要是关于HTML/CSS和Javascript如何协作的问题。</p>
<p>浏览器初始化顺序是首先脚步，然后是statements，最后是html。</p>
<p>如果在js里面直接引用body里面的element就会报错，最好是把<strong><span style="color: red;">执行脚本放到函数里调用</span></strong>。</p>
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;initializePage()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;document.getElementById('test');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x.onclick&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;()&nbsp;{alert('Hello&nbsp;world</span><span style="color: #000000;">!</span><span style="color: #000000;">')};<br />
}<br />
window.onload&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;initializePage;</span></div>
<br />
<br />
<br />
<p>一些常见的钩子</p>
<p>id：创建钩子最简单的方法，每个id在文档中只能使用一次。<img id="Code_Open_Image_223900" style="display: none;" onclick="this.style.display='none'; Code_Open_Text_223900.style.display='none'; Code_Closed_Image_223900.style.display='inline'; Code_Closed_Text_223900.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" height="16" width="11" /><span id="Code_Open_Text_223900" style="display: none;"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;document.getElementById('hook');</span></span></p>
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;document.getElementById('hook');</span></div>
<p>
</p>
<p>class：可以为一系列的元素初始化相同的行为。</p>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;lists&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;document.getElementsByTagName('ul');<br />
</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">lists.length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(lists[i].className&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;'menutree')&nbsp;</span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">初始化行为</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">}</span></div>
<p><br />
</p>
<p>自定义属性：即不属于(X)HTML规范的属性，这是不合法的，但有时为了脚本的方便使用它。</p>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;maxLength&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.getAttribute('maxlength');</span></div>
<p><br />
</p>
<p>名/值对：即写成如下的形式，然后从className中通过操作字符串获取状态。</p>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">textarea&nbsp;class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">maxlength=300</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;/</span><span style="color: #000000;">textarea</span><span style="color: #000000;">&gt;</span></div>
<p><br />
</p>
<p>准备页面：设置事件处理程序，确定访问者状态，设置访问，产生内容，定义关系(relatedElement)，修改文档结构。</p>
<p>&lt;script&gt;标签</p>
<p>defer属性：表示正在加载中的脚本不包含任何会改变HTML的指令（如document.write）。Explorer仅在页面已经完全加载之后才会执行拥有defer属性的脚本。</p>
<p>XHTML规定包含内容的script标签必须定义成CDATA，它会告诉XML/HTML解释器不要解析这些内容，而是直接送给脚本引擎。</p>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">script&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">text/javascript</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&lt;![CDATA[</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">alert('Hello&nbsp;World</span><span style="color: #000000;">!</span><span style="color: #000000;">');<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">]]&gt;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">script</span><span style="color: #000000;">&gt;</span></div>
<p><br />
</p>
<p>所有的脚本都被注册到HTML的全局对象中，同一个变量可以在多个脚本中使用，且为最后定义的那个。</p>
<p>当浏览器遇到script标签时，发送一个HTTP请求去获取脚本文件，解析其中的脚本，对HTML页面的分析和渲染暂停，直到脚本加载完成。</p>
<p>load事件会在页面完全加载时触发，window.onload = ; 多次设置onload会覆盖之前的设置，需要编写函数在同一个元素上设置多个事件处理程序。</p>
<p>等待load时会因为图片等造成延迟，这个问题很难解决，目前只有Mozilla支持的DOMContentLoaded事件，在文档加载完成后执行，不必等待图片。</p>
<p><br />
</p>
<p><br />
<br />
</p>
<img src ="http://www.blogjava.net/wingwing/aggbug/329553.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wingwing/" target="_blank">Li Ya Qiang</a> 2010-08-21 22:42 <a href="http://www.blogjava.net/wingwing/archive/2010/08/21/329553.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PPK on JavaScript 笔记 3 （转载）</title><link>http://www.blogjava.net/wingwing/archive/2010/08/21/329552.html</link><dc:creator>Li Ya Qiang</dc:creator><author>Li Ya Qiang</author><pubDate>Sat, 21 Aug 2010 14:27:00 GMT</pubDate><guid>http://www.blogjava.net/wingwing/archive/2010/08/21/329552.html</guid><wfw:comment>http://www.blogjava.net/wingwing/comments/329552.html</wfw:comment><comments>http://www.blogjava.net/wingwing/archive/2010/08/21/329552.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wingwing/comments/commentRss/329552.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wingwing/services/trackbacks/329552.html</trackback:ping><description><![CDATA[<p>第3章 浏览器</p>
<p>每种浏览器都包含一个代码引擎或渲染引擎，它负责解释Web页面上的代码，javascript解释器是其中的一部分。</p>
<p>Netscape4惨败之后，网景公司于1998年创立了Mozilla项目，开发了Gecko引擎，现在它支持着Mozilla, Firefox, Netscape, Camino等浏览器。</p>
<p>Explorer的代码引擎叫做Trident，1999年3月发布的Explorer5.0是第一个支持W3C DOM和XMLHttpRequest的浏览器，但也是最后一个包含了主要Javascript更新的Explorer版本。</p>
<p>Safari于2003年发布，它使用KHTML代码引擎，它是Macintosh平台的默认浏览器。</p>
<p>Opera是一个独立的浏览器，在浏览器大战期间，它没有实现DHTML，现在看来，这是一个相当英明的决定。</p>
<p>4种兼容性问题</p>
<p>不支持：这些出现问题的功能不是&#8220;不可或缺&#8221;的基础功能，都能够通过对象检测判断，而且浏览器也在努力消除这些问题，如document.sytleSheets来读写整个样式表，目前Safari和Opera也增加了对其的支持。</p>
<p>合理的不同看法：如defer属性对加载脚本的要求，Exploer有独特的理解，幸好这种问题是最少有的。</p>
<p>有意为之的兼容性问题：通常是浏览器大战的遗留问题，也可以通过对象检测来判断，一旦微软着手实现W3C事件标准，最后一批被故意造成的兼容性问题也将得到解决。</p>
<p>浏览器bug：这是由于编程的缺陷造成的不可预见的错误，它是无法解决也是无法衡量的。如Exploer6会被normalize()方法导致崩溃。</p>
<p>浏览器兼容性问题是单纯的生活的事实，它不会轻易消失，应该尽快地习惯它，至少听任它。</p>
<p>在任何情况下都不要先为某一个浏览器写脚本，然后增加其他浏览器的支持。在项目支出就应该解决这些兼容性问题，而不是放在最后。</p>
<p>对象检测</p>
<p>对象检测是避免兼容性问题的最佳助手。它的一般方法是检查想使用的对象，看它们是否存在，如果不存在，就结束函数。（if(!对象)），从技术上说，对象检测是把一个对象转换成一个布尔值。</p>
<p>检查W3C DOM：</p>
<span style="color: #000000;"><br />
</span>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;W3CDOM&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;document.createElement&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;document.getElementsByTagName;</span></div>
<span style="color: #000000;"><br />
<br />
</span>
<p>对W3C DOM的检测使我们可以总是假设浏览器也支持相关的功能，如appendChild，而省去对它的检查。</p>
<p>事件处理测试：</p>
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;addEventSimple(obj,&nbsp;evt,&nbsp;fn)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(obj.addEventListener)&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">W3C</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.addEventListener(evt,&nbsp;fn,&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(obj.attachEvent)&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">微软</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.attachEvent('on'&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;evt,&nbsp;fn);<br />
}</span></div>
<br />
<p>我们期望未来的版本使用标准，所以对标准的支持应该最先检查，事实上先检查attachEvent，Fx等浏览器会报错。</p>
<p>浏览器检测</p>
<p>为什么浏览器检测行不通？浏览器兼容性模式是不断变化的，今天不支持的属性，明天可能会支持；而且浏览器常常会伪装自己的身份，以便通过浏览器检测。</p>
<p>浏览器检测的军备竞赛</p>
<p>navigator.userAgent中保存了每一个浏览器的识别字符串。1995年前后的Mosaic和Netscape年代中，由于
Netscape的cookie和&lt;center&gt;标签等的支持，服务器端的程序员决定使用浏览器检测来区分两种浏览器，他们检测识别字符串
是否从Mozilla/开始，这给javascript世界带来了不必要的磨难。浏览器厂商被迫将自己的识别字符串变成从Mozilla/开始，即便是
Explorer最初进入市场时也将自己伪装成了Netscape。浏览器大战开始后，Web开发者们做出反应，他们创建了更多的浏览器程序来区分
Netscape和Exploer，而当战争结束时，已经有数不清的网站设置了检测脚本只允许Explorer访问，历史重演了，一些浏览器如
Opera，又不得不修改自己的识别字符串来匹配Explorer，甚至将识别字符串的设置开放给用户。</p>
<p>拆解浏览器字符串</p>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Mozilla</span><span style="color: #000000;">/</span><span style="color: #000000;">5.0</span><span style="color: #000000;">&nbsp;(Windows;&nbsp;U;&nbsp;Windows&nbsp;NT&nbsp;</span><span style="color: #000000;">5.1</span><span style="color: #000000;">;&nbsp;en</span><span style="color: #000000;">-</span><span style="color: #000000;">US;&nbsp;rv:</span><span style="color: #000000;">1.7</span><span style="color: #000000;">.</span><span style="color: #000000;">12</span><span style="color: #000000;">)&nbsp;Gecko</span><span style="color: #000000;">/</span><span style="color: #000000;">20050915</span><span style="color: #000000;"><br />
Mozilla</span><span style="color: #000000;">/</span><span style="color: #000000;">4.0</span><span style="color: #000000;">&nbsp;(compatible;&nbsp;MSIE&nbsp;</span><span style="color: #000000;">6.0</span><span style="color: #000000;">;&nbsp;Windows&nbsp;NT&nbsp;</span><span style="color: #000000;">5.1</span><span style="color: #000000;">;&nbsp;SV1;&nbsp;.NET&nbsp;CLR&nbsp;</span><span style="color: #000000;">1.1</span><span style="color: #000000;">.</span><span style="color: #000000;">4322</span><span style="color: #000000;">)<br />
Mozilla</span><span style="color: #000000;">/</span><span style="color: #000000;">5.0</span><span style="color: #000000;">&nbsp;(Macintosh;&nbsp;U;&nbsp;PPC&nbsp;Mac&nbsp;OS&nbsp;X;&nbsp;en)&nbsp;AppleWebKit</span><span style="color: #000000;">/</span><span style="color: #000000;">312.8</span><span style="color: #000000;">&nbsp;(KHTML,&nbsp;like&nbsp;Gecko)&nbsp;Safari</span><span style="color: #000000;">/</span><span style="color: #000000;">312.6</span><span style="color: #000000;"><br />
Mozilla</span><span style="color: #000000;">/</span><span style="color: #000000;">4.0</span><span style="color: #000000;">&nbsp;(compatible;&nbsp;MSIE&nbsp;</span><span style="color: #000000;">6.0</span><span style="color: #000000;">;&nbsp;Windows&nbsp;NT&nbsp;</span><span style="color: #000000;">5.2</span><span style="color: #000000;">)</span></div>
<br />
<p>第一个是Mozilla1.7.12，第二个是NT5.1(即XP)的Explorer6.0，第三个是Safari1.3.2，第四个是伪装后的Safari1.3.2。</p>
<p>userAgent：使用navigator.userAgent，而不是navigator.appName和navigator.appVersion。前者尚有一些遵循，后者都是谎言；</p>
<p>Mozilla/：只能证明浏览器是1994年后发布的；</p>
<p>/[version number]：没有意义，每一个现代浏览器都生命是第4版或第5版的Mozilla；</p>
<p>不规则字符串：通常被圆括号包围，包含这非常复杂的缩写；</p>
<p>Opera：唯一支持window.opera属性，可以检测这个对象来判断；</p>
<p>Safari, iCab和Konqueror：不像Opera那样勇于承担风险，它们可以完全地伪装自己；</p>
<p>Gecko：Mozilla识别串通常都会包含Gecko，但不幸Safari等也包含；</p>
<p>MSIE：没有意义，绝大多数的浏览器都包含MSIE；</p>
<p>版本号：Exploer和Opera允许在名字后面找到自己的版本号，而其他浏览器都无效，比如Mozilla的隐藏版本；</p>
<p>操作系统：Windows操作系统都以Win开始，当然这不适用于伪装的串。</p>
<p>(<a href="http://www.quirksmode.org/js/detect.html">http://www.quirksmode.org/js/detect.html</a>)</p>
<p>浏览器检测的正确使用</p>
<p>当你需要知道访问者的浏览器，如站点统计时，这些检测不会影响脚本逻辑。</p>
<p>当我们用对象检测时需要排除浏览器bug等时，可以将对象检测和浏览器检测一起使用。</p>
<p>调试</p>
<p>Mozilla有最好的错误信息，因此多在Mozilla中调试；</p>
<p>使用return，alert，confirm是不错的方法，复杂的调试可以自己创建一个错误控制台；</p>
<p>将bug报告给浏览器厂商。<span style="color: #000000;"><br />
</span></p>
<img src ="http://www.blogjava.net/wingwing/aggbug/329552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wingwing/" target="_blank">Li Ya Qiang</a> 2010-08-21 22:27 <a href="http://www.blogjava.net/wingwing/archive/2010/08/21/329552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PPK on JavaScript 笔记 2（转载）</title><link>http://www.blogjava.net/wingwing/archive/2010/08/21/329551.html</link><dc:creator>Li Ya Qiang</dc:creator><author>Li Ya Qiang</author><pubDate>Sat, 21 Aug 2010 14:21:00 GMT</pubDate><guid>http://www.blogjava.net/wingwing/archive/2010/08/21/329551.html</guid><wfw:comment>http://www.blogjava.net/wingwing/comments/329551.html</wfw:comment><comments>http://www.blogjava.net/wingwing/archive/2010/08/21/329551.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wingwing/comments/commentRss/329551.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wingwing/services/trackbacks/329551.html</trackback:ping><description><![CDATA[<span style="font-size: 18pt;"><span style="font-size: 12pt;"><span style="font-family: 幼圆;"><span style="font-family: 幼圆;"><span style="font-family: 楷体_GB2312;">
<p><span style="font-size: 10pt;"><span style="font-family: 幼圆;"><span style="font-family: 幼圆;">
<p><strong><span style="font-size: 10pt;"><span style="font-family: 幼圆;"><span style="font-size: 18pt;">第二章 大背景</span></span></span></strong></p>
<p><span style="font-size: 10pt;">javascript嵌入在一个还同时使用着HTML和CSS的环境中。</span></p>
<p><span style="font-size: 10pt;">&nbsp;</span></p>
<p><span style="font-size: 10pt;">2002年，Stuart Langridge提出无侵入脚本编程(unobtrusive scripting)。它代表了向基于CSS的、兼容标准的Web站点的新理论中嵌入Javascript的首次认真的尝试。</span></p>
<p><span style="font-size: 10pt;">它应该是可用的。即给网站带来明确的可用性好处。</span></p>
<p><span style="font-size: 10pt;">它应该是可访问的。如果javascript失效，网页应该依然是可阅读和可理解的。</span></p>
<p><span style="font-size: 10pt;">它应该是容易实现的。Web开发者只需要在页面中引入脚本本身和一个Javascript钩子，脚本就能运行。</span></p>
<p><span style="font-size: 10pt;">它应该是分离的。只存在于自己的.js文件中，而不是散落在HTML中。</span></p>
<p><span style="font-size: 10pt;">&nbsp;</span></p>
<p><span style="font-size: 10pt;">一个Web页面由如下三个层组成：HTML结构层、CSS表现层、Javascript行为层。</span></p>
<p><span style="font-size: 10pt;">&nbsp;</span></p>
<p><span style="font-size: 10pt;">表现与结构的分离</span></p>
<p><span style="font-size: 10pt;">所有的表现定义在一个单独的CSS文件中，HTML中不再出现&lt;font&gt;标签和用于表现的表格。一般通过脚本改变className来引用不同的</span></p>
<p><span style="font-size: 10pt;">CSS元素。</span>CSS (<span style="font-family: 'Andale Mono','Courier New',Courier,monospace; color: #6f8cc0; font-size: x-small;"><span style="font-size: 10pt;">display:
none</span></span>)用来表示文档中的某个元素隐藏，也可以通过脚本从文档中删除这个元素。至于采用哪种方式，PPK推荐采用后一种方式。特别是对于form表单的时候，采用第一种方式就会提交很多无用的信息。<br />
</p>
<p><span style="font-size: 10pt;">&nbsp;</span></p>
<p><span style="font-size: 10pt;">行为与结构的分离</span></p>
<p><span style="font-size: 10pt;">所有的javascript函数都被放在一个独立.js文件中，然后把它链入所需要它的HTML页面中，HTML移除所有的事件处理程序。</span></p>
<p><span style="font-size: 10pt;">钩子(hook)用来生命&#8220;在这里准备部署行为&#8221;的ID，它是注册事件处理程序的一种方法。</span></p>
<p><span style="font-size: 10pt;">javascript:伪协议是复杂而肮脏的(&lt;a href="javascript:dosomeaction()"&gt;)，应该放到脚步文件中。<br />
</span></p>
<p><span style="font-size: 10pt;">&nbsp;</span></p>
<p><span style="font-size: 10pt;">行为和表现的分离</span></p>
<p><span style="font-size: 10pt;">行为和表现的分离是复杂的，尚没有任何的标准。</span></p>
<p><span style="font-size: 10pt;">当若干元素部署相同的效果时，CSS是有效的，而需要创建相似但不完全相同的效果时，javascript是最有效的方法。</span></p>
<p><span style="font-size: 10pt;">&nbsp;</span></p>
<p><span style="font-size: 10pt;">可访问性规则</span></p>
<p><span style="font-size: 10pt;">条理分明的HTML，如硬编码的链接必须有href。</span></p>
<p><span style="font-size: 10pt;">产生对脚本用户有意义的内容，如：</span></p>
<p><span style="font-size: 10pt;">一条发送ajax请求的链接可以完全用javascript生成，这样无脚本用户就不会看到href为#的a标签而产生不解；</span></p>
<p><span style="font-size: 10pt;">用javascript来隐藏一段内容，而不是用css，否则无脚本用户将永远看不到那是什么；</span></p>
<p><span style="font-size: 10pt;">判断是否脚本可用，然后跳转到一个无脚本页面时，要用location.replace而不是location.href，这样在后退时不会再返回到有脚本页面，事实上location.href产生了一条历史记录；</span></p>
<p><span style="font-size: 10pt;">针对键盘用户，我们对触发事件的元素增加focus动作；</span></p>
<p><span style="font-size: 10pt;">由于各浏览器都支持（但不完全支持）javascript，因此&lt;noscript&gt;标签就显得没有意义，最好完全不用。</span></p>
</span></span></span></p>
<p>&nbsp;</p>
</span></span></span></span></span>
<img src ="http://www.blogjava.net/wingwing/aggbug/329551.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wingwing/" target="_blank">Li Ya Qiang</a> 2010-08-21 22:21 <a href="http://www.blogjava.net/wingwing/archive/2010/08/21/329551.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PPK on JavaScript 笔记 1（转载）</title><link>http://www.blogjava.net/wingwing/archive/2010/08/21/329550.html</link><dc:creator>Li Ya Qiang</dc:creator><author>Li Ya Qiang</author><pubDate>Sat, 21 Aug 2010 14:14:00 GMT</pubDate><guid>http://www.blogjava.net/wingwing/archive/2010/08/21/329550.html</guid><wfw:comment>http://www.blogjava.net/wingwing/comments/329550.html</wfw:comment><comments>http://www.blogjava.net/wingwing/archive/2010/08/21/329550.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wingwing/comments/commentRss/329550.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wingwing/services/trackbacks/329550.html</trackback:ping><description><![CDATA[<p>
<span style="font-size: 10pt;">第一章：目标</span>
</p>
<p>
<span style="font-size: 10pt;">javascript的目标是给Web页面增加一个额外的可用性层。</span>
</p>
<p>
<span style="font-size: 10pt;">&nbsp;</span>
</p>
<p>
<span style="font-size: 10pt;">js分为6个部分：javascript核心、BOM(浏览器对象模型)、事件、DOM(文档对象模型)、CSS修改、数据检索(XMLHttpRequest)。</span>
</p>
<p>
<span style="font-size: 10pt;">他们的任务：核心使得js成为一门编程语言的基础，控制结构变量函数和对
象；BOM给浏览器窗口下达指令，读取cookie，与其他窗口进行通信；事件找出用户执行的动作，并定义这些动作将触发的函数；DOM学习和改变
HTML文档的结构；CSS学习和改变HTML文档的CSS表现；数据检索从服务器下载新的数据而不刷新页面。</span>
</p>
<p>
<span style="font-size: 10pt;">所有的脚本都是用核心语言、事件和DOM：等待行动，并更新页面。</span>
</p>
<p>
<span style="font-size: 10pt;">&nbsp;</span>
</p>
<p>
<span style="font-size: 10pt;">ECMA(欧洲计算机制造联合协会)对javascript核心进行标准化(ECMA1.5)，这个标准应用到flash、浏览器、服务器以及其他尚未产生的应用上。</span>
</p>
<p>
<span style="font-size: 10pt;">W3C(万维网协会)创建了DOM规范，它也包括事件处理和CSS修改的内容。微软仍然没有实现W3C的事件规范，却使用它自己专有的事件模型。</span>
</p>
<p>
<span style="font-size: 10pt;">WHAT-WG(Web超文本应用技术工作组)正为BOM标准而工作。</span>
</p>
<p>
<span style="font-size: 10pt;">数据检索使用的则是微软的事实标准，W3C为数据检索推出了XMLHttpRequest规范的第一部草案。</span>
</p>
<p>
<span style="font-size: 10pt;">&nbsp;</span>
</p>
<p>
<span style="font-size: 10pt;">&lt;script标签中允许在language="javascript1.2"中指定版本号，但自1.2版本开始Netscape和Explorer 4都宣称支持，因此设置版本号没有意义，事实上根本不需要这个属性。</span>
</p>
<p>
<span style="font-size: 10pt;">&nbsp;</span>
</p>
<p>
<span style="font-size: 10pt;">js遵循严格的安全规范</span>
</p>
<p>
<span style="font-size: 10pt;">不允许访问宿主计算机：不能读写除cookie外的文件系统</span>
</p>
<p>
<span style="font-size: 10pt;">同源策略：两个窗口的页面的Web域名必须相同，才允许跨窗口通信。同子域下可以通过设置相同的document.domain(必须设置为真实域名的一部分)进行通信。</span>
</p>
<p>
<span style="font-size: 10pt;">其他限制：不能读取历史对象的属性(当可以在历史中后退)；不能设置文件上传表单域的值；试图关闭窗口时会询问用户；不允许打开一个小于100x100或处于屏幕之外或没有标题栏的新窗口。</span>
</p>
<p>
<span style="font-size: 10pt;">&nbsp;</span>
</p>
<p>
<span style="font-size: 10pt;">javascript的历史</span>
</p>
<p>
<span style="font-size: 10pt;">创始人Brendan Eich当时在Netscape工作，js公开的历史从1996.3的Netscape2发布开始。</span>
</p>
<p>
<span style="font-size: 10pt;">Eich最初的目标是为Web开发者提供一种简单的方式为页面增加一些交互，这些
脚本从其他页面复制过来并稍作调整就可以使用。最初命名为LiveScript。但Netscape出于市场的考虑选取了一个与当时流行的Java相似的
一个名字，并仓促地要求Eich&#8220;使这个语言看起来想Java&#8221;，从而误导人们将js视为轻量级的Java版本，看成一个可以拿来搬弄技巧而不值得引起严
谨的程序员注意的轻巧的脚本语言。</span>
</p>
<p>
<span style="font-size: 10pt;">&nbsp;</span>
</p>
<p>
<span style="font-size: 10pt;">第一瘦时期</span>
</p>
<p>
<span style="font-size: 10pt;">早期的日子里，浏览器是一个瘦客户端，表单验证和鼠标滑过的效果是令人惊艳的，但它们不允许在客户端大量进行交互，用户被迫与服务端交互。</span>
</p>
<p>
<span style="font-size: 10pt;">1996~1999间Netscape与微软的浏览器大战开始，双方都推出自己的
第4版，为争夺CSS规范各不相让。两个浏览器厂商都让javascript可以控制这些CSS声明，于是就可以使用position:absolute
创建一个&#8220;层&#8221;，然后通过持续地改变top和left似的它在屏幕上移动，这才叫酷！这些小伎俩被冠以DHTML为人所知，即通过javascript来
改变css属性。</span>
</p>
<p>
<span style="font-size: 10pt;">为此双方都推出了自己专有的DOM（又称过渡DOM，介于Netscap3DOM和W3CDOM之间），Netscape4支持document.layers，而Explorer支持document.all。</span>
</p>
<p>
<span style="font-size: 10pt;">&nbsp;</span>
</p>
<p>
<span style="font-size: 10pt;">第一个胖阶段</span>
</p>
<p>
<span style="font-size: 10pt;">有了这些新特性，客户端增加大量的互动：动画、隐藏和其他视觉效果，javascript的目标转向技术，而不是可用性，js进入胖阶段。</span>
</p>
<p>
<span style="font-size: 10pt;">微软在1999年发布Explorer5，相当好地支持了CSS和新的W3CDOM标准。尽管公司和Web开发者尽力挽救，Netscape4还是灭亡了，差不多同一时间，js的第一个胖阶段结束，人们发现的不过是少量的javascript和大量的空话。</span>
</p>
<p>
<span style="font-size: 10pt;">CSS变革开始。</span>
</p>
<p>
<span style="font-size: 10pt;">&nbsp;</span>
</p>
<p>
<span style="font-size: 10pt;">第二个瘦阶段</span>
</p>
<p>
<span style="font-size: 10pt;">浏览器大战接近尾声的时候，Web开发者们厌倦了大量的编程和变通做法，极度地想从头开始。CSS，而不是javascript，给了他们最好的机会来完全突破过去的束缚。</span>
</p>
<p>
<span style="font-size: 10pt;">大概从2003年开始，一部分先锋开始用一种深受CSS革命理念影响的新方式写javascript，javascript第一次深深地潜入到全面的Web开发理论中去，而可访问性问题终于被认识到并着手解决。</span>
</p>
<p>
<span style="font-size: 10pt;">无侵入脚本编程提出，但并没有立即征服世界。</span>
</p>
<p>
<span style="font-size: 10pt;">&nbsp;</span>
</p>
<p>
<span style="font-size: 10pt;">第二个胖阶段</span>
</p>
<p>
<span style="font-size: 10pt;">从服务器端悄悄地载入小块的数据，唤醒了沉睡多年的技术构思和可用性观
念，Jesse James
Garrett的文章《Ajax：Web应用程序的新方法》开创了Ajax时代，javascript的用途又一次被重新定义，传统web开发者创建的是
瘦的可访问的乱糟糟的js代码，而来自服务端开发的&#8220;资深程序员们&#8221;创建的是面向对象的，胖的，可访问性差的ajax客户端。焦点又被集中在技术方面，可
用性及为什么要用ajax仍很少被关注，臃肿的库(即框架）与日俱增。</span>
</p>
<p>
<span style="font-size: 10pt;">所幸人们都开始同意并遵循已经存在的标准。</span>
</p>
<p>
<span style="font-size: 10pt;">&nbsp;</span>
</p>
<p>
<span style="font-size: 10pt;">2006.5数据显示，目前共有至少134中Ajax框架，我个人认为这股热潮已经到达了顶峰，有谁需要134种程序去做本质上是一样的事呢？</span>
</p>
<p>
<span style="font-size: 10pt;">javascript将调整回瘦阶段，那时它的用途也将再次被重新定义，当然某个时期第三个瘦阶段结束后会迎来第三个胖阶段.. 从根本上，这种情况只有当每个人都只认同唯一的javascript用途时才会被打破。</span>
</p>
<img src ="http://www.blogjava.net/wingwing/aggbug/329550.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wingwing/" target="_blank">Li Ya Qiang</a> 2010-08-21 22:14 <a href="http://www.blogjava.net/wingwing/archive/2010/08/21/329550.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转帖）DOS Batch 命令</title><link>http://www.blogjava.net/wingwing/archive/2010/06/22/324135.html</link><dc:creator>Li Ya Qiang</dc:creator><author>Li Ya Qiang</author><pubDate>Tue, 22 Jun 2010 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/wingwing/archive/2010/06/22/324135.html</guid><wfw:comment>http://www.blogjava.net/wingwing/comments/324135.html</wfw:comment><comments>http://www.blogjava.net/wingwing/archive/2010/06/22/324135.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wingwing/comments/commentRss/324135.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wingwing/services/trackbacks/324135.html</trackback:ping><description><![CDATA[<span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><strong><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">1</span>
echo 和 @</span></strong></span><br />
</span><strong><span style="color: rgb(139, 0, 0);">回显命令<br />
</span></strong><span style="color: rgb(0, 0, 255);">@&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#关闭单行回显<br />
echo off&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;#从下一行开始关闭回显<br />
@echo off&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; #从本行开始关闭回显。一般批处理第一行都是这个<br />
echo
on&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#从下一行开始打开回显<br />
echo&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#显示当前是 echo off
状态还是 echo on 状态<br />
echo.&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;#输出一个&#8221;回车换行&#8221;，空白行<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; #(同echo, echo; echo+ echo[ echo] echo/ echo)</span><br />
<br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">2</span> errorlevel</span></span></strong><br />
<span style="color: rgb(0, 0, 255);">echo %errorlevel%<br />
每个命令运行结束，可以用这个命令行格式
查看返回码<br />
默认值为0，一般命令执行出错会设 errorlevel 为1</span><br />
<br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">3</span> dir</span></span></strong><br />
<strong><span style="color: rgb(255, 0, 0);"><span style="color: rgb(139, 0, 0);">显示文
件夹内容</span><br />
</span></strong><span style="color: rgb(0, 0, 255);">dir&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#显示当前目录中的文件和子目录<br />
dir /a&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;#显示当前目录中的文件和子目录，包括隐藏文件和系统文件<br />
dir c: /a:d&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; #显示 C 盘当前目录中的目录<br />
dir
c: /a:-d&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#显示 C 盘根目录中的文件<br />
dir c: /b/p&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#/b只显示文件名，/p分页显示<br />
dir
*.exe /s&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#显示当前目录和子目录里所有的.exe文件</span><br />
<br />
<span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><strong><span style="color: rgb(0, 0, 0);">4</span> cd</strong></span></span><br />
<span style="color: rgb(139, 0, 0);"><strong>切换目录</strong><br />
</span><span style="color: rgb(0, 0, 255);">cd&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#进入根目录<br />
cd&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; #显示当前目录<br />
cd /d d:sdk&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#可以同时更改盘符和目录</span><br />
<br />
<span style="color: rgb(0, 0, 0);"><strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">5</span>
md</span></span></strong></span><br />
<span style="color: rgb(139, 0, 0);"><strong>创建目录</strong><br />
</span><span style="color: rgb(0, 0, 255);">md d:abc&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; #如果 d:a 不存在，将会自动创建中级目录<br />
#如果命令扩展名被停用，则需要键入
mkdir abc。<br />
</span><br />
<span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><strong><span style="color: rgb(0, 0, 0);">6</span> rd</strong></span></span><br />
<span style="color: rgb(139, 0, 0);"><strong>删除目录</strong><br />
</span><span style="color: rgb(0, 0, 255);">rd abc&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#删除当前目录里的 abc 子目录，要求为空目录<br />
rd /s/q d:temp&nbsp;
&nbsp;&nbsp; &nbsp;#删除 d:temp 文件夹及其子文件夹和文件，/q安静模式</span><br />
<br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">7</span> del</span></span></strong><br />
<strong><span style="color: rgb(255, 0, 0);"><span style="color: rgb(139, 0, 0);">删除文
件</span><br />
</span></strong><span style="color: rgb(0, 0, 255);">del
d:test.txt&nbsp; &nbsp;&nbsp; &nbsp;#删除指定文件，不能是隐藏、系统、只读文件<br />
del /q/a/f d:temp*.*<br />
删除
d:temp 文件夹里面的所有文件，包括隐藏、只读、系统文件，不包括子目录<br />
del /q/a/f/s d:temp*.*<br />
删除
d:temp 及子文件夹里面的所有文件，包括隐藏、只读、系统文件，不包括子目录</span><br />
<br />
<span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><strong><span style="color: rgb(0, 0, 0);">8</span> ren</strong></span><br />
</span><span style="color: rgb(255, 0, 0);"><strong><span style="color: rgb(139, 0, 0);">重命名命令</span></strong></span><br />
<span style="color: rgb(0, 0, 255);">ren d:temp tmp&nbsp; &nbsp;&nbsp; &nbsp;#支持对文件夹的重命名<br />
</span><br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">9</span> cls</span><br />
</span></strong><span style="color: rgb(139, 0, 0);"><strong>清屏<br />
</strong></span><br />
<span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><strong><span style="color: rgb(0, 0, 0);">10</span> type<br />
</strong></span></span><span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>显
示文件内容<br />
</strong></span>type c:boot.ini&nbsp; &nbsp;&nbsp;&nbsp;#显示指定文件的内容，程序文件一般会显示乱码<br />
type
*.txt&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;#显示当前目录里所有.txt文件的内容</span><br />
<br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">11</span> copy</span><br />
</span></strong><span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>拷
贝文件<br />
</strong></span>copy c:test.txt d:test.bak<br />
复制 c:test.txt 文件到
d: ，并重命名为 test.bak<br />
copy con test.txt<br />
从屏幕上等待输入，按 Ctrl+Z
结束输入，输入内容存为test.txt文件<br />
con代表屏幕，prn代表打印机，nul代表空设备<br />
copy 1.txt + 2.txt
3.txt<br />
合并 1.txt 和 2.txt 的内容，保存为 3.txt 文件<br />
如果不指定 3.txt ，则保存到 1.txt<br />
copy
test.txt +<br />
复制文件到自己，实际上是修改了文件日期</span><br />
<br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">12</span> title</span><br />
</span></strong><span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>设
置cmd窗口的标题</strong></span><br />
title 新标题&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#可以看到cmd窗口的标题栏变了</span><br />
<br />
<span style="color: rgb(255, 0, 0);"><span style="font-size: medium;"><strong><span style="color: rgb(0, 0, 0);">13</span> ver</strong><br />
</span></span><span style="color: rgb(139, 0, 0);"><strong>显示系统版本<br />
</strong></span><br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">14</span> label 和 vol</span><br />
</span></strong><span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>设
置卷标<br />
</strong></span>vol&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#显示卷标<br />
label&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
#显示卷标，同时提示输入新卷标<br />
label c:system&nbsp; &nbsp;&nbsp; &nbsp; #设置C盘的卷标为 system<br />
</span><br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">15</span> pause</span></span><br />
</strong><span style="color: rgb(139, 0, 0);"><strong>暂停命令<br />
</strong></span><br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">16</span> rem 和 ::</span></span><br />
</strong><span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>注
释命令</strong></span><br />
注释行不执行操作<br />
</span><br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">17</span> date 和 time</span></span></strong><br />
<span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>日
期和时间</strong></span><br />
date&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;#显示当前日期，并提示输入新日期，按"回车"略过输入<br />
date/t&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#只显示当前日期，不提示输入新日期<br />
time&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;#显示当前时间，并提示输入新时间，按"回车"略过输入<br />
time/t&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#只显示当前时间，不提示输入新时间</span><br />
<br />
<span style="color: rgb(255, 0, 0);"><strong><span style="font-size: medium;"><span style="color: rgb(0, 0, 0);">18</span> goto 和 :</span><br />
</strong></span><span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>跳
转命令<br />
</strong></span>:label&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#行首为:表示该行是标签行，标签行不执行操作<br />
goto
label&nbsp; &nbsp;&nbsp;&nbsp;#跳转到指定的标签那一行</span><br />
<br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">19</span> find (外部命令)</span></span></strong><br />
<span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>查
找命令<br />
</strong></span>find "abc" c:test.txt<br />
在 c:test.txt 文件里查找含 abc
字符串的行<br />
如果找不到，将设 errorlevel 返回码为1<br />
find /i &#8220;abc&#8221; c:test.txt<br />
查找含
abc 的行，忽略大小写<br />
find /c "abc" c:test.txt<br />
显示含 abc 的行的行数</span><br />
<br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">20</span> more (外部命令)</span></span><br />
</strong><span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>逐
屏显示<br />
</strong></span>more c:test.txt&nbsp; &nbsp;&nbsp;&nbsp;#逐屏显示 c:test.txt 的文件内容</span><br />
<br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">21</span> tree</span></span></strong><br />
<span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>显
示目录结构<br />
</strong></span>tree d:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; #显示D盘的文件目录结构</span><br />
<br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">22</span> &amp;</span></span></strong><br />
<span style="color: rgb(139, 0, 0);"><strong>顺序执行多条命令，而不管命令是否执行成功<br />
</strong></span><br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">23</span> &amp;&amp;</span><br />
</span></strong><span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>顺
序执行多条命令，当碰到执行出错的命令后将不执行后面的命令<br />
</strong></span>find "ok" c:test.txt
&amp;&amp; echo 成功<br />
如果找到了"ok"字样，就显示"成功"，找不到就不显示</span><br />
<br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">24</span> ||</span></span></strong><br />
<span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>顺
序执行多条命令，当碰到执行正确的命令后将不执行后面的命令</strong></span><br />
find "ok" c:test.txt ||
echo 不成功<br />
如果找不到"ok"字样，就显示"不成功"，找到了就不显示<br />
</span><br />
<span style="color: rgb(255, 0, 0);"><strong><span style="font-size: medium;"><span style="color: rgb(0, 0, 0);">25</span> |</span></strong><br />
</span><span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>管
道命令</strong></span><br />
dir *.* /s/a | find /c ".exe"<br />
管道命令表示先执行 dir
命令，对其输出的结果执行后面的 find 命令<br />
该命令行结果：输出当前文件夹及所有子文件夹里的.exe文件的个数<br />
type
c:test.txt|more<br />
这个和 more c:test.txt 的效果是一样的</span><br />
<br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">26</span> &gt; 和 &gt;&gt;</span></span><br />
</strong><span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>输
出重定向命令<br />
</strong></span>&gt; 清除文件中原有的内容后再写入<br />
&gt;&gt;
追加内容到文件末尾，而不会清除原有的内容<br />
主要将本来显示在屏幕上的内容输出到指定文件中<br />
指定文件如果不存在，则自动生成该文件<br />
type
c:test.txt &gt;prn<br />
屏幕上不显示文件内容，转向输出到打印机<br />
echo hello world&gt;con<br />
在
屏幕上显示hello world，实际上所有输出都是默认 &gt;con 的<br />
copy c:test.txt f: &gt;nul<br />
拷
贝文件，并且不显示"文件复制成功"的提示信息，但如果f盘不存在，还是会显示出错信息<br />
copy c:test.txt f: &gt;nul
2&gt;nul<br />
不显示&#8221;文件复制成功&#8221;的提示信息，并且f盘不存在的话，也不显示错误提示信息<br />
echo ^^W ^&gt;
^W&gt;c:test.txt<br />
生成的文件内容为 ^W &gt; W<br />
^ 和 &gt;
是控制命令，要把它们输出到文件，必须在前面加个 ^ 符号<br />
</span><br />
<span style="color: rgb(255, 0, 0);"><strong><span style="font-size: medium;"><span style="color: rgb(0, 0, 0);">27</span> &lt;</span><br />
</strong></span><span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>从
文件中获得输入信息，而不是从屏幕上</strong></span><br />
一般用于 date time label 等需要等待输入的命令<br />
@echo
off<br />
echo 2005-05-01&gt;temp.txt<br />
date &lt;temp.txt<br />
del temp.txt<br />
这
样就可以不等待输入直接修改当前日期<br />
</span><br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">28</span>
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*</span></span></strong><br />
<span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>命
令行传递给批处理的参数</strong></span><br />
%0 批处理文件本身<br />
%1 第一个参数<br />
%9 第九个参数<br />
%*
从第一个参数开始的所有参数<br />
<br />
批参数(%n)的替代已被增强。您可以使用以下语法:<br />
<br />
&nbsp; &nbsp;&nbsp;&nbsp;%~1&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; -
删除引号(")，扩充 %1<br />
&nbsp; &nbsp;&nbsp;&nbsp;%~f1&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;- 将 %1 扩充到一个完全合格的路径名<br />
&nbsp; &nbsp;&nbsp;&nbsp;%~d1&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;- 仅将 %1 扩充到一个驱动器号<br />
&nbsp; &nbsp;&nbsp;&nbsp;%~p1&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;- 仅将 %1 扩充到一个路径<br />
&nbsp;
&nbsp;&nbsp;&nbsp;%~n1&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;- 仅将 %1 扩充到一个文件名<br />
&nbsp; &nbsp;&nbsp;&nbsp;%~x1&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;- 仅将 %1 扩充到一个文件扩展名<br />
&nbsp;
&nbsp;&nbsp;&nbsp;%~s1&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;- 扩充的路径指含有短名<br />
&nbsp; &nbsp;&nbsp;&nbsp;%~a1&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;- 将 %1 扩充到文件属性<br />
&nbsp;
&nbsp;&nbsp;&nbsp;%~t1&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;- 将 %1 扩充到文件的日期/时间<br />
&nbsp; &nbsp;&nbsp;&nbsp;%~z1&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;- 将 %1 扩充到文件的大小<br />
&nbsp;
&nbsp;&nbsp;&nbsp;%~$PATH : 1 - 查找列在 PATH 环境变量的目录，并将 %1<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
扩充到找到的第一个完全合格的名称。如果环境<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 变量名未被定义，或者没有找到文件，此组合键会<br />
&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 扩充到空字符串<br />
<br />
可以组合修定符来取得多重结果:<br />
<br />
&nbsp; &nbsp; %~dp1&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;- 只将 %1 扩展到驱动器号和路径<br />
&nbsp; &nbsp; %~nx1&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 只将 %1 扩展到文件名和扩展名<br />
&nbsp; &nbsp;
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1，<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
并扩展到找到的第一个文件的驱动器号和路径。<br />
&nbsp; &nbsp; %~ftza1&nbsp; &nbsp;&nbsp; &nbsp;- 将 %1 扩展到类似 DIR 的输出行。<br />
可以参照
call/? 或 for/? 看出每个参数的含意<br />
echo load "%%1" "%%2"&gt;c:test.txt<br />
生成的文
件内容为 load "%1" "%2"<br />
批处理文件里，用这个格式把命令行参数输出到文件<br />
</span><br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">29</span> if</span></span></strong><br />
<span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>判
断命令<br />
</strong></span>if "%1"=="/a" echo 第一个参数是/a<br />
if /i "%1" equ
"/a" echo 第一个参数是/a<br />
/i 表示不区分大小写，equ 和 == 是一样的，其它运算符参见 if/?<br />
if exist
c:test.bat echo 存在c:test.bat文件<br />
if not exist c:windows (<br />
&nbsp; &nbsp;&nbsp;&nbsp;echo
不存在c:windows文件夹<br />
&nbsp; &nbsp;&nbsp;&nbsp;)<br />
if exist c:test.bat (<br />
&nbsp; &nbsp;&nbsp;&nbsp;echo
存在c:test.bat<br />
&nbsp; &nbsp;&nbsp;&nbsp;) else (<br />
&nbsp; &nbsp;&nbsp;&nbsp;echo 不存在c:test.bat<br />
&nbsp; &nbsp;&nbsp;&nbsp;)<br />
<br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">30</span> setlocal 和 endlocal</span></span></strong><br />
<span style="color: rgb(139, 0, 0);"><strong>设置&#8221;命令扩展名&#8221;和&#8221;延缓环境变量扩充&#8221;</strong></span><br />
SETLOCAL
ENABLEEXTENSIONS&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; #启用"命令扩展名"<br />
SETLOCAL DISABLEEXTENSIONS&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#停用"命令扩展名"<br />
SETLOCAL ENABLEDELAYEDEXPANSION&nbsp; &nbsp;&nbsp; &nbsp;
#启用"延缓环境变量扩充"<br />
SETLOCAL DISABLEDELAYEDEXPANSION&nbsp; &nbsp;&nbsp; &nbsp;#停用"延缓环境变量扩充"<br />
ENDLOCAL&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#恢复到使用SETLOCAL语句以前的状态<br />
&#8220;命令扩展名&#8221;默认为启用<br />
&#8220;延
缓环境变量扩充&#8221;默认为停用<br />
批处理结束系统会自动恢复默认值<br />
可以修改注册表以禁用"命令扩展名"，详见 cmd /?
。所以用到"命令扩展名"的程<br />
序，建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL
语句，以确<br />
保程序能在其它系统上正确运行<br />
"延缓环境变量扩充"主要用于 if 和 for 的符合语句，在 set
的说明里有其实用例程<br />
</span><br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">31</span>
set</span></span></strong><br />
<span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>设置变量<br />
</strong></span>引用变量可在变量
名前后加 % ，即 %变量名%<br />
set&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#显示目前所有可用的变量，包括系统变量和自定义的变量<br />
echo
%SystemDrive%&nbsp; &nbsp;&nbsp; &nbsp;#显示系统盘盘符。系统变量可以直接引用<br />
set p&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
#显示所有以p开头的变量，要是一个也没有就设errorlevel=1<br />
set p=aa1bb1aa2bb2&nbsp; &nbsp;&nbsp;
&nbsp;#设置变量p，并赋值为 = 后面的字符串，即aa1bb1aa2bb2<br />
echo %p%&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
#显示变量p代表的字符串，即aa1bb1aa2bb2<br />
echo %p:~6%&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
#显示变量p中第6个字符以后的所有字符，即aa2bb2<br />
echo %p:~6,3%&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;#显示第6个字符以后的3个字符，即aa2<br />
echo %p:~0,3%&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;#显示前3个字符，即aa1<br />
echo
%p:~-2%&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#显示最后面的2个字符，即b2<br />
echo %p:~0,-2%&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
#显示除了最后2个字符以外的其它字符，即aa1bb1aa2b<br />
echo %p:aa=c%&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;#用c替换变量p中所有的aa，即显示c1bb1c2bb2<br />
echo %p:aa=%&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;#将变量p中的所有aa字符串置换为空，即显示1bb12bb2<br />
echo %p:*bb=c%&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
#第一个bb及其之前的所有字符被替换为c，即显示c1aa2bb2<br />
set p=%p:*bb=c%&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#设置变量p，赋值为
%p:*bb=c% ，即c1aa2bb2<br />
set /a p=39&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; #设置p为数值型变量，值为39<br />
set
/a p=39/10&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; #支持运算符，有小数时用去尾法，39/10=3.9，去尾得3，p=3<br />
set /a p=p/10&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;#用 /a 参数时，在 = 后面的变量可以不加%直接引用<br />
set /a p=&#8221;1&amp;0&#8243;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
#&#8221;与&#8221;运算，要加引号。其它支持的运算符参见set/?<br />
set p=&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#取消p变量<br />
set /p
p=请输入<br />
屏幕上显示&#8221;请输入&#8221;，并会将输入的字符串赋值给变量p<br />
注意这条可以用来取代 choice 命令<br />
注意变量在 if 和
for 的复合语句里是一次性全部替换的，如<br />
@echo off<br />
set p=aaa<br />
if %p%==aaa (<br />
&nbsp;
&nbsp;&nbsp;&nbsp;echo %p%<br />
&nbsp; &nbsp;&nbsp;&nbsp;set p=bbb<br />
&nbsp; &nbsp;&nbsp;&nbsp;echo %p%<br />
&nbsp; &nbsp;&nbsp;&nbsp;)<br />
结果将显示<br />
aaa<br />
aaa<br />
因
为在读取 if 语句时已经将所有 %p% 替换为aaa<br />
这里的"替换"，在 /? 帮助里就是指"扩充"、"环境变量扩充"<br />
可以启用&#8221;
延缓环境变量扩充&#8221;，用 ! 来引用变量，即 !变量名!<br />
@echo off<br />
SETLOCAL
ENABLEDELAYEDEXPANSION<br />
set p=aaa<br />
if %p%==aaa (<br />
&nbsp; &nbsp;&nbsp;&nbsp;echo %p%<br />
&nbsp;
&nbsp;&nbsp;&nbsp;set p=bbb<br />
&nbsp; &nbsp;&nbsp;&nbsp;echo !p!<br />
&nbsp; &nbsp;&nbsp;&nbsp;)<br />
ENDLOCAL<br />
结果将显示<br />
aaa<br />
bbb<br />
还
有几个动态变量，运行 set 看不到<br />
%CD%&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; #代表当前目录的字符串<br />
%DATE%&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;#当前日期<br />
%TIME%&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;#当前时间<br />
%RANDOM%&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;#随机整数，介于0~32767<br />
%ERRORLEVEL%&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;#当前 ERRORLEVEL 值<br />
%CMDEXTVERSION%&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;#当前命令处理器扩展名版本号<br />
%CMDCMDLINE%&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;#调用命令处理器的原始命令行<br />
可以用
echo命令查看每个变量值，如 echo %time%<br />
注意 %time% 精确到毫秒，在批处理需要延时处理时可以用到<br />
</span><br />
<span style="color: rgb(255, 0, 0);"><strong><span style="font-size: medium;"><span style="color: rgb(0, 0, 0);">32</span> start</span></strong><br />
</span><span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>批
处理中调用外部程序的命令，否则等外部程序完成后才继续执行剩下的指令</strong></span><br />
</span><br />
<span style="color: rgb(255, 0, 0);"><strong><span style="font-size: medium;"><span style="color: rgb(0, 0, 0);">33 </span>call</span></strong><br />
</span><span style="color: rgb(139, 0, 0);"><strong>批处理中调用另外一个批处理的命令，否则剩下的批处理指令将不会被执
行<br />
有时有的应用程序用start调用出错的，也可以call调用<br />
</strong></span><br />
<span style="color: rgb(255, 0, 0);"><strong><span style="font-size: medium;"><span style="color: rgb(0, 0, 0);">34</span> choice (外部命令)</span></strong><br />
</span><span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>选
择命令<br />
</strong></span>让用户输入一个字符，从而选择运行不同的命令，返回码errorlevel为1234&#8230;&#8230;<br />
win98
里是choice.com<br />
win2000pro里没有，可以从win98里拷过来<br />
win2003里是choice.exe<br />
choice
/N /C y /T 5 /D y&gt;nul<br />
延时5秒</span><br />
<br />
<span style="color: rgb(255, 0, 0);"><strong><span style="font-size: medium;"><span style="color: rgb(0, 0, 0);">35</span> assoc 和 ftype</span></strong><br />
</span><span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);">文件关
联<br />
</span>assoc 设置'文件扩展名'关联，关联到'文件类型'<br />
ftype 设置'文件类型'关联，关联到'执行程序和参数'<br />
当
你双击一个.txt文件时，windows并不是根据.txt直接判断用 notepad.exe 打开<br />
而是先判断.txt属于 txtfile
'文件类型'<br />
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1<br />
可
以在"文件夹选项"&#8594;"文件类型"里修改这2种关联<br />
assoc&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#显示所有'文件扩展名'关联<br />
assoc
.txt&nbsp; &nbsp;&nbsp; &nbsp; #显示.txt代表的'文件类型'，结果显示 .txt=txtfile<br />
assoc .doc&nbsp; &nbsp;&nbsp; &nbsp;
#显示.doc代表的'文件类型'，结果显示 .doc=Word.Document.8<br />
assoc .exe&nbsp; &nbsp;&nbsp; &nbsp;
#显示.exe代表的'文件类型'，结果显示 .exe=exefile<br />
ftype&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#显示所有'文件类型'关联<br />
ftype
exefile&nbsp; &nbsp; #显示exefile类型关联的命令行，结果显示 exefile="%1" %* <br />
assoc
.txt=Word.Document.8<br />
设置.txt为word类型的文档，可以看到.txt文件的图标都变了<br />
assoc
.txt=txtfile<br />
恢复.txt的正确关联<br />
ftype exefile="%1" %*<br />
恢复 exefile 的正确关联<br />
如
果该关联已经被破坏，可以运行 command.com ，再输入这条命令<br />
</span><br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">36</span> pushd 和 popd</span></span></strong><br />
<span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>切
换当前目录<br />
</strong></span>@echo off<br />
c: &amp; cd &amp; md mp3&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;#在
C: 建立 mp3 文件夹<br />
md d:mp4&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; #在 D: 建立 mp4 文件夹<br />
cd /d
d:mp4&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; #更改当前目录为 d:mp4<br />
pushd c:mp3&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;
#保存当前目录，并切换当前目录为 c:mp3<br />
popd&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#恢复当前目录为刚才保存的 d:mp4<br />
</span><br />
<span style="color: rgb(255, 0, 0);"><strong><span style="font-size: medium;"><span style="color: rgb(0, 0, 0);">37</span> for</span></strong><br />
</span><span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>循
环命令<br />
</strong></span>这个比较复杂，请对照 for/? 来看<br />
for %%i in (c: d: e: f:)
do echo %%i<br />
依次调用小括号里的每个字符串，执行 do 后面的命令<br />
注意%%i，在批处理中 for 语句调用参数用2个%<br />
默
认的字符串分隔符是"空格键"，"Tab键"，"回车键"<br />
for %%i in (*.txt) do find "abc" %%i<br />
对
当前目录里所有的txt文件执行 find 命令<br />
for /r . %%i in (*.txt) do find "abc" %%i<br />
在
当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行<br />
for /r . %%i in (.) do echo %%~pni<br />
显
示当前目录名和所有子目录名，包括路径，不包括盘符<br />
for /r d:mp3 %%i in (*.mp3) do echo
%%i&gt;&gt;d:mp3.txt<br />
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去<br />
for
/l %%i in (2,1,8) do echo %%i<br />
生成2345678的一串数字，2是数字序列的开头，8是结尾，1表示每次加1<br />
for
/f %%i in ('set') do echo %%i<br />
对 set 命令的输出结果循环调用，每行一个<br />
for /f
"eol=P" %%i in ('set') do echo %%i<br />
取 set 命令的输出结果，忽略以 P 开头的那几行<br />
for
/f %%i in (d:mp3.txt) do echo %%i<br />
显示 d:mp3.txt 里的每个文件名，每行一个，不支持带空格的名称<br />
for
/f "delims=" %%i in (d:mp3.txt) do echo %%i<br />
显示 d:mp3.txt
里的每个文件名，每行一个，支持带空格的名称<br />
for /f "skip=5 tokens=4" %%a in ('dir') do echo
%%a<br />
对 dir 命令的结果，跳过前面5行，余下的每行取第4列<br />
每列之间的分隔符为默认的"空格"<br />
可以注意到 dir
命令输出的前5行是没有文件名的<br />
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do
(<br />
&nbsp; &nbsp;&nbsp;&nbsp;echo %%a<br />
&nbsp; &nbsp;&nbsp;&nbsp;echo %%b<br />
&nbsp; &nbsp;&nbsp;&nbsp;echo %%c<br />
&nbsp; &nbsp;&nbsp;&nbsp;)<br />
对
date /t 的输出结果，每行取1、2、3列<br />
第一列对应指定的 %%a ，后面的 %%b 和 %%c 是派生出来的，对应其它列<br />
分
隔符指定为 - 和"空格"，注意 delims=- 后面有个"空格"<br />
其中 tokens=1,2,3 若用 tokens=1-3
替换，效果是一样的<br />
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b<br />
取
第2列给 %%a ，其后的列都给 %%b</span><br />
<span style="color: rgb(0, 0, 255);"><br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">38</span> subst (外部命令)</span></span></strong><br />
<strong><span style="color: rgb(139, 0, 0);">映射磁盘。</span></strong><br />
subst z:
serverd&nbsp; &nbsp;&nbsp; &nbsp;#这样输入z:就可以访问serverd了<br />
subst z: /d&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;#取消该映射<br />
subst&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;#显示目前所有的映时<br />
</span><br />
<strong><span style="font-size: medium;"><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">39</span>&nbsp; &nbsp;xcopy (外部命令)</span></span><br />
</strong><span style="color: rgb(0, 0, 255);"><span style="color: rgb(139, 0, 0);"><strong>文
件拷贝</strong><br />
</span>xcopy d:mp3 e:mp3 /s/e/i/y<br />
复制 d:mp3
文件夹、所有子文件夹和文件到 e: ，覆盖已有文件<br />
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个，否则会有询问</span>
<img src ="http://www.blogjava.net/wingwing/aggbug/324135.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wingwing/" target="_blank">Li Ya Qiang</a> 2010-06-22 11:20 <a href="http://www.blogjava.net/wingwing/archive/2010/06/22/324135.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转载】使用 Iterator 或for-each注意：java.util.ConcurrentModificationException</title><link>http://www.blogjava.net/wingwing/archive/2010/03/02/314300.html</link><dc:creator>Li Ya Qiang</dc:creator><author>Li Ya Qiang</author><pubDate>Tue, 02 Mar 2010 08:50:00 GMT</pubDate><guid>http://www.blogjava.net/wingwing/archive/2010/03/02/314300.html</guid><wfw:comment>http://www.blogjava.net/wingwing/comments/314300.html</wfw:comment><comments>http://www.blogjava.net/wingwing/archive/2010/03/02/314300.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wingwing/comments/commentRss/314300.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wingwing/services/trackbacks/314300.html</trackback:ping><description><![CDATA[来自http://www.blogjava.net/fingki/archive/2010/03/02/314268.html<br />
<br />
在使用Iterator处理Collection时，注意java.util.ConcurrentModificationException。<br />
1.如果你仅仅是对collection进行遍历查询，那么不必担心什么。<br />
2.但如果你在遍历过程中要对collection进行删除，那么你就要注意了。<br />
For example:<br />
private&nbsp;void&nbsp;testDel()&nbsp;{&nbsp;&nbsp;
<ol start="1">
    <li>&nbsp;&nbsp;&nbsp;&nbsp;List&lt;String&gt;&nbsp;list&nbsp;=&nbsp;new&nbsp;ArrayList&lt;String&gt;();&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;10;&nbsp;i++)&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;=&nbsp;"td"&nbsp;+&nbsp;i;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(str);&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(Iterator&nbsp;it&nbsp;=&nbsp;list.iterator();&nbsp;it.hasNext();)&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;=&nbsp;(String)&nbsp;it.next();&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(str.equals("td5"))&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;list.remove(str);&nbsp;&nbsp;// 删除方法一&nbsp; <br />
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it.remove();&nbsp;&nbsp;// 删除方法二&nbsp; <br />
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li>
    <li>}&nbsp; <br />
    </li>
</ol>
上面的代码运行没有问题，但如果你用&#8220;方法一&#8221;替代&#8220;方法二&#8221;，则会出现
java.util.ConcurrentModificationException。<br />
（用for-each遍历也会出个类似问题）<br />
具体原因是可以看一下<span style="color: rgb(0, 0, 0);">先看看List中的remove方法源码：<br />
</span>
<ol start="1">
    <li>public&nbsp;boolean&nbsp;remove(Object&nbsp;o)&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(o&nbsp;==&nbsp;null)&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;index&nbsp;=&nbsp;0;&nbsp;index&nbsp;&lt;&nbsp;size;&nbsp;index++)&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(elementData[index]&nbsp;==&nbsp;null)&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fastRemove(index);&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;index&nbsp;=&nbsp;0;&nbsp;index&nbsp;&lt;&nbsp;size;&nbsp;index++)&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(o.equals(elementData[index]))&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fastRemove(index);&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;&nbsp;&nbsp;</li>
    <li>}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>private&nbsp;void&nbsp;fastRemove(int&nbsp;index)&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;modCount++;&nbsp;//&nbsp;特别注意这里，这里只增加了modCount的值&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;numMoved&nbsp;=&nbsp;size&nbsp;-&nbsp;index&nbsp;-&nbsp;1;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(numMoved&nbsp;&gt;&nbsp;0)&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.arraycopy(elementData,&nbsp;index&nbsp;+&nbsp;1,&nbsp;elementData,&nbsp;index,&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numMoved);&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;elementData[--size]&nbsp;=&nbsp;null;&nbsp;//&nbsp;Let&nbsp;gc&nbsp;do&nbsp;its&nbsp;work&nbsp;&nbsp;</li>
    <li>}&nbsp; <br />
    </li>
</ol>
接着看。删除后得到下一个元素的代码，it.next():&nbsp; it为AbstractList的内部类Iterator的一个实例。<br />
<ol start="1">
    <li>public&nbsp;E&nbsp;next()&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;checkForComodification();&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E&nbsp;next&nbsp;=&nbsp;get(cursor);&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastRet&nbsp;=&nbsp;cursor++;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;next;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IndexOutOfBoundsException&nbsp;e)&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;checkForComodification();&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;NoSuchElementException();&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li>
    <li>}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>final&nbsp;void&nbsp;checkForComodification()&nbsp;{&nbsp; //注意这个方法<br />
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(modCount&nbsp;!=&nbsp;expectedModCount)&nbsp; //检查这两个值是否相同</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ConcurrentModificationException();&nbsp;&nbsp;</li>
    <li>}&nbsp; <br />
    </li>
</ol>
最后看Iterator的remove()方法的源代码：<br />
<ol start="1">
    <li>public&nbsp;void&nbsp;remove()&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(lastRet&nbsp;==&nbsp;-1)&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalStateException();&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;checkForComodification();&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AbstractList.this.remove(lastRet);&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(lastRet&nbsp;&lt;&nbsp;cursor)&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor--;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastRet&nbsp;=&nbsp;-1;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expectedModCount&nbsp;=&nbsp;modCount;&nbsp;//&nbsp;设置expectedModCount&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IndexOutOfBoundsException&nbsp;e)&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ConcurrentModificationException();&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li>
    <li>}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>final&nbsp;void&nbsp;checkForComodification()&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(modCount&nbsp;!=&nbsp;expectedModCount)&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ConcurrentModificationException();&nbsp;&nbsp;</li>
    <li>}&nbsp; <br />
    </li>
</ol>
这下就明白了，list的remove方法只修改了modCount值，而iterator的remove能同步modCount和
expectedModCount.<br />
<img src ="http://www.blogjava.net/wingwing/aggbug/314300.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wingwing/" target="_blank">Li Ya Qiang</a> 2010-03-02 16:50 <a href="http://www.blogjava.net/wingwing/archive/2010/03/02/314300.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>URL中的ASCII标示符</title><link>http://www.blogjava.net/wingwing/archive/2009/05/25/277784.html</link><dc:creator>Li Ya Qiang</dc:creator><author>Li Ya Qiang</author><pubDate>Mon, 25 May 2009 02:19:00 GMT</pubDate><guid>http://www.blogjava.net/wingwing/archive/2009/05/25/277784.html</guid><wfw:comment>http://www.blogjava.net/wingwing/comments/277784.html</wfw:comment><comments>http://www.blogjava.net/wingwing/archive/2009/05/25/277784.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wingwing/comments/commentRss/277784.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wingwing/services/trackbacks/277784.html</trackback:ping><description><![CDATA[（转帖）<br />
URL中的特殊字符&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br />
&nbsp;&nbsp;有些符号在URL中是不能直接传递的，如果要在URL中传递这些特殊符号，那么就要使用他们的编码了。编码的格式为：%加字符的ASCII码，即一个百分号%，后面跟对应字符的ASCII（16进制）码值。例如&nbsp;&nbsp;&nbsp;空格的编码值是"%20"。&nbsp;&nbsp;&nbsp;
<br />
&nbsp;&nbsp;下表中列出了一些URL特殊符号及编码&nbsp;&nbsp;&nbsp;
<br />
&nbsp;&nbsp;　&nbsp;&nbsp;&nbsp;
<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<br />
&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;十六进制值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br />
&nbsp;&nbsp;1.&nbsp;&nbsp;&nbsp;+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%2B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br />
&nbsp;&nbsp;2.&nbsp;&nbsp;&nbsp;空格&nbsp;&nbsp;&nbsp;URL中的空格可以用+号或者编码&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br />
&nbsp;&nbsp;3.&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%2F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br />
&nbsp;&nbsp;4.&nbsp;&nbsp;&nbsp;?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;分隔实际的&nbsp;&nbsp;&nbsp;URL&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;%3F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br />
&nbsp;&nbsp;5.&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;&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;%25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br />
&nbsp;&nbsp;6.&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br />
&nbsp;&nbsp;7.&nbsp;&nbsp;&nbsp;&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL&nbsp;&nbsp;&nbsp;中指定的参数间的分隔符&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%26&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br />
&nbsp;&nbsp;8.&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%3D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<img src ="http://www.blogjava.net/wingwing/aggbug/277784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wingwing/" target="_blank">Li Ya Qiang</a> 2009-05-25 10:19 <a href="http://www.blogjava.net/wingwing/archive/2009/05/25/277784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转载）RCP的一些细节部分</title><link>http://www.blogjava.net/wingwing/archive/2008/07/13/214551.html</link><dc:creator>Li Ya Qiang</dc:creator><author>Li Ya Qiang</author><pubDate>Sun, 13 Jul 2008 02:07:00 GMT</pubDate><guid>http://www.blogjava.net/wingwing/archive/2008/07/13/214551.html</guid><wfw:comment>http://www.blogjava.net/wingwing/comments/214551.html</wfw:comment><comments>http://www.blogjava.net/wingwing/archive/2008/07/13/214551.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wingwing/comments/commentRss/214551.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wingwing/services/trackbacks/214551.html</trackback:ping><description><![CDATA[来自http://cary.javaeye.com/blog/32419<br />
<br />
<span class="hilite1">ECLIPSE</span> PLUG-IN RCP
<br />
此部分有的是自己的开发中的经验，有的是在论坛中看到别人的经验。我在这里把部分觉得好的部分收集，整理。希望对大家有帮助。
<br />
1：登陆对话框
<br />
public Object run(Object args) throws Exception {
<br />
Display display = PlatformUI.createDisplay();
<br />
<br />
try {
<br />
Platform.endSplash();
<br />
/**
<br />
* 登录
<br />
*/
<br />
if (!login())
<br />
return IPlatformRunnable.EXIT_OK;
<br />
<br />
logger.info("正在初始化客户端......");
<br />
//
<br />
InitUIProgress.addInfor("初始化主界面...");
<br />
int returnCode = PlatformUI.createAndRunWorkbench(display,
<br />
new ApplicationWorkbenchAdvisor());
<br />
if (returnCode == PlatformUI.RETURN_RESTART) {
<br />
return IPlatformRunnable.EXIT_RESTART;
<br />
}
<br />
<br />
return IPlatformRunnable.EXIT_OK;
<br />
} finally {
<br />
display.dispose();
<br />
}
<br />
}
<br />
<br />
<br />
<br />
2：该写actionBar 的 ActionFactory.OPEN_PERSPECTIVE_DIALOG.create(window)
<br />
<br />
IActionBarConfigurer configurer = getActionBarConfigurer();
<br />
final IWorkbenchWindow window = configurer.getWindowConfigurer().getWindow();
<br />
<br />
MenuManager perspectiveMenu = new MenuManager("Open Perspective");
<br />
IContributionItem perspectiveList = ContributionItemFactory.PERSPECTIVES_SHORTLIST.create(window);
<br />
perspectiveMenu.add(perspectiveList);
<br />
windowMenu.add(perspectiveMenu);
<br />
<br />
3：让其viewpart显示流线型
<br />
在 WorkbenchWindowAdvisor 中的preWindowOpen（）中设置
<br />
//显示特效
<br />
PlatformUI.getPreferenceStore().setDefault(
<br />
IWorkbenchPreferenceConstants.ENABLE_ANIMATIONS, true);
<br />
//不显示传统的窗口
<br />
PlatformUI.getPreferenceStore().setDefault(
<br />
IWorkbenchPreferenceConstants.SHOW_TRADITIONAL_STYLE_TABS,
<br />
false);
<br />
<br />
<br />
4:可以使用action来做, 调用下面的方法:
<br />
<br />
IWorkbench.showPerspective(String perspectiveId, IWorkbenchWindow window)
<br />
or
<br />
IWorkbench.showPerspective(String perspectiveId, IWorkbenchWindow window, IAdaptable input)
<br />
<br />
IWorkbench和IWorkbenchWindow对象都可以在ViewPart中找到.
<br />
<br />
5:定义热键
<br />
getShell().getDisplay().addFilter(SWT.KeyDown, globEvent);
<br />
<br />
将plugin.xml里面hotkey
<br />
&lt;extension
<br />
point="org.<span class="hilite1">eclipse</span>.ui.bindings"&gt;
<br />
&lt;!--key
<br />
commandId="org.<span class="hilite1">eclipse</span>.ui.file.exit"
<br />
schemeId="org.<span class="hilite1">eclipse</span>.ui.defaultAcceleratorConfiguration"
<br />
sequence="CTRL+X"&gt;
<br />
&lt;/key --&gt;
<br />
&lt;/extension&gt;
<br />
<br />
6.如何或得RCP中的一些路径问题
<br />
从插件中获得绝对路径：
<br />
AaaaPlugin.getDefault().getStateLocation().makeAbsolute().toFile().getAbsolutePath());
<br />
<br />
<br />
通过文件得到Project：
<br />
<br />
IProject project = ((IFile)o).getProject();
<br />
<br />
<br />
通过文件得到全路径：
<br />
<br />
String path = ((IFile)o).getLocation().makeAbsolute().toFile().getAbsolutePath();
<br />
<br />
<br />
<br />
得到整个Workspace的根：
<br />
<br />
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
<br />
<br />
<br />
从根来查找资源：
<br />
<br />
IResource resource = root.findMember(new Path(containerName));
<br />
<br />
从Bundle来查找资源：
<br />
<br />
Bundle bundle = Platform.getBundle(pluginId);
<br />
URL fullPathString = BundleUtility.find(bundle, filePath); //BundleUtility类在ui里，非UI的没法用
<br />
<br />
还有其它方法：URL fileURL = FileLocator.find(bundle, new Path("some file relative path"), null); <br />
<br />
<br />
得到Appliaction workspace：
<br />
<br />
Platform.asLocalURL(PRODUCT_BUNDLE.getEntry("")).getPath()).getAbsolutePath();
<br />
<br />
得到runtimeworkspace：
<br />
Platform.getInstanceLocation().getURL().getPath();
<br />
<br />
从编辑器来获得编辑文件：
<br />
<br />
IEditorPart editor = ((DefaultEditDomain)(parent.getViewer().getEditDomain())).getEditorPart();
<br />
IEditorInput input = editor.getEditorInput();
<br />
if(input instanceof IFileEditorInput){
<br />
IFile file = ((IFileEditorInput)input).getFile();
<br />
}
<br />
<br />
得到plugin.xml中的所以ACTION
<br />
IContributionItem[] items = getViewSite().getActionBars().getMenuManager().getItems();
<br />
for (int i = 0; i &lt; items.length; i++) {
<br />
manager.add(items[i]);
<br />
}<br />
<br />
<img src ="http://www.blogjava.net/wingwing/aggbug/214551.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wingwing/" target="_blank">Li Ya Qiang</a> 2008-07-13 10:07 <a href="http://www.blogjava.net/wingwing/archive/2008/07/13/214551.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在view里得到在workbechwindow里注册到menu的action</title><link>http://www.blogjava.net/wingwing/archive/2008/07/13/214547.html</link><dc:creator>Li Ya Qiang</dc:creator><author>Li Ya Qiang</author><pubDate>Sun, 13 Jul 2008 01:55:00 GMT</pubDate><guid>http://www.blogjava.net/wingwing/archive/2008/07/13/214547.html</guid><wfw:comment>http://www.blogjava.net/wingwing/comments/214547.html</wfw:comment><comments>http://www.blogjava.net/wingwing/archive/2008/07/13/214547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wingwing/comments/commentRss/214547.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wingwing/services/trackbacks/214547.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; （本人原创，转载请注明出处） &nbsp;  <br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 上周五在项目中遇到一个棘手的问题，需要在自己定义的view中得到在workbechwindow里注册到menu的action。这个action不是通过扩展扩展点actionset定义的，就是通过继承Action对象来定义的。经过一番思索后，感觉有两条路可走：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1.&nbsp; 让这个action继承IPartListener接口，并注册到那个view中，这样在view中可以通过getListeners方法得到注册到这个view中的所有Listener列表，再通过id找到这个action，并改变这个action的状态。但是在后来遇到一个问题，这个action由于是在perspective的ApplicatonActionBarAdvisor的方法中实例化的，比view先初始化，故在aciton中无法得到这个view的实例，因此无法把action注册到view中。不知道是不是我的理解有误，如果这条路可以走通，请达人帮忙。<br />
<br />
&nbsp;&nbsp;&nbsp; 2. 然后是在view中调用相应的方法来取得这个action。刚开始时，通过this.getSite().<span style="color: #000000;">getWorkbenchWindow()方法始终无法得到actionbars，只有强制类型转换到WorkbenchWindow才能得到actionbars，</span>主要是通过以下代码：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">WWinActionBars </span><span style="color: #000000;">winBars </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp; ((WorkbenchWindow)&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.getSite().<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getWorkbenchWindow()).getActionBars();<br />
IAction&nbsp;action&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">winBars </span><span style="color: #000000;">.getGlobalActionHandler(</span><span style="color: #000000;">"</span><span style="color: #000000;">actionID</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
action.setEnable(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);</span></div>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 但是WWinActionBars类并没有实现通过action的ID得到这个action对象的<span style="color: #000000;">getGlobalActionHandler方法，该method只返回null，因此此方法也无法达成目标。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 就在我无计可施的时候，只能想到用最笨的办法来实现了，就是在view中得到管理这个aciton的MenuManager，并通过MenuManager来得到和action相关联的MenuItem，最后改变MenuItem的状态来改变action。主要代码如下：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; WWinActionBars winBars&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;((WorkbenchWindow)&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.getSite().<br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getWorkbenchWindow()).getActionBars();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IContributionItem[] contributionItems&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">winBars </span><span style="color: #000000;">.<br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getMenuManager().getItems();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> </span><span style="color: #000000;">contributionItems </span><span style="color: #000000;">.length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">contributionItems</span><span style="color: #000000;">[i]&nbsp;</span><span style="color: #0000ff;">instanceof</span><span style="color: #000000;">&nbsp;MenuManager)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MenuManager&nbsp;menuM </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(MenuManager)</span><span style="color: #000000;">contributionItems </span><span style="color: #000000;">[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">menuM </span><span style="color: #000000;">.getId().equals(</span><span style="color: #000000;">"</span><span style="color: #000000;">menumanagerID"</span><span style="color: #000000;">))&nbsp;{ </span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MenuItem[]&nbsp;menuItems&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">menuM</span><span style="color: #000000;">.getMenu().getItems();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;j&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> </span><span style="color: #000000;">menuItems</span><span style="color: #000000;">.length;&nbsp;j</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&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 style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">menuItems </span><span style="color: #000000;">[j].getText().equals(</span><span style="color: #000000;">"actionText</span><span style="color: #000000;">"</span><span style="color: #000000;">))&nbsp;{<br />
&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><span style="color: #000000;">menuItems </span><span style="color: #000000;">[j].setEnable(true);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span><span style="color: #000000;"><br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&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><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;  <br />
</span></div>
<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
</span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 经过这次研究，对SWT和JFace的menu管理有了更深的理解，如果中间有什么问题，请达人们指出来，大家一起学习，谢谢！<br />
<br />
<img src ="http://www.blogjava.net/wingwing/aggbug/214547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wingwing/" target="_blank">Li Ya Qiang</a> 2008-07-13 09:55 <a href="http://www.blogjava.net/wingwing/archive/2008/07/13/214547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>