使用 Rational Development 工具和 WebSphere Application Server V8.5 开发基于 EJB 的 OSGi 应用

免费下载:IBM® WebSphere® Application Server 试用版

下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

概述 WebSphere 中 OSGi 应用对 EJB3.x 的支持

WebSphere Application Server V8.5 对 OSGi 一个最重要的增强就是提供了对 EJB3.x 的支持(目前暂时不支持 EJB2.x 及以前的版本),OSGi 应用可以包含 EJB 模块,并能直接的访问和调用包含在其内的 EJB。我们可以在 OSGi 应用中添加包含 Stateful,Stateless,Singleton 以及 Message-Driven Beans 的 EJB 模块,所有的 EJB 功能都能在 OSGi 应用中继续保留,这与之前 JEE 应用中的 EJB 模块一样。对于包含 EJB 模块的 OSGi 应用,在对其进行部署,配置和更新的时候,采取的方法与之前对非 OSGi 应用采取的方法是一样的(包括命令行和控制台两种方法)。

开发人员可以选择将 EJB Bundle 打包到 OSGi 应用中(EBA 文件),也可以将其导入到 WAS 的内部 Bundle 存储库中,然后在 OSGi 应用的元数据文件(APPLICATION.MF)中添加对该 EJB Bundle 的引用,这两种方式达到的效果是相同的。


图 1. 管理包含 EJB 的 OSGi 应用
图 1. 管理包含 EJB 的 OSGi 应用

只需要很少的代码改动就可以将已经存在的 EJB 模块转化成 EJB Bundle 并对其添加 OSGi 的功能特性,一个 EJB Bundle 本质上就是一个 EJB 模块加上一个元数据描述文件(MANIFEST.MF)。我们通过在 MANIFEST.MF 中引入一个新的属性标识“Export-EJB:

”将一个 Bundle 定义为 EJB Bundle, EJB 容器负责加载并运行这些 EJB Bundle。

在“Export-EJB:”后面指定的 EJBs 将会以 OSGi 服务的形式进行发布,其他的 OSGi Bundle 可以查找并使用这些服务,没有在“Export-EJB:”后列出的 EJBs 依然会被加载和运行,但是这些 EJBs 对于服务存储库是不可见的,其他的 Bundle 不能使用未被列出的 EJBs。除了在“Export-EJB:”后面指定特定的 EJBs,还可以使用如下值设置:

  • 冒号后加一个空格:表明将 Bundle 中所有的 EJBs 发布成 OSGi 服务并导出供其他 Bundle 使用
  • NONE:表明不将任何的 EJBs 发布为 OSGi 服务

图 2. 在 OSGi 应用中使用 EJB
图 2. 在 OSGi 应用中使用 EJB

搭建开发环境

在上文中我们简单的介绍了在 WAS V8.5 中 OSGi 应用对 EJB 的支持,在接下来,我们会通过几个实例向大家讲解如何去开发基于 EJB 的 OSGi 应用,在开始实例之前,我们需要搭建开发环境,主要用到的软件和开发工具包括:

  • Eclipse 3.6(Helios) 或者 3.7(Indigo),本文我们使用 Indigo 版本
  • WebSphere Application Server V8.5 (可以下载免费的开发者版本)
  • IBM WebSphere Application Server V8.5 Developer Tools(WDT)
  • IBM Rational Development Tools for OSGi Applications

我们假设读者已经安装好了 Eclipse 和 WAS V8.5,在这里只介绍如何通过 Eclipse Marketplace 安装 WebSphere 以及 OSGi 开发工具。

安装 WebSphere Application Server V8.5 Developer Tools

打开 Eclipse,依次点击 Help > Eclipse MarketPlace,在出现的页面搜索栏里输入 websphere,并点击搜索。


图 3. 安装 WDT V8.5
图 3. 安装 WDT V8.5

在搜索结果中会看到如上红色方框标注的工具(WDT),点击 Install,进入 Feature 选择页面


