Eclipse RCP+Spring建胖客户端Web措施
副标题#e#
摘要 Eclipse富厚的客户端平台(RCP)正在快速地成为构建胖客户端应用措施的框架选择。本文将向你具体先容如何操作Eclipse RCP举办Spring Web开拓。
一. 引言
尽量Web 2.0和富厚的因特网应用措施(RIA)如今极为盛行,可是,当你真正需要胖客户端成果时构建一个富厚的Web前端大概并不真正满意你的要求。
可是,假如你确实想避开所谓RIA狂热而选择一种实际的胖客户端办理方案的话,那么你该奈何做呢?答复是:你可以选择一种富厚的客户端平台(RCP)来为你处理惩罚大大都的事情。实质上,这种RCP观念为Java桌面应用措施世界提供了一种新型的框架。
一个RCP提供了一个应用措施的框架/外壳,尚有一组基于模块的API,你可以或许基于这一外壳来构建本身的应用措施。这个RCP认真实现所有的沉重任务,譬喻添加菜单,东西条,差异的视图等等,而你就不必再反复事情。
本文将引导你具体地构建一个胖客户端接口以毗连到在上一篇文章中构建的处事器上。你将基于Eclipse富厚的客户端平台来构建胖客户端,然后把Eclipse RCP与Spring集成到一起。
【筹备事情】
·Eclipse 3.1.2
·MyEclipse 4.1.1
·Java SE 5
·一个Servlet容器或J2EE处事器(本文利用的是Tomcat 5.5+)
·Spring 1.2+
二. 为什么利用Eclipse RCP?
如今已经有越来越多的应用措施基于Eclipse RCP举办开拓(虽然,尚有Eclipse丰富的开拓配景),所以,我们可以安详地假定,与任何其它框架对比,这种框架已经获得更为遍及的测试。
下面,让我们开始。
#p#副标题#e#
(一) 建设一个新的Eclipse插件工程
请凭据下列步调为你的富厚的客户端应用措施建设一个新的Eclipse插件工程:
1. 在Eclipse中建设一个新的插件工程,并定名工程为EclipseTradeClient。把这个插件的应用方针定位在Eclipse 3.1版本,而且确保点选了"Create an OSGi bundle manifest"(见图1),并点击Next。
图1."New Plug-in Project"对话框在Eclipse中建设一个新的插件工程EclipseTradeClient。
2. 在"Plug-in Content"屏幕上,保持默认配置,可是确保选择了"Yes"-建设一个富厚的客户端应用措施(见图2),并点击Next。
图2.在"Plug-in Content"屏幕选择建设一个富厚的客户端应用措施。
·至于模板,选择"RCP application with a view",并点击Next。
·填写显示如图3的RCP应用措施属性,并点击Finish。之后,你将被提示转到"Plug-in Development"视图下,并点击Yes。
图3.RCP插件工程领导最后的功效屏幕
·此刻,你已经建设了你的工程,再打开plugin.xml。你将看到如下图4所示的屏幕快照。
图4.Plugin.XML提要
假如你是Eclipse插件开拓的新手,你大概常常需要利用底部的plugin.xml选项卡。正如你从Overview选项卡中所看到的,你可以运行/调试你的Eclipse富厚的客户端应用措施。
展开EclipseTradeClient/src/eclipseTradeClient包来调查Eclipse的RCP领导为你建设的类。在Eclipse编辑器中,点击"All Extensions"选项卡而且展开每一个顶级的结点,如图5所示。
图5.Eclipse生成的类及所有的扩展
请留意一下你的Application类,Perspective类和View类的扩展进口。既然Eclipse的富厚的客户端平台包罗plugin.xml文件,所以你可以简朴地添加新的组件-通过"Extensions"选项卡中的"Add…"按钮来添加它们。
(二) 重构默认的View类
如你所见,Eclipse领导为你建设了一个称为View的类。并不是很有用,对吗?请利用如下步调来重构默认的视图类:
1. 让我们重定名它-右击Package Explorer中的View.java。转到Refactor->Rename,输入新名为ExplorerView而且点击Preview。在随后弹出的面板上,你会看到Perspective类被重构-利用ExplorerView.ID来取代View.ID(见图6)。点击OK。
图6.为ExplorerView重构View类
2. 遗憾的是,Eclipse的重构本领有点弱-出格与IntelliJ作较量的话。对付象这样的重构来说,IntelliJ将不只定期望对类加以改变,并且它会把重构应用于你的.xml文件!这长短常有用的特征,出格是在一种Spring/Hibernate/XML设置操纵比例极大的环境下。
你必需手工地更新对plugin.xml的重构。打开plugin.xml,而且点击plugin.xml选项卡。找到相应于View的扩展,而且作如下更新:
name="ExplorerView"
class="eclipseTradeClient.ExplorerView"
id="EclipseTradeClient.explorerView">
从此,举办生存(见图7)。
图7.进一步重构-手工更新Plugin.XML
#p#分页标题#e#
3. 对付这种简朴的重构,环境就是这样,对吗?是的;但遗憾的是,你还没有竣事。打开类ExplorerView,改变静态变量ID-把它初始化为EclipseTradeClient.explorerView。这相应于你适才在plugin.xml中配置的ID。
4. 最后,你完成重构。此刻,让我们测试一下是否一切窜纠正常。切换回编辑器中的plugin.xml,而且点击"Overview"选项卡。点击"Launch an Eclipse application",这应该导致如图8所示功效。
图8.启动Eclipse Trade Client措施
5. 此刻让我们改变结点的名字。打开类ExplorerView。找到内部类ViewContentProvider,而且改变要领"Object getElements(Object parent)",让其返回一个字符串数组({"Watch List","Order History"})。
三. 把Spring Remoting添加到你的应用措施
下面,我们把Spring添加到你的Eclipse富厚的客户端以便它向前一篇文章中的StockTradeServer工程发出请求。
首先,当开拓Eclipse插件/RCP应用措施时,添加第三方库的推荐的要领是通过别的一个插件。这样做今后,你就不需要把这些第三方jars添加到你建设的每个工程。而是,你仅成立你的插件/RCP工程和第三方库工程之间的某种依赖性。首先,我们假定你熟悉Eclipse的classloader。要点是,你必需采纳一些特另外步调来确保你的类在插件依赖性之间可以或许互相找到对方:
1. 在Eclipse中建设一个新的插件工程。并定名这个新工程为SpringClient。然后,配置如下值:
ID = SpringClient
Class = springClient.SpringClientPlugin
在填充Plug-in属性后,点击Finish。对付SpringClient插件工程,你不需要任何模板,因为其主要目标是存储Spring库和任何Spring相关的处事类。
2. 在你的解压的spring-framework-1.2.8刊行包中,你会找到下列jar文件:
·spring-aop.jar-在文件夹dist下
·spring-beans.jar-在文件夹dist下
·spring-context.jar-在文件夹dist下
·spring-core.jar-在文件夹dist下
·spring-remoting.jar-在文件夹dist下
·commons-logging.jar-在文件夹lib\jakarta-commons下
·log4j-1.2.13.jar-在文件夹lib\log4j下
然后,把它们全部复制到你的SpringClient根目次下。
3. 在Eclipse的包资源打点器中,右击SpringClient以打开工程属性。选择"Java Build Path",点击"Libraries"选项卡,而且把适才你通过按钮"Add JARs"添加的所有的那些jar文件插手。请确保你也导入了这些库!点击"Order and Export"选项卡,而且查抄所有的库(见图9)。通过这样做,你就可以确保,当你建设对SpringClient的一种事情依赖性时,spring和log jars也是可用的。从此,点击OK。
图9.输出第三方库
4. 此刻,你要修改SpringClient的manifest。在包资源打点器中,展开SpringClient->META-INF而且打开MANIFEST.MF。点击"Runtime"选项卡而且点击Classpath部门的"Add"。全选Spring jars和logging jars而且点击OK。此刻,在"Exported Packages"节中,点击Add。选择所有的包以便导出,并点击OK(见图10)。
图10.把第三方库添加到插件Classpath并导出包
我以前提及过,Eclipse的classloader常常引起问题。为了调停这一点,你可以点击MANIFEST.MF选项卡而且添加下面一行:
Eclipse-BuddyPolicy: registered
5. 此刻,让我们添加spring设置文件。在Package Explorer中,转到src目次,建设一个新文件applicationContext.xml,而且插手下列内容:
在src目次下,别的建设一个新文件beanRefFactory.xml而且插手下列内容:
不必感想惊奇,这些设置文件与你对stocktradeserver工程举办单位测试时利用的spring设置文件是沟通的,除了你重定名了applicationContext.xml以外。
6. 为了简化问题,你可以把类从stocktradeserver工程复制到SpringClient的src目次下。在SpringClient的src目次下面,建设包stephenlum.services.stock和stephenlum.services.stock.dto。
#p#分页标题#e#
假如你还没有筹备好,你可以下载本文源码或参考我的前一篇文章而且复制stephenlum.services.stock下的类StockService.java。然后,复制在stephenlum.services.stock.dto下的类StockDTO.java(见图11)。
图11.完成上面操纵后的Package Explorer看上去的样子
7. 把代码添加到类SpringClientPlugin以装载Spring的应用措施上下文。留意,你要把该代码添加到结构器中。下面是新的SpringClientPlugin类:
package springClient;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.access.BeanFactoryLocator;
import org.springframework.beans.factory.access.BeanFactoryReference;
import org.springframework.beans.factory.access.SingletonBeanFactoryLocator;
/**
*应用于桌面的主插件类。
*/
public class SpringClientPlugin extends AbstractUIPlugin {
private BeanFactory beanFactory;
//共享实例.
private static SpringClientPlugin plugin;
/**
*结构器.
*/
public SpringClientPlugin() {
plugin = this;
BeanFactoryLocator beanFactoryLocator = SingletonBeanFactoryLocator.getInstance();
BeanFactoryReference beanFactoryReference = beanFactoryLocator.useBeanFactory("ctx");
beanFactory = beanFactoryReference.getFactory();
}
/**
*在插件激活时挪用这个要领
*/
public void start(BundleContext context) throws Exception {
super.start(context);
}
/**
*当遏制插件时,挪用这个要领
*/
public void stop(BundleContext context) throws Exception {
super.stop(context);
plugin = null;
}
/**
*返回共享实例.
*/
public static SpringClientPlugin getDefault() {
return plugin;
}
/**
*返回在给定的插件相对路径下的图像文件的一个图像描写符
* @param path-路径
* @返回图像描写符
*/
public static ImageDescriptor getImageDescriptor(String path) {
return AbstractUIPlugin.imageDescriptorFromPlugin("SpringClient", path);
}
public BeanFactory getBeanFactory() {
return beanFactory;
}
}
8. 最后,添加依赖性以实现工程EclipseTradeClient依赖于你的新插件工程SpringClient。在工程EclipseTradeClient中,打开plugin.xml而且点击"Dependencies"选项卡。在"Required Plug-ins"节中,点击Add,选择"SpringClient(1.0.0)",而且点击OK(见图12)。
图12.把SpringClient添加为一个要求的插件
此刻,你必需在EclipseTradeClient manifest文件中添加与Eclipse的同伴计策相关的内容。在文件plugin.xml中,点击MANIFEST.MF选项卡而且添加下列进口:
Eclipse-RegisterBuddy: SpringClient
四. 建设一个新的WatchListView
此刻,你可以开始建设你本身的视图类了。首先,你要建设一个WatchListView,它将向应用措施处事器的StockDataService发出一个请求:
1. 在plugin.xml中,转到extensions选项卡。
2. 在All Extensions树中选择org.eclipse.ui.views,然后点击Add。
3. 随后呈现一个新的对话框窗口。在Extension Points树中转动而且选择org.eclipse.ui.views。在相应于org.eclipse.ui.views的可用模板中,选择SampleView,然后点击Next(见图13)。
图13.新的扩展对话框
4. 在"Main View Settings"窗口中,填写如下内容:
Java Package Name = eclipseTradeClient.views.watchlist
View Class Name = WatchListView
View Name = Watch List View
View Category ID = EclipseTradeClient
View Category Name = WatchList Category
让"Table Viewer"保持选择状态而且点选"Add the view to the resource perspective checked"(见图14)。点击Next。
图14.针对付Watch List视图配置"Main View Settings"
5. 在"View Features"下,保持默认配置而且点击Finish。
6. 此刻,你会在plugin.xml的"All Extensions"选项卡中看到新的"View and Category"。
7. 此刻,你可以开始编写你的Watch List视图了。这个调查列表是一个表格,因此首先要为此表实现接口ITableLabelProvider。在包eclipseTradeClient.views.watchlist下建设一个新类WatchListTableLabelProvider。你可以把一个ITableLabelProvider看成是JFace的等价物-Swing中的TableCellRenderer。下面是WatchListTableLabelProvider的代码部门:
#p#分页标题#e#
package eclipseTradeClient.views.watchlist;
import java.text.NumberFormat;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;
import stephenlum.services.stock.dto.StockDTO;
public class WatchListTableLabelProvider extends LabelProvider implements
ITableLabelProvider {
private static NumberFormat numberFormat = NumberFormat.getInstance();
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
public String getColumnText(Object element, int columnIndex) {
if (element != null) {
switch (columnIndex) {
case 0:
return ((StockDTO) element).getTickerSymbol();
case 1:
return ((StockDTO) element).getLastTrade().toString();
case 2:
return numberFormat.format(((StockDTO) element).getVolume());
case 3:
return ((StockDTO) element).getDaysRange();
case 4:
return numberFormat.format(((StockDTO) element).getAvgVol());
case 5:
return ((StockDTO) element).getDaysRange();
case 6:
return ((StockDTO) element).getFiftyTwoWeekRange();
case 7:
return ((StockDTO) element).getMarketCap();
}
}
return "";
}
}
8. 最后,你把你的WatchListView添加到Perspective类。在Package Explorer中打开类Perspective而且作如下修改以便WatchListView将呈现于该页面的底部:
package eclipseTradeClient;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IPerspectiveFactory;
import org.eclipse.ui.IFolderLayout;
import eclipseTradeClient.views.WatchListView;
public class Perspective implements IPerspectiveFactory {
public void createInitialLayout(IPageLayout layout) {
String editorArea = layout.getEditorArea();
layout.setEditorAreaVisible(false);
layout.setFixed(false);
layout.addStandaloneView(ExplorerView.ID,
false,
IPageLayout.LEFT,
0.25f,
editorArea);
IFolderLayout topLeft = layout.createFolder("TOP",
IPageLayout.TOP,
0.50f,
editorArea);
layout.addView(WatchListView.ID,IPageLayout.BOTTOM, 0.25f,editorArea);
}
}
9. 此刻,你可以在类WatchListView中举办添加。我只管保持模板生成的代码不动以便于你可以自由地添加你的代码。实质上,你是在添加一个表格-它将显示包括在一个类StockDTO实例中的所有信息。因此,表格中的列也是基于StockDTO的成员。我已经重定名了两个生成的Action-此刻action1可以或许从stocktradeserver中取回股票的列表而且在表格中显示它们,而action2从表格中删除所有元素(请参考源码中的列表1.eclipseTradeClient.views.watchlist)。
五. 运行应用措施
此刻,你可以运行你的应用措施了。假如还没有筹备好的话,你可以把stocktradeserver工程按如下步调导入到Eclipse:
1. 在Eclipse中,点击东西栏按钮"Deploy MyEclipse J2EE project to Server"(见图15)。
图15.宣布MyEclipse J2EE处事器按钮
确保在列表下的工程是stocktradeserver。点击Add,选择Tomcat 5作为你的处事器,而且点击Finish。当你看到一条动静"Successfully deployed"时,点击OK(见图16)。
图16.StockTradeServer被乐成宣布
此刻,启动Tomcat处事器(见图17)。Tomcat应该会乐成地启动。
图17.通过MyEclipse插件启动Tomcat
2. 启动"Eclipse Rich Client"。打开EclipseTradeClient’s plugin.xml文件,点击"Overview"选项卡,而且点击"Launch an Eclipse application"。当应用措施启动时,按下图18中的赤色按钮以获得一个股票列表。这一行为将利用Spring HttpInvoker从应用措施处事器取回股票列表。你可以按下赤色圆圈右边的按钮来排除股票列表(见图18)。
图18.EclipseTradeClient乐成运行
一切顺利!你已经乐成构建了一个小型的Eclipse富厚的客户端措施而且利用Spring remoting技能把它毗连到一个应用措施处事器上。
六. 小结
#p#分页标题#e#
总之,基于Eclipse RCP构建你的胖客户端措施将会大大淘汰构建这种措施的GUI框架所需的沉重代码。别的,通过把Spring remoting用作客户端/处事器通讯机制还答允你轻松地实现协议的切换,同时还提供其它所有在处事器端的Spring利益。