Páginas

4/8/14

Tutorial Java, JSF y Adf

Tutorial Java, JSF y Adf Para Principiantes.

ADF Java. Primera Aplicación Utilizando el Framework ADF Core





ADF Java tutorial desde 0. En esta oportunidad haremos un tutorial de Java con el framework ADF para principiantes, esto quiere decir que será algo fácil con lo necesario, no voy a comenzar desde el nivel más bajo sino que te voy a enseñar a crear una aplicación con su respectivo filtro de seguridad, logs, beans, dto, etc. En esta primera parte te voy a dar uno que otro concepto pero iremos más a la práctica que es donde verdaderamente se aprende. Bueno primero que todo ADF (Application Development Framework) es el framework de Oracle para las aplicaciones empresariales de Java, está basado en el framework JSF. Para aprender ADF ya deberías saber JSF por lo menos lo mínimo.


La aplicación yo la voy a crear con el JBoss Developer Studio, el servidor de aplicaciones que utilizare será el JBoss 7, al final el IDE no es importante, puedes usar cualquiera. Primero procedemos a crear un proyecto dinámico nuevo, seleccionamos en la pestaña File> new> Dynamic Web Project. A ese proyecto le pondremos el nombre de adf, luego de esto al expandir el proyecto podemos ver que se han creado varias carpetas, entre ellas estas dos WEB-INF, META-INF

Adf Project
Adf Project


Para que nuestro proyecto compile necesitamos algunas librerías, después de descargar estas librerías nos posicionamos encima de la carpeta WEB-INF>lib> y las copiamos en ese directorio, estas son las librerías:
- adfbinding.jar
- adf-faces-api.jar
- adf-faces-impl.jar
- adfm.jar
- adfshare.jar
- com.bea.cie.bsu.ko_5.3.0.0.jar
- commons-beanutils.jar
- commons-collections.jar
- commons-digester.jar
- commons-lang-2.3.jar
- industrial-adf-faces-api.jar
- industrial-adf-faces-impl.jar
- log4j-1.2.17.jar

Después de descargar las librerías vamos a copiar todos los jars en la carpeta "lib" que se encuentra en la carpeta WEB-INF. Después de haber agregado las librerías correspondientes nos posicionamos encima de la carpeta WEB-INF y vamos a crear el archivo de configuración del JBoss en el cual podremos indicar el nombre con el cual vamos acceder en el url al proyecto, Para crearlo nos posicionamos en la carpeta WEB-INF presionamos clic derecho> new> Other> XML> XML File, el nombre que le pondremos será jboss-web.xml. El contenido del archivo sera el siguiente:

jboss-web.xml
<?xml version="1.0" encoding="UTF-8"?>

 adfDatoJava

     


Después de configurar que la url de entrada a la aplicación sea adfDatoJava pasamos a configurar el archivo de navegación de JSF que utilizara nuestra aplicación, posicionados sobre la misma carpeta WEB-INF presionamos clic derecho>new>Other>JBoss Tool Web>JSF>Faces Config y le pondremos de nombre faces-config.xml, con este archivo pondremos las reglas de navegación de la aplicación mediante String recibidos. El contenido del archivo será el siguiente:

faces-config.xml
   
<?xml version="1.0" encoding="windows-1252"?>


 
  oracle.adf.core
 

     
Como podrás ver, aquí le indico a mi aplicación el kit del framework ADF que vamos a utilizar que en este tutorial es el core. Más adelante en este mismo archivo vamos a definir los managed beans que van a instanciar nuestros jsp, un managed bean es una clase que contiene métodos y atributos que son administrados por JSF y el mismo se encarga de instanciarlo y hacerlo disponible para los jsp que tengamos en nuestra aplicación.