图 4. 选择要安装的 Feature
图 4. 选择要安装的 Feature

如上图所示,在这个开发工具包中包含了四个 Feature,其中红色方框标记的是必须要安装的,其中 WebSphere Application Server V8.5 Tools 主要用来在 Eclipse 中连接 WAS V8.5,通过这个工具,我们可以从 Eclipse 中向 WAS V8.5 部署和更新应用;OSGi Application Development Tools 也就是 Rational Development Tools for OSGi Applications 主要用来为 Eclipse 提供开发 OSGi 应用的能力,选择好 Feature,点击 Next,接受软件许可协议,并点击 Finish 开始安装过程。在安装过程中可能会有警告信息弹出,直接点击确认忽略该信息,在完成安装后需要重启 Eclipse。

在 Servers 视图,点击右键,选择 New > server,


图 5. 选择 Server 类型
图 5. 选择 Server 类型

选择 server 类型为 WebSphere Application Server V8.5,点击 Next


图 6. 设置 WAS 运行时信息
图 6. 设置 WAS 运行时信息

点击 Browser 选择 WAS V8.5 的安装路径,点击 Next


图 7. 设置 WAS 服务器实例信息
图 7. 设置 WAS 服务器实例信息

在本文用到的 WAS 环境中已经提前创建好了一个独立的服务器概要文件 AppSrv01,确认信息无误后,点击 Finish,完成 server 的创建过程。在 Servers 视图右击刚刚创建成功的 WAS 服务器,选择 Start,并观察 Console 里的的日志,确认没有错误信息输出,说明我们的配置成功了。

清单 1. WAS 服务器正常启动

 [7/24/12 17:39:30:103 CST] 00000001 WsServerImpl  A   
 WSVR0001I: Server server1 open for e-business 

如果用户的开发环境没有互联网,那么用户可以提前下载包括 WebSphere 开发工具的 ZIP 文件,在本地直接安装,具体的下载和安装方法请参考 WebSphere Developer Tools 信息中心 Installing into an existing Eclipse workbench 一节。

安装 Rational Development Tools for OSGi Applications

如果我们在上文图 4 中选择了安装 OSGi Application Development Tools,那么就说明我们的环境中已经安装了 Rational Development Tools for OSGi Applications,如果当时没有选择安装,那么同样需要从 Eclipse Marketplace 中安装该工具,具体方法请参考上文,需要指出的是在 Eclipse Marketplace 中应使用“OSGi”作为关键字进行搜索。

开发 EJB 样例程序

通过上文介绍我们已经搭建好了开发环境,在本文中我们通过两种方式构建基于 EJB 的 OSGi 应用:一种是将已有的 EJB 应用转化为 OSGi 应用;另一种是直接开发基于 EJB 的 OSGi 应用。我们会首先介绍第一种,开始之前先要创建用于转化的基于 EJB 的 JEE 应用。该节中用到的样例程序包含在参考资源的 ConverterApp.ear 文件中。

创建 EJB 模块

创建 EJB 工程和 Session Bean

  1. 打开 Eclipse,选择 File > New,新建一个 EJB 工程,在新建工程面板设置如下属性:
    1. Project name: EJB
    2. Target runtime: WebSphere Application Server V8.5
    3. EJB module version: 3.1
    4. 选中 Add project to an EAR: ConverterApp
  2. 点击两次 Next,在 EJB Module 面板,设置如下属性:
    1. 选中 Create an EJB Client JAR module to hold the client interfaces and classes
    2. Name: EJBClient
    3. Client JAR URI: EJBClient.jar
  3. 点击 Finish,等待进程结束,可以在项目管理窗口看到三个工程,分别是 JEE 工程 ConverterApp 以及两个 EJB 工程:EJB 和 EJBClient。
  4. 选中工程 EJB,右击选择 New > Session Bean(EJB 3.x)
    1. Java package: com.ibm.example.impl
    2. Class Name: EJBConverter
    3. 选中 Local,并设置其值为:com.ibm.example.EJBConverterLocal
    4. 去除选项 No-interface View


    图 8. 创建 Session Bean
    图 8. 创建 Session Bean

  5. 点击 Finish,创建好的 Session Bean 将会在编辑器中打开。

