posts - 36, comments - 30, trackbacks - 0, articles - 3

扩展点:
org.eclipse.ui.ide.resourceFilters
org.eclipse.jdt.ui.javaElementFilters

org.eclipse.ui.ide.resourceFilters扩展点可以给Naivgator视图的过滤器列表增加过滤项,要使用该扩展点需要在插件依赖项中追加
对插件项目org.eclipse.ui.ide的依赖。

扩展清单如下:

<extension
           
point="org.eclipse.ui.ide.resourceFilters">
        
<filter
              
pattern="*.classpath"
              selected
="true">
        
</filter>
</extension>
上述代码的作用就是给Navigator视图,增加过滤器,过滤后缀名为classpath的文件,该过滤项默认为选中状态。

org.eclipse.jdt.ui.javaElementFilters扩展点可以给Java透视图中相应视图的过滤器列表增加过滤项,要使用该扩展点需要在插件依赖项中追加
对插件项目org.eclipse.jdt.ui的依赖。

扩展清单如下:

<extension
           
point="org.eclipse.jdt.ui.javaElementFilters">
        
<filter
              
description="TestFilter Des"
              enabled
="true"
              id
="aaaa"
              name
="TestFilter"
              pattern
="*.properties"
              targetId
="org.eclipse.jdt.ui.PackageExplorer">
        
</filter>
 
</extension>

上述代码的作用就是给Package视图,增加过滤器,过滤点后缀名为properties的文件,该过滤项默认为选中状态。

posted @ 2010-07-09 20:59 笑看人生 阅读(2271) | 评论 (0)编辑 收藏

扩展点:
org.eclipse.ui.bindings
org.eclipse.ui.contexts

扩展点org.eclipse.ui.bindings是给command增加快捷键,结合(介绍二),给命令com.xxxx.test.command1增加快捷键,
示例代码如下:

<extension
         
point="org.eclipse.ui.bindings">
      
<key
            
commandId="com.xxxx.test.command1"
            contextId
="org.eclipse.ui.contexts.window"
            schemeId
="org.eclipse.ui.defaultAcceleratorConfiguration"
            sequence
="M2+F7">
      
</key>  
</extension>

这样快捷键Shift+F7在Eclipse工作台上都会起作用,但是如果想让命令的快捷键只对特定的视图或者编辑器起作用,那么可以通过org.eclipse.ui.contexts扩展点来自定义上下文。

<extension
           
point="org.eclipse.ui.contexts">
        
<context
              
id="viewmenu.testcontext"
              name
="ViewContext"
              parentId
="org.eclipse.ui.contexts.window">
        
</context>
</extension>

扩展之后,需要修改org.eclipse.ui.bindings扩展中的contextId属性为viewmenu.testcontext。

另外还需要在需要增加该快捷键的编辑器或者视图对应类中增加如下代码(视图类在代码的createControl方法,编辑器类在代码的init方法):

IContextService contextService = 
(IContextService) getSite().getService(IContextService.
class);
contextService.activateContext(
"viewmenu.testcontext");

posted @ 2010-07-09 20:52 笑看人生 阅读(2702) | 评论 (0)编辑 收藏

原文地址:http://www.fengfly.com/plus/view-179398-1.html

菜单是各种软件及开发平台会提供的必备功能,Eclipse 也不例外,提供了丰富的菜单,包括主菜单(Main Menu),视图 / 编辑器菜单(ViewPart/Editor Menu)和上下文菜单(Context Menu)。在 Eclipse 中,几乎所有的 Workbench Part 提供了人性化的菜单,大大方便了用户的操作。因此,如何扩展 Eclipse 的菜单功能,并实现特定于我们自己插件的菜单,是插件开发者必须掌握的重要技能,同时,Eclipse 提供了丰富的扩展点供开发人员使用。本文将首先介绍 Eclipse 中的菜单,然后详细说明如何进行扩展,最后以一个实例的形式引导读者深入理解 Eclipse 的菜单功能。

  引言

  Eclipse 具有丰富的菜单功能,给开发人员提供了很好的用户体验。总体而言,Eclipse 菜单种类包括视图 / 编辑器菜单,主菜单(Main Menu),视图 / 编辑器菜单(ViewPart/EditorPart Menu)和上下文菜单(Context Menu)。插件开发人员通过灵活应用这些菜单,可以给用户提供很好的体验。由于视图和编辑器菜单功能类似,因此本文重点讲述视图菜单(视图下拉菜单及其工具栏菜单),除此之外,还将讲述主菜单和上下文菜单。

  如图 1 所示为 Project Explorer 视图的菜单,包括视图下拉菜单和工具栏菜单(折叠树节点)。通常而言,出现在视图工具栏的菜单都会出现在视图的下拉菜单,也就是说,比较常用的视图菜单放在视图的工具栏。

图 1. Project Explorer 视图的菜单

 

 

  如图 2 所示为 Project Explorer 视图中的上下文菜单,只有当我们右键点击时才会出现。通常而言,出现频率较高的菜单项才会出现在菜单中。上下文菜单具有很强的灵活项,它可以随着我们点击的对象不同,弹出的菜单也会有相应的变化。

图 2. Project Explorer 视图中的上下文菜单


  如图 3 所示为 Eclipse 的主菜单,包括最上面的主菜单项(不可移动)及其下面的工具栏菜单(可以移动,并且 Eclipse 提供了显示 / 不显示这些菜单的功能),Eclipse 并不建议我们为每一个插件都添加新的主菜单,这样容易造成冗余,而且不方便用户操作。通常,我们可以把菜单项添加到 Eclipse 已有的菜单,如插件的查找功能可以添加一个查找菜单项到 Eclipse 的 Search 主菜单上。