Ok una vez que ya hemos creado esos archivos nos toca crear uno de los más importantes, primero que todo como comentaba al principio este tutorial no es para que comiences desde 0 sino un poco más adelante, tiene todo lo necesario para crear una aplicación estable y comercial, cuando hablamos de eso tenemos que pensar que necesita algún tipo de seguridad, tampoco es que estamos haciendo una aplicación que requiere mucha seguridad, entonces lo mas fácil es hacer un filtro de seguridad que básicamente se encarga de proteger los recursos web a través de restricciones de seguridad, esto quiere decir que si por ejemplo yo no he iniciado sesión pero me sé la url de la página de inicio y la escribo en el omnibox sin un filtro de seguridad podre ingresar sin siquiera haberme logueado y eso no es lo que queremos, primero debemos iniciar sesión y después podremos ingresar a un determinado recurso web... También utilizaremos log4j para el log, eso también hay que especificarlo aquí.
A medida que vallamos avanzando voy a ir dando algunos conceptos básicos, para comenzar vamos a crear un paquete nuevo en nuestro proyecto, nos ubicamos en Java Resources>src, y presionamos en clic derecho>new>Package. A este paquete le pondremos en nombre "dto", en este paquete pondremos las entidades que utilizara nuestra aplicación, "dto" viene de Data Transfer Object que no es más que una clase en la cual se almacenas los datos de determinada entidad (get y set). Vamos a crear un dto en el cual almacenaremos los datos del usuario que se esta logueando, por ahora solo su nombre de usuario y clave, posicionados en el paquete dto> clic derecho>new>Class. A esta clase le pondremos el nombre de UsuarioDto, el código de esta clase es el siguiente:

UsuarioDto.java
package dto;

public class UsuarioDto {
 private String nombre;
 private String clave;

 public String getNombre() {
  return nombre;
 }

 public void setNombre(String nombre) {
  this.nombre = nombre;
 }

 public String getClave() {
  return clave;
 }

 public void setClave(String clave) {
  this.clave = clave;
 }

}
     
Ahora vamos a crear otro paquete al cual le vamos a poner el nombre "bbeans" que es una abreviatura de Backing Bean que son clases de java que almacenan el estado de las paginas .jsp. En este mismo paquete vamos a crear una clase llamada SeguridadBBean, es la clase que se encargara de la seguridad de la aplicación. El código de la clase es el siguiente:

SeguridadBBean.java
package bbeans;

import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

import dto.UsuarioDto;

public class SeguridadBBean {
 // Instanciamos el logger para esta clase
 private Logger LOGGER = Logger.getLogger(SeguridadBBean.class);

 // El nombre del usuario que quiere iniciar sesion
 private String usuario;
 // La clave que esta ingresando el usuario
 private String clave;

 // El usuario que inicia sesion
 private UsuarioDto usuarioSession;

 // Constructor
 public SeguridadBBean() {

 }

 // Getters y Setters
 public void setUsuario(String usuario) {
  this.usuario = usuario;
 }

 public String getUsuario() {

  return usuario;
 }

 public void setClave(String clave) {
  this.clave = clave;
 }

 public String getClave() {

  return clave;
 }

 public UsuarioDto getUsuarioSession() {
  return usuarioSession;
 }

 // Devuelve el String para la navegacion del faces-config.xml dependiendo de
 // si el usuario y la clave ingresadas son correctos
 public String login() {
  String ruta = "";
  try {
   UsuarioDto dto = new UsuarioDto();
   dto.setNombre(this.usuario);
   dto.setClave(this.clave);

   UsuarioDto usuarioSession = new UsuarioDto();
   // Si el usuario no es datojava y la clave no es 1234 no ingresa
   // Ejemplo para el tutorial que esta sin base de datos aun
   if ((this.usuario.equals("datojava") && (this.clave.equals("1234")))) {
    usuarioSession.setNombre("datojava");

    // Almacenar en el HttpSession el usuario logueado
    getSession(true).setAttribute("seguridadBBean.usuarioSession",
      usuarioSession);

    this.usuarioSession = usuarioSession;
    ruta = "inicio";
   } else {
    ruta = "";
   }
  } catch (Exception ex) {
   ex.printStackTrace();
  }

  return ruta;
 }

 // Cerrar la sesion actual
 public String cerrarSession() {
  HttpSession session = getSession(false);
  LOGGER.info(new StringBuilder("cerrando session. usuario=  ")
    .append(usuarioSession.getNombre()));
  session.invalidate();
  return "salir";
 }

