Bienvenidos al Blog de Aldo Malaver

Este Blog contiene articulos que te ayudaran a resolver muchos problemas, comenta cada articulo por favor. Gracias.

martes, 22 de enero de 2013

Integración Hibernate, Spring, Rich Faces



1.     Creación de Proyecto Web

Abrir eclipse luego crear un nuevo Dynamic Web Project utilizando New->Other->Dynamic Web Project. El nombre del proyecto será IntegracionJSFSpringHibernate.

Utilizar el link http://amalaver.blogspot.com/2011/11/mapeo-de-entity-clases-desde-la-base-de.html para poder generar el mapeo de clases utilizando hibernate.

Driver: com.mysql.jdbc.Driver
Connect URL: jdbc:mysql://localhost:3306/Peru
User: root
Password: mysql

En la carpeta lib que se encuentra en la carpeta WEB-INF se debe pegar las librerías de Hibernate que se encuentran en la carpeta 01 HibernateLibs que se le dio al comienzo.



2.    Integración Hibernate con Spring
Primero crearemos el archivo dbConfig.xml en el cual se encontrará los parámetros de conexión para la base de datos. Hacemos click derecho en la carpeta WEB-INF y seleccionamos New->Other->XML File y le pondremos de nombre dbConfig.xml. Este archivo contendrá la siguiente información:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:context="http://www.springframework.org/schema/context"
             xmlns:tx="http://www.springframework.org/schema/tx"
             xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
      
       <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
             <property name="jpaVendorAdapter">
                    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                           <property name="showSql" value="false" />
                           <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" />
                    </bean>
             </property>
             <property name="dataSource" ref="dataSource" />
       </bean>

       <bean id="dataSource"
             class="org.springframework.jdbc.datasource.DriverManagerDataSource">
             <property name="driverClassName" value="com.mysql.jdbc.Driver" />
             <property name="url" value="jdbc:mysql://localhost:3306/Peru" />
             <property name="username" value="root" />
             <property name="password" value="mysql" />           
       </bean>
      
       <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
             <property name="dataSource" ref="dataSource" />
             <property name="entityManagerFactory" ref="entityManagerFactory" />
       </bean>

       <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

       <bean id="jdbcTemplateCibertec" class="org.springframework.jdbc.core.JdbcTemplate">
         <property name="dataSource"  ref="dataSource"/>      
       </bean>     
</beans>

Este archivo contiene información de la conexión a la base datos, configuración hibernate donde se coloca el dialecto y el uso de anotaciones.

Hasta el momento hemos configurado solamente base de datos, ahora tenemos que configurar la integración Spring con Hibernate para lo cual crearemos el archivo applicationContext.xml. Para crear este archivo seleccionaremos la carpeta WEB-INF y hacemos click derecho New->Other->XML File, el nombre el archivo será applicationContext y contendrá la siguiente información:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

       <import resource="dbConfig.xml" />
      
      
       <context:annotation-config />

       <!-- Instructs the container to look for beans with @Transactional and decorate them -->
       <tx:annotation-driven transaction-manager="transactionManager"/>
      
       <context:component-scan base-package="cibertec.edu.pe" />
       <bean id="logger" class="org.springframework.beans.factory.config.CommonsLogFactoryBean">
             <property name="logName" value="log" />
       </bean>
      
</beans>

Copiar las librerías de Spring que se encuentran en la carpeta 02 SpringLibs, dentro de la carpeta lib.

Luego seleccionar la carpeta META-INF y hacer click derecho New->Other->XML File y dar el nombre persistence.xml. Este archivo contendrá información de la persistencia de datos que utiliza Hibernate para trabajar. A continuación se muestra el código que debe contener este archivo:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
      http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
       version="1.0">

       <persistence-unit name="default" transaction-type="RESOURCE_LOCAL">

       </persistence-unit>

</persistence>
      

La carpeta META-INF con el archivo persistence.xml debe crearse también en la carpeta src del proyecto. Con esta configuración terminamos de integrar Hibernate con Spring, ahora nos tocará integrar con JSF.

3.    Integración con JSF
Primero para integrar JSF, debemos crear los componentes necesarios para que JSF pueda trabajar, estos componentes son los siguientes:
  • Web.xml
  • Faces-config.xml
  • Agregar librerías de faces
  • Página web de prueba
  • Crear log4j, properties
  • Agregar librerías log4j