图 3. Eclipse 的主菜单


  前面讲到 Eclipse 的各种菜单,那么,如何在开发插件或 RCP 应用程序的时候添加这些菜单?本文下面的篇幅将详细介绍如何扩展 Eclipse 的菜单功能,使读者深入了解 Eclipse 的菜单功能,并能够开发具有这些菜单的应用程序。因此,必须掌握三方面的内容:菜单种类,菜单的扩展点,菜单控制(显示 / 隐藏或启用 / 禁用菜单项)。下面从概念上介绍这三方面内容,下一小节将会进行详细介绍。

  菜单种类

  正如前面所讲到的,Eclipse 的菜单包括视图菜单,主菜单及上下文菜单三个种类。

  菜单项的扩展点

  Eclipse 提供了两种扩展点供用户添加菜单项到相应的位置。这两种扩展点为 org.eclipse.ui.commands(本文简称为 Commands 方式)和 org.eclipse.ui.actionSets(本文简称为 Actions 方式)。Actions 方式为界面上不同区域的表现方式提供了相应的扩展点,并且没有分离其界面表现和内在实现。恰恰相反,Commands 方式通过三步有效的达到界面表现和内部实现的分离:首先,通过 org.eclipse.ui.commands 扩展点创建命令和类别(Category),并且可以把某些命令放在一个类别(Category)中;然后,通过 org.eclipse.ui.menus 指定命令出现在界面的哪个区域(视图菜单 / 主菜单 / 上下文菜单);最后通过 org.eclipse.ui.handlers 指定命令的实现。因此,Eclipse 推荐新开发的插件使用 Commands 来创建您的界面菜单。当然,由于 Actions 在现有的插件中用得比较多,如果我们需要扩展或基于之前的插件开发,也需要对其进行了解。除此之外,针对上下文菜单,虽然 Commands 和 Actions 方式均可以创建上下文菜单,但是 Eclipse 还提供了另外一种创建上下文菜单的扩展点 org.eclipse.ui.popupMenus(本文简称为 popupMenus 方式),本文将就这三种扩展点做详细的介绍。

  菜单控制

  菜单控制是一个非常常见的功能,例如,随着选定的内容或当前窗口的不同,菜单中的菜单项会有相应的变化(显示 / 隐藏或启用 / 禁用菜单项),因此,如何控制菜单是插件开发人员必须掌握的知识。Eclipse 为菜单控制提供了两种方法,一种是通过扩展点;另一种是通过 API 的方式编写程序控制。

  Eclipse 菜单功能及其扩展点

  至此,我们对 Eclipse 菜单有了感观的认识。由上一节我们可知,要深入理解 Eclipse 菜单功能,我们需要从三个方面去掌握:菜单种类,菜单的扩展点和菜单控制。下面将进行详细讲述。

  菜单种类

  针对各种菜单,Eclipse 提供了相应的扩展点,因此,开发人员可以通过这些扩展点把菜单放到界面的不同区域,详细内容请参考 2.2 小节。

  菜单的扩展点

  视图菜单的扩展点

  采用 Commands 方式创建视图菜单,需要引入 org.eclipse.ui.menus 扩展点;而 Actions 方式需要引入 org.eclipse.ui.actionSets.

  1、视图菜单(Commands 方式):

  MenuContribution locationURI = “[Scheme]:[id]?[argument-list]”

  其中,Scheme 为该菜单项出现的区域,menu 为视图的下拉菜单,toolbar 为视图的工具栏菜单;id 为菜单区域 ID;argument-list 为该菜单项出现在指定菜单的位置。

  例如:在 ProbelmView 的下拉菜单加一个菜单项,其 MenuContribution 的 locationURI 应为:menu:org.eclipse.ui.views.ProblemView?after=additions;在 ProblemView 的工具栏菜单中加入一个菜单项,其 locationURI 应为:toolbar:org.eclipse.ui.views.ProblemView?after=additions。

  2、视图菜单(Actions 方式):

  采用 Actions 方式创建菜单,需要引入 org.eclipse.ui.actionSets 扩展点,并通过设定 action 的 menubarPath 指定下拉菜单 / 菜单项出现的位置;通过设定 action 的 toolbarPath 设定工具栏菜单 / 菜单项出现的位置。

  例如,添加一个下拉菜单项到 Problems 视图中,其 menubarPath 应为:

  org.eclipse.ui.views.ProblemView/additions

  主菜单的扩展点

  1、主菜单(Commands 方式)

  通过 Commands 方式把菜单项添加到主菜单及其工具栏上,和视图菜单一样,也是通过扩展点 org.eclipse.ui.menus 实现,需要设定其 menuContribution 的 locationURI。

  例如,添加一个菜单(菜单可以包含若干个菜单项)到主菜单一栏中,其 locationURI 为:

  menu:org.eclipse.ui.main.menu?after=additions

  添加一个菜单到工具栏之中,其 locationURI 为:

  toolbar:org.eclipse.ui.main.toolbar?after=additions

  当然,我们也可以把菜单项添加到已经存在的菜单当中,例如添加一个菜单项到 Eclipse 的 Search 主菜单当中,其 locationURI 为:

  menu:org.eclipse.search.menu?dialogGroup

  2、主菜单(Actions 方式)

  通过 Actions 方式把菜单项添加到主菜单及其工具栏上,和视图菜单一样,也是通过扩展点 org.eclipse.ui.actionSets 实现,需要设定 action 的 menubarPath 和 toolbarPath 实现。

  例如,添加一个菜单项到 Eclipse 的 Search 主菜单中,其 menubarPath 应为:

  org.eclipse.search.menu/dialogGroup

  注意:如果采用上述方式添加一个菜单项到 Search 主菜单,当我们运行时并没有出现添加的菜单项,这时候需要换一个 workspace,其原因是 Eclipse 缓存了与其相关的某些信息在 workspace 当中。

  上下文菜单的扩展点

  上下文菜单除了通过 Commands 和 Actions 方式添加,还可以使用扩展点 org.eclipse.ui.popupMenus 方式添加,下面分别进行介绍。

  1、上下文菜单(Commands 方式)

  Commands 方式与添加视图菜单和主菜单的方式一样,通过设定其 menuContribution 的 locationURI 来实现。

  例如,添加一个上下文菜单到 Problems 视图中,其 locationURI 为:

  popup:org.eclipse.ui.views.ProblemView?after=additions。

  如果我们想让某个上下文菜单项出现在任何区域,则可以使用下面的 locationURI:

  popup:org.eclipse.ui.popup.any?after=additions

  2、上下文菜单(Actions 方式)

  Actions 方式没有直接提供扩展点添加上下文菜单,但是我们可以通过编程的方式实现,如下代码清单 1 为 TreeViewer 添加上下文菜单,通过 IMenuManager 的 add 方法添加 actions。