开发本地接口

当我们成功创建 Session Bean 以后,就会在 EJBClient 工程中出现一个本地接口类 EJBConverterLocal,我们将会在该接口中添加两个和温度转换相关的方法:

展开 EJBClient 工程 > ejbModule > com.ibm.example package,双击 EJBConverterLocal.java,在右侧的编辑窗口中添加如下代码:

清单 2. EJBConverterLocal 接口清单

 public interface EJBConverterLocal { 

     public double convertToFahrenheit(double celsius); 
     public double convertToCelsius(double fahrenheit); 
 } 
  1. 保存上面的操作,此时 EJBConverter 类会报错,因为我们需要为它编写实现代码,读者可以暂时忽略这个错误。

开发实现类

在本节中,我们将为本地接口 EJBConverterLocal 开发实现类:

  1. 展开 EJB 工程 > ejbModule >com.ibm.example.impl package,双击 EJBConverter.java,在编辑窗口可以看到实现类的代码。
  2. 删除该类中默认的构造方法。
  3. 为 EJBConverterLocal 接口中的两个方法添加实现代码,实现代码很简单,仅仅是添加一些对温度数据的转化运算,完整的实现类类似如下代码:

    清单 3. EJBConverter 实现类

 @Stateless 
 @Local(EJBConverterLocal.class) 
 public class EJBConverter implements EJBConverterLocal { 

 public double convertToCelsius(double fahrenheit) { 
      return (fahrenheit - 32) * (5 / 9d); 
   } 

   public double convertToFahrenheit(double celsius) { 
      return celsius * (9 / 5d) + 32; 
   } 
 } 
  1. 保存

创建 Web 模块

创建 Web 工程

在这个小节,我们创建一个 Web 工程,用来访问我们之前创建的 EJB 工程,具体的过程如下:

  1. 打开 Eclipse,选择 File > New,新建一个 Web 工程,在新建 Web 工程的面板,设置如下属性:
    1. Name: Web
    2. Project Templates: Sample
    3. Programming Model: Java EE
  2. 点击 Next,设置 Web 工程的 Deployment 属性:
    1. Target Runtimg: WebSphere Application Server V8.5
    2. Web module version: 3.0
    3. 选中 Add project to an EAR: ConverterApp
  3. 点击 Finish,完成对 Web 工程的创建。

创建 Servlet

在这一小节中,我们创建一个 Servlet 用来处理用户的输入和输出数据:

  1. 选中我们刚刚创建的 Web 工程,右击 New > Servlet,在新建 Servlet 面板,设置如下属性:
    1. Java packaget: com.ibm.example.servlets
    2. Class name: ConverterServlet


    图 9. 创建 Servlet
    图 9. 创建 Servlet

  2. 点击 Finish,完成对 Servlet 的创建。
  3. 打开刚刚创建的 ConverterServlet.java,编辑如下代码:

    清单 4. ConverterServlet 清单
