< 上一课 | 下一课 >

课程 3:开发用于访问 EJB 的 Web 捆绑软件

在上一课中,您已将 EJB 公开为 OSGi 服务。 在本课程中,您将开发用于访问该服务的 Web 捆绑软件。您将创建捆绑软件、配置清单以导入必需的软件包、开发用于访问 EJB(作为 OSGi 服务)的 Servlet 并创建 HTML 页面以通过浏览器访问应用程序。

创建 Web 捆绑软件项目

在此部分中,您将创建具有 Web 3.0 支持的 OSGi 捆绑软件,并将该捆绑软件添加至 ConverterApp OSGi 应用程序。
  1. 打开 OSGi 捆绑软件项目向导。 单击文件 > 新建 > OSGi 捆绑软件项目。向导将打开。
  2. 创建项目。 在向导中输入或选择以下值:
    项目名称
    Web 服务器
    目标运行时
    WebSphere Application Server V8.5。
    添加 Web 支持(选中此复选框并选择以下值)
    Web 3.0。
    将捆绑软件添加至应用程序(选中此复选框并选择以下应用程序)
    ConverterApp
    创建 Web 捆绑软件项目
  3. 单击完成。项目已创建。

配置 Web 项目中的捆绑软件清单以从 EJBClient 项目导入软件包

在此部分中,您会将 EJBClient 项目中 com.ibm.example 软件包的条目添加至清单中的 Import-Package 头。com.ibm.example 软件包包含您为 EJB 开发的接口。
  1. 打开清单。 在 Web 项目中,双击清单:Web。这时,将打开清单编辑器。
  2. 添加与 com.ibm.example 软件包的依赖关系。 单击依赖关系选项卡。在导入的软件包部分中,单击添加。这时,将打开“选择软件包”对话框。在导出的软件包字段中,输入 com.ibm.example。从软件包列表中选择 com.ibm.example,然后单击确定
    添加依赖关系

    与 com.ibm.example 的依赖关系会被添加至“已导入的软件包”部分。请注意,因为已使用 Web 3.0 支持配置了捆绑软件项目,所以已为 Servlet 软件包(例如 javax.servlet)添加了额外的导入条目。

    导入数据包

  3. 保存所做的更改。

创建 servlet

在此部分中,您将使用 Servlet 向导创建初始 Servlet。
  1. 打开 Servlet 向导。 右键单击 Web 项目,然后选择新建 > Servlet。这时,将打开 Servlet 向导。
  2. 创建 Servlet。 在向导中输入或选择以下值:
    项目 (Project)
    Web 服务器
    Java™ 包
    com.ibm.example.servlets
    Class 名
    ConverterServlet

    单击完成。这时,会在 Web 项目中创建 ConverterServlet。

开发 Servlet

在此部分中,您将开发 Servlet 并包括以 OSGi 服务形式访问 EJB 的代码。
  1. 在 Java 编辑器中打开 Servlet。 如果尚未在编辑器中打开 Servlet,请在 Web 项目中展开 Java Resources/src 文件夹。 在 com.ibm.example.servlets 软件包中,双击 ConverterServlet。
  2. 添加新 import 语句。 将以下 import 语句添加至源代码文件开头的 import 部分:
    import com.ibm.example.EJBConverterLocal;
    import java.io.PrintWriter;
    import java.text.NumberFormat;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
  3. 开发 doGet() 方法。 该 Servlet 包含基本的 doGet() 方法。将自动生成的方法替换为以下方法:
    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");
       }
    }
    注: 要记录关于此代码的项:
    Servlet 会创建称为转换器的 EJBConverterLocal 对象。请记住,EJBConverterLocal 是您创建的包含两个温度转换方法 convertToCelsius() 和 convertToFahrenheit() 的接口。以下代码行会创建作为 OSGi 服务访问 EJB 的对象:
    EJBConverterLocal converter = (EJBConverterLocal) context.lookup("osgi:service/" + EJBConverterLocal.class.getName());
    要转换的温度值会通过 temperature 参数传递至 Servlet。此值会转换为名为 degrees 的双精度值,该双精度值可由转换器对象上的 convertToCelsius() 和 convertToFahrenheit() 方法进行处理。
    注: 如果要使用远程接口,请调整 JNDI 查询代码。例如,可以通过以下格式来编写先前描述的上下文查找部分:
    EJBConverterRemote converter = (EJBConverterRemote) context.lookup("osgi:service/" + EJBConverterRemote.class.getName() + "/(service.exported.interfaces=*)");
  4. 开发 doPost() 方法。 将自动生成的 doPost() 方法替换为以下代码。替换自动生成的 doPost() 方法可确保该 Servlet 可由来自浏览器的 post 和 get 请求调用。对 doPost() 的调用将自动执行 doGet() 方法。
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	doGet(request, response);
    }
  5. 检查工作。 以下代码是已完成的 Servlet 代码:
    package com.ibm.example.servlets;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.text.NumberFormat;
    
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.Servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.ibm.example.EJBConverterLocal;
    
    @WebServlet("/ConverterServlet")
    public class ConverterServlet extends HttpServlet {
       private static final long serialVersionUID = 1L;
    
       public ConverterServlet() {
          super();
       }
    
       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);
    		}
    }
  6. 保存所做的更改。

创建用于访问应用程序的 HTML 文件

在此部分中,您将创建一个 HTML 文件 index.html,该 HTML 文件包含一个用于输入值以提交至 Servlet 进行转换的表单。
  1. 打开“新建 Web 页面”向导。 右键单击 Web 项目,然后选择新建 > Web 页面。这时,将打开“Web 页面”向导。
  2. 创建 Web 页面。 在向导的文件名字段中,输入 index.html。在模板部分中,选择HTML。单击完成。这时,将创建该页面并在编辑器中打开该页面。
    新建 Web 页面
  3. 选择 Web 页面编辑器的源代码选项卡。
  4. 更新源代码。 将缺省源代码替换为以下代码:
    <!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" onsubmit="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>

    此 HTML 包含用于将 temperature 参数值提交至 ConverterServlet 的表单。在将其发送至 Servlet 之前,validate() 函数会验证要提交的值以确保输入的是数字值。

< 上一课 | 下一课 >
指示主题类型的图标 教程课程主题
信息中心的条款和条件 | 反馈

时间戳记图标 最近一次更新时间: 2014 年 4 月 17 日

文件名:osgi_ejb_3.html