清单 1. 通过 Actions 方式编程实现添加上下文菜单

 private void hookContextMenu() { 
  IMenuManager fMenuMgr = new MenuManager(“#PopupMenu”); 
  fMenuMgr.setRemoveAllWhenShown(true); 
  // 添加 Actions 
  fMenuMgr.add(action … ) 
  fMenuMgr.createContextMenu(treeViewer.getControl()); 
  treeViewer.getControl().setMenu(fMenu); 
  getSite().registerContextMenu(fMenuMgr, treeViewer); 
 } 

  3、上下文菜单(popupMenus 方式)

  通过 popupMenus 扩展点实现上下文菜单,需要设定 objectContribution 的 objectClass 属性把上下文菜单添加到相应的区域。

  例如,如果我们想当用户点击 Eclipse 中的资源时,弹出的上下文菜单包括某个菜单项,我们可以设定 objectClass 属性为:

  org.eclipse.core.resources.IResource

  通过 Commands 方式创建菜单项

  通过 Commands 方式创建菜单项,首先需要创建 Command,通过扩展点 org.eclipse.ui.commands,然后我们可以把这个 Command 放到任何区域,上一小节已经讲到,通过 org.eclipse.ui.menus 扩展点确定菜单创建的区域,最后通过扩展点 org.eclipse.ui.handlers 定义这个 command 的具体行为。

  在创建 Command 时,我们可以先创建一个 Category,并把相关的一些命令放到这个 Category 中,这样有利于管理。代码清单 2 创建一个 Command(“Show in Glossary Explorer”),并放到一个 Category 中,然后把该 Command 放到 BGSearchResultView 视图的上下文菜单中,最后通过扩展 org.eclipse.ui.handlers 定义该 Command 的实现类。

清单 2. 通过 Commands 方式添加菜单项

 <!-- 添加 command --> 
 <extension 
   point="org.eclipse.ui.commands"> 
  <category 
   description="Business Glossary" 
   id="com.ibm.bg.ui.commands.category" 
   name="%category.BusinessGlossary.name"> 
  </category> 
  <command 
   categoryId="com.ibm.bg.ui.commands.category" 
   description="Show in Glossary Explorer" 
   id="com.ibm.bg.ui.commands.BGShowInBrowser" 
   name="%command.ShowInGE.name"> 
  </command> 
 </extension> 
 <!-- 把 Command 放到界面的对应区域 --> 
 <extension 
    point="org.eclipse.ui.menus"> 
  <menuContribution locationURI= 
  "popup:com.ibm.bg.internal.ui.search.BGSearchResultView?after=additions"> 
   <command 
      commandId="com.ibm.bg.ui.commands.BGShowInBrowser" 
      style="push" 
      tooltip="%command.ShowInGE.tooltip"> 
   </command> 
  </menuContribution> 
 </extension> 
 <!-- 定义 command 的实现类 --> 
 <extension 
   point="org.eclipse.ui.handlers"> 
  <handler 
     class="com.ibm.bg.internal.ui.handlers.BGShowInBrowser" 
     commandId="com.ibm.bg.ui.commands.BGShowInBrowser"> 
  </handler> 
 </extension> 

  通过 Actions 方式创建菜单项

  正如前面讲到,Actions 方式没有分离界面的表现和内部实现,因此,所有这些均通过 action 来完成。如下代码清单 3 为添加一个 Search 菜单项到 Eclipse 的 Search 主菜单(通过 action 的 menubarPath 指定)中,其中 class 对应的值为该 Action 的实现类,该类需要实现接口 IWorkbenchWindowActionDelegate。

清单 3. 通过 Actions 方式添加菜单项

 <extension 
   point="org.eclipse.ui.actionSets"> 
  <actionSet 
     id="com.ibm.bg.ui.workbenchActionSet" 
     label="%category.name.0" 
     visible="true"> 
   <action 
      class="com.ibm.bg.internal.ui.handlers.BGSearchHandler" 
      definitionId="com.ibm.bg.ui.commands.BGSearch" 
      icon="icons/search.png" 
      id="com.ibm.bg.ui.commands.BGSearch" 
      label="%action.searchGlossayInMainMenu.label" 
      menubarPath="org.eclipse.search.menu/dialogGroup" 
      style="push"> 
   </action> 
  </actionSet> 
 </extension> 

  通过 popupMenus 方式创建菜单项

  popupMenus 方式创建上下文菜单项也是通过 action 来实现,下面例子为添加一个菜单项到用户右击 IGraphicalEditPart 对象时弹出的上下文菜单,通过 menubarPath 指定该 Action 出现的区域,通过 class 指定该 action 的实现类,该类需要实现接口 IObjectActionDelegate。

清单 4. 通过 popupMenus 方式添加菜单项

 <extension 
   point="org.eclipse.ui.popupMenus"> 
  <objectContribution 
     adaptable="false" 
     id="com.ibm.bg.uml.objectContributions.BGAssignToGlossary" 
     objectClass="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart"> 
   <action 
      class="com.ibm.bg.internal.uml.actions.BGAssignToGlossary" 
      enablesFor="+" 
      icon="icons/assign.png" 
      id="com.ibm.bg.internal.uml.actions.BGAssignToGlossary" 
      label="%BGAssignToGlossary.item" 
      menubarPath="com.ibm.bg.uml.popupMenuGroup"> 
   </action> 
  </objectContribution> 
 </extension> 

  菜单控制

  视图菜单的控制主要包括启用 / 禁用,显示 / 隐藏菜单。

  通过 Command 方式创建的菜单,可以通过 org.eclipse.ui.commands 的 visibleWhen 属性控制菜单的隐藏和显示,通过 org.eclipse.ui.handlers 的 activewhen 或 enabledWhen 控制菜单的启用或禁用。

  通过 Actions 方式创建的菜单,可以通过 action 的 enablement 属性控制菜单的启用 / 禁用。

  通过 popupMenus 方式创建的菜单,可以通过 objectContribution 的 visibility 和 enablement 来设置该 objectContribution 下的 action 的显示 / 隐藏和启用 / 禁用,我们也可以设置 action 的 enablement 来控制该菜单的启用 / 禁用。

  这里不详细讲述 enablement,visibleWhen 和 enabledWhen 的参数及如何设置,读者可以参考第三节的例子和本文的参考文献。

  编程实践

  本文将结合前两节讲到的知识,以例子的形式说明如何创建并且控制菜单。首先创建一个视图(Menu Example),然后分别通过 Commands,Actions 和 popupMenus 方式创建若干个菜单,并添加相应的菜单控制点。

  创建 Menu Example 视图

  扩展 org.eclipse.views 创建“Menu Example”视图,如下代码清单 5 为创建视图的 xml 代码。

清单 5. 扩展 org.eclipse.ui.views 创建视图

 <extension 
   point="org.eclipse.ui.views"> 
  <category 
     id="com.free.menu.category" 
     name="Menu Example View"> 
  </category> 
  <view 
     category="com.free.menu.category" 
     class="com.free.menu.view.MenuExplorer" 
     id="com.free.menu.view.MenuExplorer" 
     name="Menu Explorer" 
     restorable="true"> 
  </view> 
 </extension> 

  创建 Commands

  采用 Command 方式创建“Menu Example”主菜单(包含 AngryCommand 和 JokeCommand 两个菜单项),并且基于这两个菜单项创建了 Menu Example 视图的下拉菜单和工具栏菜单,及其 TreeViewer 的上下文菜单。

  如下代码清单 6 为扩展 org.eclipse.ui.commands 创建 Menu Example 命令和类别,并且包含两个命令:Joke Command 和 Angry Command。

清单 6. 扩展 org.eclipse.ui.commands 创建命令

 <extension 
   point="org.eclipse.ui.commands"> 
  <category 
     id="com.free.menu.category" 
     name="Menu Example"> 
  </category> 
  <command 
     categoryId="com.free.menu.category" 
     id="com.free.menu.commands.jokeCommand" 
     name="Joke Command"> 
  </command> 
  <command 
     categoryId="com.free.menu.category" 
     id="com.free.menu.commands.angryCommand" 
     name="Angry Command"> 
  </command> 
 </extension> 

  关联 Commands 到主菜单

  如下代码清单 7 为扩展 org.eclipse.ui.menus,并基于前面创建的 Comands,添加一个主菜单 Menu Example,并且包含 Joke Command 和 Angry Command 菜单项。

清单 7. 创建 Menu Example 主菜单

 <menuContribution 
   locationURI="menu:org.eclipse.ui.main.menu?after=additions"> 
  <menu 
   id="com.free.menu.MenuExample" 
     label="Menu Example"> 
   <command 
      commandId="com.free.menu.commands.jokeCommand" 
      style="push"> 
   </command> 
   <command 
      commandId="com.free.menu.commands.angryCommand" 
      style="push"> 
   </command> 
  </menu> 
 </menuContribution> 

  Commands 的实现类

  如下代码清单 9 所示扩展 org.eclipse.ui.handlers 为 Joke Command 和 Angry Command 创建事件处理类,其中 Joke Command 通过 enabledWhen 属性控制该菜单项是否启用,当我们同时选择了两个对象时 Joke Command 处于启用状态,否则为禁用。

清单 9. 扩展 org.eclipse.ui.handlers 为 Commands 创建实现类

 <extension 
   point="org.eclipse.ui.handlers"> 
  <handler 
     class="com.free.menu.actions.JokeCommand" 
     commandId="com.free.menu.commands.jokeCommand"> 
   <enabledWhen> 
     <count 
        value="2"> 
     </count> 
   </enabledWhen> 
  </handler> 
  <handler 
     class="com.free.menu.actions.AngryCommand" 
     commandId="com.free.menu.commands.angryCommand"> 
  </handler> 
 </extension> 

  创建 Action 并关联到 Eclipse 的 Search 主菜单

  采用 Actions 方式在 Eclipse 的主菜单 Search 中添加创建菜单项 SmileAction。扩展 org.eclipse.ui.actionSets 在 Eclipse 的主菜单 Search 中添加一个菜单项 Smile Action。如下代码清单 10 所示创建该 action 并添加到 search 主菜单,只有当我们选择至少一个对象时(设置 enablesFor 属性为“+”),该菜单项才处于启用状态。

清单 10. 通过 Actions 方式创建菜单项

 <extension 
   point="org.eclipse.ui.actionSets"> 
  <actionSet 
     id="com.free.menu.actionSet.MenuExample" 
     label="Menu Example" 
     visible="true"> 
   <action 
      class="com.free.menu.actions.SmileAction" 
      enablesFor="+" 
      icon="icons/searchres.gif" 
      id="com.free.menu.actions.smileAction" 
      label="Smile Action" 
      menubarPath="org.eclipse.search.menu/dialogGroup" 
      style="push"> 
   </action> 
  </actionSet> 
 </extension> 

  pupupMenus 方式创建 Action 并关联到 IResource 资源的上下文菜单

  扩展 org.eclipse.ui.popupMenus 创建菜单“Menu Example”,该菜单包含一个菜单项 HelloAction。当我们在 Eclipse 任何区域右击 org.eclipse.core.resources.IResource 资源时弹出的上下文菜单中会出现“Menu Example”菜单。如下代码清单 11 为创建该上下文菜单的 xml 代码。

清单 11. popupMenus 方式创建上下文菜单

 <extension 
   point="org.eclipse.ui.popupMenus"> 
  <objectContribution 
     adaptable="true" 
     id="com.free.menu.popupMenu" 
     objectClass="org.eclipse.core.resources.IResource"> 
   <menu 
      label="Menu Example" 
      path="additions" 
      id="com.free.menu.popupSubMenu"> 
     <separator 
        name="additions"> 
     </separator> 
   </menu> 
   <action 
      label="Hello Action" 
      class="com.free.menu.popup.actions.HelloAction" 
      menubarPath="com.free.menu.popupSubMenu/additions" 
      enablesFor="1" 
      id="com.free.menu.newAction"> 
   </action> 
  </objectContribution> 
 </extension> 

  pupupMenus 方式创建 Action 并关联到 IResource 资源的上下文菜单

  扩展 org.eclipse.ui.popupMenus 创建菜单项 GreetAction 和 CryAction,当我们右击 Menu Example 视图中的 TreeViewer 节点时弹出。如下代码清单 12 所示扩展 org.eclipse.ui.popupMenus 为 Menu Example 视图创建 GreetAction 和 CryAction 上下文菜单项。使用 visiblity 的 objectState 属性控制菜单项的可见状态,使用该属性要求其选择的对象实现了 org.eclipse.ui.IActionFilter 接口,具体可参见 Person 类的实现。

清单 12. 扩展 org.eclipse.ui.popupMenus 创建菜单

 <extension 
   point="org.eclipse.ui.popupMenus"> 
  <objectContribution 
     adaptable="false" 
     id="com.free.menu.views.popupMenu" 
     objectClass="com.free.menu.model.Person"> 
   <action 
      class="com.free.menu.actions.GreetAction" 
      enablesFor="+" 
      id="com.free.menu.actions.greetAction" 
      label="Greet Action" 
      menubarPath="additions"> 
   </action> 
   <visibility> 
     <objectState 
        name="firstName" 
        value="Dan"> 
     </objectState> 
   </visibility> 
  </objectContribution> 
 </extension> 
 <extension 
   point="org.eclipse.ui.popupMenus"> 
  <objectContribution 
     adaptable="false" 
     id="com.free.menu.views.popupMenu2" 
     objectClass="com.free.menu.model.Person"> 
   <action 
      class="com.free.menu.actions.CryAction" 
      enablesFor="+" 
      id="com.free.menu.actions.cryAction" 
      label="Cry Action" 
      menubarPath="additions"> 
     <enablement> 
      <objectState 
         name="firstName" 
         value="David"> 
      </objectState> 
     </enablement> 
   </action> 
   <visibility> 
     <objectState 
        name="lastName" 
        value="Rubel"> 
    </objectState> 
   </visibility> 
  </objectContribution> 
 </extension> 

  Menu Example 视图的代码实现类

  如下代码清单 13 所示为 Menu Example 视图的代码,该视图中有一个 TreeViewer,并通过函数 hookContextMenu 把上下文菜单关联到 TreeViewer。其中函数 viewMenuAction 用于更新菜单的状态,它首先获取视图菜单,然后调用 IMenuManager 的 update 方法更新对应菜单项的状态,从而达到控制菜单的目的。

清单 13. Menu Example 视图代码

 public class MenuExplorer extends ViewPart { 
  private TreeViewer treeViewer; 
  private MenuManager fMenuMgr; 
  private Menu fMenu; 
  private static MenuExplorer fInstance = null; 
  public MenuExplorer() { 
    fInstance = this; 
  } 
  public static MenuExplorer getInstance(){ 
    return fInstance; 
  } 
  public void createPartControl(Composite parent) { 
    treeViewer = new TreeViewer (parent, SWT.MULTI); 
    treeViewer.setLabelProvider(new PersonListLabelProvider()); 
    treeViewer.setContentProvider(new PersonTreeContentProvider()); 
    treeViewer.setInput(Person.example()); 
    this.getSite().setSelectionProvider(treeViewer); 
    hookContextMenu(); 
    fInstance = this; 
     
  } 
  public void setViewMenuActionState(boolean state){     
    JokeCommand.setState(state); 
    viewMenuAction(); 
  } 
  private void viewMenuAction() { 
    IActionBars bars= getViewSite().getActionBars(); 
    final IMenuManager menu= bars.getMenuManager();   
     
    UIOperation.asyncExecCommand(new Runnable(){ 
      public void run() { 
        menu.update("com.free.menu.commands.jokeAction"); 
      }       
    });     
  } 
  private void hookContextMenu() { 
    fMenuMgr = new MenuManager("#PopupMenu"); 
    fMenuMgr.setRemoveAllWhenShown(true); 
    fMenuMgr.addMenuListener(new IMenuListener() { 
      public void menuAboutToShow(IMenuManager manager) {         
      } 
    }); 
    fMenu = fMenuMgr.createContextMenu(treeViewer.getControl()); 
 
    treeViewer.getControl().setMenu(fMenu); 
    getSite().registerContextMenu(fMenuMgr, treeViewer);        
  }   
  public void setFocus() { 
    treeViewer.getTree().setFocus(); 
 
  } 
 } 

  Person 类的实现

  如下代码清单 14 为 Person 类的实现,用于表示 MenuExample 视图中 TreeViewer 的一个节点,它实现了 IActionFilter 接口,通过 testAttribute 来确定是否显示 / 隐藏菜单(其中 target 表示用户选择的对象,name/value 对应于 plugin.xml 文件中 objectState 的 name/value).

清单 14. Person 类实现

 public class Person implements IActionFilter { 
 
  private String firstName = "John"; 
  private String lastName = "Doe"; 
  protected int age = 37; 
  public Person[] children = new Person[0]; 
  public Person parent = null; 
  public Person(String firstName, String lastName, int age) { 
    this.firstName = firstName; 
    this.lastName = lastName; 
    this.age = age; 
  } 
  public Person(String firstName, String lastName, int age, Person[] children) { 
    this(firstName, lastName, age); 
    this.children = children; 
    for (int i = 0; i < children.length; i++) { 
      children[i].parent = this; 
    } 
  } 
  public String getFirstName() { 
    return this.firstName; 
  } 
  public String getLastName() { 
    return this.lastName; 
  } 
  public static Person[] example() { 
    return new Person[] { 
        new Person("Dan", "Rubel", 38, new Person[] { 
            new Person("Beth", "Rubel", 8), 
            new Person("David", "Rubel", 3) }), 
        new Person("Eric", "Clayberg", 39, new Person[] { 
            new Person("Lauren", "Clayberg", 6), 
            new Person("Lee", "Clayberg", 4) }), 
        new Person("Mike", "Taylor", 52) }; 
  } 
  public String toString() { 
    return firstName + " " + lastName; 
  } 
  public boolean testAttribute(Object target, String name, String value) { 
 
    if (target instanceof Person) { 
      Person person = (Person) target; 
      if (name.equals("firstName") && value.equals(person.getFirstName())) { 
        return true; 
      } 
 
      if (name.equals("lastName") && value.equals(person.getLastName())) { 
        return true; 
      } 
    } 
    return false; 
  } 
 } 

  总结

  至此为止,已经把 Eclipse 菜单功能及其扩展点涉及到的类 / 接口 /API 进行了详细的说明,相信读者已经有清晰的认识了。对于前面提到 popupMenus 方式创建上下文菜单,要求选择的对象实现 IActionFilter 接口,但是,如果开发人员正在使用 gmf 进行开发,那么我们可以不必要求选择的对象实现 IActionFilter,我们可以通过扩展 org.eclipse.gmf.runtime.common.ui.services.action.actionFilterProviders 对菜单项进行控制,如下代码清单 15 为扩展该 extension point 的 xml 代码,我们可以定义多个属性(<Attribute> … </Attribute),其中 Attribute 的 name 和 value 对应于 visibility 的 objectState 中的 name 和 value。

清单 15. 通过 actionFilterProviders 扩展点实现对菜单的控制

 <extension 
 point="org.eclipse.gmf.runtime.common.ui.services.action.actionFilterProviders"> 
   <ActionFilterProvider 
      class="com.free.menu.PopupActionFilterProvider"> 
    <Priority 
       name="Medium"> 
    </Priority> 
    <Attribute 
       name="com.ibm.bg.uml.search.isSupportedType" 
       value="supported"> 
    </Attribute> 
   </ActionFilterProvider> 
 </extension> 

  如下代码清单 16 所示 PopupActionFilterProvider 的实现,它继承 AbstractActionFilterProvider,只需要实现其中的 testAttribute 和 provides 方法,当 testAttribute 返回 true 时,那么该菜单项被启用,否则禁用。其中 target 对应于我们选择的对象,name 和 value 参数对应于 visiblity 中 objectState 的 name 和 value 的指定值 ( 与前面提到的 Person 类中的 testAttribute 方法类似 )。


清单 16. actionFilterProviders 扩展点实现类

 public class PopupActionFilterProvider extends AbstractActionFilterProvider { 
 
 
  public PopupActionFilterProvider() { 
  } 
 
  public boolean testAttribute(Object target, String name, String value) { 
       
  } 
 
  public boolean provides(IOperation operation) { 
    return false; 
  } 
 
 }

 

 

 

posted @ 2010-07-03 16:00 笑看人生 阅读(1819) | 评论 (0)编辑 收藏

扩展点:
org.eclipse.ui.menus(确定菜单创建的区域)
org.eclipse.ui.commands
org.eclipse.ui.handlers(command的具体行为)
org.eclipse.ui.commandImages(comand的图片)

扩展点org.eclipse.ui.menus用来对菜单进行扩展,可以对主菜单,工具栏,上下文菜单进行扩展。

示例代码如下:
<extension
         
point="org.eclipse.ui.menus">
      
<menuContribution
            
allPopups="false"
            locationURI
="menu:org.eclipse.ui.main.menu?after=additions">
         
<command
               
commandId="com.xxxx.test.command1"
               style
="push">
         
</command>
      
</menuContribution>
</extension>

其中locationURI属性指定菜单扩展的位置,上述代码是对主菜单进行扩展,如果要对工具栏和上下文菜单进行扩展,书写格式如下:

toolbar:org.eclipse.ui.main.toolbar?after=additions
popup:org.eclipse.ui.popup.any?after=additions(上下文菜单在任何位置出现)
popup:org.eclipse.ui.views.ProblemView?after=additions(上下文菜单在问题视图中出现)

commandId属性指定该menu对应的command,一个menu可以对应多个command。

command可以通过扩展点org.eclipse.ui.commands扩展,示例代码如下:

<extension
         
point="org.eclipse.ui.commands">
<category
            
id="com.xxxx.test.category1"
            name
="MenuTest">
      
</category>

      
<command
categoryId="="com.xxxx.test.category1"
            id
="com.xxxx.test.command1"
            name
="CommandA">
      
</command>
 
</extension>

至于Command具体要做什么,需要通过扩展点org.eclipse.ui.handlers来指定,示例代码如下:

<extension
         
point="org.eclipse.ui.handlers">
      
<handler
            
class="com.xxxx.test.SampleHandler"
            commandId
="com.xxxx.test.command1">
      
</handler>
 
</extension>

还有扩展点org.eclipse.ui.commandImages,可以指定Command对应的图标。

 <extension
         
point="org.eclipse.ui.commandImages">
      
<image
            
commandId="com.xxxx.test.command1"
            icon
="icons/sample.gif">
      
</image>
  
</extension>

posted @ 2010-07-03 15:55 笑看人生 阅读(2744) | 评论 (0)编辑 收藏

扩展点:org.eclipse.core.runtime.preferences
功能:该扩展点主要用来设置首选项的初始值;

扩展点示例:

<extension
         
point="org.eclipse.core.runtime.preferences">
      
<initializer
            
class="com.xxxx.test.AbstractPreferenceInitializer1">
      
</initializer>
</extension>

initializer指定设置首选项初始值的类,示例代码如下:

public class AbstractPreferenceInitializer1 extends
        AbstractPreferenceInitializer 
{    
    @Override
    
public void initializeDefaultPreferences() {
        IPreferenceStore prefs 
= Activator.getDefault().getPreferenceStore();
        prefs.setDefault(
"MAX"1000);
    }

}


上述代码设置属性MAX的初始值为1000,这个属性就可以被首选项使用了。

使用扩展点org.eclipse.ui.preferencePages扩展首选项

扩展点示例:

<extension
         
point="org.eclipse.ui.preferencePages">
      
<page
            
class="com.xxxx.test.WorkbenchPreferencePage1"
            id
="com.xxxx.test.page1"
            name
="testName">
      
</page>
</extension>

这样就可以在WorkbenchPreferencePage1类中使用刚才定义的属性MAX了,示例代码如下:

public class WorkbenchPreferencePage1 extends FieldEditorPreferencePage implements
        IWorkbenchPreferencePage 
{

    
public void init(IWorkbench workbench) {
        setPreferenceStore(Activator.getDefault().getPreferenceStore());        
    }

    @Override
    
protected void createFieldEditors() {
        
int max = getPreferenceStore().getDefaultInt("MAX");    
        System.out.println(
""+max);
    }
    
}


posted @ 2010-07-03 15:22 笑看人生 阅读(2586) | 评论 (0)编辑 收藏

原址地址:http://hi.baidu.com/dangjun625/blog/item/a0732c0845181ddc63d98666.html

MyEclipse has detected that less than 5% of the 64MB of Perm
Gen (Non-heap memory) space remains. It is strongly recommended
that you exit and restart MyEclipse with new virtual machine memory
paramters to increase this memory.   Failure to do so can result in
data loss. The recommended Eclipse memory parameters are:
eclipse.exe -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M

eclipse根目录下面的 eclipse.ini 配置 从网上搜了些资料

-vmargs:说明后面是VM的参数
-Xms128m:虚拟机占用系统的最小内存
-Xmx512m:虚拟机占用系统的最大内存的5%为25.6M,理论上要求-Xmx的数值与-XX:MaxPermSize必须大于25.6M
-XX:PermSize:最小堆大小。一般报内存不足时,都是说这个太小, 堆空间剩余小于5%就会警告,建议把这个稍微设大一点,不过要视自己机器内存大小来设置
-XX:MaxPermSize:最大堆大小。这个也适当大些

把里面的参数改为
-vmargs  
-Xms128M  
-Xmx512M  
-XX:PermSize=128M  
-XX:MaxPermSize=256M
问题解决!

从网上的资料看PermSize大一点肯定更好,而且最好是设置PermSize和MaxPermSize一样大。理由如下:
PermSize 和MaxPermSize如果设置为相同还可以在一定程度上提高性能,因为,PermSize在不断的变化中会需要转移其中的数据。如果固定了以后,则可以减少每次扩大PermSize带来的性能损失。

1、PermGen space简介
  
  PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。
  
  说说为什么会内存益出:
  (1)这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同。
  (2) GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS 的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。
  
  如果你的WEB APP下都用了大量的第三方jar,其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。

解决方法: 手动设置MaxPermSize大小
  
  修改TOMCAT_HOME/bin/catalina.bat,在echo "Using CATALINA_BASE: $CATALINA_BASE"上面加入以下行:
   JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
  建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以减少jar 文档重复占用内存

1。参数的含义

-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M

参数中-vmargs的意思是设置JVM参数,所以后面的其实都是JVM的参数了,我们首先了解一下JVM内存管理的机制,然后再解释每个参数代表的含义。
堆(Heap)和非堆(Non-heap)内存
按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。
堆内存分配
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。
非堆内存分配
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
JVM内存限制(最大值)
首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了。

2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动?

通过上面对JVM内存管理的介绍我们已经了解到JVM内存包含两种:堆内存和非堆内存,另外JVM最大内存首先取决于实际的物理内存和操作系统。所以说设置VM参数导致程序无法启动主要有以下几种原因:
1) 参数中-Xms的值大于-Xmx,或者-XX:PermSize的值大于-XX:MaxPermSize;
2) -Xmx的值和-XX:MaxPermSize的总和超过了JVM内存的最大限制,比如当前操作系统最大内存限制,或者实际的物理内存等等。说到实际物理内存这里需要说明一点的是,如果你的内存是1024MB,但实际系统中用到的并不可能是1024MB,因为有一部分被硬件占用了。