@WebServlet("/ConverterServlet") 
 public class ConverterServlet extends HttpServlet { 
 private static final long serialVersionUID = 1L; 
    public ConverterServlet() { 
      super();       
    } 
    @EJB EJBConverterLocal converter;    
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
   PrintWriter w = response.getWriter(); 
   NumberFormat nf = NumberFormat.getInstance(); 
   nf.setMaximumFractionDigits(2);  
   try { 
 //      InitialContext context = new InitialContext(); 
 //      EJBConverterLocal converter = (EJBConverterLocal) context 
 //            .lookup("osgi:service/" + EJBConverterLocal.class.getName()); 
     String temperature = request.getParameter("temperature"); 
     if (temperature == null) { 
        w.println("<p>A temperature value was not specified.</p>"); 
     } else if (!temperature.matches("[-+]?[0-9]*\\.?[0-9]+")) { 
        w.println("Invalid temperature specified."); 
     } else { 
        double degrees = Double.parseDouble(temperature); 

        double celsius = converter.convertToCelsius(degrees); 
        w.println("<p>" + temperature + " degrees fahrenheit is " + nf.format(celsius) + " degrees celsius</p>"); 

        double fahrenheit = converter.convertToFahrenheit(degrees); 
        w.println("<p>" + temperature + " degrees celsius is " + nf.format(fahrenheit) + " degrees fahrenheit</p>"); 
     } 
     w.println("<a href='index.html'>Back</a>"); 
 //  } catch (NamingException e) { 
 //     w.println(e.getMessage()); 
   } catch (NumberFormatException e) { 
      w.println("An incorrect temperature was specified"); 
   } 
 } 
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     doGet(request,response); 
   } 
 } 

在上述清单中,我们使用了注解的方式注入了一个 EJB:@EJB EJBConverterLocal converter,此时 Web 工程可能会有一些编译的错误,读者可以根据提示导入缺少的包或者类,还有就是在 Web 工程的 Java Build Path 中添加对 EJB 工程的依赖,具体方法是:右击 Web 工程,选择 Properties > Java Build Path,在右侧面板中选择 Projects,点击 Add 添加 EJBClient 工程到 Projects 列表里,最后点击 OK 保存。

创建 HTML 页面访问应用

在这个小节中,我们创建一个 HTML 页面来访问我们创建好的 EJB 样例程序,该 HTML 页面用来接收用户的输入数据,并将该数据提交到 Servlet 进行温度数据的转换。

  1. 选择 Web 工程,右击 New > Web Page,在新建 Web Page 面板,设置属性如下:
    1. File Name: index.html
    2. Template: HTML
  2. 点击 Finish,完成 HTML 的创建。
  3. 双击刚刚创建的 index.html,编写代码如下:

    清单 5. 编写 index.html
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
 <html> 
 <head> 
 <title>OSGi EJB Temperature Converter</title> 
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
 <script type="text/javascript"> 

 function validate(form) { 
 var temperature = new Number(form.temperature.value); 
 if (isNaN(temperature)) { 
 alert("Please enter a valid number."); 
 return false; 
 } 
 return true; 
 } 

 </script> 
 </head> 
 <body> 
 <form action="ConverterServlet" method="post" οnsubmit="return validate(this);"> 
 Enter a temperature value: 
 <br/> 
 <input type="text" id="temperature" name="temperature"/> 
 <br/> 
 <br/> 
 <input type="submit" value="Submit"/> 
 </form> 
 </body> 
 </html> 

测试 EJB 样例程序

通过上文的步骤,我们已经成功的创建了 EJB 样例程序,现在我们将该应用部署到 WAS V8.5 中,测试该应用程序可以被正常访问:

  1. 右击 Web 工程中的 index.html,选择 Run as > Run on Server,在 server 列表中选择 WebSphere Application Server V8.5,点击确认开始部署应用过程。
  2. 当应用部署完成后,会在 Eclipse 自带的浏览器中看到 index.html 的页面内容,在表单域中输入任意的一个整数,例如:18

    图 10. 初始 index.html 页面
    图 10. 初始 index.html 页面

  3. 点击 Submit,将会出现如下结果页面,表明 EJB 样例程序是正确的。

    图 11. EJB 样例程序结果
    图 11. EJB 样例程序结果

转化 EJB 样例程序为 OSGi 应用

