miércoles, 1 de abril de 2009

Día 47: EJB (6ª Parte) y JSF (5ª parte)

Siempre que hagamos algún cambio en nuestros proyectos de JSF, EJB o JPA debemos hacer en la consola "mvn clean install"

Formulario de busqueda de disco por nombre. Llama a una página que muestra los datos del disco encontrado.
Formulario por nombre del disco y nombre del autor.

Antes de acabar la clase: hacer pruebas en aislamiento en el EJB, en el JPA y en el JSF y usando el mockito.


Hoy terminamos el ejercicio que dejamos ayer pendiente sobre la búsqueda del disco y del cantante.
Este ejercicio lo hice a mi manera y me funciona, pero se puede hacer de otra manera.
Los pasos para que funcione son los siguientes:

JPA (Java Persistence API) >Usado en el proyecto
"discografía-hibernate" // Saber Más
  • Tener la clase "Disco" creada implementando "Serializable" con sus parámetros: id, nombre, cantante (de tipo Cantante) y canciones (Conjunto de Canciones) con sus anotaciones "@Entity" y "@Table" al comienzo de la clase y las anotaciones "@Id" y "@GeneratedValue" en el método getter del Id y "@Column" en los getter del resto de parámetros.
  • Tener la clase "Cantante" creada, implementando también "Serializable" y sus parámetros son: id, nombre y discos (Conjunto de Discos) y con las mismas anotaciones de "Disco"
  • Vamos a la consola y limpiamos del repositorio el proyecto y lo volvemos a instalar introduciendo el comando mvn clean install (C:\workspace\discografica-hibernate>mvn clean install)

EJB (Enterprise JavaBeans) >Usado en el proyecto "ejbProject" // Saber Más
  • Primeramente debemos tener creada la interfaz "DiscograficaDAORemote" encabezando los métodos para buscar un cantante introduciendole un nombre y devolviendo un "Cantante" y otro método para buscar un disco que le introducimos el nombre del disco y el nombre del cantante y devolviendo un "Disco"
  • Creamos la clase "DiscograficaDAO" que implemente la interfaz "DiscograficaDAORemote" y rellenando los métodos de búsqueda.
    El método para buscar el cantante quedaría así:
    • Query query = entityManager.createQuery("" +
      "from Cantante ca where " +
      "ca.nombre=:nombre");
      query.setParameter("nombre", nombre);
      try{
      Cantante resultadoConsulta = (Cantante) query.getSingleResult();
      return resultadoConsulta;
      }catch (NoResultException e) {
      e.printStackTrace();
      return null;
      }

    El método para buscar el Disco quedaría así:
    • Query query = entityManager.createQuery(""
      "from Disco d " +
      "where d.nombre=:nombreDisco and " +
      "d.cantante.nombre=:nombreCantante");
      query.setParameter("nombreDisco", nombreDisco);
      query.setParameter("nombreCantante", nombreCantante);
      try{
      Disco resultadoConsulta = (Disco) query.getSingleResult();
      return resultadoConsulta;
      }catch (NoResultException e) {
      e.printStackTrace();
      return null;
      }
  • Vamos a la consola, en este proyecto y realizamos un "mvn clean install"

JSF (JavaServer Faces) >usado en el proyecto "jsf1" // Saber Más
  • Primero creamos un archivo ".xhtml" en "src/main/webapp" que será el que muestre un formulario de la búsqueda. Hacemos 2 formularios con distintos id.
    Formulario 1:
    • Usando la etiqueta de jsf "h:inputText" le introducimos un valor "#{busquedaBean.cantante.nombre}" que lo que hace es rellenar una propiedad de una clase llamada "BusquedaBean" y que el campo sea requerido y al final un "h:commandButton" de action: "#{busquedaAction.busca1}" que lo que hará será llamar un método de una clase llamada "BusquedaAction"
    Formulario 2:
    • Lo mismo que el primer formulario pero que introduzca el nombre del disco.
  • Creamos una clase llamada "BusquedaBean" que tenga como atributos cantante (de tipo Cantante) y disco (de tipo Disco) con sus métodos getter y setter.
  • Creamos una clase llamada "BusquedaAction" que será la que enlazará con el EJB DiscograficaDAO y sus métodos.
    Añadimos un método que será el que recoja de forma remota la clase DiscograficaDAO, lo hacemos método porque el código es algo engorroso y feo:
    • private DiscograficaDAORemote getDiscograficaDAO() throws NamingException {
      Properties p = new Properties();
      p.put(Context.INITIAL_CONTEXT_FACTORY,
      "org.jnp.interfaces.NamingContextFactory");
      p.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
      p.put(Context.PROVIDER_URL, "jnp://localhost:1099");
      Context ctx = new InitialContext(p);
      Object ref = ctx.lookup("DiscograficaDAO/remote");
      DiscograficaDAORemote discograficaDAORemote = (DiscograficaDAORemote) PortableRemoteObject
      .narrow(ref, DiscograficaDAORemote.class);
      return discograficaDAORemote;
      }

    Creamos los métodos que llaman los formularios que a su vez llaman a los métodos que creamos de búsqueda en el EJB DiscograficaDAO
    También tendrá como atributo la clase "BusquedaBean" que creamos antes y que usaremos aquí. Por ejemplo el método para buscar un cantante:
    • public String busca1(){ //Buscar el cantante
      DiscograficaDAORemote discograficaDAORemote;
      try {
      discograficaDAORemote = getDiscograficaDAO();
      } catch (NamingException e) {
      throw new RuntimeException(e);
      }
      Cantante cantante = discograficaDAORemote
      .buscaCant(busquedaBean.getCantante().getNombre());
      if(cantante!=null)
      return ("cantanteEncontrado");
      else
      return("cantanteNEncontrado");
      }
  • Lo siguiente sería enlazar y asignar un nombre al Bean y a las acciones y que el formulario de la página lo use. Para ello tenemos que editar el archivo de configuración "my-config.xml" situado en "src/main/webapp/WEB-INF"
    • Añadimos una etiqueta "managed-bean" y le asignamos un nombre "busquedaBean", seleccionamos la clase (en cuál paquete está ubicado y el nombre de la clase) y que tenga un tiempo de vida de tipo petición.
    • Hacemos de nuevo lo mismo pero de nombre "busquedaAction" y le añadimos una propiedad (managed-property) que de nombre es el bean (busquedaBean) y de valor (value) sera "#{busquedaBean}". Con esto lo que estamos haciendo es que se inyecte la clase bean en la clase de la accion ya que necesitamos de ella.
  • En este proyecto no hace falta hacer la instalación


Ejercicio
Ampliamos nuestro ejercicio y esta vez en vez de solamente hacer una búsqueda que borre y guarde en la base de datos.

No hay comentarios:

Publicar un comentario