﻿<?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>Thu, 24 Jul 2008 05:58:16 GMT</lastBuildDate><pubDate>Thu, 24 Jul 2008 05:58:16 GMT</pubDate><ttl>60</ttl><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><a href="http://news.cnblogs.com/n/41275/" target="_blank">[新闻]Mozilla将于本周五发布Firefox 3.1第一个预览版</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>1</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版本，这种可能性较小，但如果是这种情况换用标准版就能解决）</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>
<img src ="http://www.cnblogs.com/bjzhanghao/aggbug/1205192.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41274/" target="_blank">[新闻]瑞星将向个人用户免费1年</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>7</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><a href="http://news.cnblogs.com/n/41273/" target="_blank">[新闻]中国互联网历史上最伟大的产品TOP10（二）</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>1</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><a href="http://news.cnblogs.com/n/41271/" 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>1</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><a href="http://news.cnblogs.com/n/41270/" target="_blank">[新闻]2008年7月24日IT博客精选</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>8</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><a href="http://news.cnblogs.com/n/41269/" target="_blank">[新闻]TOM在线与Joost正式组建合资公司</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>1</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><a href="http://news.cnblogs.com/n/41268/" target="_blank">[新闻]财富:谷歌副总裁称其新闻搜索值1亿美元</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>0</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><a href="http://news.cnblogs.com/n/41267/" target="_blank">[新闻]Ubuntu创始人呼吁开发Linux桌面软件对抗苹果</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><a href="http://news.cnblogs.com/n/41266/" 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>参考：<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><a href="http://news.cnblogs.com/n/41265/" target="_blank">[新闻]Google在线百科工具Knol今日正式上线</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>3</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><a href="http://news.cnblogs.com/n/41264/" target="_blank">[新闻]马云致信阿里巴巴全体员工号召准备过冬</a>]]></description></item><item><title>Eclipse 3.3里新TreeViewer给EMF应用程序带来的一个问题</title><link>http://www.cnblogs.com/bjzhanghao/archive/2007/08/21/864579.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Tue, 21 Aug 2007 14:29:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2007/08/21/864579.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/864579.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2007/08/21/864579.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/864579.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/864579.html</trackback:ping><description><![CDATA[<p>以前在Eclipse 3.2里做的一个EMF应用程序，到3.3里发现一些TreeViewer里标签显示的格式不对，例如原来显示&#8220;Condition true&#8221;的，在3.3下可能显示&#8220;1&#8221;。调试了一下发现这些TreeViewer在为每个节点获得标签时，若相应的XXXItemProvider实现了ITableItemLableProvider（即应用程序里有TableViewer也用到这个XXXItemProvider）时，会调用getColumnText()而不是getText()来得到文本内容。</p>
<p>在新闻组里搜到<a href="http://dev.eclipse.org/newslists/news.eclipse.tools.emf/msg25327.html">这个帖子</a>讲的是同一件事（新闻组是遇到问题后第一反应），原因不在EMF，是Eclipse 3.3里对TreeViewer的实现有了变化，新的实现把原来的TreeViewer当成只有一列的特殊的TableViewer来对待，以致EMF也把TreeViewer当成了TableViewer，当然会去找getColumnText()了。解决的办法也不复杂，新闻组里那个帖子也提到了，我给帖到这方便大家参考吧。</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;"><br />
&nbsp;*&nbsp;@Added<br />
&nbsp;*&nbsp;Solve&nbsp;a&nbsp;problem&nbsp;raised&nbsp;in&nbsp;jface&nbsp;3.3&nbsp;tree&nbsp;viewer<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@see</span><span style="color: #008000;">&nbsp;</span><span style="color: #008000; text-decoration: underline;">http://dev.eclipse.org/newslists/news.eclipse.tools.emf/msg25409.html</span><span style="color: #008000;"><br />
&nbsp;*<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;WorkaroundAdapterFactoryLabelProvider&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;AdapterFactoryLabelProvider&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;adapterFactory<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;WorkaroundAdapterFactoryLabelProvider(AdapterFactory&nbsp;adapterFactory)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">(adapterFactory);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Image&nbsp;getColumnImage(Object&nbsp;object,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;columnIndex)&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;">.getImage(object);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getColumnText(Object&nbsp;object,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;columnIndex)&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;">.getText(object);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<p>有了上面这个类，然后把原来setLabelProvider()里的AdapterFactoryLabelProvider换成它就可以了。EMF以后的版本应该会解决这个问题。</p><img src ="http://www.cnblogs.com/bjzhanghao/aggbug/864579.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41263/" target="_blank">[新闻]comScore 公布 6 月美国 TOP10 社会化网络排名</a>]]></description></item><item><title>gnujaxp.jar与axis冲突问题</title><link>http://www.cnblogs.com/bjzhanghao/archive/2007/08/17/859449.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Fri, 17 Aug 2007 03:33:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2007/08/17/859449.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/859449.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2007/08/17/859449.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/859449.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bjzhanghao/services/trackbacks/859449.html</trackback:ping><description><![CDATA[<p>一个Web应用程序，在WTP里无法完成web services向导，手工配置axis后访问http://localhost:8080/myapp/servlet/AxisServlet时提示如下错误：</p>
<p>
</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.apache.axis.InternalException:&nbsp;org.apache.axis.ConfigurationException:&nbsp;org.apache.axis.deployment.wsdd.WSDDException:&nbsp;Must&nbsp;include&nbsp;type&nbsp;attribute&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;Handler&nbsp;deployment</span><span style="color: #000000;">!</span><span style="color: #000000;"><br>org.apache.axis.deployment.wsdd.WSDDException:&nbsp;Must&nbsp;include&nbsp;type&nbsp;attribute&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;Handler&nbsp;deployment</span><span style="color: #000000;">!</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.axis.deployment.wsdd.WSDDHandler.</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">init</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(WSDDHandler.java:</span><span style="color: #000000;">50</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.axis.deployment.wsdd.WSDDDeployment.</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">init</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(WSDDDeployment.java:</span><span style="color: #000000;">176</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.axis.deployment.wsdd.WSDDDocument.setDocument(WSDDDocument.java:</span><span style="color: #000000;">139</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.axis.deployment.wsdd.WSDDDocument.</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">init</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(WSDDDocument.java:</span><span style="color: #000000;">65</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.axis.configuration.FileProvider.configureEngine(FileProvider.java:</span><span style="color: #000000;">179</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.axis.AxisEngine.init(AxisEngine.java:</span><span style="color: #000000;">172</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.axis.AxisEngine.</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">init</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(AxisEngine.java:</span><span style="color: #000000;">156</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.axis.server.AxisServer.</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">init</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(AxisServer.java:</span><span style="color: #000000;">88</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.axis.server.DefaultAxisServerFactory.createServer(DefaultAxisServerFactory.java:</span><span style="color: #000000;">109</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.axis.server.DefaultAxisServerFactory.getServer(DefaultAxisServerFactory.java:</span><span style="color: #000000;">73</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.axis.server.AxisServer.getServer(AxisServer.java:</span><span style="color: #000000;">73</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.axis.transport.http.AxisServletBase.getEngine(AxisServletBase.java:</span><span style="color: #000000;">185</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.axis.transport.http.AxisServletBase.getOption(AxisServletBase.java:</span><span style="color: #000000;">396</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.axis.transport.http.AxisServletBase.init(AxisServletBase.java:</span><span style="color: #000000;">112</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.axis.transport.http.AxisServlet.init(AxisServlet.java:</span><span style="color: #000000;">156</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;javax.servlet.GenericServlet.init(GenericServlet.java:</span><span style="color: #000000;">211</span><span style="color: #000000;">)<br><img src="http://www.cnblogs.com/Images/dot.gif"></span></div>
<p>经排除法发现只要删除WEB-INF/lib下的gnujaxp.jar即恢复正常。这个jar文件是因为应用程序使用到jfreechart带来的，按照<a href="http://www.jfree.org/phpBB2/viewtopic.php?=&amp;p=58454">jfree.org论坛里的说法</a>，只有使用jre1.3.1版本jfreechart才真正需要此文件，所以删掉它问题解决，WTP里web services向导恢复正常。</p>
<p>BTW, 除了axis，这个gnujaxp.jar好像还和spring、ibatis等环境有冲突，见这个<a href="http://www.google.cn/search?hl=zh-CN&amp;q=gnujaxp.jar&amp;btnG=Google+%E6%90%9C%E7%B4%A2&amp;lr=">google查询结果</a>。</p><img src ="http://www.cnblogs.com/bjzhanghao/aggbug/859449.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41262/" target="_blank">[新闻]万众期待 iPhone 3G 16GB上市两天破万</a>]]></description></item><item><title>GMF里实现editpolicyProviders扩展点</title><link>http://www.cnblogs.com/bjzhanghao/archive/2007/08/16/858923.html</link><dc:creator>八进制</dc:creator><author>八进制</author><pubDate>Thu, 16 Aug 2007 14:04:00 GMT</pubDate><guid>http://www.cnblogs.com/bjzhanghao/archive/2007/08/16/858923.html</guid><wfw:comment>http://www.cnblogs.com/bjzhanghao/comments/858923.html</wfw:comment><comments>http://www.cnblogs.com/bjzhanghao/archive/2007/08/16/858923.html#Feedback</comments><slash:comments>28</slash:comments><wfw:commentRss>http://www.cnblogs.com/bjzhanghao/comments/commentRss/858923