 /**
  * Retorna el HttpSession
  * 
  * @return HttpSession
  */
 public HttpSession getSession() {
  return getRequest().getSession();
 }

 /**
  * Retorna el HttpServletRequest
  * 
  * @return HttpServletRequest
  */

 public HttpServletRequest getRequest() {
  FacesContext context = FacesContext.getCurrentInstance();
  return (HttpServletRequest) context.getExternalContext().getRequest();
 }

 /**
  * Retorna el HttpSession
  * 
  * @return HttpSession
  */
 public HttpSession getSession(boolean bool) {
  return getRequest().getSession(bool);
 }

}
     

La clase de seguridad contiene dos métodos importantes el método String login() que se encarga de validar el usuario y la clave para iniciar sesión, por ahora todo esto esta cableado ya que este tutorial no necesita una base de datos, se supone que el usuario será "datojava" y la clave "1234". El método String cerrarSesion() que finaliza la sesión actual, estos dos métodos devuelven un String que sirve para la navegación en el archivo faces-config.xml. Como pueden ver en el método login() almacenamos el usuario en el objeto HttpSession para que así el usuario logueado esté disponible para cualquier servlet y en el método cerrarSesion() obtenemos la sesión actual y la invalidamos.
Ahora vamos a implementar el filtro de seguridad para nuestra aplicación, para esto hay que crear un nuevo paquete con el nombre de "util", aquí en este paquete vamos a poner las clases de utilidad para nuestra aplicación, creamos una nueva clase en este paquete llamada SecurityFilter esta clase implementa javax.servlet.Filter, aquí decimos que si no hay ninguna sesión activa ningún recurso web esta disponible hasta que se haga el login. Este es el código de la clase:

SecurityFilter.java
package util;

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.HttpSession;

import org.apache.log4j.Logger;

public class SecurityFilter implements Filter {
 private Logger logger = Logger.getLogger(SecurityFilter.class);

 public SecurityFilter() {
  logger.info("SecurityFilter");
 }

 @Override
 public void destroy() {
  // TODO Auto-generated method stub
 }

 // Metodo que se ejcuta cuando queremos ingresar a un recurso web
 public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) throws IOException, ServletException {
  HttpServletRequest objRequest = (HttpServletRequest) request;
  HttpSession session = objRequest.getSession();

  // Validamos que la url sea la correcta en este caso login.jspx
  if (skip(objRequest.getRequestURI())) {
   chain.doFilter(request, response);
   return;
  }

  // Obtenemos el login si hay una sesion activa
  Object login = session.getAttribute("seguridadBBean.usuarioSession");
  if (login != null) {
   // Si esta bien lo deja pasar
   chain.doFilter(request, response);
  } else {
   // si no lo devuelve a la pagina de login
   String ruta = "/faces/paginas/login/login.jspx";
   request.getRequestDispatcher(ruta).forward(request, response);
  }
 }

 private boolean skip(String uri) {
  return uri == null || uri.endsWith("login.jspx");
 }

 @Override
 public void init(FilterConfig arg0) throws ServletException {
  // TODO Auto-generated method stub
 }
}
     


Ahora vamos a crear la configuración del log4j, para esto en el mismo paquete de util creamos una nueva clase que llamaremos Log4jServlet y un archivo de propiedades que la clase Log4jServlet va a cargar para la configuración del log4j. Log4j es una implementación de apache para personalizar las salidas/logs de una aplicación. Para crear el archivo de propiedades vamos a posicionarnos en el paquete util> clic derecho>new>Other>JBoss Tool Web>¨Properties File, le pondremos el nombre de log4j, el código es el siguiente:

log4j.properties
log4j.rootLogger=DEBUG, LogDatoJava

log4j.appender.LogDatoJava=org.apache.log4j.ConsoleAppender
log4j.appender.LogDatoJava.Threshold=debug
log4j.appender.LogDatoJava.layout=org.apache.log4j.PatternLayout
log4j.appender.LogDatoJava.layout.ConversionPattern=%-5p %d{yyyyMMdd|HH:mm:ss:SSS}|%c.%M:%L|%m%n
     