3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置?
那为什么同样的参数在快捷方式或者命令行中有效而在eclipse.ini文件中是无效的呢?这是因为我们没有遵守eclipse.ini文件的设置规则:
参数形如“项 值”这种形式,中间有空格的需要换行书写,如果值中有空格的需要用双引号包括起来。比如我们使用-vm C:\Java\jre1.6.0\bin\javaw.exe参数设置虚拟机,在eclipse.ini文件中要写成这样:
-vm
C:\Java\jre1.6.0\bin\javaw.exe
按照上面所说的,最后参数在eclipse.ini中可以写成这个样子:
-vmargs
-Xms128M
-Xmx512M
-XX:PermSize=64M
-XX:MaxPermSize=128M
实际运行的结果可以通过Eclipse中“Help”-“About Eclipse SDK”窗口里面的“Configuration Details”按钮进行查看。
另外需要说明的是,Eclipse压缩包中自带的eclipse.ini文件内容是这样的:
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
-vmargs
-Xms40m
-Xmx256m
其中–launcher.XXMaxPermSize(注意最前面是两个连接线)跟-XX:MaxPermSize参数的含义基本是一样的,我觉得唯一的区别就是前者是eclipse.exe启动的时候设置的参数,而后者是eclipse所使用的JVM中的参数。其实二者设置一个就可以了,所以这里可以把–launcher.XXMaxPermSize和下一行使用#注释掉。