Web.xml
Primero crearemos el archivo web.xml, para lo cual seleccionaremos la carpeta WEB-INF, hacemos click derecho New->Other->Web Descriptor.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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-app_2_5.xsd">
       <context-param>
             <param-name>com.sun.faces.validateXml</param-name>
             <param-value>true</param-value>
       </context-param>
       <context-param>
             <param-name>com.sun.faces.verifyObjects</param-name>
             <param-value>false</param-value>
       </context-param>
       <context-param>
             <param-name>contextConfigLocation</param-name>
             <param-value>WEB-INF/applicationContext.xml</param-value>
       </context-param>
       <context-param>
             <param-name>facelets.BUILD_BEFORE_RESTORE</param-name>
             <param-value>false</param-value>
       </context-param>
       <context-param>
             <param-name>facelets.DEVELOPMENT</param-name>
             <param-value>true</param-value>
       </context-param>
       <context-param>
             <param-name>facelets.RECREATE_VALUE_EXPRESSION_ON_BUILD_BEFORE_RESTORE</param-name>
             <param-value>false</param-value>
       </context-param>
       <context-param>
             <param-name>facelets.REFRESH_PERIOD</param-name>
             <param-value>1</param-value>
       </context-param>
       <context-param>
             <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
             <param-value>.xhtml</param-value>
       </context-param>
       <context-param>
             <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
             <param-value>server</param-value>
       </context-param>
       <context-param>
             <param-name>log4j-messages_es-location</param-name>
             <param-value>WEB-INF/messages_es.properties</param-value>
       </context-param>
       <context-param>
             <param-name>log4j-properties-location</param-name>
             <param-value>WEB-INF/log4j.properties</param-value>
       </context-param>
       <context-param>
             <param-name>log4jConfigLocation</param-name>
             <param-value>WEB-INF/log4j.properties</param-value>
       </context-param>
       <context-param>
             <param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
             <param-value>com.sun.facelets.FaceletViewHandler</param-value>
       </context-param>
       <context-param>
             <param-name>org.richfaces.CONTROL_SKINNING</param-name>
             <param-value>enable</param-value>
       </context-param>   
       <context-param>
             <param-name>facelets.SKIP_COMMENTS</param-name>
             <param-value>true</param-value>
       </context-param>
       <filter>
             <display-name>RichFaces Filter</display-name>
             <filter-name>richfaces</filter-name>
             <filter-class>org.ajax4jsf.Filter</filter-class>
             <init-param>
                    <param-name>createTempFiles</param-name>
                    <param-value>false</param-value>
             </init-param>
             <init-param>
                    <param-name>maxRequestSize</param-name>
                    <param-value>1000000</param-value>
             </init-param>
       </filter>
       <filter>
             <filter-name>Login Filter</filter-name>
             <filter-class>cibertec.edu.pe.filter.LoginFilter</filter-class>
       </filter>
       <filter>
             <filter-name>JPA Filter</filter-name>
             <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
       </filter>
       <filter-mapping>
             <filter-name>Login Filter</filter-name>       
              <url-pattern>*.jsf</url-pattern>
       </filter-mapping>
       <filter-mapping>
             <filter-name>JPA Filter</filter-name>
             <url-pattern>*.jsf</url-pattern>
       </filter-mapping>
       <filter-mapping>
             <filter-name>richfaces</filter-name>
             <servlet-name>Faces Servlet</servlet-name>
             <dispatcher>REQUEST</dispatcher>
             <dispatcher>FORWARD</dispatcher>
             <dispatcher>INCLUDE</dispatcher>
       </filter-mapping>
       <listener>
             <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
       </listener>
       <listener>
             <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
       </listener>
       <servlet>
             <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
             <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
             <init-param>
                    <param-name>contextConfigLocation</param-name>
                    <param-value />
             </init-param>
             <load-on-startup>0</load-on-startup>
       </servlet>
       <servlet>
             <servlet-name>Faces Servlet</servlet-name>
             <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
             <load-on-startup>1</load-on-startup>
       </servlet>
       <servlet-mapping>
             <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
             <url-pattern>/spring/*</url-pattern>
       </servlet-mapping>
       <servlet-mapping>
             <servlet-name>Faces Servlet</servlet-name>
             <url-pattern>*.jsf</url-pattern>
       </servlet-mapping>
       <welcome-file-list>
             <welcome-file>index.html</welcome-file>
       </welcome-file-list>
</web-app>


Faces-Config
Después crearemos el archive faces-config.xml, seleccionamos la carpeta WEB-INF, click derecho New->Other->Faces Config. Le quitamos el check de registrer in web.xml. Después de crear el archivo, tenemos que adicionar algunas líneas y de la siguiente manera quedaría nuestro archivo:


<?xml version="1.0"?>
<faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xi="http://www.w3.org/2001/XInclude" 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>
             <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
       </application>
</faces-config>


El tag <el-resolver> dentro del archivo de configuración faces-config es necesario para poder trabajar con spring.

Agregar librerías de faces
En la carpeta 03 FacesLibs, encontraremos las librerías utilizadas para faces, las cuales serán copiadas al proyecto.

Página web de prueba
Creamos la página index.html que será la página de inicio la cual nos enviará a la primera página jsf. Seleccionamos la carpeta webContent, click derecho New->Other->html File. Cuando nos genere la página, nuestra página debe contener el siguiente código html:
<html>
<head>
       <meta content="text/html; charset=UTF-8" http-equiv="content-type" />
       <meta http-equiv="refresh" content="0; url=paginas/inicio.jsf" />
</head>

<body>
</body>
</html>

Después de crear la página html, creamos una carpeta llamada paginas dentro de la carpeta webContent. Dentro de la carpeta paginas crearemos la página inicio.xhtml que contendrá la primera página de nuestra aplicación integrada. Seleccionamos la carpeta paginas, click derecho New->Other->Xhtml Page. Esta página contendrá el siguiente código:

<html xmlns="http://www.w3.org/1999/xhtml"
       xmlns:ui="http://java.sun.com/jsf/facelets"
       xmlns:h="http://java.sun.com/jsf/html"
       xmlns:f="http://java.sun.com/jsf/core">

       <h:form>
             <h:outputText value="hola"/>     
       </h:form>

</html>     

Crea log4j, properties
Para crear el log4j.properties, seleccionamos la carpeta WEB-INF, click derecho New->Other->Properties File. El archivo contendrá las siguientes líneas:
log4j.appender.DAILY=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DAILY.File=D:/abc.log
log4j.appender.DAILY.DatePattern='.'yyyy-MM-dd
log4j.appender.DAILY.layout=org.apache.log4j.PatternLayout
log4j.appender.DAILY.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] (%F:%M:%L)%n%m%n%n

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] (%F:%M:%L)%n%m%n%n

# Root logger option
log4j.rootLogger=ERROR, DAILY, stdout
log4j.logger.org.springframework=ERROR, DAILY
log4j.logger.org.hibernate=ERROR, DAILY
log4j.logger.org.hibernate.SQL=DEBUG, DAILY

Luego haremos los mismos pasos para crear el archivo messages.properties y messages_es.properties.
El archivo messages.properties contendrá la siguiente información:
mensaje.datosEnviados=Datos enviados Satisfactoriamente
mensaje.enviar=No hay registros para enviar


El archivo messages_es.properties contendrá la siguiente información:
up=\u2191
down=\u2193
left=\u2039
right=\u203A
log4j.file.name =loging.log
log4j.file.path =D\:\\abc.log

Agregar librerías log4j
El último paso es agregar al proyecto las librerías log4j que se encuentran en la carpeta 04 Log4j.

4.    Crear el Login Filter
Creamos una clase en el paquete cibertec.edu.pe.filter llamado LoginFilter. Este clase contendrá las siguientes líneas de código:
package cibertec.edu.pe.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;

public class LoginFilter implements Filter {
       private String loginPage = "paginas/inicio.jsf";
       private String timeoutPage = "";

       public void init(FilterConfig filterConfig) throws ServletException {

       }
      
       public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
             if ((request instanceof HttpServletRequest) && (response instanceof HttpServletResponse)) {

                    HttpServletRequest httpServletRequest = (HttpServletRequest) request;
                    HttpServletResponse httpServletResponse = (HttpServletResponse) response;
                   
                    String requestPath = httpServletRequest.getRequestURI();
                    boolean loginVal = requestPath.endsWith("inicio.jsf");
                    if(!loginVal){
                           if (isSessionControlRequiredForThisResource(httpServletRequest)) {
                                  if (isSessionInvalid(httpServletRequest)) {
                                        String timeoutUrl = httpServletRequest.getContextPath() + "/" + getTimeoutPage();
                                 
                                        System.out.println("Session is invalid! redirecting to timeoutpage : " + timeoutUrl);
                                 
                                         httpServletResponse.sendRedirect(timeoutUrl);
                                        return;
                                  }
                           }
                    }
             }
             filterChain.doFilter(request, response);
       }

       private boolean isSessionControlRequiredForThisResource(HttpServletRequest httpServletRequest) {     
             String requestPath = httpServletRequest.getRequestURI();
             boolean controlRequired = !StringUtils.contains(requestPath, getTimeoutPage());
      
             return controlRequired;
       }
            
       private boolean isSessionInvalid(HttpServletRequest httpServletRequest) {
             boolean sessionInValid = (httpServletRequest.getRequestedSessionId() != null) && !httpServletRequest.isRequestedSessionIdValid();
             return sessionInValid;
       }
      
       public void destroy() {

       }
      
       public String getTimeoutPage() {
             return timeoutPage;
       }
      
       public void setTimeoutPage(String timeoutPage) {
             this.timeoutPage = timeoutPage;
       }

       public String getLoginPage() {
             return loginPage;
       }

       public void setLoginPage(String loginPage) {
             this.loginPage = loginPage;
       }
}

Si deseas las librerias, puedes donar y me escribes un correo a almalaver@gmail.com.

No te olvides de donar para poder crear más publicaciones.

No hay comentarios:

Publicar un comentario