在这一节中,我们会继续用到上文创建的基于 EJB 的 JEE 样例程序,通过使用 Rational Development 工具将其转化为基于 EJB 的 OSGi 应用程序。(本节最终转化成功的 OSGi 应用包含在 ConverterOSGi.eba 中,读者可以在参考资源列表中获得。)开始之前,请确认如下操作已经被成功执行:

  • 移除之前在 WAS V8.5 中部署的 ConverterApp 应用,具体方法是:在 Eclipse 的 Servers 视图,右击 WebSphere Application Server V8.5,选择 Add and Remove …,在右侧窗口中选中 ConverterApp,点击 Remove,最后点击 Finish,完成对 EJB 样例程序的移除。
  • 停止 WAS V8.5,同样是在 Eclipse 的 Servers 视图,右击 WebSphere Application Server V8.5,选择 Stop,停止 WAS V8.5。

将 JEE 的应用转化为 OSGi 应用的原理很简单,就是将已有的各个模块转化为 OSGi Bundle,然后将这些 Bundle 打包到 EBA 应用中,具体的步骤是:

转化 EJB 模块为 OSGi Bundle

  1. 在 Eclipse 的工程导航视图中,选中我们上文创建的 EJB 工程 ( 注意:不是 EJBClient),右键选择 Configure > Convert to OSGi Bundle Project,需要指出的是,将应用模块转化为 OSGi Bundle 的操作是不可逆的,转化之前请先做备份,Eclipse 会弹出如下警告信息:

    图 12. 转化过程的警告信息
    图 12. 转化过程的警告信息

  2. 点击 OK,完成对 EJB 模块的转化,转化完成后,在工程导航视图中,可以看到 EJB 和 EJBClient 工程的工程结构发生了一些变化,最主要的变化是都多了一个 OSGi 的元数据描述文件:Manifest

    图 13. 转化后的 EJB Bundle
    图 13. 转化后的 EJB Bundle

  3. 在本文的一开始,我们向读者介绍了 EJB Bundle 独有的一个属性标识"Export-EJB: ",在转化的过程中,我们同样需要指定将哪些 EJB 发布为 OSGi 服务:右击刚刚转化成功的 EJB Bundle,选择 OSGi > Export EJB as OSGi Serverce,选择唯一 EJB EJBConverter,点击 OK。此时读者可以在 EJB Bundle 的 Manifest 文件中看到新的属性标识:Export-EJB: EJBConverter

    图 14. 将 EJB 发布为 OSGi 服务
    图 14. 将 EJB 发布为 OSGi 服务

  4. 选中 EJBClient 工程,双击打开 Manifest: EJBClient,在右侧编辑窗口点击 Runtime 标签,确认 com.ibm.example 被列在 Exported Packages 列表里,如果没有,需要点击 Add …进行添加。

转化 Web 模块为 OSGi Bundle

转化 Web 模块为 OSGi Bundle 的过程和转化 EJB 模块为 OSGi Bundle 的过程类似:

  1. 在 Eclipse 的工程导航视图中,选中我们上文创建的 Web 工程,右键选择 Configure > Convert to OSGi Bundle Project,同样,该转化过程是不可逆的,直接点击 OK 忽略警告信息,完成对 Web 模块的转化。
  2. 转化完成后,在 Web Bundle 中同样也多了一个 OSGi 元数据描述文件 Manifest。
  3. 双击打开该元数据描述文件,在右侧编辑窗口点击 Dependencies,确认 com.ibm.example 被列在 Imported Packages 列表中,如果没有,需要点击 Add …进行添加。

创建 OSGi 应用

在本节中,我们将介绍如何创建 OSGi 应用,并将上文转化好的 OSGi Bundle 添加到该 OSGi 应用中,在创建之前,我们首先要删除之前保留下来的 JEE 应用 ConverterApp,读者可以直击选中该工程,然后右击选择删除即可。

  1. 在 Eclipse 中,选择 File > New > OSGi Application Project,在新建工程面板,设置属性如下:
    1. Project name: ConverterOSGi
    2. Target Runtime: WebSphere Application Server V8.5


    图 15. 创建 OSGi 应用
    图 15. 创建 OSGi 应用

  2. 点击 Next 进入 Bundle 选择页面,确保我们之前转化好的 Bundle 都被选中

    图 16. 添加 Bundle 到 OSGi 应用
    图 16. 添加 Bundle 到 OSGi 应用

  3. 点击 Finish,完成对 OSGi 应用的创建。