3. 其他的启动参数。 如果你有一个双核的CPU,也许可以尝试这个参数:

-XX:+UseParallelGC

让GC可以更快的执行。(只是JDK 5里对GC新增加的参数)

 

补充:

可以在myelipse里选中相应的服务器比如tomcat5,展开里面的JDK子项页面,来增加服务器启动的JVM参数设置:

-Xms128m
-Xmx256m
-XX:PermSize=128M
-XX:MaxNewSize=256m
-XX:MaxPermSize=256m

posted @ 2010-06-26 21:37 笑看人生 阅读(510) | 评论 (0)编辑 收藏

Ajax中的XMLHttpRequest对象提供了两个属性来访问服务器端相应。

  • responseText:将相应作为一个字符串返回;(系列一中已经介绍)
  • responseXML:将相应作为一个XML对象返回;(本系列中介绍)
本节要介绍的内容,很多人应该比较熟悉,比如在网上注册时,在“省”列表框中选择不同的省份,对应的“市”列表框中出现该省的所有市,这个过程,不用刷新整个页面。

要实现这个功能,只须修改一下系列一中的index.jsp和AjaxServlet.java这两个文件。

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding
="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>

<script language="javascript">
    
var xmlHttp;
    
function refresh() {
        xmlHttp 
= createXMLHttpRequest();
        
var url = "AjaxServlet?province="
                
+ document.getElementById("province").value;
        xmlHttp.open(
"GET", url);
        xmlHttp.onreadystatechange 
= handleStateChange;
        xmlHttp.send(
null);
    }

    
