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;
}
- Query query = entityManager.createQuery("" +
- 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"
- 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");
}
- private DiscograficaDAORemote getDiscograficaDAO() throws NamingException {
- 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