Esta es la configuración del archivo log4j.properties, declaramos el nivel de logueo del log4j, en este caso DEBUG, el nombre del log, su pattern... Esta configuración la carga la clase Log4jServlet que crearemos en el mismo nivel, este es el código de la clase:

Log4jServlet.java
package util;

import java.net.URL;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.apache.log4j.PropertyConfigurator;

public class Log4jServlet extends HttpServlet {
 public void init() throws ServletException {
  // Cargar la configuracion del archivo .properties
  URL url = getClass().getResource("log4j.properties");
  PropertyConfigurator.configure(url);
 }
}
     




Ahora vamos agregar la clase SeguridadBBean.java a el archivo de navegacion del JSF faces-config.xml para que lo haga disponible a nuestras paginas .jspx. Para hacer esto solo agregamos este codigo:

 seguridadBbean
 bbeans.SeguridadBBean
 session

     
Ahora en este archivo solo falta agregar las reglas de navegación, primero vamos a crear las paginas .jspx y después pasamos a ese punto... Vamos ahora a crear las paginas, este ejemplo consta de una página en la cual el usuario tiene que hacer login, y de ahí el mismo navegara hasta la página de inicio que imprime un mensaje que dice Hola Mundo. Vamos primero con la pagina de login.jspx, para eso nos vamos a posicionar en la carpeta WebContent y presionamos clic derecho> new> Folder> a esta carpeta nueva le vamos a poner paginas y dentro de esta carpeta vamos a crear las paginas que la aplicación va a tener. Para crear la pagina nos posicionamos en la nueva carpeta paginas y creamos una nueva carpeta llamada login, después posicionados en esta nueva carpeta login clic derecho> new> Other> Web> JSP File, le pondremos el nombre de login y al final le cambiamos la extensión ".jsp" a ".jspx", es recomendable utilizar .jspx ya que esto indica que es un archivo xml bien formado, el ide que estemos utilizando podrá reconocer mejor errores de sintaxis, las paginas jspx también son consideradas jsp. Este es el código de la página:

login.jspx
<?xml version='1.0' encoding='windows-1252'?>

 
 
 
  
  
   
  
  
   
    

     
     
      
     

     
      
      
      
      
      
       
        
        
        
       
      
     
    
   
  
  
 

     


Si ya estas familiarizado con JSF sabes de que tratan los facets que estoy poniendo, los facets son parte de un componente, pueden ser headers de una tabla o footer de un formulario, en este ejemplo estoy utilizando un facet para hacer una línea en la página en la cual pongo el nombre de este blog y utilizo otro facet para hacer el footer de el formulario. Aparte de eso lo más importante es que estamos utilizando atributos del backing bean de seguridadBbean, ya lo declaramos en el archivo faces-config.xml y JSF lo esta haciendo disponible en nuestras páginas .jspx, en caso de no haber declarado ese backing bean como managed bean nos dará error ya que no está disponible. En nuestra aplicación utilizamos los atributos de usuario y clave para almacenar lo que el usuario inserte en el formulario y después al presionar el botón de ingresar llamamos al método public String login() en el action del botón. Ahora bien tenemos eso y si el usuario mete el nombre de usuario y la contraseña correcta el método de login nos devuelve el String "inicio" sino no devuelve nada, bueno ahora tenemos que añadir ese String "inicio" a las reglas de navegación en el faces-config.xml, primero vamos a crear otra página .jspx que será la pagina a la que se será dirigido el usuario si ingresa el usuario y la contraseña correcta. Esta página se llamara inicio.jspx, en la misma carpeta de páginas vamos a crearla, este es el código de la página:

inicio.jspx
<?xml version='1.0' encoding='windows-1252'?>

 
 
 
  
  
   
  
  
   
    
     
      
     
     
    
   
  
  
 


Esta página como vemos solo imprime un "hola mundo", ahora bien para que después de ingresar a la aplicación naveguemos a esta página lo agregamos en las reglas de navegación faces-config.xml de la siguiente manera:
     

 /paginas/login/login.jspx< /from-view-id>
 
  inicio< /from-outcome>
  /paginas/login/inicio.jspx< /to-view-id>
 

     