function handleStateChange() {
        
if (xmlHttp.readyState == 4) {
            
if (xmlHttp.status == 200) {
                updateCity();
            }
        }
    }

    
function updateCity() {
        clearCity();
        
var city = document.getElementById("city");
        
var cities = xmlHttp.responseXML.getElementsByTagName("city");        
        
for(var i=0;i<cities.length;i++){
            option 
= document.createElement("option");
            option.appendChild(document.createTextNode(cities[i].firstChild.nodeValue));
            city.appendChild(option);                        
        }
    }

    
function clearCity() {        
        
var city = document.getElementById("city");
        
while(city.childNodes.length > 0) {
            city.removeChild(city.childNodes[
0]);
        }                    
    }
    
    
function createXMLHttpRequest() {
        
if (window.ActiveXObject) {
            xmlHttp 
= new ActiveXObject("Microsoft.XMLHTTP");
        } 
else if (window.XMLHttpRequest) {
            xmlHttp 
= new XMLHttpRequest();
        }
        
return xmlHttp;
    }
</script>

<body>
<form action="#"><select id="province" onchange="refresh()">
    
<option value="">Select One</option>
    
<option value="jiangsu">Jiang Su</option>
    
<option value="zhejiang">Zhe Jiang</option>
</select> <br>
<br>
<br>
<select id="city"></select></form>
</body>