测试 OSGi 应用

我们已经完成了对 EJB 应用的转化,现在可以在 WAS V8.5 中运行我们转化好的 OSGi 应用了,打开 Web Bundle,选中 index.html,选择 Run as > Run on Server,在 server 列表中选择 WebSphere Application Server V8.5,点击确认开始部署应用过程。等应用部署成功后,我们将看到如图 10 所示的页面,输入任意值,点击 Submit,将会看到如图 11 所示的应用程序运行成功的页面,如果这一切都是顺利的,则表明我们成功的将基于 EJB 的 JEE 应用转化成了基于 EJB 的 OSGi 应用。

直接开发基于 EJB 的 OSGi 应用

在这一节中,我们将向读者讲解,如何通过 Rational Development 工具直接开发基于 EJB 的 OSGi 应用,开始之前,请在 WAS 中卸载上文转化成功的 OSGi 应用 ConverterOSGi,并停止 WAS V8.5。本节最终开发成功的 OSGi 应用包含在 Converter.eba 中,读者可以在参考资源中找到。

创建 EJB Bundle

在这一个小节中,我们将利用 Rational Development 工具创建一个 EJB Bundle,一个包含客户端接口的客户端工程以及一个包含上述两个 Bundle 的 OSGi 应用。

  1. 打开 Eclipse,选择 File > New >OSGi Bundle Project,在新建 Bundle 面板,设置属性如下:
    1. Project name: EJB
    2. 选中 Add EJB support: EJB 3.1
    3. 选中 Add bundle to application: Converter


    图 17. 创建 EJB Bundle 工程
    图 17. 创建 EJB Bundle 工程

  2. 点击两次 Next,到达设置 EJB Module 面板:
    1. 选中 Create an EJB Client JAR module to hold the client interfaces and classes
    2. Name: EJBClient
    3. Client JAR URI: EJBClient.jar
  3. 点击完成,将会在工程导航视图中看到创建成功的三个和 OGSi 相关的工程。此刻 EJB 会有一个错误,那是因为我们必须为它创建一个 Session Bean,可以暂时忽略这个错误。

开发 EJB Bundle

创建一个 Session Bean

  1. 选中 EJB Bundle,右击选择 New > Session Bean(EJB 3.x),在新建 Session Bean 面板设置属性如下:
    1. Project: EJB
    2. Java package: com.ibm.example.impl
    3. Class name: EJBConverter
    4. State type: Stateless
    5. Local: 选中 Local 接口,并设置其值为:com.ibm.example.EJBConverterLocal
    6. 不选择 No-interface View
  2. 点击 Finish,完成创建 Session Bean 的过程。

开发本地接口

当我们成功创建 Session Bean 以后,就会在 EJBClient 工程中出现一个本地接口类 EJBConverterLocal,我们将会在该接口中添加两个和温度转换相关的方法:

  1. 展开 EJBClient Bundle > ejbModule > com.ibm.example package,双击 EJBConverterLocal.java,在右侧的编辑窗口中添加和清单 2 相同的代码。
  2. 保存上面的操作,此时 EJBConverter 类会报错,因为我们需要为它编写实现代码,读者可以暂时忽略这个错误。

开发实现类

在本节中,我们将为本地接口 EJBConverterLocal 开发实现类:

  1. 展开 EJBBundle > ejbModule >com.ibm.example.impl package,双击 EJBConverter.java,在编辑窗口可以看到实现类的代码。
  2. 删除该类中默认的构造方法。
  3. 为 EJBConverterLocal 接口中的两个方法添加实现代码,实现代码很简单,仅仅是添加一些对温度数据的转化运算,完整的实现类代码和清单 3 所列的完全相同。
  4. 保存