Esta regla de navegación que estamos agregando solo aplica para la pagina de login.jspx ya que eso es lo que estamos configurando, ahora cuando en el action pasemos una cadena texto igual a "inicio" nos re direccionara hasta la pagina que acabamos de crear que se llama inicio.jspx, es facil de hacer y de entender, recuerden que el metodo login() que llama el botón de ingresar si el usuario ingresa correctamente devuelve un String llamado "inicio". El archivo de navegación queda de la siguiente manera:

faces-config.xml
     
<?xml version="1.0" encoding="windows-1252"?>


 
  oracle.adf.core
 
 
  seguridadBbean
  bbeans.SeguridadBBean
  session
 

 
  /paginas/login/login.jspx
  
   inicio
   /paginas/login/inicio.jspx
  
 

     

Ahora vamos a crear el archivo más importante de la aplicación, en este archivo configuramos como se va a deployar la aplicación, eso quiere decir que aquí declaramos los filtros de seguridad creados por nosotros mismos, los filtros por defecto de los frameworks, la configuración del log4j, la pagina de bienvenida o de error y muchas cosas... Nos posicionamos en la carpeta WebContent>WEB-INF>clic derecho>new>Other>JBoss Tools Web>Web Descriptor y le ponemos de nombre web, ahora una vez creado el archivo web.xml este es el código que utiliza:

web.xml
<?xml version="1.0" encoding="WINDOWS-1252"?>

 
 
  javax.faces.CONFIG_FILES
  /WEB-INF/faces-config.xml
 
 
 
  javax.faces.STATE_SAVING_METHOD
  client
 
 
 
  oracle.adf.view.faces.USE_APPLICATION_VIEW_CACHE
  false
 
 
  org.apache.myfaces.trinidad.CLIENT_STATE_METHOD
  ALL
 
 
 
  org.jboss.jbossfaces.JSF_CONFIG_NAME
  Mojarra-1.2
 
 
 
  SecurityFilter
  util.SecurityFilter
 
 
 
  adfFaces
  oracle.adf.view.faces.webapp.AdfFacesFilter
 
 
 
  SecurityFilter
  *.jspx
 
 
  adfFaces
  Faces Servlet
  FORWARD
  REQUEST
 

 
 
 
  Log4JInitServlet
  util.Log4jServlet
  1
 
 
 
  resources
  oracle.adf.view.faces.webapp.ResourceServlet
 
 
 
  Faces Servlet
  javax.faces.webapp.FacesServlet
  1
 
 
 
  resources
  /adf/*
 
 
 
  Faces Servlet
  /faces/*
 
 
 
  1
 

     


Una vez que hemos creado todos los archivos para nuestra aplicacion nuestro proyecto java deberia verse de la siguiente manera.

All Project
All Project



Con esto ya podemos desplegar nuestra aplicación en el JBoss, después que desplegamos la aplicación vamos a nuestro navegador y copiamos la url de nuestra aplicación que es la siguiente: http://localhost:8080/adfDatoJava/faces/paginas/login/login.jspx, recuerda que por defecto el JBoss está escuchando en el puerto 8080, si tu lo tienes escuchando en otro puerto tienes que cambiar la url. Al ingresar a nuestra aplicación veremos la página de login.jspx que se muestra así:

login.jspx
login.jspx



Recuerda que ambos campos son requeridos lo que quiere decir que no pueden estar vacios a la hora de ingresar y aparte de eso que el nombre de usuario tiene que ser datojava y la clave 1234. Al ingresar correctamente nos dirige a la página de inicio.jspx

inicio.jspx
inicio.jspx



Y estamos listos, ya tenemos nuestra primera aplicación con Java, JSF y ADF. En los próximos dato java estaré publicando mas sobre ADF, pendiente de eso. Si quieres el projecto ya listo puedes descargarlo por mega, descargalo como .zip y despues extraes la carpeta.


Temas Relacionados:

No hay comentarios :

Publicar un comentario