<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Sung in Blog-文章分类-Ｅｃｌｉｐｓｅ</title><link>http://www.blogjava.net/qq13367612/category/4377.html</link><description>&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font class="subhead" size=3&gt;&lt;b&gt;一些技术文章 &amp; 一些生活杂碎&lt;/b&gt;&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 03:57:13 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 03:57:13 GMT</pubDate><ttl>60</ttl><item><title>Eclipse中自动重构实现探索 </title><link>http://www.blogjava.net/qq13367612/articles/17837.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Wed, 02 Nov 2005 07:42:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/17837.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/17837.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/17837.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/17837.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/17837.html</trackback:ping><description><![CDATA[<P>
<TABLE cellSpacing=0 cellPadding=0 width=680 border=0>
<TBODY>
<TR>
<TD vAlign=top>
<TABLE class=zhi14 height=38 cellSpacing=0 cellPadding=0 width=648 align=center border=0>
<TBODY>
<TR>
<TD style="WORD-BREAK: break-all" vAlign=top width=648 height=18>本文用eclipse的自动重构功能对一个程序实例进行重构，目的是探索Eclipse自动重构可以在多大程度上辅助重构这个过程。程序实例使用《Refactoring：Improving the Design of Existing Code》一书中的例子。<BR>　　<BR>　　Eclipse的自动重构功能能够很好地支持各种程序元素的重命名，并自动更新相关的引用。Eclipse能够支持方法、字段在类之间移动，并自动更新引用。Eclipse较好地支持内联字段、函数的更新替换。Eclipse较好地支持抽取方法、变量等程序元素。<BR>　　<BR>　　重构的过程是一个不断尝试和探索的过程。Eclipse的重构支持撤销和重做，并且能够预览重构结果，这些是很实用的功能。<BR>　　<BR>　　Eclipse的重命名、抽取方法、移动、内联功能、更改方法特征符等代码结构级别的重构方法，是比较成熟同时也值得使用的功能。至于设计结构上的重构，eclipse还不能很好地支持。但是作者相信，自动重构的理念应该是"工具辅助下的重构工作"，人仍然承担大部分重构工作。<BR>　　<BR>　　<B>一、预备工作</B><BR>　　<BR>　　本文使用《Refactoring：Improving the Design of Existing Code》一书第一章的例子。重构前的代码及每一步重构后的代码见附件。读者最好配合《Refactoring：Improving the Design of Existing Code》一书阅读本文。<BR>　　<BR>　　Eclipse使用如下版本：<BR>　　　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.5.10.10.59.43.1.jpg"><BR>　　同时安装了中文语言包。<BR>　　<BR>　　<B>二、重构第一步：分解并重组statement()</B><BR>　　<BR>　　目的：<BR>　　<BR>　　1、 把statement()函数中的swich语句提炼到独立的函数amountFor()中。<BR>　　<BR>　　2、 修改amountFor()参数命名<BR>　　<BR>　　重构方法：<BR>　　<BR>　　Extract Method<BR>　　Rename Method<BR>　　<BR>　　方法：<BR>　　<BR>　　1、选中swich语句的代码块，在右键菜单中选择"重构/抽取方法"，出现参数对话框。Eclipse自动分析代码块中的局部变量，找到了两个局部变量：each和thisAmount。其中，each只是在代码块中被读取，但thisAmount会在代码块中被修改。按照重构Extract Method总结出来的规则，应该把each当作抽取函数的参数、thisAmount当作抽取函数的返回值。然而Eclipse并不做区分，直接把这两个变量当作抽取新方法的参数，如图。<BR>　　　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.5.10.10.59.52.2.jpg"><BR>　　我们的目的是把在抽取函数中不会被修改的each作为参数；会被修改的thisAmount作为返回值。解决的办法是，把 double thisAmount = 0; 这行代码移到switch语句的上面，变成这样：<BR>　　<BR>　　double thisAmount = 0;<BR>　　switch(each.getMovie().getPriceCode()){<BR>　　case Movie.REGULAR:<BR>　　thisAmount += 2;<BR>　　if(each.getDaysRented()&gt;2)<BR>　　thisAmount += (each.getDaysRented()-2)*1.5;<BR>　　break;<BR>　　<BR>　　case Movie.NEW_RELEASE:<BR>　　thisAmount += each.getDaysRented()*3;<BR>　　break;<BR>　　<BR>　　case Movie.CHILDRENS:<BR>　　thisAmount += 1.5;<BR>　　if(each.getDaysRented()&gt;3)<BR>　　thisAmount += (each.getDaysRented()-3)*1.5;<BR>　　break;<BR>　　}<BR>　　<BR>　　选中这段代码，在右键菜单中选择"重构/抽取方法"，eclipse这次变得聪明点了，如图。<BR>　　　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.5.10.11.0.0.3.jpg"><BR>　　选择"预览"按钮预先查看重构后的结果，符合我们最初的目的。<BR>　　　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.5.10.11.0.10.4.jpg"><BR>　　选择"确定"按钮，重构后的代码片断如下：<BR>　　<BR>　　public String statement() {<BR>　　double totalAmount = 0;<BR>　　int frequentRenterPoints = 0;<BR>　　Enumeration rentals = _rentals.elements();<BR>　　String result = "Rental Record for " + getName() + "\n";<BR>　　<BR>　　while(rentals.hasMoreElements()){<BR>　　Rental each = (Rental)rentals.nextElement();<BR>　　<BR>　　double thisAmount = amountFor(each);<BR>　　<BR>　　frequentRenterPoints ++;<BR>　　if((each.getMovie().getPriceCode())==Movie.NEW_RELEASE &amp;&amp;each.getDaysRented()&gt;1)<BR>　　frequentRenterPoints ++;<BR>　　<BR>　　result += "\t" + each.getMovie().getTitle() + "\t" +String.valueOf(thisAmount) + "\n";<BR>　　totalAmount += thisAmount;<BR>　　}<BR>　　<BR>　　result += "Amount owed is " + String.valueOf(totalAmount) + "\n";<BR>　　result += "You earned " + String.valueOf(frequentRenterPoints) + " frequent renter points";<BR>　　<BR>　　return result;<BR>　　}<BR>　　<BR>　　/**<BR>　　* @param each<BR>　　* @return<BR>　　*/<BR>　　private double amountFor(Rental each) {<BR>　　double thisAmount = 0;<BR>　　switch(each.getMovie().getPriceCode()){<BR>　　case Movie.REGULAR:<BR>　　thisAmount += 2;<BR>　　if(each.getDaysRented()&gt;2)<BR>　　thisAmount += (each.getDaysRented()-2)*1.5;<BR>　　break;<BR>　　<BR>　　case Movie.NEW_RELEASE:<BR>　　thisAmount += each.getDaysRented()*3;<BR>　　break;<BR>　　<BR>　　case Movie.CHILDRENS:<BR>　　thisAmount += 1.5;<BR>　　if(each.getDaysRented()&gt;3)<BR>　　thisAmount += (each.getDaysRented()-3)*1.5;<BR>　　break;<BR>　　}<BR>　　return thisAmount;<BR>　　}<BR>　　<BR>　　2、选中amountFor()的参数each，在右键菜单中选择"重构/重命名"，在对话框中输入新的名称：aRental，选择确定，amountFor()中所有each的引用全部被替换成新的名称。用同样的办法修改amountFor()中的局部变量thisAmount为result。重构后的amountFor()代码如下：<BR>　　<BR>　　/**<BR>　　* @param aRental<BR>　　* @return<BR>　　*/<BR>　　private double amountFor(Rental aRental) {<BR>　　double result = 0;<BR>　　switch(aRental.getMovie().getPriceCode()){<BR>　　case Movie.REGULAR:<BR>　　result += 2;<BR>　　if(aRental.getDaysRented()&gt;2)<BR>　　result += (aRental.getDaysRented()-2)*1.5;<BR>　　break;<BR>　　<BR>　　case Movie.NEW_RELEASE:<BR>　　result += aRental.getDaysRented()*3;<BR>　　break;<BR>　　<BR>　　case Movie.CHILDRENS:<BR>　　result += 1.5;<BR>　　if(aRental.getDaysRented()&gt;3)<BR>　　result += (aRental.getDaysRented()-3)*1.5;<BR>　　break;<BR>　　}<BR>　　return result;<BR>　　}<BR>　　<BR>　　<B>三、重构第二步：搬移"金额计算"代码</B><BR>　　<BR>　　目的：<BR>　　<BR>　　1、 将函数amountFor()转移到Rental类中，并更名为getCharge()。<BR>　　<BR>　　2、 更新并替换所有对amountFor()的引用。<BR>　　<BR>　　重构方法：<BR>　　<BR>　　Move Method<BR>　　Change Method signatrue<BR>　　Inline Method<BR>　　Inline Temp<BR>　　<BR>　　方法：<BR>　　<BR>　　1、选中函数amountFor()的定义，在右键菜单中选择"重构/移动"，显示参数设置对话框。把新方法名改成getCharge。按下"确定"按钮，Customer Class中的amountFor()函数被移动到Rental Class中，并更名为：getCharge()。<BR>　　　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.5.10.11.0.19.5.jpg"><BR>　　同时eclipse自动在Customer的amountFor()函数中添加一行对新函数的"委托"代码：<BR>　　<BR>　　private double amountFor(Rental aRental) {<BR>　　return aRental.getCharge();<BR>　　}<BR>　　<BR>　　这行代码会产生编译错误，原因是amountFor()的private型被传递到了新的方法中：<BR>　　<BR>　　/**<BR>　　* @param this<BR>　　* @return<BR>　　*/<BR>　　private double getCharge() {<BR>　　……<BR>　　}<BR>　　<BR>　　2、继续重构！选中getCharge()方法，在右键菜单中选择"重构/更改方法特征符"，弹出参数选择对话框，把访问修饰符从private改成public。Eclipse的编译错误提示自动消失。<BR>　　　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.5.10.11.0.28.6.jpg"><BR>　　3、回到Customer类，把所有对amountFor()引用的地方替换成直接对getCharge()的引用。选中Customer类的函数amountFor(Rental aRental)，在右键菜单中选择"重构/内联"，出现参数选择对话框。<BR>　　　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.5.10.11.0.36.7.jpg"><BR>　　选择"确认"按钮，引用amountFor()的地方被替换成对getCharge()的引用。<BR>　　<BR>　　public String statement() {<BR>　　……<BR>　　double thisAmount = each.getCharge();<BR>　　……<BR>　　}<BR>　　<BR>　　4、除去临时变量thisAmount。<BR>　　<BR>　　选中变量thisAmount，在右键菜单中选择"重构/内联"，重构预览窗口如下，可见达到了重构的目的。按下"确认"按钮重构代码。<BR>　　　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.5.10.11.0.45.8.jpg"><BR>　　statement()代码：<BR>　　<BR>　　public String statement() {<BR>　　double totalAmount = 0; // 总消费金额<BR>　　int frequentRenterPoints = 0; // 常客积点<BR>　　Enumeration rentals = _rentals.elements();<BR>　　String result = "Rental Record for " + getName() + "\n";<BR>　　<BR>　　while(rentals.hasMoreElements()){<BR>　　Rental each = (Rental)rentals.nextElement(); //取得一笔租借记录<BR>　　<BR>　　// add frequent renter points(累加 常客积点)<BR>　　frequentRenterPoints ++;<BR>　　// add bouns for a two day new release rental<BR>　　if((each.getMovie().getPriceCode())==Movie.NEW_RELEASE &amp;&amp; each.getDaysRented()&gt;1)<BR>　　frequentRenterPoints ++;<BR>　　<BR>　　// show figures for this rental(显示此笔租借数据)<BR>　　result += "\t" + each.getMovie().getTitle() + "\t" +<BR>　　String.valueOf(each.getCharge()) + "\n";<BR>　　totalAmount += each.getCharge();<BR>　　}<BR>　　<BR>　　// add footer lines（结尾打印）<BR>　　result += "Amount owed is " + String.valueOf(totalAmount) + "\n";<BR>　　result += "You earned " + String.valueOf(frequentRenterPoints) + " frequent renter points";<BR>　　<BR>　　return result;<BR>　　}<BR>　　<BR>　　<B>四、重构第三步：提炼"常客积点计算"代码</B><BR>　　<BR>　　目的：提取"常客积点计算"代码并放在Rental类中，"常客积点计算"代码如下。<BR>　　<BR>　　public String statement() {<BR>　　……<BR>　　// add frequent renter points<BR>　　frequentRenterPoints ++;<BR>　　// add bouns for a two day new release rental<BR>　　if((each.getMovie().getPriceCode())==Movie.NEW_RELEASE &amp;&amp; each.getDaysRented()&gt;1)<BR>　　frequentRenterPoints ++;<BR>　　……<BR>　　}<BR>　　<BR>　　重构后的代码如下：<BR>　　<BR>　　frequentRenterPoints += each.getFrequentRenterPoints();<BR>　　<BR>　　重构方法：<BR>　　<BR>　　Extract Method<BR>　　Move Method<BR>　　Change Method signatrue<BR>　　Inline Method<BR>　　<BR>　　方法：<BR>　　<BR>　　1、 首先，抽取代码到独立的函数中。<BR>　　<BR>　　用"抽取方法"重构代码，函数名：getFrequentRenterPoints。很遗憾，eclipse的不能生成诸如：frequentRenterPoints += getFrequentRenterPoints(Rental aRental); 的代码。原因是执行自增操作的局部变量frequentRenterPoints要出现在等式右边，因此抽取函数getFrequentRenterPoints()一定要把frequentRenterPoints作为参数。手工修改函数和对函数的引用，重构后的代码如下：<BR>　　<BR>　　public String statement() {<BR>　　……<BR>　　while(rentals.hasMoreElements()){<BR>　　……<BR>　　frequentRenterPoints += getFrequentRenterPoints(each);<BR>　　……<BR>　　}<BR>　　……<BR>　　}<BR>　　<BR>　　/**<BR>　　* @param each<BR>　　* @return<BR>　　*/<BR>　　private int getFrequentRenterPoints(Rental each) {<BR>　　if((each.getMovie().getPriceCode())==Movie.NEW_RELEASE &amp;&amp; each.getDaysRented()&gt;1)<BR>　　return 2;<BR>　　else<BR>　　return 1;<BR>　　}<BR>　　<BR>　　2、 把getFrequentRenterPoints（）移动到Rental类中。<BR>　　<BR>　　3、 对getFrequentRenterPoints（）"更改方法特征符"为public。<BR>　　<BR>　　4、 对Customer的函数getFrequentRenterPoints()执行内联操作，重构目标完成。<BR>　　<BR>　　<B>五、重构第四步：去除临时变量（totalAmount和frequentRenterPoints）</B><BR>　　<BR>　　目的：去除临时变量（totalAmount和frequentRenterPoints）<BR>　　<BR>　　方法：<BR>　　<BR>　　1、 分析totalAmount和frequentRenterPoints的定义和引用结构如下：<BR>　　<BR>　　// 声明和定义<BR>　　double totalAmount = 0;<BR>　　int frequentRenterPoints = 0;<BR>　　……<BR>　　// 在循环中修改<BR>　　while(rentals.hasMoreElements()){<BR>　　……<BR>　　frequentRenterPoints += each.getFrequentRenterPoints();<BR>　　……<BR>　　totalAmount += each.getCharge();<BR>　　……<BR>　　}<BR>　　……<BR>　　// 在循环外使用<BR>　　result += "Amount owed is " + String.valueOf(totalAmount) + "\n";<BR>　　result += "You earned " + String.valueOf(frequentRenterPoints) + " frequent renter points";<BR>　　……<BR>　　<BR>　　上述两个变量在循环体外面定义和使用，在循环中被修改，运用Replace Temp with Query方法去除这两个临时变量是一项稍微复杂的重构。很遗憾，eclipse目前不支持这样的重构。<BR>　　<BR>　　2、手工修改代码。<BR>　　<BR>　　<B>六、重构第五步：运用多态取代与价格相关的条件逻辑</B><BR>　　<BR>　　目的：<BR>　　<BR>　　1、 把Rental类中的函数getCharge()移动到Movie类中。<BR>　　<BR>　　2、 把Rental类中的函数getFrequentRenterPoints()移动到Movie类中。<BR>　　<BR>　　重构方法：<BR>　　<BR>　　Move Method<BR>　　Inline Method<BR>　　<BR>　　方法：<BR>　　<BR>　　1、 选中Rental类中的函数getCharge()，右键菜单选中"重构/移动"，eclipse提示找不到接收者，不能移动。原因在于这行语句：<BR>　　<BR>　　switch(getMovie().getPriceCode()){//取得影片出租价格<BR>　　<BR>　　选中getMovie()，右键菜单选中"重构/内联"，确定后代码成为：<BR>　　<BR>　　switch(_movie.getPriceCode()){ //取得影片出租价格<BR>　　<BR>　　选中getCharge()，执行"重构/移动"后，函数被移动到Movie类中。然而这只是部分达成了重构目的，我们发现，移动后的代码把Rental作为参数传给了getCharge()，手工修改一下，代码变成：<BR>　　<BR>　　class Movie ……<BR>　　/**<BR>　　* @param this<BR>　　* @return<BR>　　*/<BR>　　public double getCharge(int _daysRented) {<BR>　　double result = 0;<BR>　　switch(getPriceCode()){ //取得影片出租价格<BR>　　case Movie.REGULAR: // 普通片<BR>　　result += 2;<BR>　　if(_daysRented&gt;2)<BR>　　result += (_daysRented-2)*1.5;<BR>　　break;<BR>　　<BR>　　case Movie.NEW_RELEASE: // 新片<BR>　　result += _daysRented*3;<BR>　　break;<BR>　　<BR>　　case Movie.CHILDRENS: // 儿童片<BR>　　result += 1.5;<BR>　　if(_daysRented&gt;3)<BR>　　result += (_daysRented-3)*1.5;<BR>　　break;<BR>　　}<BR>　　return result;<BR>　　}<BR>　　<BR>　　class Rental……<BR>　　/**<BR>　　* @param this<BR>　　* @return<BR>　　*/<BR>　　public double getCharge() {<BR>　　return _movie.getCharge(_daysRented);<BR>　　}<BR>　　<BR>　　2、用同样的步骤处理getFrequentRenterPoints()，重构后的代码：<BR>　　<BR>　　class Movie ……<BR>　　/**<BR>　　* @param frequentRenterPoints<BR>　　* @param this<BR>　　* @return<BR>　　*/<BR>　　public int getFrequentRenterPoints(int daysRented) {<BR>　　if((getPriceCode())==Movie.NEW_RELEASE &amp;&amp; daysRented&gt;1)<BR>　　return 2;<BR>　　else<BR>　　return 1;<BR>　　}<BR>　　class Rental……<BR>　　/**<BR>　　* @param frequentRenterPoints<BR>　　* @param this<BR>　　* @return<BR>　　*/<BR>　　public int getFrequentRenterPoints(int daysRented) {<BR>　　if((getPriceCode())==Movie.NEW_RELEASE &amp;&amp; daysRented&gt;1)<BR>　　return 2;<BR>　　else<BR>　　return 1;<BR>　　}<BR>　　<BR>　　<B>七、重构第六步：终于……我们来到继承</B><BR>　　<BR>　　目的：对switch语句引入state模式。<BR>　　<BR>　　方法：<BR>　　<BR>　　很遗憾，不得不在这里提前结束eclipse的自动重构之旅。Eclipse几乎不能做结构上的重构。也许Martin Fowler在书中呼唤的自动重构工具止于"工具辅助下的重构工作"这一理念。艺术是人类的专利，编程艺术的梦想将持续下去。<BR>　　<BR>　　感兴趣的读者可以查看手工重构的最后一步代码。将重构进行到底！<BR>　　<BR>　　附录：eclipse支持的重构方法（摘自eclipse中文帮助）<BR>　　 <IMG src="http://www.chinaitlab.com/www/imgfiles/2005.5.10.11.1.0.9.jpg"> </TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD vAlign=top height=225>
<TABLE cellSpacing=0 cellPadding=0 width=679 align=center border=0>
<TBODY>
<TR>
<TD width=687>&nbsp;</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></P><img src ="http://www.blogjava.net/qq13367612/aggbug/17837.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-11-02 15:42 <a href="http://www.blogjava.net/qq13367612/articles/17837.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用Eclipse编辑中文资源文件 </title><link>http://www.blogjava.net/qq13367612/articles/17836.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Wed, 02 Nov 2005 07:41:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/17836.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/17836.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/17836.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/17836.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/17836.html</trackback:ping><description><![CDATA[既然生为中国人，就没有什么好抱怨的了，遇到编码的问题，那只有解决它了。<BR>　　<BR>　　如果经常使用Struts，并做过国际化操作的人来说，对于中文资源文件的处理应该不会感到陌生的。比如下面两个文件，一个是英文的，一个是中文的。对于英文的，一切照常；对于中文的，一般需要用JDK的native2ascii工具进行转换。<BR>　　<BR>　　application_en.properties<BR>　　# Resources for the Hello sample application<BR>　　hello.title=A first Struts program<BR>　　hello.prompt.user=Please enter a UserName<BR>　　hello.page.hello=Hello<BR>　　hello.page.wellocome=Wellcome to Blog of Javamxj<BR>　　<BR>　　application_zh_CN.properties<BR>　　# Hello实例使用的资源文件<BR>　　<BR>　　hello.title=第一个Struts应用<BR>　　hello.prompt.user=请输入用户名<BR>　　hello.page.hello=你好<BR>　　hello.page.wellocome=欢迎来到Javamxj的Blog<BR>　　<BR>　　我当前使用的Eclipse版本是3.1M6，如果使用Eclipse编辑application_zh_CN.properties文件，保存后，关闭这个文件，然后再次打开它，会发现这个文件中的中文字符都变成了？？？？。<BR>　　<BR>　　为什么会发生这种情况呢？在中文操作系统下，Eclipse中的Java类型文件的编码的默认设置是GBK，但是对Properties资源文件的编码的默认设置是ISO-8859-1。所以编辑Java文件中的中文不会出现问题，但编辑Properties资源文件中的中文会出现问题。<BR>　　<BR>　　在3.1M6版本下，我们可以直接修改Properties资源文件的默认编码了（Eclipse3.0版本好像不支持）。在Eclipse主界面下，打开 Window -&gt;Perferences -&gt;General -&gt;Editors -&gt;Context Types:<BR>　　　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.6.11.10.52.25.1.jpg"><BR>　　修改为GBK后，再次打开application_zh_CN.properties文件，编辑后保存，再打开时，文件中的中文字符可以正常显示了。<BR>　　<BR>　　这还不行，还必须利用native2ascii来转换一下。<BR>　　<BR>　　native2ascii-本地码-至-ASCII 码转换器<BR>　　<BR>　　将含有本地编码字符（既非 Latin1 又非 Unicode 字符）的文件转换为 Unicode 编码字符的文件。<BR>　　<BR>　　结构<BR>　　<BR>　　native2ascii [options] [inputfile [outputfile]]<BR>　　<BR>　　说明<BR>　　<BR>　　Java 编译器和其它 Java 工具只能处理含有 Latin-1 和/或 Unicode 编码（\udddd 记号）字符的文件。native2ascii 将含有其它字符编码的文件转换成含 Latin-1 和/或 Unicode 编码字符的文件。<BR>　　<BR>　　若省略 outputfile，则使用标准输出设备输出。此外，如果也省略 inputfile，则使用标准输入设备输入。<BR>　　<BR>　　选项<BR>　　<BR>　　-reverse<BR>　　<BR>　　执行相反的操作：将含 Latin-1 和/或 Unicode 编码字符的文件转换成含本地编码字符的文件：<BR>　　<BR>　　-encoding encoding_name<BR>　　<BR>　　指定转换过程使用的编码名称。缺省的编码从系统属性 file.encoding 中得到。encoding_name 字符串必须是符合要求的字符串。<BR>　　<BR>　　比如可以这样利用native2ascii：<BR>　　<BR>　　native2ascii -encoding gbk application_zh_CN.properties temp.properties<BR>　　<BR>　　这里将根据application_zh_CN.properties输出了一个临时文件temp.properties，然后把application_zh_CN.properties中的文件内容替换为这个临时文件的内容就可以了。<BR>　　<BR>　　转换后的application_zh_CN.properties<BR>　　<BR>　　# Hello\u5b9e\u4f8b\u4f7f\u7528\u7684\u8d44\u6e90\u6587\u4ef6<BR>　　<BR>　　hello.title=\u7b2c\u4e00\u4e2aStruts\u5e94\u7528<BR>　　hello.prompt.user=\u8bf7\u8f93\u5165\u7528\u6237\u540d<BR>　　hello.page.hello=\u4f60\u597d<BR>　　hello.page.wellocome=\u6b22\u8fce\u6765\u5230Javamxj\u7684Blog<BR>　　<BR>　　这样的操作对于一个或两个资源文件还行，如果多个资源文件，这样未免有些太麻烦了。你可以建立一个批处理文件（.bat）；或者建立一个Ant文件，利用其包含的native2ascii任务，也可以进行批处理。<BR>　　<BR>　　但是自从使用Eclipse后，好处多多，在Eclipse下，有这么两个插件，可以用来处理资源文件，它们使用起来各有千秋。<BR>　　<BR>　　JInto 0.8.0<BR>　　<BR>　　主页 http://www.guh-software.de/jinto.html<BR>　　<BR>　　下载 http://www.guh-software.de/jinto/de.guhsoft.jinto_0.8.0.zip<BR>　　<BR>　　文档 http://www.guh-software.de/jinto/JIntoGettingStarted.pdf （英文）<BR>　　<BR>　　仔细看看文档，它提供的功能还是很不错的。<BR>　　<BR>　　Properties Editor<BR>　　<BR>　　主页 http://propedit.sourceforge.jp/index_en.html<BR>　　<BR>　　它提供了三个版本，单独运行的版本、Eclipse版本、JBuilder版本，这里只看看Eclipse3下的版本。<BR>　　<BR>　　PropertiesEditor_EclipsePlugin_for_3.0 V4.4.0<BR>　　<BR>　　分别以links方式安装这两个插件，启动Eclipse，切换到Perferences，如图：<BR>　　<BR>　　· JInto插件<BR>　　　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.6.11.10.52.37.2.jpg"><BR>　　· Properties Editor插件<BR>　　　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.6.11.10.52.48.3.jpg"><BR>　　· 先利用Properties Editor插件编辑资源文件，选中application_zh_CN.properties，右击，选择对应的插件，如图操作：<BR>　　　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.6.11.10.52.59.4.jpg"><BR>　　· Properties Editor插件编辑的效果<BR>　　　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.6.11.10.53.12.5.jpg"><BR>　　· 然后利用JInto插件编辑资源文件：<BR>　　 <IMG src="http://www.chinaitlab.com/www/imgfiles/2005.6.11.10.53.26.6.jpg"><BR>　　对应XML文件类型，默认的编码是UTF-8,但如果在xml声明中可以指定其编码，如“&lt;?xml version="1.0" encoding="GBK"?&gt;”就指定其编码为GBK。这样，Eclipse在读取xml文件时，会首先根据其声明来设置这个文件的编码，如果在声明中没有指定其编码，那么会采用UTF-8编码来读取这个文件。所以对于xml文件，就不需要强制设置其默认的编码类型了。 <img src ="http://www.blogjava.net/qq13367612/aggbug/17836.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-11-02 15:41 <a href="http://www.blogjava.net/qq13367612/articles/17836.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse插件开发之添加简单的GUI元素</title><link>http://www.blogjava.net/qq13367612/articles/17835.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Wed, 02 Nov 2005 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/17835.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/17835.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/17835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/17835.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/17835.html</trackback:ping><description><![CDATA[编写Eclipse插件的方法很简单，你只需要编写一个应用程序，并把它"添加"到Eclipse上。但是与编写音乐类似，在能够创作一部著作之前，首先必须学习大量的相关知识。<BR>　　<BR>　　本文将讨论少许几个简单的GUI元素：<BR>　　<BR>　　· 工具条按钮<BR>　　<BR>　　· 菜单项<BR>　　<BR>　　· 对话框<BR>　　<BR>　　为了使用这些元素，我们将稍微修改已有的插件，顺便编写一个可供使用的工具类。<BR>　　<BR>　　<B>扩展点（Extension Points）</B><BR>　　<BR>　　我们不能随意地向Eclipse用户界面的任何地方添加窗口小部件，只能在特殊的、指定的、有记载的位置添加。这些位置被称为扩展点（extension points）。在基本的Eclipse安装中存在数以百计可供使用的扩展点。插件自身也可以发布新的扩展点。<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.5.21.11.10.35.1.gif"></CENTER><BR>　　 
<CENTER>图1：扩展页</CENTER><BR>　　<BR>　　现在请点击"添加"（ADD）按钮，出现了图2所示的列表。<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.5.21.11.10.45.2.gif"></CENTER><BR>　　 
<CENTER>图2：新增扩展向导，扩展列表</CENTER><BR>　　<BR>　　上下滚动这个列表可以看到很多可供使用的扩展点。你可能注意到了有两种类型的扩展点：带有扩展模板的（用加号标识）和不带扩展模板的。大多数经常用到的扩展点都带有用于辅助开发扩展的模板。图2中选择的扩展点Action Set，带有一个叫做"Hello World"操作集的模板。当你选择某个模板的时候，会出现简短的描述。"下一个"页面将询问模板使用的参数。<BR>　　<BR>　　现在请关闭向导并返回到"扩展"属性页。选择"Invokatron编辑器"。在这个属性页中，你可能注意到了我们在向导中为Invokatron编辑器输入的信息。正常的扩展需要一个唯一的标识符（ID字段）、一个供显示的名称（Name字段）和它所属的扩展点（Point字段）。从模板中建立的扩展（例如Invokatron编辑器）需要更多的参数。没有模板的扩展点也需要更多的信息，但是这些信息只能在文本编辑器中输入。<BR>　　<BR>　　<B>添加工具条按钮</B><BR>　　<BR>　　现在我们已经了解了扩展点是什么，让我们来添加一个扩展吧。我们首先添加的是一个工具条按钮。这个按钮将调用我们前面建立的新的Invokatron向导。<BR>　　<BR>　　添加工具条按钮有三个步骤：<BR>　　<BR>　　1.声明一个新扩展。<BR>　　<BR>　　2.用特定的标记来扩充该声明。<BR>　　<BR>　　3.编写操作委托类<BR>　　<BR>　　1.声明一个新扩展<BR>　　<BR>　　我们已经知道怎样实现这个步骤了。简单地返回到扩展点下的plugin.xml编辑器。点击"添加"。工具条按钮在org.eclipse.ui.actionSets扩展点下面。不要使用模板，直接点击"完成"。输入下面一些内容：<BR>　　<BR>　　· Id: NewInvokatronAction<BR>　　<BR>　　· Name: New Invokatron Document Action<BR>　　<BR>　　· Point: (使用默认值：org.eclipse.ui.actionSets)<BR>　　<BR>　　返回plugin.xml属性页，Eclipse给这个文件添加了新的代码片断。<BR>　　<BR>　　2.用特定的标记来扩充该声明<BR>　　<BR>　　这个新扩展几乎毫无内容。我们在下面添加一些标记（tag）。你知道可以使用哪些标记吗？你可以右键点击"所有扩展"树中的元素，选择"新增"菜单，会得到一个列表。你也可以查看Eclipse文档。<BR>　　<BR>　　现在我们看到自己可以在＜extension＞标记内部添加一个＜actionSet＞标记。它可以包含零个或多个＜menu＞标记，后面跟着零个或多个＜action＞标记，还可以选择使用＜description＞标记。但是其中最重要的标记是＜action＞。它可以同时描述工具条按钮和菜单项。&gt;BR&gt;下面是我们将添加的工具条按钮的XML代码片断。其中的新代码是黑体的。我们在后面会剖析这段代码。<BR>　　<BR>　　＜extension id="NewInvokatronAction"<BR>　　name="New Invokatron Document Action"<BR>　　point="org.eclipse.ui.actionSets"＞<BR>　　＜actionSet id="invokatron.actionSet"<BR>　　label="Invokatron Actions"<BR>　　visible="true"＞<BR>　　＜action id="invokatron.wizard.RunWizardAction"<BR>　　toolbarPath="org.eclipse.ui.workbench.file/new.ext"<BR>　　icon="icons/InvokatronIcon16.gif"<BR>　　tooltip="Starts the New Invokatron Document Wizard."<BR>　　class="invokatron.wizard.RunWizardAction"＞<BR>　　＜/action＞<BR>　　＜/actionSet＞<BR>　　＜/extension＞<BR>　　<BR>　　所有这些操作都可以在plugin.xml编辑器中用图形化的方式来完成，但是我们查看XML以明确字段的完整文本内容。此处的＜actionSet＞标记只含有一个操作（action）。操作表现为菜单中的项或工具条中的按钮的对象。操作的属性实在太多了，你可以在在线文档中查阅。其中最有趣的一些属性是：<BR>　　<BR>　　· id：操作的唯一标识符。可以用于在运行时引用操作。<BR>　　<BR>　　· toolbarPath：放置工具条按钮的位置。<BR>　　<BR>　　· icon：工具条按钮或菜单项左侧显示的图标。它是一个与开发目录关联的16×16的GIF文件。请把 图片存放到Invokatron\icons文件夹中。这个文件夹已经被包含到二进制建立路径中，因此该图标将放入插件的文档目录中。<BR>　　<BR>　　· tooltip：当鼠标停留在工具条按钮上的时候出现的文本内容。<BR>　　<BR>　　· class：这些操作的完整的合格的类名称。<BR>　　<BR>　　<B>关于工具条路径</B><BR>　　<BR>　　工具条路径（toolbar path）指出了添加工具条按钮的位置。由于任何人都可以建立工具条，而且有时候一个按钮可以包含子选项，因此我们用分层的标识符列表来访问这个位置。下面是经常用到的工具条列表和它们的路径：<BR>　　<BR>　　· 文件： org.eclipse.ui.workbench.file 带有一些公共的分组标志（你可以添加按钮的更多的位置）：<BR>　　<BR>　　o "新建"区：new.ext<BR>　　o "保存"区：save.ext<BR>　　o "打印"区：print.ext<BR>　　o "建立"区：build.ext<BR>　　<BR>　　· 导航： org.eclipse.ui.workbench.navigate<BR>　　<BR>　　· 载入： org.eclipse.debug.ui.launchActionSet<BR>　　<BR>　　· 编辑器表示：org.eclipse.ui.edit.text.actionSet.presentation<BR>　　<BR>　　· 搜索： org.eclipse.search.searchActionSet<BR>　　<BR>　　· Java元素建立：org.eclipse.jdt.ui.JavaElementCreationActionSet<BR>　　<BR>　　· 组： Team<BR>　　<BR>　　· CVS： CVS<BR>　　<BR>　　如果你提供的工具条ID不带有标志ID，你的按钮就会被添加到紧挨着这个工具条的一个新工具条之上。接着这个新工具条就可以被添加到Eclipse GUI上了。有时候你会看到使用工具条路径"正常的（Normal）"的插件。这是旧的名称转换。在Eclipse 3中这样使用的时候会建立一个叫作"Normal"的新工具条。如果你建立一个新工具条ID，你的工具条会被添加到"文件"工具条后面。<BR>　　<BR>　　请注意"文件"工具条的"新建"组标志。这是我们添加自己的按钮的地方。由于标志ID是new.ext，完整的路径就是：<BR>　　<BR>　　org.eclipse.ui.workbench.file/new.ext<BR>　　<BR>　　3.编写操作委托类<BR>　　<BR>　　最后一步是编写少量的用于实现操作的Java。这个类称为操作委托。<BR>　　<BR>　　package invokatron.wizard;<BR>　　<BR>　　public class RunWizardAction extends Action<BR>　　implements IWorkbenchWindowActionDelegate {<BR>　　/** 操作被建立的时候调用*/<BR>　　public void init(IWorkbenchWindow window) {}<BR>　　<BR>　　/** 操作被删除的时候调用*/<BR>　　public void dispose() {}<BR>　　<BR>　　/** 操作被执行的时候调用 */<BR>　　public void run(IAction action) {<BR>　　InvokatronWizard wizard= new InvokatronWizard();<BR>　　Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();<BR>　　WizardDialog dialog= new WizardDialog(shell, wizard);<BR>　　dialog.create();<BR>　　dialog.open();<BR>　　}<BR>　　<BR>　　/** 编辑器中的对象被选中或取消选择的时候调用*/<BR>　　public void selectionChanged(IAction action, ISelection selection) {}<BR>　　}<BR>　　<BR>　　<B>添加菜单项</B><BR>　　<BR>　　你也许猜到了添加菜单项与添加工具条按钮的过程几乎相同。你也必须声明一个扩展（同种类型的）、用特定的标记（相同的标记）来扩充它，并编写操作类（相同的类）。其主要的不同点是扩展的声明。下面是菜单项的扩展XML代码（没有相应的工具条按钮）：<BR>　　<BR>　　＜extension id="NewInvokatronAction"<BR>　　name="New Invokatron Document Action"<BR>　　point="org.eclipse.ui.actionSets"＞<BR>　　＜actionSet id="invokatron.actionSet"<BR>　　label="Invokatron Actions"<BR>　　visible="true"＞<BR>　　＜action id="invokatron.wizard.RunWizardAction"<BR>　　label="New Invokatron"<BR>　　menubarPath="file/new.ext"<BR>　　icon="icons/InvokatronIcon16.gif"<BR>　　tooltip="Starts the New Invokatron Document Wizard."<BR>　　class="invokatron.wizard.RunWizardAction"＞<BR>　　＜/action＞<BR>　　＜/actionSet＞<BR>　　＜/extension＞<BR>　　<BR>　　标签（label）属性包含了显示在菜单项上的文本内容。键盘快捷键用"&amp;"符号表示，在XML中是&amp;。下面是一个组合了菜单项和工具条按钮的例子：<BR>　　<BR>　　＜extension id="NewInvokatronAction"<BR>　　name="New Invokatron Document Action"<BR>　　point="org.eclipse.ui.actionSets"＞<BR>　　＜actionSet id="invokatron.actionSet"<BR>　　label="Invokatron Actions"<BR>　　visible="true"＞<BR>　　＜action id="invokatron.wizard.RunWizardAction"<BR>　　label="New Invokatron"<BR>　　menubarPath="file/new.ext"<BR>　　toolbarPath="org.eclipse.ui.workbench.file/new.ext"<BR>　　icon="icons/invokatronPicture.gif"<BR>　　tooltip="Starts the New Invokatron Document Wizard."<BR>　　class="invokatron.wizard.RunWizardAction"＞<BR>　　＜/action＞<BR>　　＜/actionSet＞<BR>　　＜/extension＞<BR>　　<BR>　　菜单与工具条只有稍微的不同。工具条只有一个"层次"，而菜单有完整的层次。这也是用操作来声明菜单这种方法可行的原因。菜单都列举在＜actionSet＞标记之中，在＜action＞标记之上。它们的语法如下：<BR>　　<BR>　　＜menu id="unique.ID"<BR>　　＜!-- New menu at the top-level. The menubarPath<BR>　　for actions inside this menu is: Special --＞<BR>　　path="Special"<BR>　　label="This is a parent menu item."＞<BR>　　＜!-- Optional, the menubarPath for actions after<BR>　　this separator is: Special/BelowBar --＞<BR>　　＜separator name="BelowBar"＞<BR>　　＜/menu＞<BR>　　<BR>　　<B>关于菜单条路径</B><BR>　　<BR>　　菜单条路径（menubar path）指出了添加菜单项的位置。我们使用分层的标识符列表来访问这个位置。下面是经常使用的菜单条列表以及它们的路径和公共组标志：<BR>　　<BR>　　· 文件：file<BR>　　<BR>　　o "开始" 区：fileStart<BR>　　<BR>　　o "新建"菜单内部的"附加"组标志： new/additions<BR>　　<BR>　　o "新建"区，在"新建"菜单下面：new.ext<BR>　　<BR>　　o "关闭" 区：close.ext<BR>　　<BR>　　o "保存" 区：save.ext<BR>　　<BR>　　o "打印" 区：print.ext<BR>　　<BR>　　o "打开" 区：open.ext<BR>　　<BR>　　o "导入" 区：import.ext<BR>　　<BR>　　o "附加" 区：additions<BR>　　<BR>　　o "最近的文档" 区：mru<BR>　　<BR>　　o "结束" 区：fileEnd<BR>　　<BR>　　· 编辑： edit<BR>　　<BR>　　o "开始" 区：editStart<BR>　　<BR>　　o "撤销" 区：undo.ext<BR>　　<BR>　　o "剪切" 区：cut.ext<BR>　　<BR>　　o "查找" 区：find.ext<BR>　　<BR>　　o "添加" 区：add.ext<BR>　　<BR>　　o "结束" 区（有时不是结束）：fileEnd<BR>　　<BR>　　o "附加" 区：additions<BR>　　<BR>　　· 源： org.eclipse.jdt.ui.source.menu<BR>　　<BR>　　· 重构： org.eclipse.jdt.ui.refactoring.menu<BR>　　<BR>　　· 导航： navigate<BR>　　<BR>　　o "开始"区：navStart<BR>　　<BR>　　o "Go To"菜单中的"附加"组标志： goTo/additions<BR>　　<BR>　　o "打开"区（有四个）：open.ext, open.ext2, open.ext3, and open.ext4<BR>　　<BR>　　o "显示"区（有四个）：show.ext, show.ext2, show.ext3, and show.ext4<BR>　　<BR>　　o "附加"区：additions<BR>　　<BR>　　o "结束"区：navEnd<BR>　　<BR>　　· 搜索： org.eclipse.search.menu<BR>　　<BR>　　· 项目： project<BR>　　<BR>　　o "开始"区：projStart<BR>　　<BR>　　o "打开"区：open.ext<BR>　　<BR>　　o "建立"区：build.ext<BR>　　<BR>　　o "附加"区：additions<BR>　　<BR>　　o "结束"区：projEnd<BR>　　<BR>　　· 载入： launch<BR>　　<BR>　　· 运行： org.eclipse.ui.run<BR>　　<BR>　　· "附加"组标志：additions<BR>　　<BR>　　· 窗口： window<BR>　　<BR>　　o "附加"区：additions<BR>　　<BR>　　o "结束"区：additionsend<BR>　　<BR>　　· 帮助： help<BR>　　<BR>　　o "开始"区：helpStart<BR>　　<BR>　　o "主要组"区：group.main.ext<BR>　　<BR>　　o "教程组"区：group.tutorials<BR>　　<BR>　　o "工具组"区：group.tools<BR>　　<BR>　　o "更新组"区：group.updates<BR>　　<BR>　　o "结束"区（有时候不是结束）： helpEnd<BR>　　<BR>　　o "附加"区：additions<BR>　　<BR>　　o "关于组"区：group.about.ext<BR>　　<BR>　　如果你提供的菜单条ID不带有标志ID，那么你的菜单项将出现在这个菜单条的后面。如果你建立了一个新菜单条ID，你的菜单条就被添加到"项目"和"运行"菜单之间。<BR>　　<BR>　　Eclipse开发者提示：请让工具条和菜单条ID、标志位置保持一致性。<BR>　　<BR>　　请注意"文件"菜单的"新建"组标志。这是我们添加自己的菜单的位置。由于它的标志ID是new.ext，所以完整的路径是：file/new.ext<BR>　　<BR>　　<B>结果</B><BR>　　<BR>　　操作集合中还有其它一些特性可供使用，包括快捷键、状态按钮、浮动图标、帮助内容和窗体工具条等等。操作集合只是记载的数十个扩展点中的一种类型的扩展。因此我们看到的只是冰山一角。但是至少它使我们理解了扩展点是如何工作的。我们看到的这些过程都是很好的。<BR>　　<BR>　　在讲解向导自定义之前，我们看一下图3所显示的新工具条按钮和菜单项：<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.5.21.11.10.55.3.gif"></CENTER><BR>　　 
<CENTER>图3：新的菜单项和工具条按钮</CENTER><BR>　　<BR>　　<B>标准对话框</B><BR>　　<BR>　　Eclipse提供了所有的标准对话框和建立自定义对话框的简单途径。大多数标准对话框都是由org.eclipse.jface.dialogs.MessageDialog类提供的。这个类含有很多用于建立标准对话框的静态方法。下面表格列举了我们可以使用的标准对话框。<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.5.21.11.11.4.4.gif"></CENTER><BR>　　有人可能认为使用标准对话框的时候，JOptionPane类比MessageDialog提供了更大的灵活性。但是归根结底，在MessageDialog的构造函数和自定义对话框的帮助下，你几乎可以实现所有的事务。MessageDialog中缺少而JOptionPane拥有的唯一的特性是在HTML中直接进行消息格式化。但是使用自定义对话框的时候是可以实现这种功能的。<BR>　　<BR>　　<B>对话框辅助类</B><BR>　　<BR>　　现在我们知道了可供选择的类型了，让我们来建立Invokatron需要的对话框吧。有两个地方需要对话框：<BR>　　<BR>　　· 代码生成过程的确认信息，是否覆盖前面的代码。<BR>　　<BR>　　· 输入一个值的对话框（与JOptionPane.showInputDialog()类似）。<BR>　　<BR>　　这个类中的第一个方法是用于确认代码覆盖的：<BR>　　<BR>　　public static boolean openOverwriteDialog(Shell parent) {<BR>　　return MessageDialog.openConfirm(parent,<BR>　　"Confirmation",<BR>　　"You are about to overwrite your class. " +<BR>　　"Are you sure you want to continue?");<BR>　　}<BR>　　<BR>　　上面的代码非常简单，我们仅仅建立了一个常规的确认对话框。输入对话框有点麻烦：MessageDialog没有输入字段。我们只能建立一个新对话框类，可以是Dialog的子类。我们也可以建立MessageDialog的子类并重载它的createCustomArea()方法，添加输入字段。但是我们还有更简单的方法。<BR>　　<BR>　　我们将使用InputDialog类：<BR>　　<BR>　　public static String openInputDialog(<BR>　　Shell parent,<BR>　　String title,<BR>　　String question,<BR>　　String initialValue) {<BR>　　<BR>　　InputDialog dlg = new InputDialog(<BR>　　parent,<BR>　　title,<BR>　　question,<BR>　　initialValue,<BR>　　null); //这是一个可供选择的有效的类<BR>　　dlg.open();<BR>　　<BR>　　if(dlg.getReturnCode()!=Window.OK) //点击"确认"了吗？<BR>　　return null;<BR>　　<BR>　　return dlg.getValue();<BR>　　}<BR>　　<BR>　　我们的对话框辅助类完成了。你可以在图4中看到这些对话框。<BR>　　 
<CENTER><IMG src="http://www.chinaitlab.com/www/imgfiles/2005.5.21.11.11.13.5.gif"></CENTER><BR>　　 
<CENTER>图4：对话框</CENTER><BR>　　<BR>　　<B>Eclipse交响乐</B><BR>　　<BR>　　Eclipse与音乐类似；一旦你学会了如何使用那些可供使用的乐器，你就能编写自己的交响乐了。在本文中我们简短地了解了两类工具：扩展点和对话框。 <img src ="http://www.blogjava.net/qq13367612/aggbug/17835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-11-02 15:35 <a href="http://www.blogjava.net/qq13367612/articles/17835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse快速上手指南之使用ANT</title><link>http://www.blogjava.net/qq13367612/articles/17821.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Wed, 02 Nov 2005 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/17821.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/17821.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/17821.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/17821.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/17821.html</trackback:ping><description><![CDATA[Ant是Java平台下非常棒的批处理命令执行程序，能非常方便地自动完成编译，测试，打包，部署等等一系列任务，大大提高开发效率。如果你现在还没有开始使用Ant，那就要赶快开始学习使用，使自己的开发水平上一个新台阶。<BR>　　<BR>　　Eclipse中已经集成了Ant，我们可以直接在Eclipse中运行Ant。<BR>　　<BR>　　以前面建立的Hello工程为例，创建以下目录结构：<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2004.12.8.10.47.38.1.gif"></CENTER><BR>　　新建一个build.xml，放在工程根目录下。build.xml定义了Ant要执行的批处理命令。虽然Ant也可以使用其它文件名，但是遵循标准能更使开发更规范，同时易于与别人交流。<BR>　　<BR>　　通常，src存放Java源文件，classes存放编译后的class文件，lib存放编译和运行用到的所有jar文件，web存放JSP等web文件，dist存放打包后的jar文件，doc存放API文档。<BR>　　<BR>　　然后在根目录下创建build.xml文件，输入以下内容：<BR>　　<BR>　　＜?xml version="1.0"?＞<BR>　　＜project name="Hello world" default="doc"＞<BR>　　<BR>　　＜!-- properies --＞<BR>　　＜property name="src.dir" value="src" /＞<BR>　　＜property name="report.dir" value="report" /＞<BR>　　＜property name="classes.dir" value="classes" /＞<BR>　　＜property name="lib.dir" value="lib" /＞<BR>　　＜property name="dist.dir" value="dist" /＞<BR>　　＜property name="doc.dir" value="doc"/＞<BR>　　<BR>　　＜!-- 定义classpath --＞<BR>　　＜path id="master-classpath"＞<BR>　　＜fileset file="${lib.dir}/*.jar" /＞<BR>　　＜pathelement path="${classes.dir}"/＞<BR>　　＜/path＞<BR>　　<BR>　　＜!-- 初始化任务 --＞<BR>　　＜target name="init"＞<BR>　　＜/target＞<BR>　　<BR>　　＜!-- 编译 --＞<BR>　　＜target name="compile" depends="init" description="compile the source files"＞<BR>　　＜mkdir dir="${classes.dir}"/＞<BR>　　＜javac srcdir="${src.dir}" destdir="${classes.dir}" target="1.4"＞<BR>　　＜classpath refid="master-classpath"/＞<BR>　　＜/javac＞<BR>　　＜/target＞<BR>　　<BR>　　＜!-- 测试 --＞<BR>　　＜target name="test" depends="compile" description="run junit test"＞<BR>　　＜mkdir dir="${report.dir}"/＞<BR>　　＜junit printsummary="on"<BR>　　haltonfailure="false"<BR>　　failureproperty="tests.failed"<BR>　　showoutput="true"＞<BR>　　＜classpath refid="master-classpath" /＞<BR>　　＜formatter type="plain"/＞<BR>　　＜batchtest todir="${report.dir}"＞<BR>　　＜fileset dir="${classes.dir}"＞<BR>　　＜include name="**/*Test.*"/＞<BR>　　＜/fileset＞<BR>　　＜/batchtest＞<BR>　　＜/junit＞<BR>　　＜fail if="tests.failed"＞<BR>　　***********************************************************<BR>　　**** One or more tests failed! Check the output ... ****<BR>　　***********************************************************<BR>　　＜/fail＞<BR>　　＜/target＞<BR>　　<BR>　　＜!-- 打包成jar --＞<BR>　　＜target name="pack" depends="test" description="make .jar file"＞<BR>　　＜mkdir dir="${dist.dir}" /＞<BR>　　＜jar destfile="${dist.dir}/hello.jar" basedir="${classes.dir}"＞<BR>　　＜exclude name="**/*Test.*" /＞<BR>　　＜exclude name="**/Test*.*" /＞<BR>　　＜/jar＞<BR>　　＜/target＞<BR>　　<BR>　　＜!-- 输出api文档 --＞<BR>　　＜target name="doc" depends="pack" description="create api doc"＞<BR>　　＜mkdir dir="${doc.dir}" /＞<BR>　　＜javadoc destdir="${doc.dir}"<BR>　　author="true"<BR>　　version="true"<BR>　　use="true"<BR>　　windowtitle="Test API"＞<BR>　　＜packageset dir="${src.dir}" defaultexcludes="yes"＞<BR>　　＜include name="example/**" /＞<BR>　　＜/packageset＞<BR>　　＜doctitle＞＜![CDATA[＜h1＞Hello, test＜/h1＞]]＞＜/doctitle＞<BR>　　＜bottom＞＜![CDATA[＜i＞All Rights Reserved.＜/i＞]]＞＜/bottom＞<BR>　　＜tag name="todo" scope="all" description="To do:" /＞<BR>　　＜/javadoc＞<BR>　　＜/target＞<BR>　　＜/project＞<BR>　　<BR>　　以上xml依次定义了init（初始化），compile（编译），test（测试），doc（生成文档），pack（打包）任务，可以作为模板。<BR>　　<BR>　　选中Hello工程，然后选择“Project”，“Properties”，“Builders”，“New…”，选择“Ant Build”：<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2004.12.8.10.48.21.2.gif"></CENTER><BR>　　填入Name：Ant_Builder；Buildfile：build.xml；Base Directory：${workspace_loc:/Hello}（按“Browse Workspace”选择工程根目录），由于用到了junit.jar包，搜索Eclipse目录，找到junit.jar，把它复制到Hello/lib目录下，并添加到Ant的Classpath中：<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2004.12.8.10.48.49.3.gif"></CENTER><BR>　　然后在Builder面板中钩上Ant_Build，去掉Java Builder：<BR>　　 
<CENTER><IMG src="http://www.chinaitlab.com/www/imgfiles/2004.12.8.10.49.31.4.gif"></CENTER><BR>　　再次编译，即可在控制台看到Ant的输出：<BR>　　<BR>　　Buildfile: F:\eclipse-projects\Hello\build.xml<BR>　　<BR>　　init:<BR>　　<BR>　　compile:<BR>　　[mkdir] Created dir: F:\eclipse-projects\Hello\classes<BR>　　[javac] Compiling 2 source files to F:\eclipse-projects\Hello\classes<BR>　　<BR>　　test:<BR>　　[mkdir] Created dir: F:\eclipse-projects\Hello\report<BR>　　[junit] Running example.HelloTest<BR>　　[junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.02 sec<BR>　　<BR>　　pack:<BR>　　[mkdir] Created dir: F:\eclipse-projects\Hello\dist<BR>　　[jar] Building jar: F:\eclipse-projects\Hello\dist\hello.jar<BR>　　<BR>　　doc:<BR>　　[mkdir] Created dir: F:\eclipse-projects\Hello\doc<BR>　　[javadoc] Generating Javadoc<BR>　　[javadoc] Javadoc execution<BR>　　[javadoc] Loading source files for package example...<BR>　　[javadoc] Constructing Javadoc information...<BR>　　[javadoc] Standard Doclet version 1.4.2_04<BR>　　[javadoc] Building tree for all the packages and classes...<BR>　　[javadoc] Building index for all the packages and classes...<BR>　　[javadoc] Building index for all classes...<BR>　　[javadoc] Generating F:\eclipse-projects\Hello\doc\stylesheet.css...<BR>　　[javadoc] Note: Custom tags that could override future standard tags: @todo. To avoid potential overrides, use at least one period character (.) in custom tag names.<BR>　　[javadoc] Note: Custom tags that were not seen: @todo<BR>　　BUILD SUCCESSFUL<BR>　　Total time: 11 seconds<BR>　　<BR>　　Ant依次执行初始化，编译，测试，打包，生成API文档一系列任务，极大地提高了开发效率。将来开发J2EE项目时，还可加入部署等任务。并且，即使脱离了Eclipse环境，只要正确安装了Ant，配置好环境变量ANT_HOME=＜Ant解压目录＞，Path=…;%ANT_HOME%\bin，在命令行提示符下切换到Hello目录，简单地键入ant即可。 <img src ="http://www.blogjava.net/qq13367612/aggbug/17821.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-11-02 15:32 <a href="http://www.blogjava.net/qq13367612/articles/17821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Eclipse中如何利用Maven </title><link>http://www.blogjava.net/qq13367612/articles/17819.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Wed, 02 Nov 2005 07:20:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/17819.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/17819.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/17819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/17819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/17819.html</trackback:ping><description><![CDATA[Maven 将作为一个普通的构建系统，被人们重新认识，并且它将超越 Java技术。本文不打算成为一篇 Maven 教程，而是将 Maven 与其他技术进行比较，让您洞察 Maven 与 Eclipse 相适应的地方，以及如何使这些工具相互协作。<BR>　　<BR>　　在过去几年中，Maven 已经不仅仅是 Java 世界的一个时髦话题。自 2001 年起，Maven 已经成为构建工具领域的先驱。最近几年，人们常拿它与 Ant 比较。因为 Maven 与 Ant 有一些显而易见的相似之处，所以拿它们俩作比较似乎是很自然的事。<BR>　　<BR>　　比如说，在两种情况下，XML 脚本都是可用的；两种工具都可以生产工件；它们还可以共享相同的分类法和概念，比如 项目（project）、目标（target）与 目标（goal），以及 依赖关系（depends） 和 先决条件（prereqs）。但它们实质上有很大的差别。<BR>　　<BR>　　Ant 只是一个 XML 脚本工具，而 Maven 是一个普通的构建工具，它关注的重点是一个叫做项目对象模型（POM）的概念。POM 暴露的是粗粒度的、面向构建的任务，这些任务被称为目标，它们提供了一些准则，帮助您开发构建方法和实现最佳实践。<BR>　　<BR>　　在某些方面，Maven 属于软件工厂尽管目前它仍在外围。更确切地说，诸如 Maven 之类的构建工具是软件工厂领域中必不可少的。<BR>　　<BR>　　<B>软件工厂</B><BR>　　<BR>　　通过显著提高自动开发的级别，软件工厂提供了一个花费更少、更灵活的应用程序开发方法。根据 Software Factories Web 站点的说法，“软件工厂是一个软件产品线，它根据构建特殊种类的应用程序的方法，配置一些可扩展的开发工具……提供打包的内容……以及指导”。<BR>　　<BR>　　<B>软件工厂涉及三个主要概念：</B><BR>　　<BR>　　模式，提供了一些元数据，描述组成应用程序的不同工件的结构，以及它们是如何交互的。 一个或多个模板，提供了启动程序工具箱，以及构建应用程序所需的其他任何东西。 可扩展的开发环境，用于配置、定制和装配组件。<BR>　　<BR>　　如今，这类工具已经逐渐引起了认识到它们的价值的那些工具制造人员、工具开发人员和软件编辑的注意。这些工具促进了软件开发过程的工业化，降低了投入市场的成本和时间，同时还提高了生产率，加快了对进化需求的反应。<BR>　　<BR>　　仔细查看一下 Maven 的主要特性，您就会认识到 Maven 与软件工厂之间的相似之处：Maven 使用 POM 作为元数据来描述项目结构，并通过通用应用程序插件来获得可扩展的项目模板。<BR>　　<BR>　　因为 Maven 非常灵活并且是开放源码的，所以很容易推断和设想 Maven 是软件工厂平台中的一个核心组件。但是，还有另一种说法。上述类比并不完全，因为目前的 Maven 缺乏专用的开发环境，而这类环境有助于创建特定于域或特定于企业的插件和模板，并允许您轻松地配置项目或定制行为。<BR>　　<BR>　　不过，Maven 的主要目标是标准化构建过程，并保证代码构建-测试-部署（CBTD）循环中的质量和易再现性（easy reproducibility）。它还可以制定度量标准，帮助您了解开发状态。<BR>　　<BR>　　CBTD 本体论在软件工程领域已经不再新鲜，但 Maven 可以使您标准化这种本体论，并通过抽象这种理论，将它想像成一个完整的实体。考虑到不断增长的项目的复杂性，标准化成为一种迫切需要。<BR>　　<BR>　　扩建的概念，我们称之为元构建，因为其无可估量的价值以及保证下一级质量的特性，正逐渐被人们认识。持续集成（continuous integration）就是建立在这个概念的基础之上，但它也应用了在 IDE 上下文之外的地方进行构建的能力。<BR>　　<BR>　　<B>模糊的界限</B><BR>　　<BR>　　使用过 Java 技术的人应该都听说过 Eclipse。2001 年年中的时候，Eclipse 推出了它的第一个版本，标志其成熟的是它为集成开发环境（IDE）提供了一个机会，特别是为 Java 开发人员（不严谨地说）提供了一个机会。<BR>　　<BR>　　Eclipse 是一种开放的、以语言为中心的平台，也可以将它用作教育性项目和研究项目的基础平台，其中一些平台捐赠给了 Eclipse 团体。<BR>　　<BR>　　就像 Microsoft已经采用软件工厂方法一样，Eclipse 也开始转向模型驱动开发（MDD）方向，并且最近已经公布了一个新的项目提议 —— 模型驱动的开发集成（MDDi）。<BR>　　<BR>　　根据该提议，“Eclipse MDDi 项目专用于平台的实现……其设计目标是支持各种建模语言（统一建模语言或特定于域的语言）和模型驱动的技术。”<BR>　　<BR>　　渐渐地，一些工具开始假定某些特性可以完全并且顺利地集成在一起，Maven 和 Eclipse（即使作为一个简单的 IDE）也不例外。因此，从构建的角度来看，二者似乎出现了重叠，如图 1 所示。<BR>　　 
<CENTER><IMG src="http://www.chinaitlab.com/www/imgfiles/2005.8.13.11.50.32.42.1.gif"></CENTER><BR>　　 
<CENTER>图 1. 扩建的概念</CENTER><BR>　　<BR>　　图1描述的实际上是以前讨论的扩建概念。正如以前定义的那样，整个扩建过程包括几个任务，同时还表示了一个元构建实例。任务可以是以下两种类型之一：原子任务是细粒度的，并且是上下文不明确的，这种任务的两个实例几乎是相同的；宏观任务是复合任务，它充当微观任务的容器。<BR>　　<BR>　　构建，从扩展的意义上说，只处理宏观任务；原子任务的触发取决于配置。这意味着用户对系统有着较高层次的看法，这使得系统更易于维护和发展。<BR>　　<BR>　　此外，Maven 和 Eclipse 都是开放的，并且很容易通过插件扩展它们，使其满足您的需要。但是，因为它们针对的受众不同，所以它们之间的相似性也到此为止：多数 Eclipse 最终用户是一些开发人员；而 Maven 主要针对的是一些构建管理人员。<BR>　　<BR>　　尽管如此，Maven 仍然是一个命令行工具。虽然图形用户界面（GUI）是按照 Jason Van Zyl（Maven 的制造者和架构师）指示的方向开发的，但 Maven 目前仍然没有帮助用户执行特殊任务的特定 GUI，比如创建或更新配置，或者只用一个鼠标单击发起构建。<BR>　　<BR>　　上面描述的典型构建顺序在 Eclipse 中不像在 Maven 中那么顺利。Eclipse 的特性之一是开发 环境造成构建过程不连续，这要归因于一些人为因素：并不是每次成功编译之后都进行测试、所有测试没必要一次运行、可以跳过一些微观任务，等等。<BR>　　<BR>　　各种因素都会导致产生差异，这就是为什么开发人员每天至少必须运行一次完整的构建过程，以确信他们没有破坏什么的原因。<BR>　　<BR>　　不过，因为 Eclipse 是一个可扩展平台，所以它受到许多用户社区的支持，这使它成为驻留 Maven 驱动的开发、允许开发人员和构建管理人员以某种简单的方式进行协作的理想之地。<BR>　　<BR>　　将 Maven 集成到 Eclipse 中 Mevenide 是 Codehaus 主办的一个项目，旨在通过将 Maven 集成到 IDE 中，简化 Maven 的使用。<BR>　　<BR>　　现在，Borland Software 的 JBuilder、NetBeans 和 Eclipse 都受到支持。其他一些项目也部分地将 Maven 集成到 Eclipse 中，这样，就可以与 Mevenide（如 Maven Workshop）共享一些特性。除了增加 Maven 的易用性之外，为什么需要这种插件？<BR>　　<BR>　　通过提供一些工具和视图，让您了解 Maven 隐藏的复杂性并改进团队环境中的协作，Mevenide for Eclipse 提高了生产率。<BR>　　<BR>　　从协作的角度来看，假如构建已经被 Maven 化了，那么最有用的特性就是 Eclipse 项目元数据与 Maven 元数据之间的双向同步。如果开发人员忘记在向 Eclipse 中添加一个依赖关系之后更新 POM，那么该怎么办？<BR>　　<BR>　　如果重构无法传播到 Maven，该怎么办？构建可能会中断，或者一些单元测试可能被拒绝，因此，真的需要使 Eclipse 元数据和 Maven 元数据保持同步。Mevenide 监听元数据的变化，并使您能够很容易地确定元数据不匹配的地方，这可以防止进行被严重破坏的构建。<BR>　　<BR>　　但 POM 并不只是关于依赖关系和项目布局的。它还包含一些不用于结构上的项目管理信息，比如版本号、名称、ID 和源储存库的位置。Eclipse 元数据并不总是反映所有这些信息。<BR>　　<BR>　　因此，需要另一个编辑这些信息的方法。为此，Mevenide 提供了一个图形编辑器，该编辑器使 POM 的维护变得更容易，并允许您避开一些烦琐的、容易出错的原始 XML 手工编辑。每个 POM 语义部分都被表示为一个编辑器页，这增强了模型的整体可靠性。<BR>　　<BR>　　此外，为了最大限度地减少创建 POM 的无聊过程，Mevenide 提供了一个相当简单的、可扩展的 POM 模板机制。<BR>　　<BR>　　阻止 Maven 在 Eclipse 之外的地方运行的能力是从类似 Mevenide 的插件中最容易获得的一项功能。您可以选择某些执行任务（用 Maven 的术语来讲是 目标），这些任务可以是通过 Maven 插件全局定义的任务，也可以是依赖于项目的任务，或者，您可以通过定义构建敏感的变量来定制构建。<BR>　　<BR>　　Eclipse 控制台上只显示了一些相关的选项（即在 IDE 的上下文中相关），对于其他任何插件，控制台上只输出构建日志。这一特性非常重要，因为它避免了在控制台与 Eclipse 之间不停地来回奔波。<BR>　　<BR>　　Mevenide 还集成了其他许多帮助方法特性，但它们不是很重要。例如，您可以定义给定目标与文件模式之间的关系，这样，就可以根据工作空间增加的增量来激活那些任务。<BR>　　<BR>　　您还可以浏览工件储存库，或者根据名称搜索某个给定的工件（一个工件 就是一个构建结果，它可以是 JAR 文件、可执行文件或者是一个完整的 Web 站点）。然后，可以重定向到 Mevenide 站点，获得完整的特性列表。<BR>　　<BR>　　不过，仍然还有一个问题：即使 Mevenide 增强了生产率和易用性，但您仍然必须认识到哪些工具可以在特殊环境中满足您的需要。通过 Maven Console 运行 Maven 会话可能非常耗时，所以，为了获得较高的生产率，在对会话进行编码期间，应该改为使用 JUnit 集成的 Eclipse 支持来运行测试，并依赖于 Eclipse 的内部编译器来生成可执行的文件。<BR>　　<BR>　　但在向源代码储存库提交任何东西之前，应该确保 POM 是同步的，并回滚所有不需要的 .classpath 或 .project 修改 —— 也就是说，假设这些文件都是在源代码控制之下，这可能是有争议的。这个话题在 Martin Van den Bemt 的 blog 中讨论过。<BR>　　<BR>　　<B>结束语</B><BR>　　<BR>　　尽管 Maven 和 Eclipse 具有不同的特性，但从构建的角度看，它们在某些地方可能出现重叠。它们之间存在的对立似乎也相当多，但我们很容易克服这些，通过努力最终使它们相互协作，共创一片沃土。<BR>　　<BR>　　诸如 Mevenide 之类的工具可以使 Maven 和 Eclipse 顺利合作，并使它们保持同步，但您必须认识到，在某一个给定的开发阶段，哪种工具最能满足您的需要。<BR>　　<BR>　　尽管 Maven 作为质量保证过程中的一个重要因素，正逐渐被人们所认可，但在将它集成到开发环境（尤其是 Eclipse）中，使 Maven 成为一等 IDE 公民这一点上，还有待提高。<BR>　　<BR>　　到那时，我们就可以考虑其他的 Maven 用例，比如说，更进一步地将它集成到全局开发过程中，以及像 Eclipse 这样的可扩展环境如何帮助实现这些集成。 <img src ="http://www.blogjava.net/qq13367612/aggbug/17819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-11-02 15:20 <a href="http://www.blogjava.net/qq13367612/articles/17819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>测试实践：Eclipse 之 JUnit</title><link>http://www.blogjava.net/qq13367612/articles/17818.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Wed, 02 Nov 2005 07:19:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/17818.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/17818.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/17818.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/17818.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/17818.html</trackback:ping><description><![CDATA[这篇文章将给你介绍JUnit——一个工程测试调式的工具。 在介绍了了 测试驱动开发理论之后，我们继续介绍“怎样用Eclipse创建你的、JUnit Test”。 我们会用象"hello word"一样简单例子来向你揭露JUnit Case。<BR>　　<BR>　　自动化测试（automated testing）在好多书籍中被介绍了，但很少注意讲怎样去组织这些测试。 当测试写的越多时，很难知道把这些测试放到哪或者用什么去调用它们。 在极限编程---Extreme Programming(xp)，测试驱动开发 Test-Driven Development (TDD)盛行的时代，这成了一个很大的问题。 你可以把 测试驱动开发（TDD）认为是"Development through testing" 开发由经测试。<BR>　　<BR>　　TDD的主要条款：<BR>　　<BR>　　在任何代码片段之前，必须先写好自动检测这段代码功能的程序。既然代码不存在，那么测试在一开始就失败。<BR>　　<BR>　　在 测试通过之后，复制的代码必须删掉。<BR>　　<BR>　　象这样的方式每个程序员都可以应用，并不需要特定的方法论。但在我们开始写test之前， 值得我们注意的是，先考虑一下如何组织自动化测试。<BR>　　<BR>　　这里有几种我们需要考虑的测试<BR>　　<BR>　　单元测试(Unit test) :这些是为检查个别模块（比如classes类）服务的。 如果对象需要访问外部的数据源，比如Database，就需要通过一些模拟的对象（MOCK object）来模拟Database， （但这也只有在真实环境的数据与测试环境不同的时候。<BR>　　比如测试环境里面没有真实Datebase,就需要MOCK Object）<BR>　　<BR>　　用户测试 （Customer's test）:这里是功能的，系统的并且认可的测试。系统中所有的行为检查都做为一个整体。 在XP理论中，这些测试，是由用户编写的，给出测试案例提纲。<BR>　　<BR>　　集成测试 （Itegration tests）: 这些测试象是在用户测试和单元测试之间的十字路口。 集成测试帮助程序测试几个级别中交互。 ，Mock Object不会出现在集承测试中，他会增加测试时间。同样，集成测试也经常需要存在的特定的测试环境，比如从数据库中放一些测试数据。集成测试也许使用外部的lib。 Cactus就是这样一个J2EE集成的lib。 解释这些测试已经超出了本篇文章的范围，并且也需要详细的理论叙述，所以，你仅需要知道这种测试存在就可以了。<BR>　　<BR>　　开发测试（Developer's test） : 这种测试就是那些开发者校验 整段代码，新加的代码，新加的函数函数。 对于每个开发而言， 随时生成新的的测试去检查代码是很重要的。 组织这些测试和组织这些代码有着同样的重要性。<BR>　　<BR>　　至于本文其他地方，只要说到"测试"，就是专指开发测试（Developer's test）。<BR>　　<BR>　　在开发期间， 一个程序员有时可能问自己：系统中这个行为有test么，这个test存在么，哪里可以找到这个test？每次发现错误，都是靠最基础修改bug而不是通过自动测试，这是一个典型的例子。 在这种情形下事情进展可能是：<BR>　　<BR>　　去找到这个函数的测试（可能测试已经写了，但里面还有一些小错误）<BR>　　如果这样的测试还没有，或者测试不能盖住这种错误，我们就写一个新的测试来盖住这种错误。<BR>　　现在 我们深信，程序在新的测试中不会通过。<BR>　　修复程序中的bug。<BR>　　再运行测试<BR>　　确定程序在测试中通过了。<BR>　　<BR>　　当然，可能出现各种各样的处理， 但思想必须很明确：你只需纠正那些被测试找出那些错误。<BR>　　<BR>　　现在，让我们告诉你一个开发人员怎样解决这种情形。 通过存在的功能性的测试<BR>　　<BR>　　我利用一些集成的开发环境（IDE）来查找 被修正那些类和方法的放在什么地方。<BR>　　<BR>　　制造一个已知的错误环境，来查找那些代码判断存在错误。<BR>　　<BR>　　最后但不是最不重要的，写好测试并且放到一个现有的测试类中去。 如果你不小心出了错误， 期望你和你的同事能注意到副本，并且纠正它<BR>　　<BR>　　都准就绪，开始建立测试了， 所以现在需要给测试取一个名称。 你可能说，“这不是问题: 在每个类面前加个Test就是了！” 但并不是那么简单的， 让我告诉你这样如果可能造成的问题：<BR>　　<BR>　　当时候我们在使用TDD的方式开发时， 需要测试的class或者method可能都不存在。<BR>　　<BR>　　也可能一个test 含盖了好几个方法，甚至好几个classes。<BR>　　<BR>　　这些仅仅是最普通的问题， 下面还有更多。<BR>　　<BR>　　给个在test命名上的建议: test 类的取名首先应该表达出这个类是一个test类，并且能确切的表示出他要检查哪些，留有这个原class名的味道。 其实这很容易，请别担心这个名称会变的很长或者很丑陋，自己随便怎样取都可以。<BR>　　<BR>　　下面我们将使用Eclipse中的JUnit工具建立我们的第一个测试，假定你已经下载了这个产品的当前版本， 如果没有，你随时可以从它的官方网站(www.eclipse.org)下载。我们需要JUnit,你也可以从它的官方网站（www.junit.org）上下载，下载并解压缩到你硬盘中存放java libaries的地方。<BR>　　<BR>　　打开Eclipse.我们将建立一个新的工程的工作空间（workplace project） 点 File -&gt; New -&gt;Project,选择Java一路Next。 输入工程名称（project name），比如ProjectWithJUnit. 点击完成。 这样就建立了一个新工程，让我们配置一下我们的Eclipse,于是，我们把JUnit library 添加到build path. 点击 Project--&gt;Properties, 选择Java Build Path Libraries, 点Add Exteranal JARs 选中JUnit.jar。 你将会看到JUnit将会出现在的屏幕上 libraries列表中。 点Okay,Eclipse将强制rebuild所有的build paths.<BR>　　<BR>　　我们已经准备好，开始写我们的"Hello World"了 . 让我们遵照TDD规范：在编码之前就建立测试。为了， 我们将假顶我们将要写的类名是HelloWorld 有一个返回字符串的方法 say().<BR>　　<BR>　　要建立这样一个test, 在ProjectWithJUnit标题上右键， 选择New -&gt; Other,展开"Java"， 选择JUnit. 在对话框的右边一拦里选择TestCase,接着点Next. 参见图1。<BR>　　<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2004.9.24.11.24.19.01.gif"> </CENTER><BR>　　图1。 在Eclipse 中建立JUnit test<BR>　　在Test class:一拦里输入我们需要测试的class--HelloWorld。并且给Test case取个名称--- 比如，TestThatWeGetHelloWorldPrompt(是的，这看上去太长了，但是它能很清楚表达出它的意思) 点Finish完成。<BR>　　<BR>　　下面是 TestThatWeGetHelloWorldPrompt.java的代码：<BR>　　<BR>　　public class TestThatWeGetHelloWorldPrompt<BR>　　<BR>　　extends TestCase {<BR>　　<BR>　　public TestThatWeGetHelloWorldPrompt(<BR>　　<BR>　　String name) {<BR>　　<BR>　　super(name);<BR>　　<BR>　　}<BR>　　<BR>　　public void testSay() {<BR>　　<BR>　　HelloWorld hi = new HelloWorld();<BR>　　<BR>　　assertEquals("Hello World!", hi.say());<BR>　　<BR>　　}<BR>　　<BR>　　public static void main(String[] args) {<BR>　　<BR>　　junit.textui.TestRunner.run(<BR>　　<BR>　　TestThatWeGetHelloWorldPrompt.class);<BR>　　<BR>　　}<BR>　　<BR>　　}<BR>　　<BR>　　这个代码一点都不复杂，仅仅有一点点特别。 不管怎样，让我们详细的检查它。 我们继承了JUnit的TestCase. (TestCase 在JUnit的javadoc里定义是"用来运行多个Test的固定装置")。 JUnit也定义了TestSuite 由于一组关联的TestCase组成..<BR>　　<BR>　　通过以下两步来建立我们简单的Test Case;<BR>　　<BR>　　建立Junit.framework.TestCase的实例.<BR>　　定义一些 以"test"开头的测试函数, 并且返回一空值.(比如 testWasTranscationSuccessful(),testShow()等等).<BR>　　<BR>　　TestThatWeGetHelloWorldPrompt.java 同时遵循这些标准: 这些TestCase的子类含有一个testSay()的方法. 这个方法由assertEquals()方法调用, 用于检验say()的返回值（按照这里的做法返回应该是不一致，因为一开始建立的HelloWorld 我们让say()返回的值是null）.<BR>　　<BR>　　main()主函数是用来运行test并且显示输出的结果. JUnit的TestRunnery以（swing.u）图形和本文（text.ui）的的方式来执行我们的test并反馈信息。我们就使用文本(text.ui),这个Eclipse肯定支持. （译注：这里可能翻译的不怎么好，所谓文本和图形，是指你在建立TestCase的时候，有一个选项，Which method stubs would you like to create,选择text.ui|| swing.ui||awt.ui，一般是选择text.ui因为Eclipse肯定支持这个）, 依照这些文本的信息,Eclipse同时会生成图形显示。（在Package Exploer的下面Tab条上会多个JUnit,点它就看到了:）。<BR>　　<BR>　　又一个所以,按照现在这样测试驱动的开发的做法, 一旦我们跑起了我们的test,我们应该看到返回一些错误的信息。 点Run-&gt; Run as -&gt; JUnit Test（注意啊， 这个TestThatWeGetHelloWorldPrompt.java应该在Package Explorer被点中，在左边那个window中）,你点到的因该是JUnit window（就是下面的那个Tab条，注意不是Package Exploer)，这样你就看到了JUnit window， 他会显示一个红色条，表示是一个失败的Test。 (如果你按了运行它没有自动转到这个窗口，你可以点做下Tab条 上的JUnit标签。)<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2004.9.24.11.24.31.02.gif"> </CENTER><BR>　　一按运行, 太好了，果然出错了。好，现在正式开始建立用于工作的HelloWorld代码，---点New-&gt;Class，可能和原来的的重复，那就把原来的删掉。代码如下：<BR>　　<BR>　　HelloWolrd.java<BR>　　<BR>　　public class HelloWorld {<BR>　　<BR>　　public String say() {<BR>　　<BR>　　return("Hello World!");<BR>　　<BR>　　}<BR>　　<BR>　　}<BR>　　<BR>　　这及为简单的，都用不着注释。现在再来测试一下看看结果。就用上面的方法，点Run-&gt; Run As Jnit. 在左边的JUnit窗口中出现了一个绿条。 看图三。 出现绿色的条表示测试通过了。<BR>　　<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2004.9.24.11.24.42.03.gif"> </CENTER><BR>　　现在，再变个条件,让测试不通过。 这将帮助我们理解JUnit test怎样覆盖并且报出不同的错误。 编辑 assertEquals()方法，把它的返回值从"Hello World!"变成另外一个值 比如"Hello ME!". 这样，当你再运行这个JUnit test，那个显示条又变成红的了，并且在Failuer Trace里看到是不是什么导致了错误。 如图:<BR>　　<BR>　　 
<CENTER><IMG src="http://www.chinaitlab.com/www/imgfiles/2004.9.24.11.24.53.04.gif"> </CENTER><BR>　　总结。我想说一些自己的想法(这里还是原文不是翻译过来的)。 我过去并不认为测试代码是开发过程中很重要的一部分。 但在最近几年发展的很快,多亏了那些方法论(比如基于异常开发"exceptions-based development"等),他们促进了测试以及测试工具的发展。<BR><img src ="http://www.blogjava.net/qq13367612/aggbug/17818.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-11-02 15:19 <a href="http://www.blogjava.net/qq13367612/articles/17818.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用Eclipse开发Hibernate应用程序</title><link>http://www.blogjava.net/qq13367612/articles/17817.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Wed, 02 Nov 2005 07:18:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/17817.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/17817.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/17817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/17817.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/17817.html</trackback:ping><description><![CDATA[Eclipse是目前非常流行的开发平台，开放扩展的架构让很多程序员找到了自己个性化的工作环境，Hibernate也是目前牛叉得不得了的框架，至少在EJB 3大行其道之前，它是我们在考虑OR映射时非常好的选择。本文主要介绍如何利用Hibernate Syn插件在Eclipse 3.0.1中快速的开发Hibernate应用程序，提高我们的工作效率。关于Hibernate框架的细节，本文不做过多的讨论，请参考相关资料，推荐《Hibernate in action》一书。<BR>　　<BR>　　首先需要安装这个插件，Eclipse 3.0.1为我们提供了更加方便的插件管理方式，选择菜单“帮助?软件更新?查找并安装”（本人的Eclipse使用了语言抱汉化，请英文界面用户自行对照），选择“搜索要安装的新功能部件”，操作界面如下：<BR>　　　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.3.18.10.53.37.1.jpg"><BR>　　选择“新建远程站点”，填写名称“Hibernate plugin”，下面的URL中填入：http://www.binamics.com/hibernatesync<BR>　　如下图：<BR>　　　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.3.18.10.53.55.2.jpg"><BR>　　然后在“安装”界面中选中我们刚添加的“Hibernate plugin”，一路Next，Eclipse就可以自己下载完成安装，然后Eclipse自动重启动一次就完成了。<BR>　　<BR>　　下面演示一个最简单的单表操作，可以让我们很快熟悉开发过程。我们选择Mysql数据库来做这个应用，首先建立一个数据表，名为user_info，包含id、name、password三个字段，建表语句如下：<BR>　　<BR>　　# Host: localhost<BR>　　# Database: test<BR>　　# Table: 'user_info'<BR>　　#<BR>　　CREATE TABLE `user_info` (<BR>　　`id` int(11) NOT NULL auto_increment,<BR>　　`name` varchar(100) NOT NULL default '',<BR>　　`password` varchar(100) NOT NULL default '',<BR>　　PRIMARY KEY (`id`)<BR>　　);<BR>　　<BR>　　然后新建一个普通的Java项目：“新建?项目?Java项目”，注意加入Hibernate的所有lib文件，以及mysql的jdbc驱动文件。下面我们需要在项目中加入一个Hibernate的配置文件，在src目录下选择“新建?其他?hibernate?hibernate configuration file”，如下图：<BR>　　　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.3.18.10.54.6.3.jpg"><BR>　　在弹出的界面中，你需要指定要使用的数据库，以及连接数据库所需要的信息，我们对应的选择了数据库为mysql，并配置了数据库的URL和管理员帐号，如下：<BR>　　　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.3.18.10.54.17.4.jpg"><BR>　　在上图中，我们还可以指定从JNDI数据源中获得连接，可以点击“Datasource“标签进行配置。<BR>　　<BR>　　“完成”之后系统会自己生成一个名为“hibernate.cfg.xml”的文件，里面包含了基本的配置信息，如果需要高级配置，可以手动添加。<BR>　　<BR>　　下面我们要生成映射文件，首先新建一个包“org.bromon.zizz.pojo”，在这个包下选择“新建?其他?hibernate?hibernate mapping file”，在弹出的界面中点击“刷新”，讲会列出库中所有的数据表，选中我们要使用的“user_info”表，以及我们要生成的pojo文件所在的包：org.bromon.zizz.pojo。如下图：<BR>　　　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.3.18.10.54.27.5.jpg"><BR>　　在上述界面的“Properties”标签中可以配置hbm的其他选项，包括文件扩展名，聚合列名，ID生成规则等。完成后，系统会自动生成一个名为“UserInfo.hbm”的文件，我们可以通过这个文件生成相关的存根类。在UserInfo.hbm文件上选择“Hibernate Synchronizer?Synchronize files”：<BR>　　　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.3.18.10.54.40.6.jpg"><BR>　　该操作将生成三个包八个类文件，里面封装了Hibernate的操作细节，让我们可以专心面对业务逻辑的开发，仔细阅读这些文件可以提高你对Hibernate的认识，增长应用技巧。<BR>　　<BR>　　然后我们需要在Hibernate的配置文件中添加对UserInfo的相关信息，在UserInfo.hbm上选择“Synchronizer?Add Mapping Reference”。现在我们可以开始编写自己的程序逻辑了，代码可以写在org.bromon.zizz.pojo.dao. UserInfoDAO中，这个类的代码不会被插件修改。我们首先创建一条新的记录，在该类中加入一个main方法：<BR>　　<BR>　　public static void main(String args[])<BR>　　{<BR>　　try<BR>　　{<BR>　　_RootDAO.initialize();<BR>　　UserInfoDAO uid=new UserInfoDAO();<BR>　　<BR>　　org.bromon.zizz.pojo.UserInfo ui=new org.bromon.zizz.pojo.UserInfo();<BR>　　ui.setName("bromon");<BR>　　ui.setPassword("123");<BR>　　<BR>　　uid.save(ui);<BR>　　<BR>　　}catch(Exception e)<BR>　　{<BR>　　e.printStackTrace();<BR>　　}<BR>　　}<BR>　　<BR>　　可以看出，插件已经把session操作和事务操作都封装起来了，我们的代码工作得到了极大的简化。而且我们可以利用插件自带的Hibernate editor来编辑hbm文件，非常方便，我们需要把ID的生成方式改为“identity”：<BR>　　 <IMG src="http://www.chinaitlab.com/www/imgfiles/2005.3.18.10.54.51.7.jpg"><BR>　　要让这个程序正常运行，还需要对配置文件hibernate.cfg.xml作一些修改。值得注意的是，请不要在该插件以外的环境中修改配置文件（比如使用DreamWeaver之类的工具编辑文件），否则会造成系统与资源不同步的错误，这可能是插件的一个bug。使用Eclipse的“文本编辑器”打开该文件，其中有如下的内容：<BR>　　<BR>　　＜property name="hibernate.transaction.factory_class"＞<BR>　　net.sf.hibernate.transaction.JTATransactionFactory<BR>　　＜/property＞<BR>　　＜property name="jta.UserTransaction"＞<BR>　　java:compUserTransaction<BR>　　＜/property＞<BR>　　<BR>　　由于在我们的例子中，并没有使用JTA来控制事务，所以需要将上面的内容注释掉，程序才能正常运行。<BR>　　<BR>　　OK，Run一下，可以看到数据已经被保存到数据库。<BR>　　<BR>　　如果在实际开发工作中，需要重新设计数据表结构，那么只需要在.hbm文件中做相应的修改，然后执行“Synchronize and Overwrite”的操作，插件会重新生成存根文件，我们只需要修改程序逻辑就可以了，非常方便。有了这样的功能插件，我们可以极大的从配置文件的编写、查错中解脱出来，从而提高我们的工作效率。 <img src ="http://www.blogjava.net/qq13367612/aggbug/17817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-11-02 15:18 <a href="http://www.blogjava.net/qq13367612/articles/17817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用Myeclipse快速开发struts应用程序 </title><link>http://www.blogjava.net/qq13367612/articles/17816.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Wed, 02 Nov 2005 07:14:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/17816.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/17816.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/17816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/17816.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/17816.html</trackback:ping><description><![CDATA[开发环境：<BR>　　jdk5.0<BR>　　eclipse3.1M7 <BR>　　myeclipse3.84<BR>　　tomcat5.0.28<BR>　　<BR>　　简介：<BR>　　文本主要介绍用myeclipse的struts designer（图形化开发环境）开发一个简单的用户登录程序片段。<BR>　　主要包括2个jsp文件、一个ActionForm、一个Action等其它<BR>　　userLogin.jsp(用户登录及错误提示页面) userLoginSuccess.jsp(提示登录成功页面)<BR>　　UserLoginForm.java(ActionForm,存放用户提交信息)<BR>　　UserLoginAction.java(Action,简单的处理用户登录事件)<BR>　　<BR>　　开始吧<BR>　　首先我们先建立一个j2ee的web project.如图1:<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.7.12.11.35.42.1.gif"></CENTER><BR>　　点击next,Project name输入LoginDemo,其余保持默认,点击finish.<BR>　　在package explorer下,就可以看到我们的项目了,然后给这个项目添加Struts框架必要的文件.在我们项目名上点击右键,选择MyEclipes --&gt; Add Struts Capabilities...弹出对话框图2：<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.7.12.11.35.58.2.gif"></CENTER><BR>　　其中Struts config path就是我们的struts配置文件，URL pattern我们选择*.do，Default application resource为我们默认的资源文件地方，你可以选择它的存储位置，我们在这里保持默认。点击Finish后，项目结构类似于图3：<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.7.12.11.36.15.3.jpg"></CENTER><BR>　　现在就来开始我们的例子吧。首先修改/WEB-INF/web.xml文件,为其添加标签库(在使用中发现，不添加也能成功。但为了保持书上一致，还是添加安全些。hoho~~)将下面代码添加至 </WEBAPP>上面：<BR>　　<BR>　　<TAGLIB><BR>　　<TAGLIB-URI>/tags/struts-html</TAGLIB-URI><BR>　　<TAGLIB-LOCATION>/WEB-INF/struts-html.tld</TAGLIB-LOCATION><BR>　　</TAGLIB><BR>　　<BR>　　<TAGLIB><BR>　　<TAGLIB-URI>/tags/struts-bean</TAGLIB-URI><BR>　　<TAGLIB-LOCATION>/WEB-INF/struts-bean.tld</TAGLIB-LOCATION><BR>　　</TAGLIB><BR>　　<BR>　　<TAGLIB><BR>　　<TAGLIB-URI>/tags/struts-logic</TAGLIB-URI><BR>　　<TAGLIB-LOCATION>/WEB-INF/struts-logic.tld</TAGLIB-LOCATION><BR>　　</TAGLIB><BR>　　完成后，打开struts-config.xml文件，点击这个界面左下角的Design进入可视化设计界面。有没有注意右边的Palette :) 点击它，让我们来开始我们的jsp页面设计。我们先建立userLoginSuccess.jsp文件，为啥先建这一个呢？等下就知道了，在myeclipse中可以一次性把我们的Action,ActionForm,Jsp文件一次建好（将三个有关联的文件等下创建）。<BR>　　点击Palette面版上的创建JSP文件图标,弹出创建JSP文件面板。图4：<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.7.12.11.36.29.4.gif"></CENTER><BR>　　在File Name里输入userLoginSuccess.jsp，Template to use选择2] Standard JSP using Struts 1.1,点击Finish完成。<BR>　　完成后，struts-config.xml文件自动被更新，可视化界在上也出现了刚新建的JSP模块。新建的jsp文件也被打开了。<BR>　　覆盖所有的<%@ taglib ...... 为我们开始在/WEB-INF/web.xml中定义的：<BR>　　<BR>　　<%@ taglib uri="/tags/struts-html" prefix="html"%><BR>　　<%@ taglib uri="/tags/struts-bean" prefix="bean"%><BR>　　<%@ taglib uri="/tags/struts-logic" prefix="logic"%><BR>　　<BR>　　然后在中添加:<BR>　　Hello <?xml:namespace prefix = bean /><bean:write scope="request" name="userName"></bean:write>.<BR>　　这里将request中的属性userName输出在页面上，所以等下我们在UserLoginAction中，登录成功后要设置一个相关属性。<BR>　　<BR>　　OK,下面来开始我们最后三个文件的设计吧。在Struts-config.xml的Design模式中，在画版的空白区域点右键，选择New --&gt; New Form, Action and JSP 弹出ActionForm的选项面板，我们按图上输入相关值，图5：<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.7.12.11.36.45.5.gif"></CENTER><BR>　　在Optional Details的Form Properties选项卡，点add为这个ActionForm添加相关值，在这个登录示例中，将添加两个属性userName和password，图6：<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.7.12.11.37.1.6.jpg"></CENTER><BR>　　在添加password时，注意将JSP input type 下拉框选择password.<BR>　　完成这步后，我们就将ActionForm设计完成。<BR>　　接下来选择 Optional Details的JSP选项卡,我们选中Create JSP form? 这一步myeclipse将为我们创建一个简单的与用户交互的登录页面。保持内容和图7一样。图7：<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.7.12.11.37.14.7.gif"></CENTER><BR>　　因为我们这只是简单的演示一个登录片段，所以不用验证用户信息是否合法，所以将 Option Details的method选项卡的新建方法去掉，如图8：<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.7.12.11.37.31.8.gif"></CENTER><BR>　　点Next，进入Action选项面板.将Option Details的Form选项卡中Validate Form取消选择，如图9：<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.7.12.11.37.50.9.gif"></CENTER><BR>　　然后在Forwards选项卡中点add添加成功和失败返回的页面.如图10：<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.7.12.11.38.4.10.jpg"></CENTER><BR>　　点击Finish完成。在Struts-config.xml的Design中，可以看到图11所示：<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.7.12.11.38.18.11.gif"></CENTER><BR>　　最后，简单的修改一下userLogin.jsp,将所有<%@ taglib ...%>替换为：<BR>　　<%@ taglib uri="/tags/struts-html" prefix="html"%><BR>　　<%@ taglib uri="/tags/struts-bean" prefix="bean"%><BR>　　修改UserLoginAction中的execute片段为如下所示，图12：<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.7.12.11.38.32.12.gif"></CENTER><BR>　　OK，完成。。。下面就部暑项目，测试。。。<BR>　　<BR>　　像为项目添加Struts框架一样，在项目名上右击，选择MyEclipse --&gt; Add and Remove Project development.<BR>　　在弹出对话框上，单击add ，在弹出的 New Deployment 对话框上，Server选Tomcat5，点击Finish完成部署，如图13:<BR>　　 
<CENTER>　<IMG src="http://www.chinaitlab.com/www/imgfiles/2005.7.12.11.38.48.13.gif"></CENTER><BR>　　在用浏览器上打开：http://127.0.0.1:8080/LoginDemo/userLogin.jsp<BR>　　输入密码123456,用户名EricHe。显示成功：<BR>　　 
<CENTER><IMG src="http://www.chinaitlab.com/www/imgfiles/2005.7.12.11.39.1.14.jpg"></CENTER><BR>　　如果输错，或不输入，则无反映又回到当前登录页面（因为我们没有设置错误信息）。<BR><img src ="http://www.blogjava.net/qq13367612/aggbug/17816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-11-02 15:14 <a href="http://www.blogjava.net/qq13367612/articles/17816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse 3.0 简介和插件开发示例 </title><link>http://www.blogjava.net/qq13367612/articles/17814.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Wed, 02 Nov 2005 07:06:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/17814.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/17814.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/17814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/17814.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/17814.html</trackback:ping><description><![CDATA[<IMG height=1 src="http://www.pcbookcn.com/images/ads_200.gif" width=1 align=left> <SPAN class=main>Eclipse 是一个很让人着迷的开发环境，它提供的核心框架和可扩展的插件机制给广大的程序员提供了无限的想象和创造空间。目前网上流传相当丰富且全面的开发工具方面的插件，但是Eclipse已经超越了开发环境的概念，可以想象Eclipse将成为未来的集成的桌面环境。目前的Eclipse本身就具备资源管理和外部程序的功能，加上无所不能的插件，将构成一个丰富多彩的工作环境而不仅仅是一个IDE。<BR><BR>　　<B>1.Eclipse简介和插件开发</B><BR><BR>　　Eclipse 是一个很让人着迷的开发环境，它提供的核心框架和可扩展的插件机制给广大的程序员提供了无限的想象和创造空间。目前网上流传相当丰富且全面的开发工具方面的插件，但是Eclipse已经超越了开发环境的概念，可以想象Eclipse将成为未来的集成的桌面环境。目前的Eclipse本身就具备资源管理和外部程序的功能，加上无所不能的插件，将构成一个丰富多彩的工作环境而不仅仅是一个IDE。对于程序员来说，没有什么比可以随心所欲的定制的工作环境更重要，你的决心，勇气和创造力在与别人分享成果的过程中一览无余。好了，你是不是心动了，如果你已经对Eclipse有一定的认识，那么，和我一起打造自己的个性化工作环境吧，首先我们一起开发一个天气预报的插件，然后我们打造属于自己的邮件快速监控功能。 <BR><BR>　　以下的工作基于一定的前提，那就是你是一名Java程序员，你很欣赏并正开始使用Eclipse这个超酷的工作环境，别忘了下载最新版的Eclipse3.0，本文基于Eclipse3.0开发。<BR><BR>　　<B>2.天气预报插件</B><BR><BR>　　如果你已经厌倦了总是要登录某些网站从相关网页上获取信息，这里有一个让你通过Eclipse快速获取信息的新方法。让我们从头开始，做一个属于自己的天气预报插件吧，你的Eclipse将具有天气预报功能，是不是很酷呢？<BR><BR>　　在这一部分，我们将要实现一个Eclipse插件，他可以在任何我们想知道的时候通过简单的点击鼠标告诉我们本地区的天气预报，这当然很刺激。对于一个程序员而言，事情就应该如此。让我们开始吧，我们首先要定义一个插件，把他加到菜单和工具栏中。对于没有插件开发经验的你，可以参考《开发 Eclipse 插件》，树立基本的插件开发意识，当然，本文将详细的辅助你完成这一创造性的工作。<BR><BR>　　2.1最基础的插件<BR><BR>　　打开菜单 File -＞ New-＞ Other -＞Plug-in Project，输入项目名称，next出现对话框，只要在插件名处输入"muplugin",next 以后选择 "Hello,World"的插件模板你可以直接新建一个名为myplugin的最简单的插件，但其实我们的天气预报并不比它复杂多少，建完改插件以后的效果如下图。<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center><IMG onerror="this.src='/img_article/200512814610734.png';" hspace=3 src="http://www.pcbookcn.com/img_article/200512814611580.png" align=center vspace=1 border=1></DIV></TD></TR></TBODY></TABLE><BR>　　现在，将项目作为运行时工作台运行（run － run as runtime workbench），在一个全新的Eclipse窗口中，通过点击菜单 sample menu 的sample Action或者工具栏中的圆形Eclipse 图标，你将看到如下效果的对话框。<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center><IMG onerror="this.src='/img_article/200512814611621.png';" hspace=3 src="http://www.pcbookcn.com/img_article/200512814611360.png" align=center vspace=1 border=1></DIV></TD></TR></TBODY></TABLE><BR>　　到此为止，天气预报插件的原始版做成了，通过修改plugin.xml，我们将菜单改成中文形式，需要修改的地方就2处，详见表格。<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#d8d8d1 border=1>
<TBODY>
<TR>
<TD>＜actionSet label="Sample Action Set" visible="true" id="myplugin.actionSet"＞<BR>＜menu label="我的空间" id="sampleMenu"＞<BR>＜separator name="sampleGroup"＞<BR>＜/separator＞<BR>＜/menu＞<BR>＜action label="天气预报" icon="icons/sample.gif" class="myplugin.actions.SampleAction"<BR>tooltip="Hello, Eclipse world" menubarPath="sampleMenu/sampleGroup"<BR>toolbarPath="sampleGroup" id="myplugin.actions.SampleAction"＞<BR>＜/action＞<BR></TD></TR></TBODY></TABLE><BR>　　此时在运行时工作台，我们的菜单已经改变。<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center><IMG onerror="this.src='/img_article/200512814612371.png';" hspace=3 src="http://www.pcbookcn.com/img_article/200512814612797.png" align=center vspace=1 border=1></DIV></TD></TR></TBODY></TABLE><BR>　　2.2用VisualEditer制作天气预报对话框<BR><BR>　　虽然菜单是天气预报，但是我们需要的不是hello Eclispe对话框，我们需要的是告诉我们天气的对话框，当然需要我们从头开始，于是我们需要重新构建一个对话框，这个就需要 Visual Editor来帮助进行界面的开发。我们将使用Visual Editor实现一个Swing对话框，当然只用VE做一个对话框是有点大材小用，但是作为起点，已经合适了。<BR><BR>　　首先构建Visual Editer开发环境(读者可参考相关资料)，当一切准备齐全，鼠标右键点击PackgeExpoler中的 "muplugin.actions"java文件，从弹出式菜单中选择 new-＞other-＞VisualClass，新建一个可视化的类，弹出界面如下图：<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center><IMG style="WIDTH: 596px; HEIGHT: 514px" height=565 onerror="this.src='/img_article/200512814612112.png';" hspace=3 src="http://www.pcbookcn.com/img_article/200512814613784.png" width=488 align=center vspace=1 border=1></DIV></TD></TR></TBODY></TABLE><BR>　　选择next，然后在name中输入WeatherDialog，这个就是我们用来显示天气预报的dialog<BR><BR>　　选择该对话框的超类为javax.swing.JDiaog,点击Finish按钮。等待一段时间后，我们的对话框就基本生成了，鼠标点击左上角图标，直接输入天气预报就是对话框的标题，同时 我们可以看到左侧的VisualEditor面板。<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center><IMG style="WIDTH: 614px; HEIGHT: 378px" height=395 onerror="this.src='/img_article/200512814613833.png';" hspace=3 src="http://www.pcbookcn.com/img_article/200512814613738.png" width=612 align=center vspace=1 border=1></DIV></TD></TR></TBODY></TABLE><BR>　　 然后我们将该对话框于与刚才的天气预报菜单连接找到SampleAction的run函数，如下所示：<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#d8d8d1 border=1>
<TBODY>
<TR>
<TD>public void run(IAction action) {<BR>　MessageDialog.openInformation(<BR>　　window.getShell(),"Myplugin Plug-in", "Hello, Eclipse world");<BR>}</TD></TR></TBODY></TABLE><BR>　　替换成如下代码<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#d8d8d1 border=1>
<TBODY>
<TR>
<TD>public void run(IAction action) <BR>{<BR>WeatherDialog wd=new WeatherDialog();<BR>wd.setSize(400, 335);<BR>wd.show(); <BR>}</TD></TR></TBODY></TABLE><BR>　　此时，点击菜单运行，我们的对话框看起来象这个样子，在此基础上我们还要在上面增加天气预报信息。<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center><IMG onerror="this.src='/img_article/200512814614140.png';" hspace=3 src="http://www.pcbookcn.com/img_article/200512814614472.png" align=center vspace=1 border=1></DIV></TD></TR></TBODY></TABLE><BR>　　2.3增加天气预报功能<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center><IMG onerror="this.src='/img_article/200512814614876.png';" hspace=3 src="http://www.pcbookcn.com/img_article/200512814614811.png" align=center vspace=1 border=1></DIV></TD></TR></TBODY></TABLE><BR>　　下面的部分是重点，我们将使用具有解析Html功能的Swing组件JEditPane，来获取网络上的现成的天气预报信息，根据上图，从 VisualEditor的面板中Swing Components组点击JEditPane，加入到对话框中。并修改对话框代码使得最终的代码如下：<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#d8d8d1 border=1>
<TBODY>
<TR>
<TD>/*<BR>* Created on 2004-9-23<BR>* */<BR>package myplugin;<BR><BR><BR>import java.io.BufferedReader;<BR>import java.io.InputStreamReader;<BR>import java.net.URL;<BR><BR>import javax.swing.JDialog;<BR>import javax.swing.JEditorPane;<BR><BR>/**<BR>* ＜p＞Title: WatherDialog＜/p＞<BR>* ＜p＞Description: 这个是对话框类，用于显示指定城市的当天的天气预报＜/p＞<BR>* ＜p＞Copyright: Copyright (c) 2004＜/p＞<BR>* ＜p＞Company:UF SOFT＜/p＞<BR>* @author 赵勇<BR>* @version 1.0<BR>*/<BR>public class WatherDialog extends JDialog<BR>{<BR>String city="北京";<BR><BR>private JEditorPane jEditorPane = null;<BR>/**<BR>* This method initializes <BR>* /<BR>public WatherDialog(String city) <BR>{<BR>super();<BR>this.city=city;<BR>initialize();<BR>}<BR>/**<BR>* This method initializes this<BR>* @return void<BR>*/<BR>private void initialize() <BR>{<BR>this.setContentPane(getJEditorPane());<BR>try<BR>{<BR>//构建URL对象<BR>URL url =new URL("http://weather.news.sina.com.cn//cgi-bin/figureWeather/simpleSearch.cgi?city="+city);<BR>String temp="";<BR>BufferedReader in <BR>= new BufferedReader(new InputStreamReader(url.openStream()));<BR>//使用openStream得到一输入流并由此构造一个BufferedReader对象<BR>String inputLine;<BR>//从输入流不断的读数据，直到读完为止<BR>while ((inputLine = in.readLine()) != null)<BR>temp=temp+inputLine+"\n";<BR>//关闭输入流<BR>in.close(); <BR>String weather <BR>=temp.substring ( temp.indexOf( "＜body"),<BR>temp.lastIndexOf( "body＞")+5);<BR><BR>this.jEditorPane .setText(weather);<BR>} <BR>catch (Exception e)<BR>{<BR>e.printStackTrace();<BR>} <BR>this.setTitle("天气预报");<BR>this.setSize(400, 166);<BR><BR>}<BR>/**<BR>* This method initializes jEditorPane <BR>* <BR>* @return javax.swing.JEditorPane <BR>*/ <BR>private JEditorPane getJEditorPane() <BR>{<BR>if (jEditorPane == null) <BR>{<BR>jEditorPane = new JEditorPane();<BR>jEditorPane.setContentType( "text/html");<BR>}<BR>return jEditorPane;<BR>}<BR>} // @jve:decl-index=0:visual-constraint="70,19"</TD></TR></TBODY></TABLE><BR>　　以上代码中最关键的部分就是对话框中的JEditorPane对象，在初始化时，从一个URL 获取天气预报信息，表现为Html标记片段，不用解析，直接调用JEditorPane的setText 方法，就可以将Html格式的信息直接按解析过的方式显示，也就是天气预报信息了，<BR><BR>　　此时Action中的调用需要做修改<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#d8d8d1 border=1>
<TBODY>
<TR>
<TD>public void run(IAction action) <BR>{<BR>WeatherDialog wd=new WeatherDialog("北京");<BR>wd.setSize(400, 335);<BR>wd.show(); <BR>}</TD></TR></TBODY></TABLE><BR>　　现在以运行时工作台的方式运行，点击天气预报菜单，可以看到下图：<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center><IMG onerror="this.src='/img_article/200512814615436.png';" hspace=3 src="http://www.pcbookcn.com/img_article/200512814616965.png" align=center vspace=1 border=1></DIV></TD></TR></TBODY></TABLE>
<P><BR>　　如果你在上海或者其他城市，试着修改city参数为"上海"，再次运行，你将发现，你仍然能够得到该城市的天气预报（这里我们从网站上提取的信息，有点投机取巧了）。值得注意的是，Xmethod网站提供了一个天气预报的WebService，可惜只有美国的城市，不然我们可以使用Web Service调用获取天气预报，将会更酷。<BR><BR>　　现在运行是工作台已经具备了天气预报的功能，还需要更进一步，将改插件导出发布，拷贝到Eclipse根目录的plugins目录中，重新启动（具体参见Eclipse帮助）。现在你自己的Eclipse，就具备了天气预报的功能，只要你点击鼠标，就可以在编程之余轻松的获取天气信息。 除非你的老板认为你在工作时间随时了解天气情况不是一个好主意，我认为你完全可以将这个插件纳入个人收藏的插件之列。你也可以在此基础上扩展，增加一些配置文件和属性设置，定制出满足自己要求的插件。如果能够增加信息的自动过滤和筛选，那将是一次很愉快的体验，如果你有时间和兴趣，不妨一试。</P>
<P>　<B>3.邮件快速监控插件</B><BR><BR>　　现在你的工作因为Eclipse而更加惬意，更具创造力，那么你还有什么不满？你是否厌倦了各种邮件客户端随时随地的骚扰你呢？你希望你在高兴的时候适时的了解一下邮件的概况？好了，既然想到了为什么犹豫呢，因为你是程序员，你就是要用Eclipse享受完全DIY的乐趣。<BR><BR>　　3.1生成插件<BR><BR>　　本部分我们将在以上myplugin插件的基础上增加一个邮件过滤显示的对话框，类似的我们通过VisualEditer创建一个名为MailDialog的对话框，并增加一个JEditPane用来显示邮箱中我们关注的信息。<BR><BR>　　修改plugin.xml，增加一个"我的邮件"菜单<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#d8d8d1 border=1>
<TBODY>
<TR>
<TD>＜action<BR>label="邮件信息"<BR>icon="icons/sample.gif"<BR>class="myplugin.actions.MailAction"<BR>tooltip="邮件信息"<BR>menubarPath="sampleMenu/sampleGroup"<BR>toolbarPath="sampleGroup"<BR>id="myplugin.actions.MailAction"＞<BR>＜/action＞</TD></TR></TBODY></TABLE><BR>　　现在，你知道要创建一个MailAction的Action类，并在在Run中增加如下代码<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#d8d8d1 border=1>
<TBODY>
<TR>
<TD>MailConfig mail=new MailConfig();<BR><BR>String popServer="server";<BR>String popUser="zhaoyong";<BR>String popPassword="1234";<BR><BR>//设置需要过滤的关键字：发件人和邮件主题<BR>String [] strFrom=new String[] {"zhaoyong"};<BR>String [] strSubject=new String[] {"测试"};<BR><BR>MailConfig[] mc =new MailConfig [] { mail };<BR>MailDialog md=new MailDialog(mc);<BR>System.err.println("run run run ") ;<BR>md.setSize(400, 335);<BR>md.show();</TD></TR></TBODY></TABLE><BR>　　以上的代码编译不会通过，但是别着急，慢慢来，很快了。<BR><BR>　　3.2构建邮件监控对话框 <BR><BR>　　当然你需要建立一个MailConfig类用来表示一个邮箱的具体设置已及相关信息，这里就不在累述说明，详情参见参考资料中的代码。需要说明的式MailConfig除了要记录一个邮箱的地址，用户名和密码外，还提供2个关键字数组，如果为空，不加过滤，如果关键字有值，系统会根据发件人和邮件标题中是否包含关键字来进行显示邮件信息，已保证你的绝对自由。<BR><BR>　　首先我们需要实现一个MailConfig类，表示邮件配置，每个MailConfig的对象代表一个邮件帐户，我们的系统将能显示多个邮箱的配置，每个MailConfig中使用一个数组来保存需要过滤的收件人和邮件地址。<BR><BR>　　MailConfig类的中的变量如下： <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#d8d8d1 border=1>
<TBODY>
<TR>
<TD>String popServer;<BR>String popUser;<BR>String popPassword;<BR><BR>//设置需要过滤的关键字：发件人和邮件主题<BR><BR>String [] strFrom;<BR>String [] strSubject; <BR><BR>//是否显示邮件内容 <BR>boolean isViewContent=false;</TD></TR></TBODY></TABLE><BR>　　同样，我们将使用一个对话框来显示邮件信息，MailDialog需要引用javaMail.jar,和activation.jar这两个类包，确保已经有这两个类包并加入到项目的类路径中。最后的MailDialog代码如下：<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#d8d8d1 border=1>
<TBODY>
<TR>
<TD>package myplugin;<BR><BR><BR>import java.io.IOException;<BR>import java.util.Properties;<BR><BR>import javax.mail.Folder;<BR>import javax.mail.Message;<BR>import javax.mail.MessagingException;<BR>import javax.mail.Session;<BR>import javax.mail.Store;<BR>import javax.mail.internet.InternetAddress;<BR>import javax.swing.JDialog;<BR>import javax.swing.JEditorPane;<BR>import javax.swing.JTextPane;<BR>/**<BR>* @author zhaoyong<BR>*<BR>* TODO To change the template for this generated type comment go to<BR>* Window - Preferences - Java - Code Style - Code Templates<BR>*/<BR>public class MailDialog extends JDialog<BR>{<BR><BR>private JEditorPane jEditorPane = null;<BR>private JTextPane jTextPane = null;<BR><BR>//可以显示多个邮件配置<BR>MailConfig[] mc= null; <BR><BR><BR>/**<BR>* This method initializes <BR>* 构造函数<BR>* @param mc : 需要显示的多个邮箱配置对象。<BR>*/<BR>public MailDialog(MailConfig[] mc) <BR>{<BR><BR>super();<BR><BR>if(mc!=null)<BR>this.mc = mc;<BR>else<BR>System.err.println("邮件配置错误！") ;<BR><BR>initialize();<BR>}<BR>/**<BR>* This method initializes this<BR>* 初始化<BR>* @return void<BR>*/<BR>private void initialize() <BR>{<BR>try<BR>{<BR>//设定显示内容的面板<BR>this.setContentPane(getJTextPane());<BR>//取得所有的新邮件信息<BR>String s= getAllMailInfo(); <BR>//将信息显示在对话框中<BR>this.jTextPane .setText(s);<BR><BR>this.setTitle("邮件信息");<BR>this.setSize(251, 100);<BR>} <BR>catch (Exception e)<BR>{ <BR>//发生错误显示错误信息<BR>this.jTextPane .setText(e.toString());<BR>e.printStackTrace();<BR>}<BR><BR>}<BR>/**取得所有的邮箱的需要监控的邮件信息<BR>* <BR>* @return String <BR>*/<BR>private String getAllMailInfo()<BR>{<BR>String allMailInfo="";<BR><BR>if (mc.length ＜1)<BR>allMailInfo="没有配置邮箱！";<BR>else<BR>{<BR>for(int i=0;i＜mc.length;i++)<BR>{<BR>//循环获取每个邮箱的邮件信息 <BR>allMailInfo=allMailInfo+getMailInfo(mc[i]);<BR>}<BR>}<BR>//还没有收到相关的邮件<BR>if (allMailInfo.trim().length() ==0)<BR>allMailInfo="未检测到相关新邮件！";<BR>return allMailInfo;<BR><BR>}<BR>/*<BR>*得到一个邮箱中满足条件的所有新邮件的字符串形式<BR>**/<BR>private String getMailInfo(MailConfig mc)<BR>{<BR>//最终输出的邮件信息<BR>String mailInfo="";<BR><BR>//每个邮箱服务器上的Store和Folder对象<BR>Store store=null;<BR>Folder folder=null;<BR><BR>try<BR>{<BR><BR>Properties props = System.getProperties();<BR>//与邮件服务器生成一个Session<BR>Session session = Session.getDefaultInstance( props,null);<BR><BR>//给出服务器，用户名，密码连接服务器<BR>store = session.getStore("pop3");<BR>store.connect(mc.getPopServer(), mc.getPopUser(),mc.getPopPassword());<BR><BR>//取得默认的邮件Folder<BR>folder = store.getDefaultFolder();<BR>if (folder == null) <BR>throw new Exception("No default folder");<BR><BR>//取得收件箱<BR>folder = folder.getFolder("INBOX");<BR>if (folder == null) <BR>throw new Exception("No POP3 INBOX");<BR><BR>//以只读方式打开收件箱<BR>folder.open(Folder.READ_ONLY);<BR><BR>//获取所有新邮件并处理<BR>Message[] msgs = folder.getMessages(); <BR><BR>for (int i = 0; i ＜ msgs.length; i++)<BR>{<BR>Message message= msgs[i];<BR>//取得每封邮件的信息，需要引用MailConfig对象进行关键字过滤<BR>mailInfo = mailInfo+ getMessageInfo( message,mc); <BR>}<BR><BR>}<BR>catch (Exception ex)<BR>{<BR>ex.printStackTrace();<BR>}<BR>finally<BR>{<BR>//安全的关闭邮件服务器资源<BR>try<BR>{<BR>if (folder!=null) folder.close(true);<BR>if (store!=null) store.close();<BR>}<BR>catch (Exception ex2) {ex2.printStackTrace();}<BR>}<BR>return mailInfo;<BR>}<BR><BR>/**<BR>* 得到一封邮件的信息，需要根据MailConfig过滤<BR>* @param mailInfo<BR>* @param message<BR>* @return 邮件信息<BR>* @throws MessagingException<BR>* @throws IOException<BR>*/<BR>private String getMessageInfo( final Message message ,final MailConfig mc) <BR>throws MessagingException, IOException <BR>{<BR>//返回的改邮件信息<BR>String mailInfo="";<BR><BR>String from=((InternetAddress)message.getFrom()[0]).getPersonal();<BR><BR>if (from==null) <BR>from=((InternetAddress)message.getFrom()[0]).getAddress();<BR><BR>String subject=message.getSubject();<BR><BR>//如果满足过滤信息则显示，否则返回空<BR>if(isElementinString(from,mc.getStrFrom())<BR>||isElementinString(subject,mc.getStrSubject()) ) <BR>{ <BR>mailInfo=mailInfo+"发件人 : "+from+"\n"; <BR>mailInfo=mailInfo+"邮件主题 : "+subject+"\n";<BR>mailInfo=mailInfo+"发送时间 : "+message.getSentDate() +"\n";<BR><BR>//如果显示内容，则打印内容<BR>if(mc.isViewContent)<BR>mailInfo=mailInfo+message.getContent() +"\n";<BR><BR>mailInfo=mailInfo+"------------------------------------\n";<BR>}<BR>return mailInfo;<BR>}<BR><BR>private JTextPane getJTextPane() <BR>{<BR>if (jTextPane == null) <BR>{<BR>jTextPane = new JTextPane();<BR>}<BR><BR>return jTextPane;<BR>}<BR><BR>/**<BR>* 判断目标关键字数组中是否有指定的字符串,进行过滤<BR>* @param targetStr ：<BR>* @param keys ：<BR>* @return 如果有，返回true， 否则返回false<BR>*/<BR><BR>private boolean isElementinString(String targetStr,String [] keys)<BR>{<BR>//没指定过滤条件，显示所有<BR>if (keys==null)<BR>return true;<BR>//指定字符串为空，直接返回false<BR>if (targetStr==null)<BR>return false;<BR>for(int i=0;i＜keys.length ;i++)<BR>{<BR>if (targetStr.indexOf(keys[i])＞-1)<BR>return true;<BR>}<BR>return false;<BR>}<BR><BR>} <BR>// @jve:decl-index=0:visual-constraint="10,10"－－说明，这是Visual Editor添加的控制信息</TD></TR></TBODY></TABLE><BR>　　以上代码的注释已经保证你能够看清楚，这里就不加累述，有兴趣的可以自己试试，体验一切尽在掌握的快感。当然这个例子做的实在简单，因此也为你的进一步开发留有足够的余地。<BR><BR>　　3.3 打包和发布<BR><BR>　　到此，在mypulgin中增加了邮件信息菜单和对话框，系统的plugin.xml如下：<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#d8d8d1 border=1>
<TBODY>
<TR>
<TD>＜?xml version="1.0" encoding="UTF-8"?＞<BR>＜?eclipse version="3.0"?＞<BR>＜plugin<BR>id="myplugin"<BR>name="Myplugin Plug-in"<BR>version="1.0.0"<BR>provider-name=""<BR>class="myplugin.MypluginPlugin"＞<BR><BR>＜runtime＞<BR>＜library name="myplugin.jar"＞<BR>＜export name="*"/＞<BR>＜/library＞<BR>＜library name="lib/javaMail.jar"＞<BR>＜export name="*"/＞<BR>＜/library＞<BR>＜library name="lib/activation.jar"＞<BR>＜export name="*"/＞<BR>＜/library＞<BR>＜/runtime＞<BR><BR>＜requires＞<BR>＜import plugin="org.eclipse.ui"/＞<BR>＜import plugin="org.eclipse.core.runtime"/＞<BR>＜/requires＞<BR><BR>＜extension<BR>point="org.eclipse.ui.actionSets"＞<BR>＜actionSet<BR>label="Sample Action Set"<BR>visible="true"<BR>id="myplugin.actionSet"＞<BR>＜menu<BR>label="我的空间"<BR>id="sampleMenu"＞<BR>＜separator<BR>name="sampleGroup"＞<BR>＜/separator＞<BR>＜/menu＞<BR>＜action<BR>label="天气预报"<BR>icon="icons/sample.gif"<BR>class="myplugin.actions.SampleAction"<BR>tooltip="Hello, Eclipse world"<BR>menubarPath="sampleMenu/sampleGroup"<BR>toolbarPath="sampleGroup"<BR>id="myplugin.actions.SampleAction"＞<BR>＜/action＞<BR>＜action<BR>label="邮件信息"<BR>icon="icons/sample.gif"<BR>class="myplugin.actions.MailAction"<BR>tooltip="邮件信息"<BR>menubarPath="sampleMenu/sampleGroup"<BR>toolbarPath="sampleGroup"<BR>id="myplugin.actions.MailAction"＞<BR>＜/action＞<BR>＜/actionSet＞<BR>＜/extension＞<BR>＜/plugin＞</TD></TR></TBODY></TABLE><BR>　　实际上，我们在一个插件中加入了2个功能，因此就实现了我们的开发环境的自我扩展和定制。同样，参考Eclipse的帮助，你可以轻松的再次将插件打包导出，并将其加入自己的Eclipse 的plugins目录（可能需要解压缩），或通过help菜单的Update选项进行安装，注意导出时需要选定相关的类包。重新启动，你将发现自己的IDE已经多了自己的菜单，开发环境已经随着自己的意愿在改变了，程序员天生的满足感油然而生。 <BR><BR>　　现在，你可以在需要的时候点击菜单，了解你希望监控的邮件情况或者最近的天气情况，一切轻松的尽在掌握，Eclipse的插件，就是这样全能。<BR><BR>　　<B>4.总结</B> <BR><BR>　　那么，聪明的你有没有发现什么问题，对，上面的东西太粗糙，太简单了，你可以做进一步的优化设计和功能加强，比如，自己增加邮件配置文件而不是写在代码里面，动态监控弹出邮件预警（通过事先设定的紧急状态），你也许还会想起来很多的新的主意，比如我为什么不能有个能看电影的插件？或是Eclipse中飘出动听的音乐？别急，这些不一定需要你亲手去做，http://sourceforge.net/projects/rocexwang/ 有一个播放器插件，但是现在仅能播放音乐，国外已经有人用Eclipse开发游戏，也有人用Eclipse来做MIS系统的。http://www.matrix.org.cn/forum_view.asp?forum_id=25&amp;view_id=10510 有一个国人开发的俄罗斯方块游戏，虽然简单了一点。当然，通过网址http://eclipse-plugins.2y.net/eclipse/index.jsp和http://www.eclipseplugincentral.com/你可以找到很多的插件，如果你知道什么更好的插件，请告诉我。<BR><BR>　　Eclipse提供了一个纯的框架和插件结构，使得开发任何功能的插件都能成为现实。本文介绍了2个有趣的Eclipse插件的开发，可以使我们的工作环境增加了两个可爱的小功能，同时也使得你具备了基础的插件开发能力，借助Eclipse的强大功能，从此你可以把你的任何想法变为现实。同时请保持与别人的交流，我会很乐意了解你的新奇的插件，并收藏和学习任何好的插件，打造一个完全属于自己的个性化的开发环境。Eclipse将在不久的将来成为一个全能的Platform，这一点在全世界数以万计的开发人员的手中，正一点一点变为现实。</P></SPAN><img src ="http://www.blogjava.net/qq13367612/aggbug/17814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-11-02 15:06 <a href="http://www.blogjava.net/qq13367612/articles/17814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse的使用简介及插件开发</title><link>http://www.blogjava.net/qq13367612/articles/17813.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Wed, 02 Nov 2005 07:04:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/17813.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/17813.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/17813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/17813.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/17813.html</trackback:ping><description><![CDATA[<P>Eclipse 是替代IBM Visual Age for Java（以下简称IVJ）的下一代IDE开发环境，但它未来的目标不仅仅是成为专门开发Java程序的IDE环境，根据Eclipse的体系结构，通过开发插件，它能扩展到任何语言的开发，甚至能成为图片绘制的工具。目前，Eclipse已经开始提供C语言开发的功能插件。更难能可贵的是，Eclipse是一个开放源代码的项目，任何人都可以下载Eclipse的源代码，并且在此基础上开发自己的功能插件。也就是说未来只要有人需要，就会有建立在Eclipse之上的COBOL，Perl，Python等语言的开发插件出现。同时可以通过开发新的插件扩展现有插件的功能，比如在现有的Java开发环境中加入Tomcat服务器插件。可以无限扩展，而且有着统一的外观，操作和系统资源管理，这也正是Eclipse的潜力所在。</P>
<P>虽然目前Eclipse项目还没有最后完成，但从已有的版本中已经能领略到Eclipse设计主导思想和主要功能特点。现在就了解Eclipse不但能使广大程序员对这款业界期望很高的IDE能一睹为快，更为重要的是如果能参加到Eclipse项目的开发中或是阅读它的开放源代码，这对广大程序员来说无疑是一个千载难逢的提高编程水平的好机会。Eclipse计划提供多个平台的版本，象Windows，Linux，Solaris，HP-UX和AIX，以下只介绍Windows版本。本文第一部分先介绍Eclipse的基本使用方法。第二部分介绍如何进行Eclipse的插件开发。</P>
<P><A name=1><SPAN class=atitle2>一．Eclipse简介</SPAN></A><BR></P>
<P>Eclipse是开放源代码的项目，你可以到 <A href="http://www.eclipse.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/" xmlns:h="http://www.w3.org/1999/xhtml">www.eclipse.org</A>去免费下载Eclipse的最新版本，一般Eclipse提供几个下载版本：Release，Stable Build，Integration Build和Nightly Build，建议下载Release或Stable版本，笔者用的是Build20020125（Stable版本）。Eclipse本身是用Java语言编写，但下载的压缩包中并不包含Java运行环境，需要用户自己另行安装JRE，并且要在操作系统的环境变量中指明JRE中bin的路径。安装Eclipse的步骤非常简单：只需将下载的压缩包按原路径直接解压既可。需注意如果有了更新的版本，要先删除老的版本重新安装，不能直接解压到原来的路径覆盖老版本。在解压缩之后可以到相应的安装路径去找Eclipse.exe运行。如果下载的是Release或Stable版本，并且JRE环境安装正确无误，一般来说不会有什么问题，在闪现一个很酷的月蚀图片后，Eclipse会显示它的缺省界面： </P>
<P><A name=N10052><B></B></A><BR><IMG height=427 alt=图一 src="http://www-128.ibm.com/developerworks/cn/java/l-eclipse/1.gif" width=554 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/" xmlns:h="http://www.w3.org/1999/xhtml"> </P>
<P>图一 </P>
<P>乍一看起来，Eclipse的界面有点象JBilder，但实际操作进程中会发现它更象IVJ，毕竟开发Eclipse的主导用量是开发IVJ的原班人马（可参考www.oti.com）。另外还值得一提的是Eclipse项目的参预者除了IBM以外，还有象Borland，Rational Software，RedHat，Merant等一大批业界的姣姣者，这也为Eclipse的未来奠定了良好的基础。</P>
<P>下面将分别对Eclipse的各种特性作简单介绍，包括：文件存放，开发环境，编译与运行，版本管理，使用插件。</P>
<P><A name=2><SPAN class=atitle3>1． 文件存放</SPAN></A><BR></P>
<P>大多IVJ的初学者都对找不到Java源代码感到非常不适应，因为IVJ把所有的源代码都存储到一个reponsitory库文件中，想要得到文本格式的源代码必须用Export功能从reponsitory