Download Instituto Politécnico Nacional Escuela Superior de Cómputo Web

Document related concepts
no text concepts found
Transcript
Instituto Politécnico Nacional
Escuela Superior de Cómputo
Web Applications Development
Prof. Cifuentes Álvarez Alejandro Sigfrido
Hibernate en la web
Alumno: Hernández Oyarzábal Mauricio Francisco
Grupo: 3CM2
Hibernate en la Web
Se utiliza el IDE NetBeans para crear y desplegar una aplicación Web muestra datos de
una base de datos. La aplicación web utiliza el marco de Hibernate como la capa de
persistencia para almacenar y recuperar de objetos típicos JAVA (POJOs) a una base de
datos relacional.
Hibernate es el marco que proporciona herramientas para el mapeo relacional de
objeto (ORM). El tutorial se muestra cómo agregar soporte para el marco de Hibernate
para el IDE y crear los archivos necesarios de Hibernate. Después de crear los objetos
Java y configurar la aplicación para utilizar Hibernate, se crea un beans JSF
administrados y las páginas JSF 2.0 para mostrar la fecha.
Utiliza base de datos MySQL Sakila Llamados a la base de datos MySQL de muestra
gratuita que está disponible en el sitio de MySQL.
*Abra el Administrador de complementos e instalar el plug-in muestra Sakila base de
datos.
*Después de instalar el plugin, iniciar la base de datos MySQL mediante la ampliación
del nodo Bases de datos en la ventana Servicios, haga clic en el nodo de servidor de
MySQL y seleccione Inicio.
*Haga clic en el nodo de servidor MySQL y seleccione Crear base de datos.
*Sakila Seleccione la base de datos de la nueva base de datos Nombre de la lista
desplegable del cuadro de diálogo de creación de MySQL base de datos. Haga clic en
Aceptar.
*Haga clic en el nodo Sakila y seleccione Conectar.
Crear el proyecto de aplicación web
En este ejercicio creará un proyecto de aplicación web y agregar las bibliotecas de
Hibernate para el proyecto. Cuando se creó el proyecto, tendrá que elegir de
hibernación en el panel Marcos del Asistente para nuevo proyecto y especificar la base de
datos.
* Elija Archivo> Nuevo Proyecto en el menú principal. * Seleccione la aplicación web
desde la categoría de Java Web y haga clic en Siguiente.
* Tipo de DVDStore para el nombre del proyecto y la ubicación del proyecto.
* Desactive la opción Usar carpeta dedicada, si es seleccionado. Haga clic en Siguiente.
Para este tutorial no hay razón para copiar las bibliotecas del proyecto en una carpeta
dedicada Debido a que usted no tendrá que compartir bibliotecas con otros usuarios.
* Configurar el servidor para el servidor GlassFish 3 y establecer la versión de Java
EEJava EE 6 Web Haga clic en Siguiente.
* Seleccione la casilla de verificación JavaServer Faces y el uso de las bibliotecas por
defecto JSF 2.0.
* Seleccione la casilla de verificación Hibernate 3.2.5.
* Seleccione la base de datos Sakila de la conexión a la base en la lista desplegable.
Haga clic en Finalizar.
Modificar el archivo de configuración de Hibernate
Cuando se crea un nuevo proyecto utiliza la hibernación ese marco, el IDE crea
automáticamente el fichero de configuración hibernate.cfg.xml en la raíz de la ruta de
clase del contexto de aplicación (en la ventana de Archivos, src / java). El archivo se
encuentra en el package> <default en el nodo Source Packages en la ventana
deproyectos. El archivo de configuración contiene información sobre la conexión de base
de datos, las asignaciones de recursos y otras propiedades de conexión. Usted puede
editar el archivo con el editor de multi-vista, o de modificar el código XML directamente en
el editor XML.
* Abrir Hibernate.cfg.xml en la pestaña Diseño. Usted puede abrir el archivo mediante la
ampliación del nodo package> <default en los paquetes fuente en la ventana de
Proyectos y hibernate.cfg.xml doble clic.
* En el editor de multi-vista XML, expanda el nodo Propiedades de configuración en las
propiedades opcionales.
* Haga clic en Agregar para abrir el agregar propiedades Hibernate cuadro de diálogo.
* En el cuadro de diálogo, seleccione la propiedad hibernate.show_sql y el valor a
true. Esto permite que el registro de depuración de las sentencias SQL.
* Expandir el nodo Propiedades Varios y haga clic en Agregar
* En el cuadro de diálogo, seleccione la hibernate.current_session_context_class
propiedades y establecer el valor de enhebrar para permitir la gestión automática de
Hibernate contexto de la sesión.
* Haga clic en Agregar nuevo bajo el nodo Propiedades y seleccione Varios
hibernate.query.factory_class en la lista desplegable Nombre de la propiedad.
* Seleccione org.hibernate.hql.classic.ClassicQueryTranslatorFactory como el valor de la
propiedad. Haga clic en Aceptar.
Creación del archivo de auxiliar HibernateUtil.java
Para utilizar Hibernate tiene que crear una clase auxiliar se encarga de inicio y es que
accede a Hibernate SessionFactory obtener un objeto Session. La clase llama a configure
() y carga el archivo de configuración hibernate.cfg.xml y después construye la
SessionFactory obtener el objeto Session.
En esta sección se utiliza el asistente de archivo nuevo para crear la clase
de ayudaHibernateUtil.java.
* Haga clic derecho en el nodo Source Packages y seleccione Nuevo> Otros para abrirel
asistente de New File.
* Seleccione Hibernar en la lista Categorías y HibernateUtil.java de la lista Tipos de
archivo. Haga clic en Siguiente.
* Tipo de HibernateUtil para el nombre de clase y dvdrental para el paquete. Haga clic en
Finalizar.
Crear el archivo de hibernación inversa Ingeniería
Si usted desea utilizar los archivos de mapeo Hibernate y POJOs de un asistente de base
de datos, primero debe crear un archivo de hibernate.reveng.xml ingeniería
inversa. Los archivos de mapeo Hibernate y POJOs de un asistente de base de datos
requiere hibernate.reveng.xml y Hibernate.cfg.xml.
El archivo de la ingeniería inversa le permite tener mayor control sobre la estrategia de
asignación de bases de datos. La hibernación Ingeniería inversa Ingeniería
inversaasistente crea un archivo con una configuración predeterminada que se puede
editaren el editor XML.
Para crear los archivos temporales de Hibernate de ingeniería, realice los siguientes
pasos.
* Haga clic derecho en el nodo Source Packages en la ventana de Proyectos y seleccione
Nuevo> Otros para abrir el asistente de New File.
* Seleccione el asistente de ingeniería inversa de Hibernate en la categoría
deHibernate. Haga clic en Siguiente.
* Especificar el nombre de archivo y hibernate.reveng como src / java para la
carpeta.Haga clic en Siguiente.
* Seleccione Hibernate.cfg.xml en el archivo de configuración de la lista desplegable, si no
está seleccionado.
* Seleccione las tablas siguientes de las tablas disponibles y haga clic en Agregar para
agregar las tablas para las tablas seleccionadas.
La creación de los archivos de mapeo Hibernate y POJOs
Puede utilizar los archivos de mapeo Hibernate y POJOs de un asistente de base de
datos para generar los archivos para usted. El asistente puede generar un POJO y un
archivo de asignación correspondiente a cada mesa que seleccione en el
asistente.Los archivos de mapeo son archivos XML que contienen datos acerca de
cómo lascolumnas de las tablas se asignan a los campos en los POJOs. Usted necesita
tenerlos archivos hibernate.reveng.xml y hibernate.cfg.xml para utilizar el asistente.
Para crear los POJOs y archivos de asignación mediante un asistente, realice
lossiguientes pasos.
* Haga clic derecho en el nodo Source Packages en la ventana de Proyectos y seleccione
Nuevo> Otros para abrir el asistente de New File.
* Selección de archivos de mapeo Hibernate y POJOs de una base de datos en la
categoría de Hibernate. Haga clic en Siguiente.
* Asegúrese de que los archivos hibernate.cfg.xml y hibernate.reveng.xml se seleccionan
en las listas desplegables.
* Seleccione JDK 5 Características del lenguaje en las opciones de configuración general.
* Asegúrese de que el Código de dominio y las opciones
de Hibernate XMLAsignaciones están seleccionados.
* Seleccione dvdrental para el nombre del paquete. Haga clic en Finalizar.
Creación de la Clase
Se creará una sesión de Hibernate llamando getSessionFactory en HibernateUtil.java y
crear algunos métodos de ayuda para crear consultas para recuperar datos de la base de
datos. Se llamará a los métodos auxiliares de las páginas JSP.
* Haga clic derecho en el nodo de origen del paquete dvdrental y seleccione New>Java
Class para abrir el asistente de archivo nuevo.
* Tipo de FilmHelper para el nombre de la clase.
* Confirme que dvdrental es seleccionado como el paquete. Haga clic en Finalizar.
* Añadir el siguiente código (en negrita) para crear una sesión de Hibernate.
Enumerar los títulos de las películas y recuperación de los actores mediante una
consulta HQL
La tabla de Cine cuenta con 1000 registros por lo que el método para recuperar la lista de
las películas debe ser capaz de recuperar los registros basados en la clave
principal filmId. Va a utilizar el editor de HQL para construir y probar la consulta HQL.
Después de haber creado la consulta correcta va a agregar un método a la clase que
puede generar la consulta adecuada.
* Haga clic derecho en el nodo del proyecto en la ventana de Proyectos y elegir limpiar y
construir.
* Haga clic derecho en hibernate.cfg.xml en la ventana de Proyectos y seleccione Ejecutar
consulta HQL para abrir el editor de consultas HQL.
* Seleccione hibernate.cfg de la lista desplegable en la barra de herramientas.
* Pruebe la conexión escribiendo lo siguiente en el editor y hacer clic en el botón
Ejecutar consulta HQL () en la barra de herramientas.
Equivalencia: select film0_.film_id as col_0_0_ from sakila.film film0_
Agregar las siguientes líneas de código al archivo FilmHelper.java
package dvdrental;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
public class FilmHelper {
Session session = null;
public FilmHelper() {
this.session = HibernateUtil.getSessionFactory().getCurrentSession();
}
public List getFilmTitles(int startID, int endID) {
List<Film> filmList = null;
try {
org.hibernate.Transaction tx = session.beginTransaction();
Query q = session.createQuery ("from Film as film where film.filmId between '"+startID+"'
and '"+endID+"'");
filmList = (List<Film>) q.list();
} catch (Exception e) {
e.printStackTrace();
}
return filmList;
}
public List getActorsByID(int filmId){
List<Actor> actorList = null;
try {
org.hibernate.Transaction tx = session.beginTransaction();
Query q = session.createQuery ("from Actor as actor where actor.actorId in (select
filmActor.actor.actorId from FilmActor as filmActor where filmActor.film.filmId='" + filmId + "')");
actorList = (List<Actor>) q.list();
} catch (Exception e) {
e.printStackTrace();
}
return actorList;
}
public Category getCategoryByID(int filmId){
List<Category> categoryList = null;
try {
org.hibernate.Transaction tx = session.beginTransaction();
Query q = session.createQuery("from Category as category where category.categoryId in
(select filmCat.category.categoryId from FilmCategory as filmCat where filmCat.film.filmId='" +
filmId + "')");
categoryList = (List<Category>) q.list();
} catch (Exception e) {
e.printStackTrace();
}
return categoryList.get(0);
}
public Film getFilmByID(int filmId){
Film film = null;
try {
org.hibernate.Transaction tx = session.beginTransaction();
Query q = session.createQuery("from Film as film where film.filmId=" + filmId);
film = (Film) q.uniqueResult();
} catch (Exception e) {
e.printStackTrace();
}
return film;
}
public String getLangByID(int langId){
Language language = null;
try {
org.hibernate.Transaction tx = session.beginTransaction();
Query q = session.createQuery("from Language as lang where lang.languageId=" + langId);
language = (Language) q.uniqueResult();
} catch (Exception e) {
e.printStackTrace();
}
return language.getName();
}
}
Crear archivo FilmController.java
package dvdrental;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
@ManagedBean
@SessionScoped
public class FilmController {
int startId;
int endId;
DataModel filmTitles;
FilmHelper helper;
private int recordCount = 1000;
private int pageSize = 10;
private Film current;
private int selectedItemIndex;
/** Creates a new instance of FilmController */
public FilmController() {
helper = new FilmHelper();
startId = 1;
endId = 10;
}
public FilmController(int startId, int endId) {
helper = new FilmHelper();
this.startId = startId;
this.endId = endId;
}
public Film getSelected() {
if (current == null) {
current = new Film();
selectedItemIndex = -1;
}
return current;
}
public DataModel getFilmTitles() {
if (filmTitles == null) {
filmTitles = new ListDataModel(helper.getFilmTitles(startId, endId));
}
return filmTitles;
}
void recreateModel() {
filmTitles = null;
}
public boolean isHasNextPage() {
if (endId + pageSize <= recordCount) {
return true;
}
return false;
}
public boolean isHasPreviousPage() {
if (startId-pageSize > 0) {
return true;
}
return false;
}
public String next() {
startId = endId+1;
endId = endId + pageSize;
recreateModel();
return "index";
}
public String previous() {
startId = startId - pageSize;
endId = endId - pageSize;
recreateModel();
return "index";
}
public int getPageSize() {
return pageSize;
}
public String prepareView(){
current = (Film) getFilmTitles().getRowData();
return "browse";
}
public String prepareList(){
recreateModel();
return "index";
}
public String getLanguage() {
int langID = current.getLanguageByLanguageId().getLanguageId().intValue();
String language = helper.getLangByID(langID);
return language;
}
public String getActors() {
List actors = helper.getActorsByID(current.getFilmId());
StringBuffer totalCast = new StringBuffer();
for (int i = 0; i < actors.size(); i++) {
Actor actor = (Actor) actors.get(i);
totalCast.append(actor.getFirstName());
totalCast.append(" ");
totalCast.append(actor.getLastName());
totalCast.append(" ");
}
return totalCast.toString();
}
public String getCategory() {
Category category = helper.getCategoryByID(current.getFilmId());
return category.getName();
}
}
Crear template.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link href="./resources/css/default.css" rel="stylesheet" type="text/css" />
<link href="./resources/css/cssLayout.css" rel="stylesheet" type="text/css" />
<title>Facelets Template</title>
</h:head>
<h:body>
<div id="top" class="top">
<ui:insert name="top">Top</ui:insert>
</div>
<div id="content" class="center_content">
<ui:insert name="body">Content</ui:insert>
</div>
</h:body>
</html>
Modificar archivo index.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core">
<ui:composition template="./template.xhtml">
<ui:define name="body">
<h:form styleClass="jsfcrud_list_form">
<h:commandLink action="#{filmController.previous}" value="Previous
#{filmController.pageSize}" rendered="#{filmController.hasPreviousPage}"/>
<h:commandLink action="#{filmController.next}" value="Next
#{filmController.pageSize}" rendered="#{filmController.hasNextPage}"/>
<h:dataTable value="#{filmController.filmTitles}" var="item" border="0" cellpadding="2"
cellspacing="0" rowClasses="jsfcrud_odd_row,jsfcrud_even_row" rules="all" style="border:solid
1px">
<h:column>
<f:facet name="header">
<h:outputText value="Title"/>
</f:facet>
<h:outputText value="#{item.title}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Description"/>
</f:facet>
<h:outputText value="#{item.description}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value=" "/>
</f:facet>
<h:commandLink action="#{filmController.prepareView}" value="View"/>
</h:column>
</h:dataTable>
<br/>
</h:form>
</ui:define>
</ui:composition>
</html>
Crear archivo browse.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets">
<body>
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
template="./template.xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<ui:define name="top">
top
</ui:define>
<ui:define name="body">
<h:form>
<h:panelGrid columns="2">
<h:outputText value="Title:"/>
<h:outputText value="#{filmController.selected.title}" title="Title"/>
<h:outputText value="Description"/>
<h:outputText value="#{filmController.selected.description}" title="Description"/>
<h:outputText value="Genre"/>
<h:outputText value="#{filmController.category}"/>
<h:outputText value="Cast"/>
<h:outputText value="#{filmController.actors}"/>
<h:outputText value="Film Length"/>
<h:outputText value="#{filmController.selected.length} min" title="Film Length"/>
<h:outputText value="Language"/>
<h:outputText value="#{filmController.language}" title="Film Length"/>
<h:outputText value="Release Year"/>
<h:outputText value="#{filmController.selected.releaseYear}" title="Release Year">
<f:convertDateTime pattern="MM/dd/yyyy" />
</h:outputText>
<h:outputText value="Rental Duration"/>
<h:outputText value="#{filmController.selected.rentalDuration}" title="Rental
DUration"/>
<h:outputText value="Rental Rate"/>
<h:outputText value="#{filmController.selected.rentalRate}" title="Rental Rate"/>
<h:outputText value="Replacement Cost"/>
<h:outputText value="#{filmController.selected.replacementCost}" title="Replacement
Cost"/>
<h:outputText value="Rating"/>
<h:outputText value="#{filmController.selected.rating}" title="Rating"/>
<h:outputText value="Special Features"/>
<h:outputText value="#{filmController.selected.specialFeatures}" title="Special
Features"/>
<h:outputText value="Last Update"/>
<h:outputText value="#{filmController.selected.lastUpdate}" title="Last Update">
<f:convertDateTime pattern="MM/dd/yyyy HH:mm:ss" />
</h:outputText>
</h:panelGrid>
<br/>
<br/>
<h:commandLink action="#{filmController.prepareList}" value="View All List"/>
<br/>
</h:form>
</ui:define>
</ui:composition>
</body>
</html>
Ejecutar Proyecto