</html>

AjaxServlet.java

package servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AjaxServlet extends HttpServlet {

    
private static final long serialVersionUID = 7032718233562299325L;

    @Override
    
protected void doPost(HttpServletRequest req, HttpServletResponse response)
            
throws ServletException, IOException {
        processRequest(req, response, 
"POST");
    }

    @Override
    
protected void doGet(HttpServletRequest req, HttpServletResponse response)
            
throws ServletException, IOException {
        processRequest(req, response, 
"GET");
    }

    
private void processRequest(HttpServletRequest req,
            HttpServletResponse response, String method) 
throws IOException {
        String province 
= req.getParameter("province");
        StringBuffer cities 
= new StringBuffer("<cities>");
        
        
if("jiangsu".equals(province)){
            cities.append(
"<city>Nanjing</city>");
            cities.append(
"<city>Zhenjiang</city>");
        }
else if("zhejiang".equals(province)){
            cities.append(
"<city>Hanzhou</city>");
            cities.append(
"<city>Wenzhou</city>");
        }        
        
        PrintWriter writer 
= response.getWriter();    
        cities.append(
"</cities>");
        response.setContentType(
"text/xml");
        writer.write(cities.toString());
        writer.close();
    }
}




posted @ 2009-11-15 09:28 笑看人生 阅读(230) | 评论 (0)编辑 收藏