发布 EJB 为 OSGi 服务

  1. 在本文的一开始,我们向读者介绍了 EJB Bundle 独有的一个属性标识"Export-EJB: ",我们需要在 OSGi Bundle 中指定将哪些 EJB 发布为 OSGi 服务:右击创建成功的 EJB Bundle,选择 OSGi > Export EJB as OSGi Serverce,选择唯一 EJB EJBConverter,点击 OK。此时读者可以在 EJB Bundle 的 Manifest 文件中看到新的属性标识:Export-EJB: EJBConverter
  2. 选中 EJBClient 工程,双击打开 Manifest: EJBClient,在右侧编辑窗口点击 Runtime 标签,确认 com.ibm.example 被列在 Exported Packages 列表里,如果没有,需要点击 Add …进行添加。

开发 Web Bundle 用来访问 EJB

在这个小节中,我们将开发一个 Web Bundle,它包含一个 servlet 和一个 HTML 页面,用来访问我们上文创建 EJB Bundle,具体的步骤如下:

创建 Web Bundle 工程

  1. 打开 Eclipse,选择 File > New >OSGi Bundle Project,在新建 Bundle 面板,设置属性如下:
    1. Project name: Web
    2. 选中 Add Web support: Web 3.0


    图 18. 创建 Web Bundle 工程
    图 18. 创建 Web Bundle 工程

  2. 点击 Finish,完成 Web Bundle 工程的创建。

配置 Bundle Manifest

在 OSGi 中必须显示的在 Manifest 中声明需要从外部使用的包,方法如下:

  1. 展开 Web Bundle,双击 Manifest: Web,在右侧编辑窗口点击 Dependencies 标签,点击 Imported Packages 旁边的 Add,在出现的对话框中输入 com.ibm.example 搜索

    图 19. 添加 Imported Packages
    图 19. 添加 Imported Packages

  2. 点击 OK,完成 Imported Pakcage 的添加。
  3. 保存

创建 Servlet

  1. 选中 Web Bundle,右击 New > Servlet,在新建 Servlet 面板,设置如下属性:
    1. Java packaget: com.ibm.example.servlets
    2. Class name: ConverterServlet
  2. 点击 Finish,完成对 Servlet 的创建。
  3. 打开刚刚创建的 ConverterServlet.java,编辑如下代码:

    清单 6. ConverterServlet
 @WebServlet("/ConverterServlet") 
 public class ConverterServlet extends HttpServlet { 
 private static final long serialVersionUID = 1L; 
    public ConverterServlet() { 
        super(); 
    } 

 //    @EJB EJBConverterLocal converter; 
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
   PrintWriter w = response.getWriter(); 
   NumberFormat nf = NumberFormat.getInstance(); 
   nf.setMaximumFractionDigits(2); 

   try { 
      InitialContext context = new InitialContext(); 
      EJBConverterLocal converter = (EJBConverterLocal) context.lookup("osgi:service/" + EJBConverterLocal.class.getName()); 

      String temperature = request.getParameter("temperature"); 
      if (temperature == null) { 
         w.println("<p>A temperature value was not specified.</p>"); 
      } else if (!temperature.matches("[-+]?[0-9]*\\.?[0-9]+")) { 
         w.println("Invalid temperature specified."); 
      } else { 
         double degrees = Double.parseDouble(temperature); 

         double celsius = converter.convertToCelsius(degrees); 
         w.println("<p>" + temperature + " degrees fahrenheit is " + nf.format(celsius) + " degrees celsius</p>"); 

         double fahrenheit = converter.convertToFahrenheit(degrees); 
         w.println("<p>" + temperature + " degrees celsius is " + nf.format(fahrenheit) + " degrees fahrenheit</p>"); 
      } 

      w.println("<a href='index.html'>Back</a>"); 
   } catch (NamingException e) { 
      w.println(e.getMessage()); 
   } catch (NumberFormatException e) { 
      w.println("An incorrect temperature was specified"); 
   } 
 } 

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
   doGet(request, response); 
 } 
 } 

