﻿<?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>博客园-八进制</title><link>http://www.cnblogs.com/bjzhanghao/</link><description>少年壮志无烟抽</description><language>zh-cn</language><lastBuildDate>Fri, 03 Jul 2009 03:10:12 GMT</lastBuildDate><pubDate>Fri, 03 Jul 2009 03:10:12 GMT</pubDate><ttl>60</ttl><item><title>ILOG JViews Diagrammer使用记录</title><link>http://www.cnblogs.com/bjzhanghao/archive/2009/04/17/1438359.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Fri, 17 Apr 2009 12:15:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2009/04/17/1438359.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/1438359.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2009/04/17/1438359.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/1438359.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/1438359.html</trackback:ping><description><![CDATA[<p>ILOG Jviews一共提供了四个组件，用来实现各种与可视化（Visualization）相关的应用实现。Diagrammer是其中之一，其主要功能是画一般意义的图，例如地图和各种拓扑图。以下记录了我在使用Diagrammer过程中遇到的问题和解决方法。<br /></p><p>使用Thin Client（在后台生成图片）的方式：<br />
</p>
<p>1、修改了.css文件，在浏览器里刷新页面发现没有更新</p>
<p>没办法，重启web服务器，更保险一些，在新开的浏览器里访问。</p>
<p>2、改变图片类型</p>
<p>缺省好像是JPG类型，要改为PNG应在&lt;jvdf:diagrammerView&gt;里加属性imageFormat="PNG"</p><p>3、让diagrammer区域始终占满所在&lt;div&gt;区域<br /></p><p>需在定义diagrammer时设置一个属性（//TODO）值为true</p><p>Special thanks to: He Xiangyang <br /></p>
<p> </p><img src ="http://www.cnblogs.com/bjzhanghao/aggbug/1438359.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47947/" target="_blank">微软告攒机商第一案胜诉</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Dojo使用中的问题记录</title><link>http://www.cnblogs.com/bjzhanghao/archive/2009/04/06/1430063.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Sun, 05 Apr 2009 16:37:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2009/04/06/1430063.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/1430063.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2009/04/06/1430063.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/1430063.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/1430063.html</trackback:ping><description><![CDATA[<p>1、动态填充dijit.form.MultiSelect</p>
<p>MultiSelect不支持dojo.data（即datastore），所以如果想把一个datastore动态填充进去，只能写一些javascript代码来动态创建那些&lt;option&gt;标签，基本上是通过myDataStore.fetch()来实现的。<a href="http://www.dojotoolkit.org/forum/dijit-dijit-0-9/dijit-support/populating-markup-multiselect">这个链接（Populating markup MultiSelect）</a>值得参考。</p>
<p>2、强制一个datastore从url里取得数据</p>
<p>myDataStore._forceLoad();</p>
<p>3、当datastore含有嵌套结构的时候，datastore.fetch()报错&#8220;dojo _48 is undefined&#8221;
</p>
<p>原因是在得到的json串里包含了"identifier"的声明，但嵌套结构里有一些对象没有包含所声明的属性。解决的方式1、让所有对象都包含该属性，2、去掉"identifier"声明（推荐1，因为我猜去掉这个声明后，在一些控件里将无法映射id值到html代码）<a href="http://www.dojotoolkit.com/forum/dojo-core-dojo-0-9/dojo-core-support/itemfilereadstore-and-nested-json">参考链接1</a> <a href="http://www.nabble.com/error-loading-root-children-td19828687.html">参考链接2</a><br />
</p>
<p>4、在dojo中响应事件</p>
<p> <a href="http://docs.dojocampus.org/quickstart/events">JavaScript events and Dojo</a></p>
<p>5、刷新BorderContainer</p>
<p>有时需要动态隐藏BorderContainer里的一些区域（如left），若近将该区域的style.display设置为"none"，则该区域所在的部分将变为空白，其他区域（如center）不会自动占领它原来的屏幕空间。这时需要调用dojo.byId('myBorderContainer').layout()方法手动让dojo重新计算一次布局，其他布局类似。<a href="http://www.nabble.com/update-resize-LayoutContainer-td5285082.html">一个相关链接（仅针对旧版本dojo）</a></p>
<p>6、用dojo画统计图（柱图，饼图等）</p>
<p>见这个教程：A Beginner's Guide to Dojo Charting (<a href="http://www.sitepen.com/blog/2008/06/06/a-beginners-guide-to-dojo-charting-part-1-of-2/">Part1</a>, <a href="http://www.sitepen.com/blog/2008/06/16/a-beginners-guide-to-dojo-charting-part-2-of-2/">Part2</a>)</p>
<p>7、程序改变dijit.dialog的标题</p>
<p>dijit.dialog并没有提供一个"setTitle"方法来控制标题内容，但可以通过dijit.byId('myDialog').titleNode.innerHTML='My New Title'来实现。<a href="http://www.alexatnet.com/node/75">参考链接</a></p>
<p>8、BorderContainer里各个pane的显示和隐藏</p>
<p>利用dojox.layout.ExpandoPane（尚不确定是否为experimental），使用的例子见<a href="http://archive.dojotoolkit.org/nightly/dojotoolkit/dojox/layout/tests/test_ExpandoPane.html">这个链接</a>。 <br />
</p>
<p>9、将ItemFileWriteStore序列化为JSON字符串</p>
<div class="cnblogs_code"><!--<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;foo</span><span style="color: #000000;">=</span><span style="color: #000000;">dojo.data.ItemFileWriteStore._getNewFileContentString();</span></div>
<p>&nbsp;</p>
<p>10、dojo的XHR(XmlHttpRequest) 里，handleAs可以有以下取值：<br />
</p>
<p>text (default), json, json-comment-optional, json-comment-filtered, javascript, xml</p>
<p><a href="http://www.sitepen.com/blog/2008/04/14/xhr-plugins-with-dojo-using-handleas/">参考链接</a> <br />
</p>
<p>11、将DataStore里的数据以XHR方式发给服务器，并处理返回值</p>
<p>在js里这样写：</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;data&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;scenarioEntryStore._getNewFileContentString();<br />
&nbsp;dojo.rawXhrPost({<br />
&nbsp;&nbsp;url:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">http://127.0.0.1:8080/myapp/myservlet</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;handleAs:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">text</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;postData:&nbsp;data,<br />
&nbsp;&nbsp;headers:&nbsp;{</span><span style="color: #000000;">"</span><span style="color: #000000;">Content-Type</span><span style="color: #000000;">"</span><span style="color: #000000;">:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">application/json</span><span style="color: #000000;">"</span><span style="color: #000000;">},<br />
&nbsp;&nbsp;handle:&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;(data,&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(data)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">error</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: #000000;">"</span><span style="color: #000000;">Error&nbsp;run&nbsp;analysis</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: #000000;">"</span><span style="color: #000000;">Successed&nbsp;run&nbsp;analysis</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">do&nbsp;with&nbsp;result&nbsp;data</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;});</span></div>
<p><br />
</p>
<p>在myservlet里用下面的方法得到js传过来的json字符串，然后可以用任何java的json包来做解析和处理了：</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">private&nbsp;String&nbsp;readJSONString(HttpServletRequest&nbsp;request)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;json&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;StringBuffer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;line&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;reader&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;request.getReader();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;((line&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;reader.readLine())&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json.append(line);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e.toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;json.toString();<br />
}</span></div>
<p>&nbsp;</p>
<p>12、使用xhr的时候，如果不是在本机访问，可能会遇到&#8220;Access to Restricted URI Denied&#8221;的提示。</p>
<p>一个可能的原因是xhr里的url的domain与访问者浏览器（或其他什么，这里没搞很清楚）的domain不一致，如果是这个原因，只要在url里使用相对路径就可以了。比如原来url是&#8220;http://127.0.0.1:8080/myapp/myservlet&#8221;的，改为&#8220;myservlet&#8221;即可。如果不是这个原因，<a href="http://www.dojotoolkit.org/forum/dojo-core-dojo-0-9/dojo-core-support/access-restricted-uri-denied">这个链接</a>可以参考一下。<br />
</p>
<p>13、dojo里的单击事件是&#8220;onClick&#8221;，写成&#8220;onclick&#8221;不认。（但onchange是全小写，够奇怪）<br />
</p>
<p>14、把json格式的数据画到dojo chart<br />
</p>
<p>下面是一个把json数据转换到数组的例子，来自<a href="http://www.sitepen.com/blog/2008/06/16/a-beginners-guide-to-dojo-charting-part-2-of-2/">这个链接</a>，实际上是利用prototype的能力。<br />
</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">//</span><span style="color: #008000;">JSON:</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">str&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&#8220;{values:&nbsp;[</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;">3</span><span style="color: #000000;">,</span><span style="color: #000000;">4</span><span style="color: #000000;">,</span><span style="color: #000000;">5</span><span style="color: #000000;">]}&#8221;;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">using&nbsp;prototype</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">obj&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;str.evalJSON();<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">the&nbsp;array&nbsp;is&nbsp;then&nbsp;referenced&nbsp;by:</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">chart1.addSeries(&#8221;Series&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&#8243;,&nbsp;obj.values);</span></div>
<p>&nbsp; <br />
</p>
<p>&nbsp;下面这种方式则直接使用了json格式（来自<a href="http://www.sitepen.com/blog/2008/06/12/dojo-charting-widgets-tooltips-and-legend/">这里</a>），但关于valueFn这个参数的使用方法我还没找到一个比较完整的介绍：</p><div class="cnblogs_code"><!--<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;">div&nbsp;dojoType</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">dojox.charting.widget.Chart2D</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">chart4</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;theme</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">dojox.charting.themes.PlotKit.green</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;style</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">width:&nbsp;300px;&nbsp;height:&nbsp;300px;</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">div&nbsp;class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">plot</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">default</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">Pie</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;radius</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">100</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fontColor</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">black</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;labelOffset</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">-20</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;</span><span style="color: #000000;">/</span><span style="color: #000000;">div&gt;</span><span style="color: #000000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">div&nbsp;class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">series</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">Series&nbsp;C</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;store</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">tableStore</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;valueFn</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">Number(x)</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;</span><span style="color: #000000;">/</span><span style="color: #000000;">div&gt;</span><span style="color: #000000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">div&nbsp;class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">action</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">Tooltip</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;</span><span style="color: #000000;">/</span><span style="color: #000000;">div&gt;</span><span style="color: #000000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">div&nbsp;class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">action</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">MoveSlice</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;shift</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">2</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;</span><span style="color: #000000;">/</span><span style="color: #000000;">div&gt;</span><span style="color: #000000;"><br /></span><span style="color: #000000;">&lt;</span><span style="color: #000000;">/</span><span style="color: #000000;">div&gt;</span></div><p>&nbsp;</p><p>15、可伸缩的pane</p>使用ExpandoPane（//测试链接TODO）即可实现。要注意的是，ExpandoPane在dojo 1.3之前的版本里有bug，现象是包含抽屉pane时在IE下最下面的抽屉会被挤掉，在Firefox里则正常。dojo 1.3解决了这个问题。<p>&nbsp;</p><p>（如无特别说明，以上均针对dojo 1.3版本。 ）</p>
<p>&nbsp;</p><img src ="http://www.cnblogs.com/bjzhanghao/aggbug/1430063.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47946/" target="_blank">Mono这只猴子招惹了谁？</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>JSF开发问题和解决</title><link>http://www.cnblogs.com/bjzhanghao/archive/2009/02/19/1394275.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Thu, 19 Feb 2009 11:31:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2009/02/19/1394275.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/1394275.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2009/02/19/1394275.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/1394275.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/1394275.html</trackback:ping><description><![CDATA[<p>1、在&lt;f:subview&gt;里的&lt;h:commandLink&gt;的action不执行</p>
<p>很多时候&lt;f:subview&gt;是在包含页面的情况下被用到（例如包含一个导航页面），而被包含的页面里如果有非JSF标签（如&lt;a&gt;）的时候，必须额外使用&lt;f:verbatim&gt;包含它才不会报错。问题是&lt;f:verbatim&gt;包含的内容是不算在JSF的Component Tree里的，因此这里的&lt;h:commandLink&gt;的action就不会被执行了。解决的办法是不要在&lt;f:verbatim&gt;里用&lt;h:commandLink&gt;，即尽量全部使用JSF的标签比较不容易出问题。<a href="http://www.coderanch.com/t/211721/JSF/java/CommandLink-Subview">参考链接</a></p>
<p>2、还是在&lt;f:subview&gt;里，action属性的方法虽然执行了，但不能转到faces-config里定义的目标页面</p>
<p>检查faces-config.xml里&lt;from-view-id&gt;，如果页面被包含的话，则&lt;from-view-id&gt;可能应为"/*"，而不是如"/navigatorbar.jspx"这样。<br />
</p>
<p>3、结合<a href="http://www.eclipse.org/emf">EMF</a>使用时，页面抛出找不到属性异常&#8220;Error getting property 'xxx' from bean of type XXXX&#8221;</p>
<p>EMF生成的XXXImpl里的构造方法是protected修饰的，改为public即可。（注意修改@generated修饰，否则下次重新生成时会被覆盖回来） </p>
<p>另（不仅限于EMF的情况）：如果一个Bean里有两个同名但参数不同的方法，例如Customer有getRecords()和getRecords(int year)这两个方法，则在JSF页面里用#{customer.value}会抛出同样的异常，我暂时还不确定是EL的问题还是JSF实现（我用的trinidad）的问题，部分异常stack如下所示：</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">严重:&nbsp;Servlet.service()&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;servlet&nbsp;faces&nbsp;threw&nbsp;exception<br />
javax.faces.el.PropertyNotFoundException:&nbsp;Error&nbsp;getting&nbsp;property&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">xxx</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;from&nbsp;bean&nbsp;of&nbsp;type&nbsp;XXXX<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.sun.faces.el.PropertyResolverImpl.getValue(PropertyResolverImpl.java:</span><span style="color: #000000;">107</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.sun.faces.el.impl.ArraySuffix.evaluate(ArraySuffix.java:</span><span style="color: #000000;">167</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.sun.faces.el.impl.ComplexValue.evaluate(ComplexValue.java:</span><span style="color: #000000;">151</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.sun.faces.el.impl.ExpressionEvaluatorImpl.evaluate(ExpressionEvaluatorImpl.java:</span><span style="color: #000000;">243</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.sun.faces.el.ValueBindingImpl.getValue(ValueBindingImpl.java:</span><span style="color: #000000;">173</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.sun.faces.el.ValueBindingImpl.getValue(ValueBindingImpl.java:</span><span style="color: #000000;">154</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.myfaces.trinidad.bean.FacesBeanImpl.getProperty(FacesBeanImpl.java:</span><span style="color: #000000;">66</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.myfaces.trinidad.component.UIXComponentBase.getProperty(UIXComponentBase.java:</span><span style="color: #000000;">1100</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.myfaces.trinidad.component.UIXIterator.getValue(UIXIterator.java:</span><span style="color: #000000;">415</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.myfaces.trinidad.component.UIXCollection._flushCachedModel(UIXCollection.java:</span><span style="color: #000000;">1127</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.myfaces.trinidad.component.UIXCollection.encodeBegin(UIXCollection.java:</span><span style="color: #000000;">511</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.myfaces.trinidadinternal.uinode.UIComponentUINode._renderComponent(UIComponentUINode.java:</span><span style="color: #000000;">317</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.myfaces.trinidadinternal.uinode.UIComponentUINode.render(UIComponentUINode.java:</span><span style="color: #000000;">279</span><span style="color: #000000;">)<br />
</span></div>
<p> </p>
<p>解决的办法是把带参数的那个方法改名。 <br />
</p>
<p>4、从session里删除一个bean</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">ValueBinding&nbsp;binding&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"> </span>FacesContext<span style="color: #000000;">.getCurrentInstance().getApplication().createValueBinding(</span><span style="color: #000000;">"</span><span style="color: #000000;">#{MyBean}</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
binding.setValue(context,&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">);</span></div>
<p><a href="http://forums.sun.com/thread.jspa?threadID=675034&amp;messag...">
参考链接</a>
</p><img src ="http://www.cnblogs.com/bjzhanghao/aggbug/1394275.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47945/" target="_blank">Firefox 3.5本月晚些时候即首次升级</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>基于RapidMiner开发问题和解决</title><link>http://www.cnblogs.com/bjzhanghao/archive/2009/02/16/1392063.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Mon, 16 Feb 2009 14:36:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2009/02/16/1392063.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/1392063.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2009/02/16/1392063.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/1392063.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/1392063.html</trackback:ping><description><![CDATA[<p><a href="http://www.rapidminer.com/">RapidMiner</a>（前身是YALE）是一个十分流行的开源数据挖掘软件，它不仅提供了一个GUI的数据处理和分析环境，还提供了Java API以便将它的能力嵌入其他应用程序。本文记录了基于RapidMiner开发数据分析应用程序时遇到的一些问题和解决方法。</p>
<p>BTW，选择RapidMiner而非WEKA的主要原因有两个：1、RapidMiner对Java开发更方便 2、RapidMiner同时提供free license和commertial license，而WEKA只提供GNU license（无法用来开发商用软件）</p>
<p><img src="http://rapid-i.com/images/stories/rapidi/products/RapidMiner/rapidminer_logo.gif" border="0"  alt="" />
</p>
<p>1、安装了RapidMiner 4.3，但执行RapidMiner.init()时抛出异常&#8220;java.lang.UnsupportedClassVersionError: Bad version number in .class file&#8221;</p>
<p>RapidMiner 4.3是用JDK1.6编译的（虽然用1.5也可以编译），因此在JDK1.5或以下版本环境里调用会抛出上述异常。解决办法有两个，一是安装JDK1.6，二是从CVS里下载RapidMiner的源代码自己在1.5里编译并导出jar文件。<a href="http://rapid-i.com/rapidforum/index.php?PHPSESSID=3402bda4d15e48bc2d1430f2f4ac9ef1&amp;/topic,183.0.html">参考链接</a> </p>
<p>2、在Eclipse应用里执行RapidMiner.init()时提示&#8220;java.lang.IllegalArgumentException: URI scheme is not "file"&#8221;</p>
<p>需要设置环境变量"rapidminer.home"到rapidminer安装目录，以便初始化时能找到"rapidminerrc"这个文件。即使未安装rapidminer，也要保证在这个目录下有个"etc"目录，里面有"rapidminerrc"文件。（另，还有个方法是设置"rapidminer.rcfile"环境变量指向rapidminerrc文件，未试验）<br />
</p>
<p>3、在Eclipse应用里执行RapidMiner.init()时提示&#8220;[Error] Cannot find 'operators.xml'.&#8221;</p>
<p>
经过跟踪rapidminer代码，发现需要把operators.xml文件放在classpath下的com.rapidminer.resources包里。所以结合上面一条问题，可以执行的代码如下：</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">System.setProperty(RapidMiner.PROPERTY_RAPIDMINER_HOME,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">D:/eclipse3.4m7/workspace/yale</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
RapidMiner.init();</span></div>
<p>&nbsp;</p>
<p>
</p><img src ="http://www.cnblogs.com/bjzhanghao/aggbug/1392063.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47944/" target="_blank">Google App Engine出现故障宕机6小时</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>GridLayoutFactory和GridDataFactory</title><link>http://www.cnblogs.com/bjzhanghao/archive/2008/12/09/1350938.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Tue, 09 Dec 2008 03:00:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2008/12/09/1350938.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/1350938.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2008/12/09/1350938.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/1350938.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/1350938.html</trackback:ping><description><![CDATA[<p>我写的SWT程序里用到layout的地方95%以上是GridLayout，今天才发现原来从eclipse 3.2开始就有了这两个方便使的类：GridLayoutFactory和GridDataFactory。特别是GridDataFactory，以前要用至少三行的代码：</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">GridData&nbsp;gd&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;GridData(GridData.FILL_HORIZONTAL);<br />
gd.horizontalSpan&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br />
txtName.setLayoutData(gd);</span></div>
<p>&nbsp;</p>
<p>现在用一行就可以了（稍微长点儿）：</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">GridDataFactory.fillDefaults().grab(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">).span(</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">).applyTo(txtName);</span></div>
<p>&nbsp;</p>
<p>或者有些情况下更简单：</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">GridDataFactory.generate(txtName,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);</span></div>
<p>&nbsp;</p>
<p>顺便提一句：eclipse.org上关于SWT的例子在<a href="http://www.eclipse.org/swt/snippets">http://www.eclipse.org/swt/snippets</a>就有很多，而JFace的例子则可以在<a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.snippets/Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/">这个地址</a>找到（或者从cvs里下载）。</p><img src ="http://www.cnblogs.com/bjzhanghao/aggbug/1350938.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47943/" target="_blank">消息称Facebook今年营收将达5.5亿美元</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Hadoop配置和使用问题记录</title><link>http://www.cnblogs.com/bjzhanghao/archive/2008/11/02/1325113.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Sun, 02 Nov 2008 15:26:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2008/11/02/1325113.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/1325113.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2008/11/02/1325113.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/1325113.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/1325113.html</trackback:ping><description><![CDATA[<p>关于hadoop如何配置的教程网上已经有不少了，配合hadoop主页上的说明，基本可以顺利在多台机器上配置好hadoop集群。这里记录的是我在实际配置和使用hadoop时遇到的问题，其中一些属于hadoop周边，如ssh配置时容易遇到的问题和解决方法，供大家参考。我目前是在windows xp里通过cygwin安装的hadoop，版本是0.17.2.1。</p>
<p>1. 安装cygwin。在www.cygwin.com下载网络安装包，在选择组件的时候建议直接把openssh组件选中，有些版本的cygwin似乎不会自动安装diffutils组件，所以需要手工选中一下，否则配置ssh时会提示缺少该组件包。</p>
<p>2. cygwin控制台里的缺省提示符不太习惯，用export PS1="\u@\w$"设一下好多了。</p>
<p>3. 配置sshd比较简单，可以参考<a href="http://cha.homeip.net/blog/archives/2006/04/_winxp_cygwin_s.html">这个链接</a>。在ssh-host-config时问到&#8220;Should privilege separation be used? (yes/no)&#8221;时回答no即可，如果由于安全因素要回答yes时，在启动sshd时有可能遇到&#8220;Privilege separation user sshd does not exist&#8221;的错误信息，解决方法可参考<a href="http://www.unixguide.net/comments/sun/ssh_installation.shtml/37.shtml">这个链接</a>。</p>
<p>4. 在配置ssh使用证书方式自动验证时花了一些时间，后来觉得可能是由于机器上有两个版本的cygwin的缘故，因为在另一台机器上安装就没有出现问题。在使用ssh-keygen -t rsa命令后提示输入密码时，直接按两次回车即可。公钥的复制等过程这里不再赘述。</p>
<p>5. 试图在Eclipse里运行hadoop的WordCount程序时提示异常：&#8220;javax.security.auth.login.LoginException: Login failed: CreateProcess: whoami error=2&#8221;，解决方法是把c:\cygwin\bin加入系统的path环境变量，然后重启Eclipse以便改动生效。</p>
<p>6. 在Eclipse里运行WordCount时遇到java heap size不够的异常，在运行配置里加入-Xms200M就可以解决。（hadoop的helloworld要求的内存比较多？）<br />
</p>
<p>7. 当要运行的运算依赖第三方类库时，<a href="https://issues.apache.org/jira/browse/HADOOP-1622">这个链接</a>有所讨论，但暂时没看到除了在命令行里使用hadoop jar命令以外的解决方法，比如在0.17.2和0.18.1版本里我都没有看到JobConf类里有类似addJar()这样的方法，在JobConf#setJar()里使用逗号分隔多个jar文件的方式则会报找不到文件的错误。解决方式可能有两个：a)把所需要的第三方jar文件复制到每个节点机器的jre里（暂时没有试验） b)把第三方jar包和自己的类打到一个包里。 </p>
<p>update: 在网上找到另一种方式，<a href="http://www.infoq.com/cn/articles/hadoop-process-develop#view_31599">通过DistributedCache实现</a>，原文里可能有笔误，我试验正确的方法是
调用DistributedCache.addArchiveToClassPath()方法，注意其第一个参数必须是相对路径，如&#8220;/test/lib
/my.jar&#8221;，而不能是像&#8220;hdfs://192.168.0.5:47110/test/lib/my.jar&#8221;这样的绝对路径。关于
DistributedCache的说明在<a href="http://hadoop.apache.org/core/docs/current/mapred_tutorial.html"  &="" gt;这个链接=""></a>里有一些。</p>
<p>8. 调试mapreduce程序的方式，在<a href="http://wiki.apache.org/hadoop/HowToDebugMapReducePrograms">这个链接</a>里讲得比较清楚了，因为很有用所以特意重复一次。如果文件存放在HDFS里，那么只需要调用JobConf#.set("mapred.job.tracker", "local");即可；如果文件也是存在本地的，还需要调用JobConf#set("fs.default.name", "local");方法。我通常让文件存在HDFS里调试，因为要使用本地文件要么参数需要改变，要么代码需要改变，维护两个环境很麻烦。在程序里用System.out.println()输出的内容可以在datanode的hadoop安装路径的logs/userlogs目录里找到。</p>
<p> </p>
<p>9. 当使用自定义InputFormat时，特别是使用EMF模型元素作为key的时候，需要注意并不是在代码的任何地方都能得到xmi:id的值的。具体来说，在WritableComparable#write()方法里能得到（前提是该对象本来就有resource，即eobj.eResource()!=null），而在WritableComparable#readFields()里是不能得到的，在RecordWriter#write()方法里同样不能得到，因为后两者的EMF元素对象都是反序列化得到的，已经不是内存里原来的那个实例了。 </p>
<p>10. map进行到100%后，reduce过程进行到某个数值（如16%）后就不再继续，直到被hadoop强制关闭。在tasknode的log里记录如下：</p>
<p> </p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">2008</span><span style="color: #000000;">-</span><span style="color: #000000;">11</span><span style="color: #000000;">-</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">06</span><span style="color: #000000;">,</span><span style="color: #000000;">455</span><span style="color: #000000;">&nbsp;INFO&nbsp;org.apache.hadoop.mapred.TaskTracker:&nbsp;task_200811191041_0015_r_000000_0&nbsp;</span><span style="color: #000000;">0.16666667</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;reduce&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;copy&nbsp;(</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;of&nbsp;</span><span style="color: #000000;">12</span><span style="color: #000000;">&nbsp;at&nbsp;</span><span style="color: #000000;">0.00</span><span style="color: #000000;">&nbsp;MB</span><span style="color: #000000;">/</span><span style="color: #000000;">s)&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;<br />
</span><span style="color: #000000;">2008</span><span style="color: #000000;">-</span><span style="color: #000000;">11</span><span style="color: #000000;">-</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">09</span><span style="color: #000000;">,</span><span style="color: #000000;">455</span><span style="color: #000000;">&nbsp;INFO&nbsp;org.apache.hadoop.mapred.TaskTracker:&nbsp;task_200811191041_0015_r_000000_0&nbsp;</span><span style="color: #000000;">0.16666667</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;reduce&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;copy&nbsp;(</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;of&nbsp;</span><span style="color: #000000;">12</span><span style="color: #000000;">&nbsp;at&nbsp;</span><span style="color: #000000;">0.00</span><span style="color: #000000;">&nbsp;MB</span><span style="color: #000000;">/</span><span style="color: #000000;">s)&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;<br />
</span><span style="color: #000000;">2008</span><span style="color: #000000;">-</span><span style="color: #000000;">11</span><span style="color: #000000;">-</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">15</span><span style="color: #000000;">,</span><span style="color: #000000;">455</span><span style="color: #000000;">&nbsp;INFO&nbsp;org.apache.hadoop.mapred.TaskTracker:&nbsp;task_200811191041_0015_r_000000_0&nbsp;</span><span style="color: #000000;">0.16666667</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;reduce&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;copy&nbsp;(</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;of&nbsp;</span><span style="color: #000000;">12</span><span style="color: #000000;">&nbsp;at&nbsp;</span><span style="color: #000000;">0.00</span><span style="color: #000000;">&nbsp;MB</span><span style="color: #000000;">/</span><span style="color: #000000;">s)&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;<br />
</span><span style="color: #000000;">2008</span><span style="color: #000000;">-</span><span style="color: #000000;">11</span><span style="color: #000000;">-</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">18</span><span style="color: #000000;">,</span><span style="color: #000000;">705</span><span style="color: #000000;">&nbsp;FATAL&nbsp;org.apache.hadoop.mapred.TaskTracker:&nbsp;Task:&nbsp;task_200811191041_0015_r_000000_0&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;Killed&nbsp;due&nbsp;to&nbsp;Shuffle&nbsp;Failure:&nbsp;Exceeded&nbsp;MAX_FAILED_UNIQUE_FETCHES;&nbsp;bailing</span><span style="color: #000000;">-</span><span style="color: #000000;">out.<br />
</span><span style="color: #000000;">2008</span><span style="color: #000000;">-</span><span style="color: #000000;">11</span><span style="color: #000000;">-</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">18</span><span style="color: #000000;">,</span><span style="color: #000000;">705</span><span style="color: #000000;">&nbsp;INFO&nbsp;org.apache.hadoop.mapred.TaskTracker:&nbsp;About&nbsp;to&nbsp;purge&nbsp;task:&nbsp;task_200811191041_0015_r_000000_0<br />
</span><span style="color: #000000;">2008</span><span style="color: #000000;">-</span><span style="color: #000000;">11</span><span style="color: #000000;">-</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">18</span><span style="color: #000000;">,</span><span style="color: #000000;">705</span><span style="color: #000000;">&nbsp;INFO&nbsp;org.apache.hadoop.mapred.TaskRunner:&nbsp;task_200811191041_0015_r_000000_0&nbsp;done;&nbsp;removing&nbsp;files.<br />
</span><span style="color: #000000;">2008</span><span style="color: #000000;">-</span><span style="color: #000000;">11</span><span style="color: #000000;">-</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">18</span><span style="color: #000000;">,</span><span style="color: #000000;">705</span><span style="color: #000000;">&nbsp;WARN&nbsp;org.apache.hadoop.mapred.TaskTracker:&nbsp;Unknown&nbsp;child&nbsp;task&nbsp;finshed:&nbsp;task_200811191041_0015_r_000000_0.&nbsp;Ignored.<br />
</span><span style="color: #000000;">2008</span><span style="color: #000000;">-</span><span style="color: #000000;">11</span><span style="color: #000000;">-</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">40</span><span style="color: #000000;">,</span><span style="color: #000000;">845</span><span style="color: #000000;">&nbsp;INFO&nbsp;org.apache.hadoop.mapred.TaskTracker:&nbsp;Received&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">KillJobAction</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;job:&nbsp;job_200811191041_0015<br />
</span><span style="color: #000000;">2008</span><span style="color: #000000;">-</span><span style="color: #000000;">11</span><span style="color: #000000;">-</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">40</span><span style="color: #000000;">,</span><span style="color: #000000;">845</span><span style="color: #000000;">&nbsp;INFO&nbsp;org.apache.hadoop.mapred.TaskRunner:&nbsp;task_200811191041_0015_m_000011_0&nbsp;done;&nbsp;removing&nbsp;files.<br />
</span><span style="color: #000000;">2008</span><span style="color: #000000;">-</span><span style="color: #000000;">11</span><span style="color: #000000;">-</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">40</span><span style="color: #000000;">,</span><span style="color: #000000;">845</span><span style="color: #000000;">&nbsp;INFO&nbsp;org.apache.hadoop.mapred.TaskRunner:&nbsp;task_200811191041_0015_m_000005_0&nbsp;done;&nbsp;removing&nbsp;files.</span> <br />
</div>
<p>&nbsp;</p>
<p>在我的java application的控制台里的输入如下： <br />
</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">08</span><span style="color: #000000;">/</span><span style="color: #000000;">11</span><span style="color: #000000;">/</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">06</span><span style="color: #000000;">:</span><span style="color: #000000;">39</span><span style="color: #000000;">&nbsp;INFO&nbsp;mapred.JobClient:&nbsp;&nbsp;map&nbsp;</span><span style="color: #000000;">96</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;reduce&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">%</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">08</span><span style="color: #000000;">/</span><span style="color: #000000;">11</span><span style="color: #000000;">/</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">06</span><span style="color: #000000;">:</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;INFO&nbsp;mapred.JobClient:&nbsp;&nbsp;map&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;reduce&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">%</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">08</span><span style="color: #000000;">/</span><span style="color: #000000;">11</span><span style="color: #000000;">/</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">06</span><span style="color: #000000;">:</span><span style="color: #000000;">43</span><span style="color: #000000;">&nbsp;INFO&nbsp;mapred.JobClient:&nbsp;&nbsp;map&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;reduce&nbsp;</span><span style="color: #000000;">13</span><span style="color: #000000;">%</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">08</span><span style="color: #000000;">/</span><span style="color: #000000;">11</span><span style="color: #000000;">/</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">06</span><span style="color: #000000;">:</span><span style="color: #000000;">47</span><span style="color: #000000;">&nbsp;INFO&nbsp;mapred.JobClient:&nbsp;&nbsp;map&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;reduce&nbsp;</span><span style="color: #000000;">16</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;(在这里停很久)<br />
</span><span style="color: #000000;">08</span><span style="color: #000000;">/</span><span style="color: #000000;">11</span><span style="color: #000000;">/</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">12</span><span style="color: #000000;">&nbsp;INFO&nbsp;mapred.JobClient:&nbsp;&nbsp;map&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;reduce&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">%</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">08</span><span style="color: #000000;">/</span><span style="color: #000000;">11</span><span style="color: #000000;">/</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">12</span><span style="color: #000000;">&nbsp;INFO&nbsp;mapred.JobClient:&nbsp;Task&nbsp;Id&nbsp;:&nbsp;task_200811191041_0015_r_000000_0,&nbsp;Status&nbsp;:&nbsp;FAILED<br />
Shuffle&nbsp;Error:&nbsp;Exceeded&nbsp;MAX_FAILED_UNIQUE_FETCHES;&nbsp;bailing</span><span style="color: #000000;">-</span><span style="color: #000000;">out.<br />
</span><span style="color: #000000;">08</span><span style="color: #000000;">/</span><span style="color: #000000;">11</span><span style="color: #000000;">/</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">14</span><span style="color: #000000;">&nbsp;WARN&nbsp;mapred.JobClient:&nbsp;Error&nbsp;reading&nbsp;task&nbsp;outputnode2<br />
</span><span style="color: #000000;">08</span><span style="color: #000000;">/</span><span style="color: #000000;">11</span><span style="color: #000000;">/</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">14</span><span style="color: #000000;">&nbsp;WARN&nbsp;mapred.JobClient:&nbsp;Error&nbsp;reading&nbsp;task&nbsp;outputnode2<br />
</span><span style="color: #000000;">08</span><span style="color: #000000;">/</span><span style="color: #000000;">11</span><span style="color: #000000;">/</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">25</span><span style="color: #000000;">&nbsp;INFO&nbsp;mapred.JobClient:&nbsp;&nbsp;map&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;reduce&nbsp;</span><span style="color: #000000;">16</span><span style="color: #000000;">%</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">08</span><span style="color: #000000;">/</span><span style="color: #000000;">11</span><span style="color: #000000;">/</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">30</span><span style="color: #000000;">&nbsp;INFO&nbsp;mapred.JobClient:&nbsp;&nbsp;map&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;reduce&nbsp;</span><span style="color: #000000;">25</span><span style="color: #000000;">%</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">08</span><span style="color: #000000;">/</span><span style="color: #000000;">11</span><span style="color: #000000;">/</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">31</span><span style="color: #000000;">&nbsp;INFO&nbsp;mapred.JobClient:&nbsp;&nbsp;map&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;reduce&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">%</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">08</span><span style="color: #000000;">/</span><span style="color: #000000;">11</span><span style="color: #000000;">/</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">:</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">32</span><span style="color: #000000;">&nbsp;INFO&nbsp;mapred.JobClient:&nbsp;Job&nbsp;complete:&nbsp;job_200811191041_0015<br />
</span></div>
<p>&nbsp;</p>
<p>我想找到这个问题的所在了。是secondary name node所在的机器没有配置dfs.http.address这个参数，该参数在hadoop-default.xml里的缺省值是0.0.0.0:50070，应改为name node所在机器的ip地址。<a href="http://mail-archives.apache.org/mod_mbox/hadoop-core-user/200807.mbox/%3C486C9E08.7000409@adacor.com%3E">参考链接</a><br />
</p>
<p>11. 一些参考链接。</p>
<p><a href="http://hayesdavis.net/2008/06/14/running-hadoop-on-windows/">http://hayesdavis.net/2008/06/14/running-hadoop-on-windows/</a><br />
<a href="http://hi.baidu.com/shirdrn/blog/category/Hadoop">http://hi.baidu.com/shirdrn/blog/category/Hadoop</a><br />
<a href="http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop1/index.html">http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop1/index.html</a><br />
<a href="http://blog.ring.idv.tw/comment.ser?i=231">http://blog.ring.idv.tw/comment.ser?i=231</a>
</p><img src ="http://www.cnblogs.com/bjzhanghao/aggbug/1325113.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47937/" target="_blank">微软8月25日开始通过WSUS推送IE8</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>从google获得大尺寸地图图片文件</title><link>http://www.cnblogs.com/bjzhanghao/archive/2008/10/05/1304314.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Sun, 05 Oct 2008 13:10:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2008/10/05/1304314.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/1304314.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2008/10/05/1304314.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/1304314.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/1304314.html</trackback:ping><description><![CDATA[<p>现在有很多工具可以从google地图获得大尺寸的地图图片文件，用于离线地图软件。<a href="http://iphonetrick.net/iphone/iphone_tricks/capture_google_maps">这个地址</a>介绍的方法我认为更加简单，而且同时适用街道地图和卫星地图，摘要如下：</p>
<p>1. 给你的firefox安装screengrab这个插件，这里是<a href="https://addons.mozilla.org/en-US/firefox/addon/1146">安装链接</a>；</p>
<p>2. 打开<a href="http://ditu.google.cn/">google地图网站</a>，把地图定位到想要的位置（以中心点为准）；<br />
</p>
<p>3. 点击地图右上方的&#8220;链接&#8221;链接，把弹出窗口里&#8220;粘贴 HTML 以便嵌入网站&#8221;里的内容复制下来并存成一个.html文件，如map.html，文件内容大概如下：</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">iframe&nbsp;</span><span style="color: #ff0000;">width</span><span style="color: #0000ff;">="425"</span><span style="color: #ff0000;">&nbsp;height</span><span style="color: #0000ff;">="350"</span><span style="color: #ff0000;">&nbsp;frameborder</span><span style="color: #0000ff;">="0"</span><span style="color: #ff0000;">&nbsp;scrolling</span><span style="color: #0000ff;">="no"</span><span style="color: #ff0000;">&nbsp;marginheight</span><span style="color: #0000ff;">="0"</span><span style="color: #ff0000;">&nbsp;marginwidth</span><span style="color: #0000ff;">="0"</span><span style="color: #ff0000;">&nbsp;src</span><span style="color: #0000ff;">="http://ditu.google.cn/maps?f=q&amp;amp;hl=zh-CN&amp;amp;geocode=&amp;amp;q=%E5%8C%97%E4%BA%AC&amp;amp;ie=UTF8&amp;amp;z=10&amp;amp;ll=40.037078,116.464691&amp;amp;output=embed&amp;amp;s=AARTsJrxRs93mjURz58t1CN5oqwlje5dZQ"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">iframe</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">br&nbsp;</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">small</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">a&nbsp;</span><span style="color: #ff0000;">href</span><span style="color: #0000ff;">="http://ditu.google.cn/maps?f=q&amp;amp;hl=zh-CN&amp;amp;geocode=&amp;amp;q=%E5%8C%97%E4%BA%AC&amp;amp;ie=UTF8&amp;amp;z=10&amp;amp;ll=40.037078,116.464691&amp;amp;source=embed"</span><span style="color: #ff0000;">&nbsp;style</span><span style="color: #0000ff;">="color:#0000FF;text-align:left"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">查看大图</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">a</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">small</span><span style="color: #0000ff;">&gt;</span></div>
<p>&nbsp;</p>
<p>4. 修改map.html文件的内容，把width和height改为所需要的大小，例如width="4000" height="4000"（注意，修改以后得到的地图的中心点座标是保持不变的）；如果需要，还可以修改z值（缩放值），最大可以到17；</p>
<p>5. 在浏览器里打开map.html文件，即可得到一个显示大地图的网页；</p>
<p>6. 点击firefox状态栏里screengrab的图标，选择&#8220;Save-&gt;Complete Page/Frame&#8221;命令将整个地图保存为一个4000x4000的图片文件；街道地图推荐使用png格式，卫星地图推荐jpg格式，格式切换在screengrab的选项里改。（注意，0.95版的screengrab好像只能保存不超过9000x8000的图片，以后应该会修正）</p>
<p align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/bjzhanghao/capture-google-map.gif" width="700" height="458" /><br />
</p>
<p align="center">图1 将浏览器里的大地图通过screengrab保存为图片文件 <br />
</p><img src ="http://www.cnblogs.com/bjzhanghao/aggbug/1304314.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47935/" target="_blank">暴风称新旧版更换完毕 总计超4000万用户换装</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>DB2若干问题解决记录</title><link>http://www.cnblogs.com/bjzhanghao/archive/2008/08/19/1271120.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Tue, 19 Aug 2008 06:08:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2008/08/19/1271120.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/1271120.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2008/08/19/1271120.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/1271120.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/1271120.html</trackback:ping><description><![CDATA[<p>1. 用SQL实现交叉表格。</p>
<p>SQL Server里提供了Pivot关键字可以帮助实现交叉表格，但DB2里似乎没有等价的东西。实现的方法稍微复杂一点，以下是一个例子。</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;location,&nbsp;<br />
</span><span style="color: #ff00ff;">MAX</span><span style="color: #000000;">(</span><span style="color: #ff00ff;">CASE</span><span style="color: #000000;"> </span><span style="color: #0000ff;">WHEN</span><span style="color: #000000;">&nbsp;metric</span><span style="color: #808080;">=</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">PH</span><span style="color: #ff0000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">THEN</span><span style="color: #000000;">&nbsp;value&nbsp;</span><span style="color: #0000ff;">END</span><span style="color: #000000;">)&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;PH,<br />
</span><span style="color: #ff00ff;">MAX</span><span style="color: #000000;">(</span><span style="color: #ff00ff;">CASE</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">WHEN</span><span style="color: #000000;">&nbsp;metric</span><span style="color: #808080;">=</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">Hg</span><span style="color: #ff0000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">THEN</span><span style="color: #000000;">&nbsp;value&nbsp;</span><span style="color: #0000ff;">END</span><span style="color: #000000;">)&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;"> </span><span>Hg</span><span style="color: #000000;">,<br />
</span><span style="color: #ff00ff;">MAX</span><span style="color: #000000;">(</span><span style="color: #ff00ff;">CASE</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">WHEN</span><span style="color: #000000;">&nbsp;metric</span><span style="color: #808080;">=</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">Fe</span><span style="color: #ff0000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">THEN</span><span style="color: #000000;">&nbsp;value&nbsp;</span><span style="color: #0000ff;">END</span><span style="color: #000000;">)&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;Fe,<br />
</span><span style="color: #ff00ff;">MAX</span><span style="color: #000000;">(</span><span style="color: #ff00ff;">CASE</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">WHEN</span><span style="color: #000000;">&nbsp;metric</span><span style="color: #808080;">=</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">Mn</span><span style="color: #ff0000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">THEN</span><span style="color: #000000;">&nbsp;value&nbsp;</span><span style="color: #0000ff;">END</span><span style="color: #000000;">)&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;Mn<br />
</span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;data_view<br />
</span><span style="color: #0000ff;">GROUP</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">BY</span><span style="color: #000000;">&nbsp;location<br />
</span></div>
<p>&nbsp;其中data_view表/视图有location、metric和value这三个字段，数据是下面这个样子：</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">location1&nbsp;&nbsp;&nbsp;&nbsp;PH&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1.142575278063135</span><span style="color: #000000;"><br />
location1&nbsp;&nbsp;&nbsp; Hg &nbsp;&nbsp; </span><span style="color: #000000;">0.0018310994140037379</span><span style="color: #000000;"><br />
location1&nbsp;&nbsp;&nbsp;&nbsp;Fe&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0.2974983113601452</span><span style="color: #000000;"><br />
location1&nbsp;&nbsp;&nbsp;&nbsp;Mn&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0.09548843270448454</span><span style="color: #000000;"><br />
location2&nbsp;&nbsp;&nbsp;&nbsp;PH&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">6.096025515217242</span><span style="color: #000000;"><br />
location2&nbsp;&nbsp;&nbsp; Hg &nbsp;&nbsp; </span><span style="color: #000000;">0.005575948698159294</span><span style="color: #000000;"><br />
location2&nbsp;&nbsp;&nbsp;&nbsp;Fe&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0.32657056877142043</span><span style="color: #000000;"><br />
location2&nbsp;&nbsp;&nbsp;&nbsp;Mn&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0.009418315198912612</span></div>
<p>得到的交叉表：</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">LOCATION&nbsp;&nbsp; PH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hg &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Mn<br />
location1&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1.142575278063135</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0.0018310994140037379</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0.2974983113601452</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0.09548843270448454</span><span style="color: #000000;"><br />
location2&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">6.096025515217242</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0.005575948698159294</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0.32657056877142043</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0.009418315198912612</span></div>
<p>参考链接：</p>
<a href="http://it.toolbox.com/blogs/db2luw/pivot-query-12757">Pivot Query</a><br />
<a href="http://www.tek-tips.com/viewthread.cfm?qid=1205022">另一个方法</a>（经实验不好用）<br />
<a href="http://www.tek-tips.com/viewthread.cfm?qid=1203069&amp;page=1">又一个方法</a>（感觉比较复杂，没试）
<br />
<p>2. "Error 500: DB2 SQL error: SQLCODE: -954, SQLSTATE: 57011, SQLERRMC: null"</p>
<p>APP Heap区不足，用"DB2 UPDATE DB CFG FOR DBNAME USING APPLHEAPSZ 1024"可以解决。注意要重启DB2以便让更改生效。</p>
<p>3. 恢复（Restore）数据库 <br />
</p>
<p>在控制中心里，选择数据库备份路径时要选到xxx.0的上一层，时间戳要与备份时一致（可通过查看备份路径里的文件夹和文件名得到，如20081007165742）。恢复数据库的命令行格式如下：<br />
</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">db2&nbsp;restore&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">dbname</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;incremental&nbsp;from&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">imagepath</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;taken&nbsp;at&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">timestamp</span><span style="color: #000000;">&gt;</span></div>
<p>4、恢复数据库时提示&#8220;SQL2570N&#8221;</p>
<p>例如：SQL2570N  由于操作系统不兼容或者指定的 RESTORE 命令不正确，所以在目标操作系统 "NT-32" 上从源操作系统 
"AIX-32" 上创建的备份进行复原的尝试失败。原因码："1"。</p>
<p>按照错误码（1）对应的用户响应，应该使用db2move实用程序：&#8220;要使用这个特定的备份映像，应在与创建该备份
时所在的操作系统&#8220;复原兼容&#8221;的系统上进行复原
。要将数据库从一种操作系统类型移至另一操作系
统类型，请使用 db2move                   
实用程序。要了解有关相互&#8220;复原兼容&#8221;的平台以
及 db2move 实用程序的详细信息，请使用诸如&#8220;跨平
台备份和复原&#8221;或&#8220;使用不同操作系统&#8221;之类的短
语来在 DB2 信息中心（                                     
http://publib.boulder.ibm.com/infocenter/db2luw/v9）中执行搜索&#8221;</p><img src ="http://www.cnblogs.com/bjzhanghao/aggbug/1271120.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47934/" target="_blank">3.5版既出 Firefox面临新挑战</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>启用EMF的自动生成UUID功能</title><link>http://www.cnblogs.com/bjzhanghao/archive/2008/07/24/1250873.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Thu, 24 Jul 2008 13:32:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2008/07/24/1250873.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/1250873.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2008/07/24/1250873.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/1250873.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/1250873.html</trackback:ping><description><![CDATA[<p>缺省条件下，EMF不会为每个对象维护一个唯一的id，这在一些情况下不太方便，例如要在web环境下编辑一个EMF模型实例，通常需要在URL里传递对象的id以便确定目标。
</p>
<p>有两种方式解决这类问题。第一种是在模型里给每个对象增加一个id属性，并维护使其保持唯一，例如在XXXFactory的createXXX()方法里为这个属性赋值。另一种方式是借助EMF的功能。其实EMF的XMIResource维护了一个id与对象的映射表，并且会为每个新创建的对象自动赋值，只要稍微设置一下就可以启用这个功能，具体的方法如下。</p>
<p>1. 在xxx.genmodel里选中package节点，在属性视图里把Resource Type属性的值设置为XMI。</p>
<p align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/bjzhanghao/emf/emf-resource-type.gif" width="666" height="190" />&nbsp;</p>
<p>2. 重新生成代码，EMF生成的代码里会比原来多出XXXResourceImpl.java文件。</p>
<p>3. 在XXXResourceImpl.java里，覆盖useUUIDs()方法，让其返回true（缺省返回的是false）。</p>
<p>4. 重新生成代码。（删除以前的Manifest.MF和plugin.xml文件以便这两个文件能得到更新） <br />
</p>
<p>这样，如果用文本方式查看新创建的模型实例文件，会发现每个对象都多出一个xmi:id属性，如xmi:id="_gitpslkoEd2PdI7FPnuunA"。要在程序里使用这个id，只需要用resource.getId(eobject)即可得到，其中resource可以通过eobject.eResource()很方便的获得。</p>
<p>参考链接：<br />
<a href="http://serdom.szn.pl/ser/2007/03/05/how-to-enable-uuid-in-emf-generated-model-to-get-copypaste-working/">How To Enable UUID In EMF Generated Model To Get Copy&amp;Paste Working</a>（这个链接里的方法太麻烦了，但功效一样。）<br />
<a href="http://serdom.szn.pl/ser/2008/07/02/eclipse-gmf-enabling-uuids-in-semantic-model-the-simplest-way/">Eclipse GMF - Enabling UUIDs in Semantic model - The Simplest Way</a>（用GMF的时候这个链接里的方法应该比较方便）</p><img src ="http://www.cnblogs.com/bjzhanghao/aggbug/1250873.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47930/" target="_blank">Bing首页将显示各国美景 顺推Silverlight</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Eclipse 3.4新特性 - Plug-in spy</title><link>http://www.cnblogs.com/bjzhanghao/archive/2008/07/14/1242627.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Mon, 14 Jul 2008 08:24:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2008/07/14/1242627.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/1242627.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2008/07/14/1242627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/1242627.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/1242627.html</trackback:ping><description><![CDATA[<p>Eclipse 3.4提供了一个新功能：在任何界面下按Alt+Shift+F1 (Windows, Mac OS里用Shift+Option+F1)，就可以看到Eclipse用来实现当前选中界面元素的类。</p>
<p>这个功能至少我看起来对插件开发人员很有用，因为当你想要模仿实现（或利用）Eclipse里的某个界面时，不用再像以前那样猜这个界面的实现类的名字了。比如最开始我就用了很久才找到属性视图的实现类是PropertySheet，而我总是朝着PropertyView的方向找，当然很难找到。</p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/bjzhanghao/eclipse/plug-in-spy.gif" border="0" /></p>
<p>Plug-in Spy本是一个单独的<a href="http://www.eclipse.org/pde/incubator/spy/">小项目</a>，在3.4里直接集成到workbench里了。</p>
<p>来源：<a href="http://eclipse.dzone.com/articles/eclipse-34-hidden-treasures">Eclipse 3.4 Hidden Treasures
</a></p>
<img src ="http://www.cnblogs.com/bjzhanghao/aggbug/1242627.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47929/" target="_blank">Gmail 的标签马上就会支持拖拽操作了</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Cognos8安装使用问题记录</title><link>http://www.cnblogs.com/bjzhanghao/archive/2008/05/22/1205192.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Thu, 22 May 2008 13:40:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2008/05/22/1205192.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/1205192.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2008/05/22/1205192.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/1205192.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/1205192.html</trackback:ping><description><![CDATA[<p>网上已经有很多关于cognos8的安装配置文章了（如<a href="http://www.cnblogs.com/jiesin/archive/2007/03/30/694225.html">这篇</a>），这里介绍的是自己的亲身经历，供大家参考。以下是Cognos v8.3安装过程中遇到的问题和解决方法：</p>
<p>1. 运行issetup.exe安装完成后，把cognos自带的jre里bcprov-jdk13-125.jar复制到机器缺省jre的相应目录下，否则运行Cognos Configuration会提示找不到类错误。</p>
<p>2. Cognos8产品包括很多张安装盘（Image），BI Server包括最常用的功能，其他如Metric Studio、Framework Manager和SDK等等都需要在BI Server的基础上单独安装，这些component的安装也很简单，直接安装到BI Server所在目录即可。<br />
</p>
<p>3. 在Cognos Configuration里启动Cognos Service时提示&#8220;[ ERROR ] CFG-ERR-0103 Unable to start Cognos 8&#8221;。只有使用cognos自带的content manager数据库时才报这个错误，改用SQL后错误消失。<a href="http://businessintelligence.ittoolbox.com/groups/technical-functional/cognos8-l/1-error-cfgerr0103-unable-to-start-cognos-8-service-1836989">参考链接1</a>（但后来测试中发现用SQL Server也会报这个错，怀疑有两个可能：1.数据库中未创建ContentStore所需的那些表，如果是这种情况，需要按cognos文档中的方法运行创建表的script命令；2.数据库使用的是Express版本，这种可能性较小，但如果是这种情况换用标准版就能解决；另，SQL Server Express版本的默认端口号是1702而非1433，在Cognos Configuration的Content Store里要注意正确配置）</p>
<p>4. 为Metric Studio创建包时提示&#8220;DPR-ERR-2014: Unable to load balance the request because no nodes in the cluster are available, or no nodes are configured for the service: metricsManagerService.&#8221;</p>
<p>解决方法：到Cognos Configuration里，在"Cognos Planning"这一项里，根据你的数据库类型新建一个resource，指向ContentStore那个数据库（也就是让这个数据库的配置与"Content Manager"下面的那个数据库配置一致），重启Cognos问题解决。</p>
<p>5. 运行cognos sdk的jsp例子。要把$cognos dir$/sdk/lib下的xalan.jar复制到$cognos dir$/webapps/samples/WEB-INF/lib下，然后在Cognos Configuration里重启cognos，用http://localhost:9300/samples/index.jsp就可以访问了。（cognos文档里说还需要在bootstrap_win32.xml里配置tools.jar的路径，我没配置好像也可以用，可能是有一些例子需要还没遇到）</p>
<p>6. 启动report studio时提示"HAL ERROR The web request failed. 12002 - Unknown URL: dialogs/_YU7.xml" （解决方案探索中）</p>
<p>7. 在工作区间里添加链接前要先设置Acceptable Domain列表，这是在Cognos Configuration的Cognos Application Firewall (CAF)里设置的，在&#8220;Valid domains or hosts"项里添加即可。</p>
<p>8. 数据库里数据改变后，Report里的内容不更新。解决方法：这个问题可能是由于Cognos缓存了数据，要取消缓存，在Framework Manager里选择Project-&gt;Edit Govenors，勾掉Allow Usage of Local Cache选项，我试验的结果好像需要重新发布包并Update报表才生效。<a href="http://businessintelligence.ittoolbox.com/groups/technical-functional/cognos8-l/data-is-not-updated-when-running-a-report-1369013">参考链接</a></p>
<p>9. 把cognos报表集成到其他portal里。报表的地址可以在报表属性里找到，要去掉标题和工具条，可以加ui.header=false&amp;ui.toolbar=false在URL里（cognos8.2里试验正确，cognos 8.3里可能要用cv.header和cv.toolbar）<br />
</p>
<p>10. 在Transformer里更新一个powercube的时候，如果提示&#8221;The locking of Cube XXX.mdc failed. It is probably in use by another application&#8220;，可能是在浏览器里正在查看使用该powercube的报表，关掉浏览器过一段时间应该就可以正常更新了。</p>
<p>11. 安装镜像名和comonent对应关系（部分）： <br />
</p>
<p>c8bisrvr_xxx -&gt; BI Server<br />
c8bimodel_xxx -&gt; Framework Manager, Map Manager<br />
c8bisamples -&gt; (Samples)<br />
</p><img src ="http://www.cnblogs.com/bjzhanghao/aggbug/1205192.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47928/" target="_blank">Windows 7 触摸功能是摆设 无厂商支持价值不大</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Palm OS开发常见问题和技巧</title><link>http://www.cnblogs.com/bjzhanghao/archive/2008/04/14/1152995.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Mon, 14 Apr 2008 08:56:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2008/04/14/1152995.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/1152995.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2008/04/14/1152995.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/1152995.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/1152995.html</trackback:ping><description><![CDATA[<p>1. 判断当前focus是否为field</p>
<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;">index</span><span style="color: #000000;">=</span><span style="color: #000000;">FrmGetFocus(form);<br />
</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(index</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">noFocus)<br />
</span><span style="color: #0000ff;">return</span><span style="color: #000000;">(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
field</span><span style="color: #000000;">=</span><span style="color: #000000;">FrmGetObjectPtr(form,index);<br />
</span></div>
<p>2. FrmDoDialog()使用方法：</p>
<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;">FrmInitForm<br />
FrmDrawForm<br />
<img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span style="color: #0000ff;">set</span><span style="color: #000000;">&nbsp;form&nbsp;controls<img src="http://www.cnblogs.com/Images/dot.gif" alt="" /><br />
FrmDoDialog<br />
<img src="http://www.cnblogs.com/Images/dot.gif" alt="" />read&nbsp;form&nbsp;controls<img src="http://www.cnblogs.com/Images/dot.gif" alt="" /><br />
FrmDeleteForm <br />
</span></div>
<p>注意：FrmDoDialog()无法获得frmOpenEvent。</p>
<p>3. 测试控件类型：</p>
<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: #0000ff;">switch</span><span style="color: #000000;">&nbsp;(FrmGetObjectType(pForm,&nbsp;index))&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;frmControlObj:&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif" alt="" /><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;frmFieldObj:&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif" alt="" /><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;frmScrollBarObj:&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif" alt="" /><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">default</span><span style="color: #000000;">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif" alt="" /><br />
}<br />
</span></div>
<p>4. 在程序里使用标准的edit menu:</p>
<p>If your form has a menubar that consists of just the "Edit" menu, you can specify menu ID 10000 at form creation time.
If your form has a menubar with several menus, you should specify your Edit menu like this, using PilRC notation:
</p>
<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;">PULLDOWN&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">Edit</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
BEGIN<br />
&nbsp;&nbsp;&nbsp;&nbsp;MENUITEM&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">Undo</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;ID&nbsp;</span><span style="color: #800080;">10000</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">U</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;MENUITEM&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">Cut</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;ID&nbsp;</span><span style="color: #800080;">10001</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">X</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;MENUITEM&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">Copy</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;ID&nbsp;</span><span style="color: #800080;">10002</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">C</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;MENUITEM&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">Paste</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;ID&nbsp;</span><span style="color: #800080;">10003</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">U</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;MENUITEM&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">Select&nbsp;All</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;ID&nbsp;</span><span style="color: #800080;">10004</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">S</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;MENUITEM&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">-</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;ID&nbsp;</span><span style="color: #800080;">10005</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;MENUITEM&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">Keyboard</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;ID&nbsp;</span><span style="color: #800080;">10006</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">K</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;MENUITEM&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">Grafitti&nbsp;Help</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;ID&nbsp;</span><span style="color: #800080;">10007</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">G</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
END</span></div>
<p>If you're using Constructor, just create an Edit menu with ID 10000, and the IDs for the items will be provided for you.
http://www.palmoswerks.com/2001/11/16
</p>
<p>5. Push button的使用</p>
<p>GroupID若为0则与普通button一样，若GroupID不为0则同组内保证只有一个被选中。
FrmSetControlGroupSelection给push button赋值。</p>
<p>6. 关于PrefGetAppPreferences</p>
<p>PrefGetAppPreferences要判断返回结果是否为noPreferenceFound</p>
<p>7. 给文本框（Field）赋值</p>
<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: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;SetFieldText(FormType&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">form,&nbsp;FieldType&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">field,&nbsp;Char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;value){<br />
&nbsp;&nbsp;&nbsp;&nbsp;MemHandle&nbsp;newTextH;<br />
&nbsp;&nbsp;&nbsp;&nbsp;MemHandle&nbsp;oldTextH;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Char&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">text;<br />
&nbsp;&nbsp;&nbsp;&nbsp;newTextH&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;MemHandleNew(</span><span style="color: #800080;">20</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;text&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;MemHandleLock(newTextH);<br />
&nbsp;&nbsp;&nbsp;&nbsp;StrCopy(text,&nbsp;value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;MemHandleUnlock(newTextH);<br />
&nbsp;&nbsp;&nbsp;&nbsp;oldTextH&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;FldGetTextHandle(field);<br />
&nbsp;&nbsp;&nbsp;&nbsp;FldSetTextHandle(field,&nbsp;newTextH);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(oldTextH)&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MemHandleFree(oldTextH);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(FrmVisible(form))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FldDrawField(field);<br />
}</span></div>
<p>8. 关于CtlGetLabel()</p>
<p>如果需要CtlGetLabel()，则在CtlSetLabel()时不应立即释放Char*参数，否则CtlGetLabel()得到的将是乱内容。
&#8220;This function stores the newLabel pointer in the control's data structure. It doesn't make a copy of the string that is passed in. Therefore, if you use CtlSetLabel, you must manage the string yourself. You must ensure that it persists for as long as it is being displayed (that is, for as long as the control is displayed or until you call CtlSetLabel with a new string), and you must free the string after it is no longer in use (typically after the form containing the control is freed).
If you never use CtlSetLabel, you do not need to worry about freeing a control's label. &#8221;</p>
<p>9. 关于HideState()</p>
<p>HideState()返回代码之一是statXXX而非sysXXX，Palm SDK参考有误。</p>
<p>10. 最好不要使用全局变量，用Feature代替之。</p>
<p>11. Simulator没有截屏的快捷键，用Alt+PrintScr代替之。</p>
<p>12. 让modal dialog全屏的方法</p>
<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;">FormType</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pOriForm&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;FrmGetActiveForm();<br />
pForm&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;FrmInitForm(KeyboardForm);<br />
FrmSetActiveForm(pForm);</span><span style="color: #008000;">//</span><span style="color: #008000;">Must</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">FrmSetEventHandler(pForm,&nbsp;KeyboardFormHandleEvent);<br />
<br />
formWinH&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;FrmGetWindowHandle(pForm);<br />
WinSetConstraintsSize(formWinH,&nbsp;</span><span style="color: #800080;">160</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800080;">160</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800080;">160</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800080;">240</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800080;">240</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800080;">240</span><span style="color: #000000;">);<br />
FrmSetDIAPolicyAttr(pForm,&nbsp;frmDIAPolicyCustom);<br />
PINSetInputTriggerState(pinInputTriggerDisabled);<br />
PINSetInputAreaState(pinInputAreaClosed);<br />
SysSetOrientation(sysOrientationLandscape);<br />
StatHide();</span></div>
<p>13. 关于RepeatingButton</p>
<p>RepeatingButton响应CtlRepeatEvent而非CtlSelectEvent</p>
<p>14. Palm simulator与电脑同步</p>
<p>可参考这个网址：http://duchaoqian.blogbus.com/logs/538520.html，注意电话号码用"00"</p>
<p>15. 多行文本框</p>
<p>Multi-line的text改变内容后要FldRecalculateField(textField, false);否则换行可能不正确。</p>
<p>16. 关于下拉列表</p>
<p>要产生popSelectEvent，在ctlSelectEvent里一定让handled=false</p>
<p>17. 关于debug</p>
<p>遇到不知原因的死机等错误，最有效的解决办法是排除法，用if(false){...}不断缩小范围直到找到导致错误的代码。
按下按钮后，若模拟器不是崩溃而是没有反应，很可能是程序陷入了死循环。</p>
<p>18. JPilotDB的使用方法</p>
<p>JPilotDB提供的lib文件太大，有4M多（因为包含了很多UI和相关lib），如果只是用于在Java里处理.pdb文件完全不需要它的全部内容，精简后的大小为96K，<a href="http://www.cnblogs.com/Files/bjzhanghao/jpilot-db-1.3.15.zip">点击下载</a></p>
<p>代码范例：创建一个.pdb文件</p>
<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: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Construct&nbsp;the&nbsp;database</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;PilotDBSchema&nbsp;schema&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PilotDBSchema();<br />
&nbsp;&nbsp;&nbsp;&nbsp;PilotDBDatabase&nbsp;database&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PilotDBDatabase(</span><span style="color: #800000;">"</span><span style="color: #800000;">DB Name</span><span style="color: #800000;">"</span><span style="color: #000000;">, "TypeID",&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">Creator</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;schema);<br />
&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;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> 10;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PilotDBRecord&nbsp;record&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;database.createRecord();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record.setRecordData(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[]{<img src="http://www.cnblogs.com/Images/dot.gif" alt="" />});</span><span style="color: #008000;">//</span><span style="color: #008000;">set&nbsp;contents&nbsp;of&nbsp;the&nbsp;record</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Write&nbsp;to&nbsp;file</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;FileOutputStream&nbsp;fos&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileOutputStream(</span><span style="color: #800000;">"</span><span style="color: #800000;">c:/test.pdb</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;database.write(fos);<br />
&nbsp;&nbsp;&nbsp;&nbsp;fos.close();<br />
}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IOException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(PalmDbException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
}<br />
</span></div>
<p>代码范例：读取一个.pdb文件</p>
<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: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Read&nbsp;database&nbsp;from&nbsp;file</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;FileInputStream&nbsp;fis&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileInputStream(</span><span style="color: #800000;">"</span><span style="color: #800000;">c:/test.pdb</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;PilotDBDatabase&nbsp;database&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PilotDBDatabase(fis);<br />
&nbsp;&nbsp;&nbsp;&nbsp;fis.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Read&nbsp;records&nbsp;of&nbsp;the&nbsp;database</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;recCount&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;database.getRecordCount();<br />
&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;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;recCount;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Record&nbsp;record&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;database.getRecord(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[]&nbsp;bytes&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;record.getRecordData();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">deal&nbsp;with&nbsp;the&nbsp;record</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IOException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(PalmDbException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
}<br />
</span></div>
<p>&nbsp;19. 用程序控制退出当前运行的程序</p>
<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 />
--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #000000;">EvtEnqueueKey&nbsp;(vchrLaunch,&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">,&nbsp;commandKeyMask);</span></div>
<p>20. Simulator里使用五维方向键(5-Way Navigator)：</p>
<ul>
    <li>[Alt] + [Enter] = Select <br />
    </li>
    <li>[Alt] + [Left Arrow] = Left</li>
    <li>[Alt] + [Right Arrow] = Right <br />
    </li>
    <li>[Alt] + [Up Arrow] = Up <br />
    </li>
    <li>[Alt] + [Down Arrow] = Down</li>
</ul>
<p>21. 关于Gadget。帮助文档里的例子可能比较旧了，回调(Callback)函数里的第一个参数FormGadgetType*类型应改为FormGadgetTypeInCallback*类型。此外，第三个void*类型的参数不能直接paramP-&gt;eType，要先转换为确定类型才能使用，例如在formGadgetHandleEventCmd里要先EventType* pToEvent = (EventType*) paramP;，然后才可以用pToEvent-&gt;eType来判断事件类型。</p>
<p>22. 在PODS里使用Palm OS Glue Library，除了在.c文件头部加上&#8220;#include &lt;PalmOSGlue.h&gt;;&#8221;外，还要设置这个project的linker配置，否则会提示"Undefined reference"。配置的方法祥见<a href="http://kb.palmsource.com/cgi-bin/palmsource.cfg/php/enduser/std_adp.php?p_faqid=831">这里</a>。摘抄如下：&#8220;For managed make 68K projects, go to the project properties, and in the C/C++ Build panel, choose PRC-Tools Palm OS 68K Linker/General. Click the "New..." button in the Additional Libraries area, and enter this text into the dialog: <code>-lPalmOSGlue</code>; For a standard make 68K project based on the PalmSource template, in the file "makefile", modify the line for ADDITIONAL_LINK_LIBRARIES to read: <code>ADDITIONAL_LINK_LIBRARIES = -lPalmOSGlue</code>&#8221;<br />
</p>
<p>23. 判断Form里的对象是否可见：用FrmGlueGetObjectUsable()方法，注意要先加载Glue库。</p>
<p>24. 根据新闻组里的言论以及自己的试验，FrmReturnToFrom(0)在Debug ROM里很可能有bug，会导致Simulator因内存问题崩溃。</p>
<p>25. 若两个数据库的TypeID和CreatorID都相同，Palm将视其为同一数据库的两个版本，因此若要枚举出它们，DmGetNextDatabaseByTypeCreator()的第五个参数必须为false（有些应用可能恰恰不需要枚举出每个版本，而只需要最新版本，则应使用true）。</p>
<p>26. 虽然数据库都是在内存里，但打开一个数据库的开销还是不能忽视，DmOpenDatabase()执行50次的时间大约有0.1秒。</p>
<p>27. Palm SDK没有提供画圆的函数，可以用画圆角矩形的方法代替，让圆角的半径等于矩形边长一半即可。</p>
<p>28. 关于使用表格控件的方法，这篇文章介绍的很详细，建议参考：<a href="http://www.mit.jyu.fi/%7Emweber/teaching/docs/palmos/book/ch08.htm">http://www.mit.jyu.fi/~mweber/teaching/docs/palmos/book/ch08.htm</a></p>
<p><a href="http://www.mit.jyu.fi/%7Emweber/teaching/docs/palmos/book/ch08.htm"><br />
</a>
</p>
<br />
<img src ="http://www.cnblogs.com/bjzhanghao/aggbug/1152995.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47927/" target="_blank">虚拟货币上了"紧箍咒" 新规将限制Q币发行</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>四种方法修改Palm Simulator使用的ROM</title><link>http://www.cnblogs.com/bjzhanghao/archive/2008/02/28/1085499.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Thu, 28 Feb 2008 15:29:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2008/02/28/1085499.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/1085499.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2008/02/28/1085499.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/1085499.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/1085499.html</trackback:ping><description><![CDATA[<p>第一次运行Palm OS Garnet Simulator时，模拟器会提示你选择一个ROM文件，但这之后想换其他ROM文件时该怎么做呢？以下四种方法都可以实现：</p>
<ol>
<li>在模拟器运行文件(palmsim.exe)所在目录找到palmsim.ini文件，修改里面的ROM项；</li>
<li>运行模拟器时加-rom参数；</li>
<li>启动模拟器时按住shift键，模拟器会像第一次运行一样提示你选择一个ROM文件；</li>
<li>在windows文件管理器里直接把ROM文件拖到palmsim.exe图标上启动。</li>
</ol>
<p>来自Palm OS Tools Documentation。</p>
 
 
<img src ="http://www.cnblogs.com/bjzhanghao/aggbug/1085499.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47926/" target="_blank">魔兽世界审批期限有新说 - 80天才是正解</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>利用OSGi DS实现可配置Web应用程序初探</title><link>http://www.cnblogs.com/bjzhanghao/archive/2007/11/21/967320.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Wed, 21 Nov 2007 07:41:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2007/11/21/967320.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/967320.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2007/11/21/967320.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/967320.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/967320.html</trackback:ping><description><![CDATA[<p>Eclipse的插件体系结构让我们可以灵活定义插件，组装成可插拔的软件系统，OSGi的Declarative Services(DS)有着和Eclipse扩展点类似的思想（见<a href="http://www.eclipsezone.com/articles/extensions-vs-services/">很详细的一篇对比文章</a>），很自然的想到，如果把DS应用在Web应用程序上，我们将能够通过定义自己的&#8220;扩展点&#8221;，打造SOA的Web应用程序。题目中&#8220;可配置&#8221;是指，根据用户需求，提供给客户不同的包即可形成针对该客户定制的产品/解决方案。<br />
</p>
<p>现在来试试怎样用DS实现动态配置一个Web应用程序界面里菜单，使用的OSGi实现还是Equinox。Eclipse里菜单项是通过实现actionSets、editorActions等等扩展点添加的，在OSGi里没有这些&#8220;扩展点&#8221;，没关系，我们可以自己定义。</p>
<p>一、用一个Bundle定义Java接口文件，和Eclipse扩展点的功能类似，这些接口可以作为服务的接入点。例子里这个Bundle的ID是net.bjzhanghao.osgi.services，接口类是IMenuContributor，内容很简单如下所示：</p>
<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: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;IMenuContributor&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">MenuItem</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;getItems();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
}</span></div>
<p>上面用到的MenuItem是自己定义的一个简单的数据结构，包含name和url两个String类型的成员变量和相应的getter/setter方法，这里就不展示了。</p>
<p>二、用0..n个Bundle实现上面定义的接口（暂时称之为Contributor），并声明为服务。例子里有两个这样的Bundle，ID分别是net.bjzhanghao.osgi.menu.contributor和net.bjzhanghao.osgi.menu.contributor2，实现类都是MyMenuContributor，前者提供了Menu1..3，后者提供了Menu4..5；以下是服务的声明，即项目里OSGI-INF/component.xml文件的内容：</p>
<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: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">component&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="services"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">implementation&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="net.bjzhanghao.osgi.menu.contributor.MyMenuContributor"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">service</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">provide&nbsp;</span><span style="color: #ff0000;">interface</span><span style="color: #0000ff;">="net.bjzhanghao.osgi.services.IMenuContributor"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">service</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">component</span><span style="color: #0000ff;">&gt;</span></div>
<p>MyMenuContributor实现IMenuContributor，你可以任意实现它，例子里是让它提供三个菜单项：</p>
<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: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;MyMenuContributor&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;IMenuContributor&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">MenuItem</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;getItems()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">MenuItem</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;list&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">MenuItem</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MenuItem(</span><span style="color: #000000;">"</span><span style="color: #000000;">Menu1</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MenuItem(</span><span style="color: #000000;">"</span><span style="color: #000000;">Menu2</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MenuItem(</span><span style="color: #000000;">"</span><span style="color: #000000;">Menu3</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;list;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</span></div>
<p>三、现在SOA的一半工作也就是注册服务的部分完成了，剩下要做的是另一半，消费这些服务。首先在web应用程序Bundle里，创建一个Helper类收集这些服务，这个Helper类的功能相当于一个Registry。例子里这个Bundle的ID是net.bjzhanghao.osgi.example，Helper类是MenuHelper；以下是对MenuHelper的配置，即项目里OSGI-INF/component.xml文件的内容，这样OSGi在启动Bundle时会把实现IMenuContributor的服务通过addMenuContributor方法注册到MenuHelper里，注意cardinality的值要为"0..n"，policy的值要为"dynamic"：</p>
<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: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">component&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="menuHelper"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">implementation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="net.bjzhanghao.osgi.example.MenuHelper"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">reference&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="menuHelper"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interface</span><span style="color: #0000ff;">="net.bjzhanghao.osgi.services.IMenuContributor"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cardinality</span><span style="color: #0000ff;">="0..n"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;policy</span><span style="color: #0000ff;">="dynamic"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bind</span><span style="color: #0000ff;">="addMenuContributor"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unbind</span><span style="color: #0000ff;">="removeMenuContributor"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">component</span><span style="color: #0000ff;">&gt;</span></div>
<p>四、在JSP/Servlet里，利用上面的Helper类构造界面（或业务逻辑）。因为我们定义的接口是关于菜单的，所以例子应用的菜单会根据Bundle配置（启动/停止）变化。例子里是在ExampleServlet里实现的，代码很简单如下所示：</p>
<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: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;doGet(HttpServletRequest&nbsp;req,&nbsp;HttpServletResponse&nbsp;resp)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;ServletException,&nbsp;IOException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;resp.setContentType(</span><span style="color: #000000;">"</span><span style="color: #000000;">text/html</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;resp.getWriter().write(</span><span style="color: #000000;">"</span><span style="color: #000000;">Hello&lt;br/&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;resp.getWriter().write(</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;ul&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(IMenuContributor&nbsp;menuContributor&nbsp;:&nbsp;MenuHelper.getInstance().getMenuContributors())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(MenuItem&nbsp;mItem&nbsp;:&nbsp;menuContributor.getItems())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resp.getWriter().write(</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;li&gt;&lt;a&nbsp;href=\</span><span style="color: #000000;">""</span><span style="color: #000000;">&nbsp;+&nbsp;mItem.getUrl()&nbsp;+&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">\</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;mItem.getName()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;/a&gt;&lt;/li&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;resp.getWriter().write(</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;/ul&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
}<br />
</span></div>
<p>五、执行方式：</p>
<p>1、在Eclipse里导入代码包里所有项目，启动上述所有项目及其依赖的项目（Add Required Bundles），见下图：</p>
<p align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/bjzhanghao/eclipse/osgi_menu_debug.gif" height="387" width="600" /><br />
</p>
<p>2、在浏览器里输入地址http://localhost/exampleServlet，应该可以看到五个菜单项，见下图（这个简单的例子里没有考虑顺序问题，所以Menu4..5可能出现在前面，使用类似Eclipse里为Menu预留位置的方式可以解决）：</p>
<p align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/bjzhanghao/osgi_menu_screen1.gif" height="280" width="600" /><br />
</p>
<p>3、回到Eclipse，在Console里输入ss查看当前的Bundle，应该可以看到类似下图的内容：</p>
<p align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/bjzhanghao/eclipse/osgi_menu_console.gif" height="201" width="600" /><br />
</p>
<p>4、在Console里输入stop 35（35是Contributor的Bundle序号），Console会提示&#8220;Calling removeMenuContributor&#8221;，然后到浏览器里刷新页面，应该看到菜单项只剩下Menu4..5。</p>
<p align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/bjzhanghao/eclipse/osgi_menu_screen2.gif" height="280" width="600" /><br />
</p>
<p><a href="http://www.cnblogs.com/Files/bjzhanghao/net.bjzhanghao.osgi.example2.zip">代码下载</a></p>
<img src ="http://www.cnblogs.com/bjzhanghao/aggbug/967320.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47925/" target="_blank">“必应”出生满月 抢夺谷歌蛋糕</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Equinox OSGi服务器应用程序的配置步骤</title><link>http://www.cnblogs.com/bjzhanghao/archive/2007/10/28/940622.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Sun, 28 Oct 2007 12:46:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2007/10/28/940622.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/940622.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2007/10/28/940622.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/940622.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/940622.html</trackback:ping><description><![CDATA[<p>本文介绍在Eclipse里如何配置一个简单的基于Eclipse Equinox OSGi实现的Web应用程序，在它的基础上可以构造更加复杂的应用，本文使用的是Eclipse 3.3.1版本，如果你的Eclipse版本在3.2.0或以上应该都可以。</p>
<p><strong>一、支持静态页面和Servlet</strong></p>
<p>1. 创建一个新的plugin项目，
net.bjzhanghao.osgi.test，在向导第一步里选中&#8220;This plug-in is target，在下一步的&#8220;Plug-in Options&#8221;里选中&#8220;Generate an activator&#8221;。</p>
<p align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/bjzhanghao/eclipse/new_osgi_project.gif" /><br />
</p>
<p>2. 在例子项目的MANIFEST.MF里添加如下依赖项目，这些项目都是Eclipse自带的：</p>
<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;">org.eclipse.equinox.http.jetty<br />
org.eclipse.equinox.http.servlet<br />
org.mortbay.jetty<br />
org.apache.commons.logging<br />
javax.servlet<br />
org.eclipse.equinox.http.registry<br />
</span></div>
<p>3. 在例子项目根目录下创建一个放置web文件的目录，如&#8220;web_files&#8221;，在这个目录下写一个简单的index.html文件。</p>
<p>4. 为项目建一个plugin.xml文件，内容如下：</p>
<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: #0000ff;">&lt;</span><span style="color: #800000;">plugin</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">extension&nbsp;</span><span style="color: #ff0000;">point</span><span style="color: #0000ff;">="org.eclipse.equinox.http.registry.resources"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">resource<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">alias</span><span style="color: #0000ff;">="/web"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base-name</span><span style="color: #0000ff;">="/web_files"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">extension</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">plugin</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span></div>
<p>注意，这时若MANIFEST.MF里提示错误，只要在Bundle-SymbolicName这一行后面加上&#8220;;singleton:=true&#8221;即可解决。</p>
5. 现在可以启动这个应用程序了。在Eclipse菜单里选择&#8220;Run-&gt;Open Run Dialog...&#8221;，在左边的
&#8220;OSGi Framework&#8221;项下创建一个新的启动配置项，在右边先点&#8220;Deselect All&#8221;清空所有复选框，然后在Workspace下选中
自己的osgi项目，再点&#8220;Add Required Bundles&#8221;按钮，Eclipse会自动把所依赖的项目选中。
最后按&#8220;Debug&#8221;按钮启动，内嵌的jetty和我们的项目会一起被启动。
<p align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/bjzhanghao/eclipse/run_osgi.gif" /><br />
</p>
<p>6. 打开浏览器，输入&#8220;http://localhost/web/index.html&#8221;应该可以看到index.html里的内容。</p>
<p>以上只验证了静态页面，现在来配置一个servlet看看。</p>
<p>7. 在项目里创建一个继承自HttpServlet的类，覆盖doGet()方法，内容是在网页上打印一些文本。</p>
<p>8. 在项目的plugin.xml里添加下面的内容，这些内容指定了servlet的访问路径和实现类：</p>
<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: #0000ff;">&lt;</span><span style="color: #800000;">extension&nbsp;</span><span style="color: #ff0000;">point</span><span style="color: #0000ff;">="org.eclipse.equinox.http.registry.servlets"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">alias</span><span style="color: #0000ff;">="/exampleServlet"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff;">="net.bjzhanghao.osgi.example.servlet.ExampleServlet"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">extension</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span></div>
<p>9. 重新启动项目，在浏览器里输入&#8220;http://localhost/exampleServlet&#8221;，应该可以看到servlet的输出。</p>
<p><strong>二、支持JSP页面</strong></p>
<p>10. 在index.html所在目录下创建一个简单的jsp文件index.jsp</p>
<p>11. 打开项目的MANIFEST.MF文件，添加如下项目依赖：</p>
<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;">org.eclipse.equinox.jsp.jasper</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />
org.apache.jasper</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />
org.eclipse.equinox.jsp.jasper.registry</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />
javax.servlet.jsp</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />
org.apache.commons.el</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />
org.eclipse.equinox.http.helper</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />
org.eclipse.osgi</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />
org.eclipse.osgi.services<br />
</span></div>
<p>其中org.eclipse.equinox.http.helper需要从cvs里下载得到（目前是在/cvsroot/eclipse下的
equinox-incubator目录里，以后可能会直接放到/cvsroot/eclipse下）。</p>
<p>12. 修改Activator，目的是注册一个处理扩展名为.jsp类型的servlet，感觉这一步以后应该有更简单的方法，例如通过扩展点。</p>
<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: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Activator&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;BundleActivator&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;ServiceTracker&nbsp;httpServiceTracker;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;jspContext&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">/jsps</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;jspFolder&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">/web_files</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;start(BundleContext&nbsp;context)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpServiceTracker&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HttpServiceTracker(context);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpServiceTracker.open();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;stop(BundleContext&nbsp;context)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpServiceTracker.open();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;HttpServiceTracker&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;ServiceTracker&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;HttpServiceTracker(BundleContext&nbsp;context)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">(context,&nbsp;HttpService.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getName(),&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;addingService(ServiceReference&nbsp;reference)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;HttpService&nbsp;httpService&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(HttpService)&nbsp;context<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getService(reference);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpContext&nbsp;commonContext&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BundleEntryHttpContext(context<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;.getBundle(),&nbsp;jspFolder);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpService.registerResources(jspContext,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">/</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;commonContext);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Servlet&nbsp;adaptedJspServlet&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ContextPathServletAdaptor(<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;">new</span><span style="color: #000000;">&nbsp;JspServlet(context.getBundle(),&nbsp;jspFolder),<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;jspContext);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpService.registerServlet(jspContext&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">/*.jsp</span><span style="color: #000000;">"</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;adaptedJspServlet,&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">,&nbsp;commonContext);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<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;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;httpService;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;removedService(ServiceReference&nbsp;reference,&nbsp;Object&nbsp;service)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;HttpService&nbsp;httpService&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(HttpService)&nbsp;service;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpService.unregister(jspContext);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpService.unregister(jspContext&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">/*.jsp</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.removedService(reference,&nbsp;service);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<p>13. 打开Debug对话框，选中workspace里的例子osgi项目和org.eclipse.equinox.http.helper项目，再按&#8220;Add Required Bundles&#8221;按钮，然后启动程序。</p>
<p>14. 在浏览器里输入&#8220;http://localhost/jsps/index.jsp&#8221;，应该可以看到jsp输出。</p>
<p>例子项目下载（<a href="http://www.cnblogs.com/Files/bjzhanghao/net.bjzhanghao.osgi.example.zip">链接</a>）。</p>
<p>参考链接：</p>
<ul>
    <li><a href="http://www.eclipse.org/equinox/server/http_in_equinox.php">
    Embedding an HTTP server in Equinox
    </a><br />
    </li>
    <li><a href="http://www.eclipse.org/equinox/server/http_writing_application.php">Writing a bundle-based server application</a></li>
    <li><a href="http://www.eclipse.org/equinox/server/jsp_support.php">OSGi based JSP Support</a></li>
</ul>
<img src ="http://www.cnblogs.com/bjzhanghao/aggbug/940622.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47924/" target="_blank">Firefox 3.5正式版全球下载量突破500万次</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>无光驱笔记本n410c装windows xp总结</title><link>http://www.cnblogs.com/bjzhanghao/archive/2007/10/06/915055.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Fri, 05 Oct 2007 16:47:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2007/10/06/915055.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/915055.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2007/10/06/915055.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/915055.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/915055.html</trackback:ping><description><![CDATA[<p>LP的compaq n410c笔记本硬盘坏了，就买了一个80g日立pata笔记本硬盘。到今天十月五号花了五天空余时间，总算在新换的硬盘上装好了windows xp。网上已经有不少无光驱笔记本安装windows xp的网页，但这次情况稍微有些特殊（安装程序会中途关机），并且手里也没有常说的IDE转接头，所以这里总结这次的安装经验，供有类似需要的朋友和自己以后参考：</p>
<p>阶段1：</p>
<ol>
    <li>把新硬盘装进移动硬盘盒，连接到另一台winxp电脑上，鼠标右键点&#8220;我的电脑&#8221;选&#8220;管理&#8221;，在&#8220;磁盘管理&#8221;里给新硬盘分区；</li>
    <li>随便找一个u盘，用&#8220;超级启动盘1.7&#8221;这个软件制作成启动u盘（选HDD方式），这一步用"HP USB Disk Storage Format Tool"应该也行；</li>
    <li>把新硬盘从移动硬盘盒里拿出来，装到笔记本里，把u盘也插上。启动笔记本电脑，在bios里设置u盘启动（n410c要求在bios里打开legacy usb设备才能设置u盘启动），顺利的话可以进u盘上的dos系统，这时c:是u盘，d:是则新硬盘第一分区（这时如果运行fdisk也可以给新硬盘分区，但无法设置新硬盘的主分区为active分区，这好像会为用这块硬盘启动启动带来麻烦）；</li>
    <li>用format d:/s命令将新硬盘做成启动盘（直接用sys c: d:命令不能成功，怀疑与硬盘分区非active有关）；</li>
    <li>把新硬盘从笔记本里取出，装到移动硬盘盒里，连接到另一台电脑上，复制windows xp的安装文件到新硬盘第一个分区，顺便复制himems.sys，smartdrv.exe这两个文件到根目录，建立一个config.sys文件（为smartdrv准备的），内容很简单如下：</li>
    device = himem.sys
    <li>把新硬盘装回笔记本电脑，用新硬盘启动系统，顺利的话可以进入dos环境；</li>
    <li>执行smartdrv.exe（否则安装过程漫长），然后进入xp安装路径的i386路径，执行winnt开始安装；</li>
</ol>
<p>看到windows xp安装程序在n410c上开始了，我以为问题搞定了，结果证明高兴太早了。第一次重启后，还未进入图形界面安装阶段，安装程序开始复制文件，复制到driver.cab的时候n410c突然关机，现象就和掉电一样，再次执行多次安装程序或换不同的xp安装镜像现象一致，只是有时还没到driver.cab就关机了。</p>
<p>阶段2：</p>
<ol>
    <li>（在阶段1安装到一半失败的基础上）把新硬盘装回移动硬盘盒，用&#8220;超级启动盘&#8221;直接把新硬盘做成启动盘；</li>
    <li>把新硬盘安回笔记本电脑，用新硬盘启动，结果失败；</li>
    <li>把新硬盘装回移动硬盘盒，用"HP USB Disk Storage Format Tool"把它做成win98启动盘；（做了两三次后再做就会失败，很奇怪）</li>
    <li>把新硬盘安回笔记本电脑，用新硬盘启动，成功进入win98的dos环境。执行xp安装程序，安装到一半时同样会自动关机；</li>
    <li>既然xp安装程序过不去，试试win2000怎么样。利用移动硬盘盒把win2000 professional安装程序拷到新硬盘上，装回笔记本启动进入dos，之行win2000的winnt命令开始安装，结果顺利安装成功。在win2000里运行winxp的setup程序，准备把win2000升级为xp，这次xp安装程序是在图形界面下执行的，没想到再次出现了中途关机的状况，看来升级的路也走不通；<br />
    </li>
</ol>
<p>阶段3：</p>
<ol>
    <li>把新硬盘安装到另一台有光驱的笔记本电脑上，以正常方法在xp安装程序里为硬盘分区和安装，安装完成后第一次进入操作系统后，立即按制作&#8220;万能ghost系统&#8221;的方法操作(<a href="http://jzhua.blog.sohu.com/46548220.html">参考链接</a>)，可以不需要系统减肥的步骤，关键是卸载硬件驱动这一步，不过我在卸载各种驱动以后没有执行sysprep封装这一步。</li>
    <li>把安装好xp并处理为万能ghost系统的硬盘装到无光驱笔记本电脑上，这时xp应该可以启动，但因为我没有执行sysprep这一步，所以在用户登录界面键盘鼠标（包括外接鼠标）都没有反应，因此无法进入实际使用。</li>
    <li>想到是没有执行sysprep封装步骤，所以把硬盘再次装到有光驱笔记本里，却发现笔记本死活认不出有硬盘存在（bios里都找不到，有人提到过ibm t60笔记本里需要设置scsi model为compatible，但我的笔记本不是这个型号，bios里也没有类似选项..）；</li>
</ol>
<p>已经花费了不少时间，为了不造成更大损失把另一台笔记本也搞坏，放弃了继续尝试，只是到现在也不明白为什么只有第一次装上时能认出来。</p>
<p>阶段4：</p>
<ol>
    <li>（在阶段3的基础上）用新硬盘在无光驱电脑上启动，在xp启动时按F8并选择安全模式进入，在登录界面等待几分钟，发现鼠标键盘可以用了（哈哈）;</li>
    <li>登录进入以后重启电脑，这回以正常模式启动xp，也可以顺利登录进入了，这时可以安装各种驱动软件；</li>
</ol>
<p>现在看起来似乎正常了，但有一个问题：无法软关机，即选择关闭电脑后会提示&#8220;您现在可以安全关闭计算机了&#8221;，自己还要按电源键4秒关
机；原因是前面制作万能ghost系统时修改了acpi相关的驱动，在设备管理器里&#8220;计算机&#8221;下可以看到是&#8220;Standard
PC&#8221;。</p>
<p>阶段5：</p>
<ol>
    <li>我解决这个问题的办法是在&#8220;Standard PC&#8221;上点鼠标右键，选&#8220;更新驱动程序&#8221;，这时驱动程序被自动更新为&#8220;ACPI Uniprocessor PC&#8221;，按提示重新启动电脑，结果自检后黑屏，左上角有一个正常大小的光标闪烁，汗..（现在想来，正确的解决方法也许直接用halacpi.dll改名并替换system32下的hal.dll）</li>
    <li>因为另一台笔记本已经不认这块硬盘了，想重装不太容易，另外问题显然出在更换的acpi驱动上，所以在网上搜dos下是否有办法把这个驱动换回来。竟然找到了一个网页（<a href="https://www.dream4ever.org/printthread.php?t=52540">链接</a>），方法是用xp安装光盘启动进入恢复模式（在阶段4后发现实际用usb光驱也可以启动n410c，后悔为什么最早没发现，不过让我感到安慰的是用光驱安装一样会中途关机无法完成。进入恢复模式也有中途关机问题，摸索出的解决方法是在安装一开始提示&#8220; Press F6 if you need to install a third-party SCSI or RAID driver&#8221;时按F5，后面过一会儿会提示你选择acpi设备，选第一项即可。但我没有用这种方法实验能不能成功从光驱完整安装xp，如果能就好了，下次需要重装的时候再试吧）；</li>
    <li>在恢复模式下，先expand i386\halacpi.dl_ c:\，然后copy c:\halacpi.dll c:\windows\system32即把安装盘上的halacpi.dl_解压缩改名覆盖原来的hal.dll，若直接用安装盘上的hal.dll则是Standard PC，好像大部分支持acpi的电脑都应该用halacpi.dll，而刚好我那台有光驱笔记本用的是halaacpi.dll（比前者多了一个a，支持的是Uniprocessor PC），在新电脑里选更新驱动程序后给恢复了有光驱笔记本的驱动，所以造成了无法启动；（替换的过程也可以参考这个<a href="http://zhidao.baidu.com/question/3615545.html">链接</a>）</li>
    <li>再次用新硬盘重启，果然能进xp了，只是所有的驱动都需要重新扫描安装一次，不过大多数让xp自动安装都可以发现（因为之前已经装过一次）。</li>
</ol>
<p>希望不要再出什么新问题。</p>
<br />
<p align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/bjzhanghao/n410c.jpg" height="375" width="500" /></p>
<p align="center"><br />
</p>
<img src ="http://www.cnblogs.com/bjzhanghao/aggbug/915055.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47923/" target="_blank">网易今日凌晨开放战网及魔兽官网</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>实现内容助理(1. 自动完成)</title><link>http://www.cnblogs.com/bjzhanghao/archive/2007/09/28/908648.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Thu, 27 Sep 2007 16:07:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2007/09/28/908648.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/908648.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2007/09/28/908648.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/908648.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/908648.html</trackback:ping><description><![CDATA[<p>在实际项目应用里，如果需要用户手动输入比较复杂的文本内容时可以考虑利用内容助理（Content
Assistant）功能减轻用户负担，同时减低出错的机会。Jface的SourceViewer支持内容助理，这篇帖子里介绍一下如
何实现自动完成（Auto Completion）功能，即向用户提示接下来可能输入的内容。</p>
<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: #008000;">//</span><span style="color: #008000;">Create&nbsp;a&nbsp;new&nbsp;source&nbsp;viewer</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">sourceViewer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SourceViewer(shell,&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">,&nbsp;SWT.BORDER&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;SWT.WRAP&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;SWT.V_SCROLL);<br />
<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">Set&nbsp;a&nbsp;blank&nbsp;document</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">sourceViewer.setDocument(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Document(</span><span style="color: #000000;">""</span><span style="color: #000000;">));<br />
sourceViewer.setEditable(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
<br />
</span><span style="color: #000000;">StyledText&nbsp;txtSource&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sourceViewer.getTextWidget();<br />
GridData&nbsp;gd&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;GridData(GridData.FILL_BOTH);<br />
txtSource.setLayoutData(gd);</span></div>
<p>自动完成功能一般在以下两种条件下弹出一个小窗口向用户提示当前可供选择的选项，一是用户按下指定的组合键时，二是用户输入了特定的字
符时，SourceViewer支持这两种触发方式。在程序里使用SourceViewer和使用一般控件没有很大的分别，只是SourceViewer
是StyledText的包装，所以一些操作要通过getTextWidget()完成，如下所示：</p>
<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: #008000;">//</span><span style="color: #008000;">Configure&nbsp;source&nbsp;viewer,&nbsp;add&nbsp;content&nbsp;assistant&nbsp;support</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">sourceViewer.configure(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SourceViewerConfiguration()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;IContentAssistant&nbsp;getContentAssistant(ISourceViewer&nbsp;sourceViewer)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ContentAssistant&nbsp;assistant&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ContentAssistant();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IContentAssistProcessor&nbsp;cap&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MyContentAssistProcessor();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assistant.setContentAssistProcessor(cap,&nbsp;IDocument.DEFAULT_CONTENT_TYPE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assistant.setInformationControlCreator(getInformationControlCreator(sourceViewer));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assistant.enableAutoActivation(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;assistant;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
});<br />
</span></div>
<p>现在这个SourceViewer还不能弹出任何提示，因为我们还没有给它一个SourceViewerConfiguration，后者通过getContentAssistant()负责提供一个IContentAssistant的实现。下面的代码显示了如何为SourceViewer设置SourceViewerConfiguration，这个例子里不论当前文本框里是什么内容都弹出一样的提示选项，在实际应用里可以根据内容改变选项：</p>
<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: #0000ff;">public</span><span style="color: #000000;">&nbsp;ICompletionProposal[]&nbsp;computeCompletionProposals(ITextViewer&nbsp;viewer,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;offset)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;content&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;viewer.getTextWidget().getText();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Demo&nbsp;options</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;String[]&nbsp;options&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;String[]&nbsp;{&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">sum()</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">count()</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">sort()</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;};<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Dynamically&nbsp;generate&nbsp;proposal</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList();<br />
&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;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;">&nbsp;options.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;CompletionProposal&nbsp;proposal&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;CompletionProposal(options[i],&nbsp;offset,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;options[i].length());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.add(proposal);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;(ICompletionProposal[])&nbsp;result.toArray(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ICompletionProposal[result.size()]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
}<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">[]&nbsp;getCompletionProposalAutoActivationCharacters()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;TRIGGER_TOKENS;<br />
}</span></div>
<p>上面代码里，MyContentAssistProcessor是我们对IContentAssistant接口的实现，它里面与自动完成有关的是computeCompletionProposals()和getCompletionProposalAutoActivationCharacters()这两个方法，前者返回的结果数组将作为弹出提示窗口里的选项，后者返回的字符数组包含了可以触发弹出窗口的特殊字符。</p>
<p>最后，我们还要支持用户触发内容助理，这要求为SourceViewer添加一个监听器：</p>
<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;">sourceViewer.appendVerifyKeyListener(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;VerifyKeyListener()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;verifyKey(VerifyEvent&nbsp;event)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Check&nbsp;for&nbsp;Alt+/</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(event.stateMask&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;SWT.ALT&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;event.character&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">/</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: #008000;">//</span><span style="color: #008000;">&nbsp;Check&nbsp;if&nbsp;source&nbsp;viewer&nbsp;is&nbsp;able&nbsp;to&nbsp;perform&nbsp;operation</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(sourceViewer.canDoOperation(SourceViewer.CONTENTASSIST_PROPOSALS))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Perform&nbsp;operation</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;sourceViewer.doOperation(SourceViewer.CONTENTASSIST_PROPOSALS);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Veto&nbsp;this&nbsp;key&nbsp;press&nbsp;to&nbsp;avoid&nbsp;further&nbsp;processing</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.doit&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
});<br />
</span></div>
<p>实现后的结果截图如下图所示，（<a href="http://www.cnblogs.com/Files/bjzhanghao/assistant.zip">示例代码下载</a>）：</p>
<p align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/bjzhanghao/eclipse/content_assistant.gif" height="298" width="461" /><br />
</p>
<p>相关参考链接：<br />
<a href="http://www.ibm.com/developerworks/cn/linux/opensource/os-ecca/index.html">为 SWT 应用程序配备内容助理</a><br />
<a href="http://wiki.eclipse.org/FAQ_How_do_I_add_Content_Assist_to_my_language_editor%3F">FAQ How do I add Content Assist to my language editor?</a><br />
<a href="http://help.eclipse.org/help32/topic/org.eclipse.platform.doc.isv/guide/editors_contentassist.htm">Eclipse Help - Content Assist</a>
</p><img src ="http://www.cnblogs.com/bjzhanghao/aggbug/908648.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47919/" target="_blank">微软公布部分Windows 7中文版本零售价</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>GMF里实现contributionItemProvider扩展点</title><link>http://www.cnblogs.com/bjzhanghao/archive/2007/09/17/896499.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Mon, 17 Sep 2007 15:42:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2007/09/17/896499.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/896499.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2007/09/17/896499.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/896499.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/896499.html</trackback:ping><description><![CDATA[<p>GMF里的contributionItemProvider扩展点的功能与org.eclipse.ui.editorActions类似，即为指定editor增加Action，但用contributionItemProvider还可以为view添加Action，以及实现添加popupMenu等多种功能，相当于eclipse提供的多种与Action有关的扩展点的集合。现以为editor增加Action为例介绍一下如何使用contributionItemProvider。</p>
<p>首先当然是在plugin.xml里描述contributionItemProvider扩展点的实现方式。在下面的xml代码里，首先用contributionItemProvider元素指定了实现类为com.my.MyContributionItemProvider，这个实现类可以有两种情况：一般它继承自GMF提供的AbstractContributionItemProvider；也可以直接实现IContributionItemProvider，后者情况就不需要再定义contributionItemProvider元素下的其他元素了，全部Action都可以用java代码在contributeToActionBars()和contributeToPopupMenu()方法里构造。</p>
<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;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">extension<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">point</span><span style="color: #0000ff;">="org.eclipse.gmf.runtime.common.ui.services.action.contributionItemProviders"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">contributionItemProvider<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">checkPluginLoaded</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff;">="com.my.MyContributionItemProvider"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Priority&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="Low"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">partContribution&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="com.my.RuleDiagramEditorID"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">partAction<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="showConsole"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menubarPath</span><span style="color: #0000ff;">="/window/views"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">partAction</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">partContribution</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">contributionItemProvider</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">extension</span><span style="color: #0000ff;">&gt;</span></div>
<p>现在讨论继承AbstractContributionItemProvider的情况，我们需要实现createAction()方法，这个方法接受actionId作为参数。actionId参数是在plugin.xml里指定的，如上面的xml片段里，首先用partContribution元素指定要把Action添加到哪个editor上，然后用partAction元素指定希望添加的Action的id和menubarpath位置等其他参数。</p>
<p>实际上AbstractContributionItemProvider的主要功能就是解析contributionItemProvider下的xml元素，并根据这些元素内容调用createAction()方法，所以在createAction()方法里我们可以得到actionId并根据它创建实际的Action类。下面是对应上面xml片段的MyContributionItemProvider代码：</p>
<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: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;MyContributionItemProvider&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;AbstractContributionItemProvider&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;IAction&nbsp;createAction(String&nbsp;actionId,&nbsp;IWorkbenchPartDescriptor&nbsp;partDescriptor)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(actionId.equals(</span><span style="color: #000000;">"</span><span style="color: #000000;">showConsole</span><span style="color: #000000;">"</span><span style="color: #000000;">))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAction&nbsp;action&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ShowViewAction(</span><span style="color: #000000;">"</span><span style="color: #000000;">&amp;Console</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">console.view.id</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;action.setImageDescriptor(<img src="http://www.cnblogs.com/Images/dot.gif" alt="" />);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;action;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.createAction(actionId,&nbsp;partDescriptor);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ShowViewAction&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;Action{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif" alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<p>最后要注意一点，如果editor和contributionItemProvider不在同一个plugin里，则一定要在plugin.xml里指定contributionItemProvider元素的checkPluginLoaded属性为false，否则这个contributionItemProvider不会被加载。（补充08/01/02: 如果menuPath设置不正确也可能导致contributionItemProvider不被加载，一个正确的menuPath是"/file/print"）</p>
<p>几条参考链接：<br />
<a href="http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg06035.html">http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg06035.html</a><br />
<a href="http://dev.eclipse.org/newslists/news.eclipse.technology.gmf/msg04270.html">http://dev.eclipse.org/newslists/news.eclipse.technology.gmf/msg04270.html</a><br />
<a href="http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg00757.html">http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg00757.html</a><br />
<a href="http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg08196.html">http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg08196.html</a>
</p>
<img src ="http://www.cnblogs.com/bjzhanghao/aggbug/896499.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47918/" target="_blank">Firefox 3.5：很快 但还是不够</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>解决EMF里引用对象的刷新问题</title><link>http://www.cnblogs.com/bjzhanghao/archive/2007/09/03/880854.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Mon, 03 Sep 2007 15:31:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2007/09/03/880854.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/880854.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2007/09/03/880854.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/880854.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/880854.html</trackback:ping><description><![CDATA[<p>假设在ecore模型里定义了两个类：产品（Product）和制造商（Manufacturer），Product通过名为manufacturer的多对一引用与Manufacturer建立关系。在应用程序里，有一些表格（TableViewer）需要在显示产品信息的同时，还要显示制造商相关信息，如制造商名称。缺省条件下，因为这些表格里每一行是一个Product实例，表格的文字更新由AdapterFactoryLabelProvider通过ProductItemProvider实现，所以在制造商名称被改变的时候产品表格无法得到更新。</p>
<p>当然可以直接调用viewer.refresh()方法刷新表格，但这要求具有对viewer的引用，况且我们不知道以后还会有多少个这样的viewer需要刷新。更好的解决办法是修改ProductItemProvider，让它维护一个Adapter（即EMF里的模型监听器），并把这个监听器注册到Product对应的Manufacturer实例上。监听器的注册可以在getText()方法里实现（也许有更合适的地方），别忘了在dispose()方法里要删除这个监听器。此外，要在.genmodel里把Product的Provider Type属性值从缺省的"Singleton"改为"Stateful"，如下图，这样每个Product都对应一个ProductItemProvider实例，从而对应一个这样的监听器。</p>
<p align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/bjzhanghao/emf/emf_genclass_provider_type.gif" height="181" width="595" /><br />
</p>
<p>以下是ProductItemProvider里部分相关代码：</p>
<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;</span><span style="color: #008000;">//</span><span style="color: #008000;">Define&nbsp;an&nbsp;adapter</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;Adapter&nbsp;manufacturerAdapter&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;AdapterImpl()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;notifyChanged(Notification&nbsp;notification)<br />
&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;</span><span style="color: #008000;">//</span><span style="color: #008000;">notify&nbsp;product&nbsp;viewers&nbsp;if&nbsp;manufacturer's&nbsp;name&nbsp;changed</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&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;(notification.getFeatureID(Manufacturer.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;ProductPackage.MANUFACTURER__NAME)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fireNotifyChanged(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ViewerNotification(notification,&nbsp;ProductItemProvider.</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.getTarget(),&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getText(Object&nbsp;object)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Product&nbsp;product&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(Product)&nbsp;object;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Add&nbsp;following&nbsp;codes&nbsp;to&nbsp;maintain&nbsp;the&nbsp;adapter</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Manufacturer&nbsp;manufacturer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;product.getManufacturer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(manufacturer&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;manufacturerAdapter.getTarget())&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;(manufacturerAdapter.getTarget()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;manufacturerAdapter.getTarget().eAdapters().remove(manufacturerAdapter);<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;(manufacturer&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;manufacturer.eAdapters().add(manufacturerAdapter);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;label&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;var.getName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;label;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Remove&nbsp;adapter&nbsp;when&nbsp;ProductItemProvider&nbsp;disposes</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;dispose()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(manufacturerAdapter.getTarget()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;manufacturerAdapter.getTarget().eAdapters().remove(manufacturerAdapter);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.dispose();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span></div>
<p>&nbsp;</p>
<p>最后，需要覆盖ProductItemProvider的notifyChanged()方法，在switch里增加如下代码：<br />
</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;ProductPackage.Product__Manufacturer:<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;fireNotifyChanged(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ViewerNotification(notification,&nbsp;notification.getNotifier(),&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">));<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;</span></div>
<p>&nbsp;</p>
<p>参考：<a href="http://dev.eclipse.org/newslists/news.eclipse.tools.emf/msg18730.html">http://dev.eclipse.org/newslists/news.eclipse.tools.emf/msg18730.html</a></p><img src ="http://www.cnblogs.com/bjzhanghao/aggbug/880854.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47913/" target="_blank">2009年7月中国微软最有价值专家(MVP)名单</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>SWT的SelectionEvent.stateMask不起作用</title><link>http://www.cnblogs.com/bjzhanghao/archive/2007/08/28/873677.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Tue, 28 Aug 2007 14:12:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2007/08/28/873677.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/873677.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2007/08/28/873677.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/873677.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/873677.html</trackback:ping><description><![CDATA[<p>通常理解stateMask的作用是标志事件发生时是否有Shift、Ctrl等键同时按下，但SWT里绝大多数Control都不支持这个标志，无论按下什么键，事件对象里的stateMask都是0（不信可以运行下面的代码）。更奇怪的是<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=65679">这个问题</a>已经被提出3年多还没有解决，stateMask只对MenuItem有用，那要怎么实现对Button的Ctrl+Click检测呢？</p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;org.eclipse.swt.SWT;<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;org.eclipse.swt.events.SelectionAdapter;<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;org.eclipse.swt.events.SelectionEvent;<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;org.eclipse.swt.layout.GridLayout;<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;org.eclipse.swt.widgets.Button;<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;org.eclipse.swt.widgets.Display;<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;org.eclipse.swt.widgets.Shell;<br />
<br />
</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);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;ButtonTest&nbsp;{<br />
<br />
&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);">static</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;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;Display&nbsp;display&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, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Display();<br />
&nbsp;&nbsp;Shell&nbsp;shell&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, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Shell(display);<br />
&nbsp;&nbsp;shell.setLayout(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;GridLayout());<br />
&nbsp;&nbsp;shell.setSize(</span><span style="color: rgb(0, 0, 0);">200</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 0);">200</span><span style="color: rgb(0, 0, 0);">);<br />
<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">final</span><span style="color: rgb(0, 0, 0);">&nbsp;Button&nbsp;button&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, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Button(shell,&nbsp;SWT.NONE);<br />
&nbsp;&nbsp;button.addSelectionListener(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;SelectionAdapter()&nbsp;{<br />
&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;widgetSelected(SelectionEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e.stateMask);//Always zero<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;});<br />
&nbsp;&nbsp;button.setText(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Test</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
<br />
&nbsp;&nbsp;shell.open();<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">while</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);">shell.isDisposed())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</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);">display.readAndDispatch())<br />
&nbsp;&nbsp;&nbsp;&nbsp;display.sleep();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;display.dispose();<br />
&nbsp;}<br />
}</span></div><img src ="http://www.cnblogs.com/bjzhanghao/aggbug/873677.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47912/" target="_blank">Oracle手中另一张对抗微软的王牌：Ubuntu</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item></channel></rss>