UploadFile con Icefaces + Hibernate + Anotaciones.
0. Índice de contenidos.
- 1. Introducción.
- 2. Entorno
- 3. La Aplicacion
- 4. Creando nuestro proyecto
- 5. Capa de Persistencia
- 6. Capa de Negocio
- 7. Capa de Control
- 8. Capa de Presentacion
- 9. Configuracion Hibernate y jsf
- 10.Conclusiones.
1. Introducción
Este tutorial pretende servir de gu
de inicio
para todos aquellos usuarios que comienzan a dar sus primeros pasos en ICEfaces,
JSF e Hibernate,y también,como pueden servirse de Netbeans IDE como entorno de desarrollo
fácil e intuitivo para dar soporte a estas tecnologías,
confeccionando de una manera rápida nuestro entorno de trabajo.
Objetivos
- 1.Manejar comoponentes ICEfaces para la interfaz de usuario.
- 2.Ver como JSF gestiona la capa de control,comunicando la presentación con la lógica de negocio.
- 3.Servirnos de Hibernate para obtener una capa de persistencia más sencilla y mantenible.
2. Entorno
El tutorial está escrito usando el siguiente entorno:
- Hardware: Portátil Dell Latitude E5500(Core Duo T9550 2.66GHz, 4GB RAM, 340 GB HD).
- Sistema operativo: Windows XP.
- JDK 1.6.0_1
- NetBeans 6.5
- Icefaces 1.8.0
- Hibernate 3.2.5
- Tomcat 6.0.18
- MySQL 5.1
- Internet Explorer
3. La aplicación
La aplicación consiste en un listado donde se muestra los ficheros que tenemos en nuestro servidor. Podría quedar algo como:
y una pantalla de edición de los ficheros,tanto para editar uno existente como para subir un nuevo fichero.
4. Creando nuestro proyecto
Lo primero es crear un nuevo proyecto.
seleccionamos proyecto web.
Damos nombre a nuestro proyecto y le indicamos la ubicación de nuestro workspace
seleccionamos el servidor,en nuestro caso Tomcat.
y por último seleccionamos los frameworks necesarios.ICEfaces,JavaServerFaces e Hibernate 3.2.5 .
En el pantallazo no aparece pero Hibernate 3.2.5 esta el ultimo de la lista.
Nuestro proyecto quedaría algo como:
Podemos observar que en Libraries nos ha colocado todas las dependencias necesarias,además de crearnos los ficheros de configuración
de JSF (faces-config.xml) y el fichero de configuración de Hibernate(hibernate.cfg.xml) que veremos mas adelante.
5. Capa de Persistencia
La capa de persistencia son los cimientos de la aplicación.
Cualquier desarrollo por sencillo que sea,podría interactuar con una base de datos para insertar,modificar
y recuparar información.Aquí es donde entra en juego Hibernate facilitando el
proceso mediante mecanismos de mapeo objeto/relaccional(Object Relational Mapping,ORM) y
simplificando la programación de la capa de persistencia como veremos a continuación.
Dentro de la capa de persistencia hemos de diferenciar dos partes:
- Definicion de las entidades persistentes de Hibernate
- Definicion de los clases DAO ,que se encargaran de gestionar la logica de Hibernate,ya que nuestra lógica de negocio
no tiene por qué saber como Hibernate gestiona el acceso a los datos.
5.1 Las Entidades
Creamos la única entidad de nuestra aplicación.Así quedaría la clase:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
// Indico que la clase pertenece a la capa de persistencia // y que es una entidad (objetojava-->tabla) @Entity @Table public class FilesUp implements Serializable { private Long id; private String namefile; private Date datefile; private String pathfile; private String typefile; private String sizefile; private String descripfile; // Definimos el id y su comportamiento // Genera la clave en orden @Id @GeneratedValue(strategy=GenerationType.IDENTITY) public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name = "nombre", nullable = false, length = 100) public String getNamefile() { return namefile; } public void setNamefile(String namefile) { this.namefile = namefile; } @Column(name = "fecha", nullable = false) @Temporal(javax.persistence.TemporalType.DATE) public Date getDatefile() { return datefile; } public void setDatefile(Date datefile) { this.datefile = datefile; } @Column(name = "ruta", nullable = false) public String getPathfile() { return pathfile; } public void setPathfile(String pathfile) { this.pathfile = pathfile; } @Column(name = "sizefile", nullable = false) public String getSizefile() { return sizefile; } public void setSizefile(String sizefile) { this.sizefile = sizefile; } @Column(name = "tipefile", nullable = false) public String getTypefile() { return typefile; } public void setTypefile(String typefile) { this.typefile = typefile; } @Column(name = "descripcion", nullable = true, length = 200) public String getDescripfile() { return descripfile; } public void setDescripfile(String descripfile) { this.descripfile = descripfile; } } |
De la clase hay que destacar el uso de anotaciones que serviran ha Hibernate
para saber que el objeto es una entidad,cual es el id de la entidad,que este id
sera generado por la base de datos y cual serán los nombres y algunas otras
propiedades básicas para las columnas.
5.2 El DAO
Primero definimos una interface,de esta manera en un futuro podríamos
cambiar la implementación en caso de utilizar otro motor de persistencia distinto a Hibernate.
1 2 3 4 5 6 7 8 |
public interface FilesUpIntDao { //Metodo que graba o modifica un registro de la base de datos public void guardar(Object entity); // Metodo que recupara todos los registros de base datos public List<FilesUp> listartodos(); } |
Continuamos implementando el DAO.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
public class FilesUpDao implements FilesUpIntDao{ private Session sesion; private Transaction tx; // Metodo que guarda o modifica el object pasado como parametro public void guardar(Object entity) { try { iniciaOperacion(); sesion.saveOrUpdate(entity); tx.commit(); }catch(HibernateException sf) { manejaExcepcion(sf); throw sf; }finally { sesion.close(); } } // Metodo que devuelve todos los registros de la tabla fileup public List<FilesUp> listartodos() { List<FilesUp> filesUp = null; try { iniciaOperacion(); Query q = sesion.createQuery("from FilesUp"); filesUp = (List<FilesUp>) q.list(); }catch(HibernateException sf){ manejaExcepcion(sf); throw sf; } finally { sesion.close(); } return filesUp; } // Metodo encargado de incializar el SessionFactory y abrir una Tx private void iniciaOperacion() throws HibernateException { // Recuperamos el SessionFactuy y comenzamos las tx sesion = HibernateUtil.getSessionFactory().openSession(); tx = sesion.beginTransaction(); } // Metodo encargado de recoger la excepcion y hacer el rollbak de la transacion private void manejaExcepcion(HibernateException sf) throws HibernateException { tx.rollback(); throw new HibernateException("Ocurrió un error en la capa de acceso a datos", sf); } } |
Como podemos ver se trata de una implementación sencilla ya que solo necesitamos
dos operaciones básicas para cubrir la funcionalidad de nuestra aplicación:
- 1.Insertar y modifcar datos de lo que se encargará el método guardar().
- 2.Recuperar información de lo que se encargará el método listartodos()
Vemos que de una manera rápida hemos creado nuestra capa de persistencia teniendo
la ventaja de que trabajando de esta manera podremos decirle ha Hibernate en su
fichero de configuración que sea el mismo el que cree las tablas correspondientes en
base de datos a partir de las clases definidas como entidades persistentes.
6. Capa de Negocio.
Como hemos visto anteriormente la funcionalidad de nuestra aplicación es muy sencilla
por lo que nuestra lógica de negocio también lo será.En realidad en esta clase
solo estamos delegando el control al DAO para que realice la operación correspondiente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class FilesUpManager { private FilesUpDao dao; public void guardar(FilesUp file){ dao=new FilesUpDao(); dao.guardar(file); } public List<FilesUp> getFilesUp() { dao=new FilesUpDao(); final List<FilesUp> list = dao.listartodos(); return list; } } |
7. Capa de Control.
Aquí es donde JSF entra a formar parte de nuestra aplicación.
Esta capa es la encargada de gestionar la comunicación entre la presentación y
la lógica de negocio ,gestionando los eventos provocados por el usuario al realizar
distintas acciones (pulsar un botón,cambios de valores,seleccionar una opción …).
y ejecutando código java para responder a cada una de las acciones.
Las clases que formaran parte de la capa de control son los denomidados
managed-bean de JSF.En nuestro caso,al tener dos pantallas definiremos dos
managed-bean,uno para cada pantalla.
Mas adelante veremos que para que JSF sepa que estas clases forman parte de
la capa de control hemos de definirlas en el faces-config.xml .
Para la pantalla con el listado de ficheros:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
public class ListFilesUp { private FilesUpManager filesUpMgr; private List listFiles; // Metodo de control para definir el data table public ListFilesUp() {} public List getListFiles() { filesUpMgr=new FilesUpManager(); listFiles=filesUpMgr.getFilesUp(); return listFiles; } public void setListFiles(List listFiles) { this.listFiles = listFiles; } } |
En este managed-bean la implementación es muy sencilla ya que solo nos servirá
para mostrar la lista con todos los registros de nuestra tabla en base de datos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
public class EditFilesUp { private Long id; private String nombre; private Date fecha; private String ruta; private String tipoFile; private String sizeFile; private String descripfile; private FilesUpManager filesUpMgr; private FilesUp filesUp ; // file upload completed percent (Progress) private int fileProgress; private UIData componentDataTable; private boolean disabledGuardar; private boolean disabledUpload; public EditFilesUp() {} //Metodo de navegacion a la pantalla de de edicion public String insertFilesUp(){ // Obtenemos la fecha del sitema Calendar fechaActual=new GregorianCalendar(); // Inicializamos propiedades del backBeans this.id=null; this.nombre=""; this.ruta=""; this.tipoFile=""; this.sizeFile="0 B"; this.descripfile=""; this.fecha=fechaActual.getTime(); this.fileProgress=0; this.disabledGuardar=true; this.disabledUpload=false; return "insertFilesUp"; } // metodo que inserta o modifica y navega a la pagina inicial de listado public String save(){ filesUpMgr=new FilesUpManager(); filesUp=new FilesUp(); if (this.id==null){ // Insertamos registro filesUp.setNamefile(nombre); filesUp.setDatefile(fecha); filesUp.setPathfile(ruta); filesUp.setSizefile(sizeFile); filesUp.setTypefile(tipoFile); filesUp.setDescripfile(descripfile); }else{ // Modificamos registro filesUp.setId(id); filesUp.setNamefile(nombre); filesUp.setDatefile(fecha); filesUp.setPathfile(ruta); filesUp.setSizefile(sizeFile); filesUp.setTypefile(tipoFile); filesUp.setDescripfile(descripfile); } filesUpMgr.guardar(filesUp); return "home"; } //metodo de navegacion hacia el registro seleccionado public String editSelectFile(){ int index=getComponentDataTable().getRowIndex(); filesUp = (FilesUp) getComponentDataTable().getRowData(); this.id=filesUp.getId(); this.nombre=filesUp.getNamefile(); this.fecha=filesUp.getDatefile(); this.ruta=filesUp.getPathfile(); this.tipoFile=filesUp.getTypefile(); this.sizeFile=filesUp.getSizefile(); this.descripfile=filesUp.getDescripfile(); this.disabledGuardar=false; this.disabledUpload=true; this.fileProgress=0; return "editFilesUp"; } // metodo Listener para el uploadFile public void cargarFile(ActionEvent event) { InputFile inputFile = (InputFile) event.getSource(); File file=inputFile.getFile(); FileInfo fileInfo = inputFile.getFileInfo(); if (file!=null){ this.ruta=file.getPath(); this.nombre =fileInfo.getFileName(); this.tipoFile =fileInfo.getContentType(); this.sizeFile =Utilidades.getSizeFormatted(fileInfo.getSize()) ; this.descripfile=""; Calendar fechaActual=new GregorianCalendar(); this.fecha=fechaActual.getTime(); this.disabledGuardar=false; } } // metodo listener para la barra de progreso public void fileUploadProgress(EventObject event) { InputFile ifile = (InputFile) event.getSource(); fileProgress = ifile.getFileInfo().getPercent(); } |
Para la pantalla de edición:
Este managed-bean es el que contiene el control para el resto de las funcionalidades
de nuestra aplicacion.En la capa de presentación veremos como los
componentes ICEfaces lanzan cada uno de los metodos dependiendo de la
accion realizada por el usuario.
Es importante a la hora de implemetar los distintos managed-bean saber los tipos de eventos que maneja JSF:
- 1. Evento Action:Se produce al activarse el componente que implementa la interface
ActionSource.Se trata de botones e hiperlinks. - 2. Evento Value-change:Se produce al cambiar el dato de un componente UIInput o sus
subclases.Solo se lanza en caso de haber errores de validación,además el valor del atributo inmediate
cambia su actuación. - 3. Evento Data-Model:Se produce al cambiar la columna seleccionada en un componente de
tipo UIData.
También es importante saber como trata estos eventos:
- 1.Implemtando una clase Listener que recoja los eventos y registrando esta en el
componente que los produce mediante el tag actionListener o valueChangeListener. - 2. Implementando un metodo en los managed-bean que sea referenciado desde el componente con una expresion de
metodo en el atributo apropiado de este.
8. Capa de Presentación.
Para la capa de presentación utilizaremos ICEfaces.Este framework basado en
JSF nos habilita un set de componentes de interfaz de usuario rico y potente.
En este caso en concreto utilizaremos distintos componentes como outputtext,inputtext,
datatable e inputfile.
Pantalla listado:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <%@taglib prefix="ice" uri="http://www.icesoft.com/icefaces/component"%> <f:view> <f:loadBundle basename="MensajesAplicacion" var="msg"/> <ice:outputHtml> <ice:outputHead> <ice:outputStyle href="./xmlhttp/css/xp/xp.css"/> <title><h:outputText value="#{msg.tituloPagina}"/></title> </ice:outputHead> <ice:outputBody> <ice:form> <div id="panelUp" style="border:none;height:100px"> <ice:graphicImage id ="cabecera" value="/img/cabecera.png" style="position:relative;left:10%"/> </div> <div id="panelCenter" style="border:none;height:100px"> <ice:panelGrid style="position:relative;left:10%"> <h3><ice:outputText style="position:relative;left:15px" value="#{msg.tituloLista}"/></h3> <ice:dataTable var="file" binding="#{editFilesUp.componentDataTable}" value="#{listFilesUp.listFiles}"> <h:column> <f:facet name="header"> <ice:outputText value="#{msg.nombreLabel}" /> </f:facet> <ice:outputText value="#{file.namefile}" /> </h:column> <h:column> <f:facet name="header"> <ice:outputText value="#{msg.tipoLabel}" /> </f:facet> <ice:outputText value="#{file.typefile}" /> </h:column> <h:column> <f:facet name="header"> <ice:outputText value="#{msg.sizeLabel}" style="width:50px"/> </f:facet> <ice:outputText value="#{file.sizefile}" /> </h:column> <h:column> <f:facet name="header"> <ice:outputText value="#{msg.fechaLabel}" /> </f:facet> <ice:outputText value="#{file.datefile}" style="width:90px"> <f:convertDateTime type="date" dateStyle="medium" /> </ice:outputText> </h:column> <h:column > <f:facet name="header"> <ice:outputText value="#{msg.descripcionLabel}" /> </f:facet> <ice:outputText value="#{file.descripfile}" /> </h:column> <h:column > <f:facet name="header"> <ice:outputText value="Edicion"/> </f:facet> <ice:commandButton style="position:relative;left:0px" value="Editar fichero" action="#{editFilesUp.editSelectFile}"></ice:commandButton> </h:column> </ice:dataTable> <br> <ice:commandButton style="position:relative;left:2%" value="#{msg.anadirLabel}" action="#{editFilesUp.insertFilesUp}"></ice:commandButton> </ice:panelGrid> </div> <div id="panelDown" style="border:none;height:auto;position:relative;top:10%;"> <ice:graphicImage id ="pie" value="/img/pie.png" style="position:relative;left:10%"/> </div> </ice:form> </ice:outputBody> </ice:outputHtml> </f:view> |
De esta página destacaremos:
-
Componente datatable
- Atributo value:Sirve para indicar al componente el origen de los datos.
- Atributo binding:Sirve pasa asociar el componente a una propiedad de managed-bean de edición con el fin de porder recuperar la fila seleccionada.
- Componente commandButton
- Atributo action:Indicamos el método que se ejecutará al pulsar y que devolverá la navegación de la aplicación.Las
reglas de navegación las definiremos el el fichero faces-config.xml
Pantalla de edición:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
<%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <%@taglib prefix="ice" uri="http://www.icesoft.com/icefaces/component"%> <f:view> <f:loadBundle basename="MensajesAplicacion" var="msg"/> <ice:outputHtml> <ice:outputHead> <title> <h:outputText value="#{msg.tituloPagina}"/></title> <ice:outputStyle href="./xmlhttp/css/rime/rime.css"/> </ice:outputHead> <ice:outputBody> <ice:form> <div id="panelUp" style="border:none;height:100px"> <ice:graphicImage id ="cabecera" value="/img/cabecera.png" style="position:relative;left:10%"/> </div> <div id="panelCenter" style="border:none;height:100px"> <ice:panelGrid style="position:relative;left:10%"> <ice:panelGrid columns="2"> <ice:outputText value="#{msg.selecFileLabel}"/> <ice:inputFile id ="inputFileName" disabled="#{editFilesUp.disabledUpload}" actionListener="#{editFilesUp.cargarFile}" progressListener="#{editFilesUp.fileUploadProgress}"/> <ice:outputText value="#{msg.nombreLabel}"/> <ice:inputText id="nombre" value="#{editFilesUp.nombre}" readonly="true" style="height:25px;width:245px"/> <ice:outputText value="#{msg.tipoLabel}"/> <ice:inputText id="tipo" value="#{editFilesUp.tipoFile}" readonly="true" style="height:25px;width:245px"/> <ice:outputText value="#{msg.sizeLabel}"/> <ice:inputText id="size" value="#{editFilesUp.sizeFile}" readonly="true" style="height:25px;width:245px"/> <ice:outputText value="#{msg.fechaLabel}"/> <ice:selectInputDate id="Fecha" value="#{editFilesUp.fecha}" popupDateFormat="dd-MM-yyyy" renderAsPopup="true" required="true" /> <ice:outputText value=""/> <ice:message for="Fecha" style="color:red"/> <ice:outputText value="#{msg.descripcionLabel}"/> <ice:inputTextarea id="Descripcion" value="#{editFilesUp.descripfile}" style="width:300px;height:100px" required="true" /> <ice:outputText value=""/> <ice:message for="Descripcion" style="color:red"/> <ice:outputText value=""/> <ice:outputProgress value="#{editFilesUp.fileProgress}" style="position:relative;left:0%" styleClass="uploadProgressBar"/> </ice:panelGrid> <ice:panelGrid columns="2"> <ice:outputText value="#{msg.uploadFileLabel}"/> <ice:inputText value="#{editFilesUp.ruta}" readonly="true" style="width:100%;height:25px"/> </ice:panelGrid> <br> <ice:panelGrid columns="2" style="position:relative;left:400px"> <ice:commandButton style="position:relative;left:15px" value="#{msg.guardarLabel}" action="#{editFilesUp.save}" disabled="#{editFilesUp.disabledGuardar}"></ice:commandButton> <ice:commandButton style="position:relative;left:15px" value="#{msg.cancelLabel}" immediate="true" action="home"></ice:commandButton> </ice:panelGrid> </ice:panelGrid> </div> <div id="panelDown" style="border:none;height:auto;position:relative;top:10%;"> <ice:graphicImage id ="pie" value="/img/pie.png" style="position:relative;left:10%"/> </div> </ice:form> </ice:outputBody> </ice:outputHtml> </f:view> |
De esta página destacaremos:
-
Componente inputFile
- Atributo actionListener:Indicamos que método de control se ejecutará al pulsar el boton de upload
- Atributo progressListener:Para indicar el método que gestiona la barra de progreso asociada
Para renderizar la barra de progreso utilizamos el componente outputProgress.
9. Configuracion de Hibernate y JSF.
Para configurar Hibernate debemos editar el fichero hibernate.cfg.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/testautentia</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <property name="connection.pool_size">1</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.hbm2ddl.auto">create</property> <!-- Indicamos las clases a mapear--> <mapping class="com.testautentia.entidades.FilesUp"/> </session-factory> </hibernate-configuration> |
Mediante este fichero estamos indicando a Hibernate todo lo que necesita saber
para integrarse con base de datos.Cabe destacar la propiedad «hibernate.hbm2ddl.auto»
que sirve para que Hibernate cree la tablas al arrancar la aplicación.Opción muy recomendable en desarrollo.
También es importante como indicamos cual van a ser nuestras entidades persistentes
mediante mapping class.
Para la configuraciónn de JSF editamos el fichero faces-config.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
<faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"> <application> <locale-config> <default-locale>es</default-locale> <supported-locale>en</supported-locale> <supported-locale>en_US</supported-locale> <supported-locale>es_ES</supported-locale> </locale-config> <message-bundle>MensajesAplicacion</message-bundle> </application> <managed-bean> <managed-bean-name>listFilesUp</managed-bean-name> <managed-bean-class>com.testautentia.control.ListFilesUp</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> <managed-bean> <managed-bean-name>editFilesUp</managed-bean-name> <managed-bean-class>com.testautentia.control.EditFilesUp</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean> <!-- # | ================= Navigation rules ================= # --> <navigation-rule> <navigation-case> <from-outcome>home</from-outcome> <to-view-id>/welcomeJSF.jspx</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <from-view-id>/welcomeJSF.jspx</from-view-id> <navigation-case> <from-outcome>insertFilesUp</from-outcome> <to-view-id>/editFilesUp.jspx</to-view-id> </navigation-case> <navigation-case> <from-outcome>editFilesUp</from-outcome> <to-view-id>/editFilesUp.jspx</to-view-id> </navigation-case> </navigation-rule> </faces-config> |
En este fichero definimos nuestros managed-bean y las reglas de navegación de la aplicación.
10. Conclusiones.
Como conclusión podemos decir que los frameworks que hemos utilizado para construir nuestra
aplicación proporcionan una serie de facilidades que hacen que el desarrollo se lleve a cabo de una manera
coherente y estructurada.Además reduciremos el tiempo de desarrollo para la capa de persistencia gracias a Hibernate
,siendo esta facilmente mantenible,nos hemos servido de JSF para diferenciar claramente el control del negocio y nuestra presentación será
mucho mas flexible,dinámica y profesional.
Por lo tanto iniciarse en el uso de estas tegnologías es una opción muy recomendable a la hora de realizar desarrollos web.
Un saludo.
Saul
muy buen tutorial, podria tener el codigo fuente.
muy buen tutorial, pero incompleto, sin el código fuente, es complicado despejar dudas cuando se es principiante ante las tecnologías que allí se presentan, por favor, he visto muchos tutoriales, y todos bueno, pero sin el CÓDIGO FUENTE, no es muy claro tu objetivo, Gracias, por favor, si tu intención es colaborar y ayudar igual a la de todos, agreguen el código fuente, nuevamente, Gracias.