< Anterior | Siguiente >

Lección 3: desarrollar un paquete web que accede al EJB

En la lección anterior se ha mostrado EJB como servicio OSGi. En esta lección, se va a desarrollar un paquete web que acceder al servicio. Va a crear el paquete, configurará el manifiesto para importar paquetes necesarios, desarrollará un servlet que accede a EJB como servicio OSGi y creará una página HTML para acceder a la aplicación a través de un navegador.

Creación de un proyecto de paquete web

En esta sección, puede crear un paquete OSGi con soporte de Web 3.0 y añadir el paquete a la aplicación OSGi ConverterApp.
  1. Abra el asistente de proyecto de paquete OSGi. Pulse Archivo > Nuevo > Proyecto de paquete OSGi. Se abre el asistente.
  2. Cree el proyecto. Escriba o seleccione los valores siguientes en el asistente:
    Nombre del proyecto
    Web
    Tiempo de ejecución de destino
    WebSphere Application Server v8.5.
    Añada soporte web (marque este recuadro de selección y seleccione el valor siguiente)
    Web 3.0.
    Añada el paquete a la aplicación (marque este recuadro de selección y seleccione la aplicación siguiente)
    ConverterApp
    Cree un proyecto de paquete web
  3. Pulse Finalizar. Se creará el proyecto.

Configuración del manifiesto de paquete en el proyecto web para importar el paquete del proyecto EJBClient

En esta sección, va a añadir una entrada para el paquete com.ibm.example en el proyecto EJBClient en la cabecera Import-Package del manifiesto. El paquete com.ibm.example contiene la interfaz que ha desarrollado para EJB.
  1. Abra el manifiesto. En el proyecto web, efectúe una doble pulsación en Manifiesto: Web. Se abrirá el editor del manifiesto.
  2. Añada una dependencia al paquete com.ibm.example. Pulse la pestaña Dependencias. En la sección Paquetes importados, pulse Añadir. Se abrirá el diálogo Selección de paquete. En el campo Paquetes exportados, escriba com.ibm.example. Seleccione com.ibm.example de la lista de paquetes y pulse Aceptar.
    Añadir dependencia

    Se añadirá la dependencia a com.ibm.example en la sección Paquetes importados. Fíjese que como el proyecto de paquete se ha configurado con soporte para Web 3.0, ya se habrán añadido las entradas de importación para paquetes de servlet como, por ejemplo, javax.servlet.

    Paquetes importados

  3. Guarde los cambios.

Creación de un servlet

En esta sección, se crea un servlet inicial con el asistente de servlets.
  1. Abra el asistente de servlets. Pulse el botón derecho del ratón en el proyecto web y seleccione Nuevo > Servlet. Se abre el asistente de servlets.
  2. Cree el servlet. Escriba o seleccione los valores siguientes en el asistente:
    Proyecto
    Web
    Paquete Java™
    com.ibm.example.servlets
    Nombre de clase
    ConverterServlet

    Pulse Finalizar. Se creará ConverterServlet en el proyecto web.

Desarrollo del servlet

En esta sección, va a desarrollar el servlet y a incluir código para acceder a EJB como servicio OSGi.
  1. Abra el servlet en el editor Java. Si el servlet todavía no está abierto en el editor, en el proyecto web, expanda la carpeta Java Resources/src. En el paquete com.ibm.example.servlets, efectúe una doble pulsación en ConverterServlet.
  2. Añada nuevas sentencias de importación. Añada las siguientes sentencias de importación en la sección de importación, al principio del archivo de origen:
    import com.ibm.example.EJBConverterLocal;
    import java.io.PrintWriter;
    import java.text.NumberFormat;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
  3. Desarrolle el método doGet(). El servlet contiene un método básico doGet(). Sustituya el método generado automáticamente por el método siguiente:
    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");
       }
    }
    Nota: Aspectos a tener en cuenta acerca de este código:
    El servlet crea un objeto EJBConverterLocal denominado conversor. Recuerde que EJBConverterLocal era la interfaz que creó y que contiene dos métodos de conversión de temperatura, convertToCelsius() y convertToFahrenheit(). La línea de código siguiente gestiona la creación del objeto que accede a EJB como servicio OSGi:
    EJBConverterLocal converter = (EJBConverterLocal) context.lookup("osgi:service/" + EJBConverterLocal.class.getName());
    El valor de temperatura para la conversión ha pasado al servlet mediante el parámetro temperature. Este valor se convierte en un doble llamado degrees, que los métodos convertToCelsius() y convertToFahrenheit() pueden procesar en el objeto conversor.
    Nota: Si desea utilizar interfaces remotas, ajuste el código de búsqueda JNDI. Por ejemplo, la sección de búsqueda de contexto descrita anteriormente se puede escribir en el formato siguiente:
    EJBConverterRemote converter = (EJBConverterRemote) context.lookup("osgi:service/" + EJBConverterRemote.class.getName() + "/(service.exported.interfaces=*)");
  4. Desarrolle el método doPost(). Sustituya el método generado automáticamente doPost() por el código siguiente. La sustitución del método generado automáticamente doPost() garantiza que el servlet lo pueden invocar tanto las solicitudes post como get en un navegador. Las llamadas a doPost() ejecutan automáticamente el método doGet().
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	doGet(request, response);
    }
  5. Compruebe su trabajo. El código siguiente es el código del servlet completo:
    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. Guarde los cambios.

Creación de un archivo HTML para acceder a la aplicación

En esta sección, va a crear un archivo HTML, index.html, que contiene un formato para entrar valores que se enviarán al servlet para su conversión.
  1. Abra el asistente de página web nueva. Pulse el botón derecho del ratón en el proyecto web y seleccione Nuevo > Página web. Se abrirá el asistente Página web.
  2. Cree la página web. En el campo Nombre de archivo del asistente, escriba index.html. En la sección Plantilla, seleccione HTML. Pulse Finalizar. Se creará la página y se abrirá en el editor.
    Nueva página web
  3. Seleccione la pestaña Origen del editor de página web.
  4. Actualice la fuente. Sustituya el código fuente predeterminado por el código siguiente:
    <!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);">
    	Escriba un valor de temperatura:
    	<br/>
    	<input type="text" id="temperature" name="temperature"/>
    	<br/>
    	<br/>
    	<input type="submit" value="Submit"/>
    </form>
    </body>
    </html>

    Este HTML contiene un formato que envía un valor de parámetro temperature a ConverterServlet. Antes de enviarlo al servlet, la función validate() validará el valor que se debe enviar para garantizar que se ha indicado un valor numérico.

< Anterior | Siguiente >
Icono que indica el tipo de tema Tema de lección de guía de aprendizaje
Términos y condiciones para centros de información | Comentarios

Icono de indicación de fecha y hora Última actualización: 22 de abril de 2014

Nombre de archivo: osgi_ejb_3.html