清单 4 和清单 6 的不同之处在于访问 EJB 的方式不同,在清单 4 中使用的注解的方式,而在清单 6 中使用的查找 OSGi 服务的方式,这两种方式都是正确的,但是在 OSGi 中更倾向于用后一种方式。

创建 HTML 页面访问 OSGi 应用

  1. 选择 Web Bundle,右击 New > Web Page,在新建 Web Page 面板,设置属性如下:
    1. File Name: index.html
    2. Template: HTML
  2. 点击 Finish,完成 HTML 的创建
  3. 双击刚刚创建的 index.html,填写清单 5 所列的代码

测试 OSGi 应用

打开 Web Bundle,选中 index.html,选择 Run as > Run on Server,在 server 列表中选择 WebSphere Application Server V8.5,点击确认开始部署应用过程。等应用部署成功后,我们将看到如图 10 所示的页面,输入任意值,点击 Submit,将会看到如图 11 所示的应用程序运行成功的页面,如果这一切都是顺利的,则表明我们开发的基于 EJB 的 OSGi 应用是正确的。

总结

在本文中,我们通过实例向读者介绍了如何在 OSGi 应用中加入 EJB 的支持,除了讲解转化已有的 JEE 应用为 OSGi 应用,也详细阐述了如何从无到有直接开发一个基于 EJB 的 OSGi 应用,通过阅读本文,相信读者已经初步掌握了在 OSGi 应用中加入 EJB 支持的方法和技能。


参考资料

学习

获得产品和技术

讨论





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Table of Contents IBM WebSphere Application Server - The Complete Reference Part I - Getting Started Chapter 1 - What Is WebSphere? Chapter 2 - Installing and Starting WebSphere Chapter 3 - Hello World (Wide Web) Chapter 4 - Hello Servlets and JSPs Chapter 5 - Hello EJBs Part II - WebSphere Technologies Chapter 6 - Web Servers and Java Application Servers Chapter 7 - Servlets and JavaServer Pages Chapter 8 - Common Object Request Broker Architecture Chapter 9 - Internet Inter-ORB Protocol Chapter 10 - JavaBeans Chapter 11 - Enterprise JavaBeans Chapter 12 - Extensible Markup Language (XML) Chapter 13 - Java Security Chapter 14 - Java Messaging Service Chapter 15 - Java 2 Enterprise Edition Part III - Development Environments for WebSphere Applications Chapter 16 - WebSphere Studio Application Developer Chapter 17 - VisualAge for Java Part IV - Core Services Chapter 18 - Connection Pooling and Data Access Beans Chapter 19 - WebSphere Security Services Chapter 20 - Lightweight Directory Access Protocol Support Chapter 21 - WebSphere Application Logging Part V - Developing Servlets and JavaServer Pages Chapter 22 - HTTP Servlets Chapter 23 - Servlet Sessions Chapter 24 - WebSphere-Specific Servlet Issues Chapter 25 - JSP Elements Chapter 26 - JSP Examples Chapter 27 - Custom Tag Libraries Chapter 28 - Debugging Servlets and JSPs Using VisualAge Part VI - Developing EJB Chapter 29 - Session Beans Chapter 30 - Entity Beans Part VII - Using XML Chapter 35 - Writing XML E-Business Applications Chapter 36 - Application of XSL Transformations Chapter 37 - Web Services: SOAP, WSDL, and UDDI Chapter 38 - Deploying Web Services on WebSphere Part VIII - Internationalization and Localization Chapter 39 - Java Support Features for Internationalization Chapter 40 - Building Multilingual Applications Part IX - Administering WebSphere Sites Chapter 41 - Deploying WebSphere for Scalability and Fault Tolerance Chapter 42 - The WebSphere Administrative Console Chapter 43 - WebSphere Administration Scripts Chapter 44 - Administering WebSphere Security
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值