简单介绍一下Ajax应用程序的基本流程:

  1. 创建XMLHttpRequest对象;
  2. 从页面中获取获取需要的数据;
  3. 建立要连接的URL;
  4. 打开与服务器的连接;
  5. 设置服务器相应之后要调用的函数,即回调函数;
  6. 发送请求;
下面以一个简单的例子来演示一下,该例子要完成的功能是使用Ajax技术对输入的EMail地址进行简单校验,根据校验的结果,在页面显示相应的消息。

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding
="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>

<script language="javascript">
      
var xmlHttp;  
     
function sendreq(){  
       xmlHttp 
= createXMLHttpRequest();  //步骤1
       
var url = "AjaxServlet?email=" + document.getElementById("email").value;//步骤2,3
       xmlHttp.open(
"GET", url);  //步骤4
       xmlHttp.onreadystatechange 
= handleStateChange; //步骤5
       xmlHttp.send(
null);    //步骤6
    }  
     
function handleStateChange(){       
      
if(xmlHttp.readyState == 4){  
         
if(xmlHttp.status == 200){             
             document.getElementById(
"result").innerHTML=xmlHttp.responseText;  
         }  
       }  
     }  
     
function createXMLHttpRequest(){  
         
if (window.ActiveXObject){  
             xmlHttp 
= new ActiveXObject("Microsoft.XMLHTTP");  
         }  
         
else if (window.XMLHttpRequest){  
             xmlHttp 
= new XMLHttpRequest();  
         }  
         
return xmlHttp;  
     }  
    
    
</script>
<body>
  
<label id="result">&nbsp;</label><br>
  Email:
<input type="text" id="email" onblur="sendreq()" value="" />  
  
<label id="result">&nbsp;</label>
  
</body>
</html>

AjaxServlet.java

package servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AjaxServlet extends HttpServlet {

    
private static final long serialVersionUID = 7032718233562299325L;

    @Override
    
protected void doPost(HttpServletRequest req, HttpServletResponse response)
            
throws ServletException, IOException {
        processRequest(req, response, 
"POST");
    }

    @Override
    
protected void doGet(HttpServletRequest req, HttpServletResponse response)
            
throws ServletException, IOException {
        processRequest(req, response, 
"GET");
    }

    
private void processRequest(HttpServletRequest req,
            HttpServletResponse response, String method) 
throws IOException {
        String email 
= req.getParameter("email");
        StringBuffer validator 
= new StringBuffer("");
        validator.append(method);
        response.setContentType(
"text/html;charset=UTF-8");
        PrintWriter writer 
= response.getWriter();
        
if (email.indexOf("@"< 0) {
            validator.append(
":FAILURE!");
        }
else{
            validator.append(
":SUCCESS!");
        }
        writer.write(validator.toString());
        writer.close();
    }
}

GET和POST请求方式区别:

  • POST方法将参数串放在请求体中发送;
  • GET方法将参数串放在URL中发送;

如果数据处理不改变数据模型的状态,建议使用GET方式,如果需要改变数据模型的状态,建议使用POST方式;

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
    xmlns
="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    
<display-name>ajax</display-name>
    
<welcome-file-list>
        
<welcome-file>index.jsp</welcome-file>
    
</welcome-file-list>
    
<servlet>
        
<servlet-name>AjaxServlet</servlet-name>
        
<servlet-class>servlet.AjaxServlet</servlet-class>
    
</servlet>
    
<servlet-mapping>
        
<servlet-name>AjaxServlet</servlet-name>
        
<url-pattern>/AjaxServlet</url-pattern>
    
</servlet-mapping>
</web-app>


posted @ 2009-11-01 12:31 笑看人生 阅读(312) | 评论 (0)编辑 收藏

最近在升级JDK版本后,启动Eclipse时候,遇到这样的问题:
JVM terminated.Exit code=1.
在网上找了些资料,找到了解决方法。
只要修改eclipse.ini文件即可。修改内容如下:
-startup
plugins\org.eclipse.equinox.launcher_1.0.100.v20080509-1800.jar
--launcher.library
plugins\org.eclipse.equinox.launcher.win32.win32.x86_1.0.100.v20080509-1800
-showsplash
vm
D:\Java\jdk15011\bin\javaw.exe
org.eclipse.platform
--launcher.XXMaxPermSize
256m
-vmargs
-Xms40m
-Xmx256m
其中粗体部分为新增内容。

posted @ 2008-07-27 21:22 笑看人生 阅读(11592) | 评论 (4)编辑 收藏

 

问题描述:

最近在做Eclipse插件开发的时候,在国际化的问题上遇到这样问题,比如我的plugin.xml文件中,通过%xxx来引用plugin_zh.properties中对应键xxx的信息时,在插件运行时,相应的信息显示不了,后来进过研究,发现是由于在MANIFEST.MF少配置了一项造成的

Bundle-Localization: plugin

而这一项配置我在Overview标签页上没有找到相应设置的地方,把这个在MANIFEST.MF加上,插件在运行时,就可以显示plugin_zh.properties中定义的消息了。

posted @ 2008-04-23 19:44 笑看人生 阅读(1591) | 评论 (0)编辑 收藏

仅列出标题
共4页: 上一页 1 2 3 4 下一页