Fetishcode…Thinking in objects

Thinking in objects

Archivo para la categoría "JSF"

Validador de Números de Tarjetas de crédito en JSF.

sin comentarios

CreditCard Validator in JSF

Implementamos el validador:

package view.validators;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;

import javax.faces.validator.ValidatorException;

public class ValidatorCreditCard implements Validator{
    //Credit card validator for AMEX, VISA, MasterCard only.
    //Allows spaces, dashes, or no separator between digit groups according to the layout
   // (4-6-5 for AMEX, 4-4-4-4 for Visa and Mastercard)
    String regex="^((4\\d{3})|(5[1-5]\\d{2}))(-?|\40?)(\\d{4}(-?|\40?)){3}|^(3[4,7]\\d{2})(-?|\40?)\\d{6}(-?|\40?)\\d{5}";

    public void validate(FacesContext facesContext, UIComponent uiComponent,
                         Object object) {
        String val = (String)object;
        if (!val.matches(regex)) {
            throw new ValidatorException(new FacesMessage("La Tarjeta de Credito no es valida"));
           }
    }
}

Lo registramos en el faces-config:

 <validator>
<validator-id>ValidatorCreditCard</validator-id>
<validator-class>view.validators.ValidatorCreditCard</validator-class>
</validator>

Lo usamos en nuestro componente:

 <af :inputText value="#{bindings.numeroTarjetaCredito.inputValue}"
                                label="#{bindings.numeroTarjetaCredito.label}"
                                required="#{bindings.numeroTarjetaCredito.mandatory}"
                                columns="#{bindings.numeroTarjetaCredito.displayWidth}"
                                binding="#{backing_paginas_pagoTarjeta.inputText1}"
                                id="inputText1" autoSubmit="true">
                                <af :validator binding="#{ValidatorCreditCard}" validatorId="ValidatorCreditCard"/>
                  </af>

Escrito por fetishcode

Marzo 28, 2009 a 9:39 am

Escrito en JSF

Etiquetado con

PrettyFaces, urls amigables en JSF

con 2 comentarios

PrettyFaces es una extensión que podemos aplicar a nuestras aplicaciones JSF y que nos proporciona un mecanismo para obtener unas url´s mas bonitas y amigables en la aplicación.

Substituyendo el típico /faces/page.jsf por /mapped/page.

Además esta pequeña extensión nos proporciona otras características muy interesantes como poder llamar a métodos antes de la renderización de las páginas.

El código se distribuye bajo licencia GPL 3

Mas información :

Escrito por fetishcode

Enero 7, 2009 a 2:58 pm

Escrito en JSF

Etiquetado con

Login Check con PhaseListener

con 2 comentarios

Implementar un filtro que verifique para cada una de nuestras peticiones si el usuario esta loginado “Login check”, se suele hacer generalmente con un filtro del tipo ServletFilter.

Es por eso que aquí les dejo otra forma, quizá no tan conocida. Utilizar PhaseListener, es decir el propio Listener de las fases del ciclo de vida de nuestra aplicación JSF nos validara las peticiones.

Aquí pueden ver la clase:


package view;

import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseListener;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;

public class MyPhaseListener implements PhaseListener {
    public MyPhaseListener() {
    }

    public void beforePhase(PhaseEvent pe) {
        if (pe.getPhaseId() == PhaseId.RESTORE_VIEW){
            System.out.println("Procesando nueva Peticion!");}
        System.out.println("before - " + pe.getPhaseId().toString());
    }

    public void afterPhase(PhaseEvent pe) {
        FacesContext fc = pe.getFacesContext();
        System.out.println("after - " + pe.getPhaseId().toString() + "---" + pe.getFacesContext().getViewRoot().getViewId());

        if (pe.getPhaseId() == PhaseId.RESTORE_VIEW){
            System.out.println("Miramos si esta logeado!");

            boolean loginPage =fc.getViewRoot().getViewId().lastIndexOf("login") > -1 ? true : false;
            if (!loginPage && !loggedIn()) {
                      NavigationHandler nh = fc.getApplication().getNavigationHandler();
                      nh.handleNavigation(fc, null, "logout");
            }   
        }

        if (pe.getPhaseId() == PhaseId.RENDER_RESPONSE){
            System.out.println("Peticion Procesada!");}

    }

    private boolean loggedIn() {
        //TODO
        //implementar un metodo de validacion de login
    }

    public PhaseId getPhaseId() {
        return PhaseId.ANY_PHASE;
    }
}

Llegados a este punto quizá se abre un debate interesante:

Que forma es mejor, si es que hay una mejor. La configuración es distinta para cada una de las opciones ya que ServletFilter se configura en el web.xml y podríamos decir que sirve para cualquier aplicación web en cambio mediante la opción PhaseListener nos adentramos mas en JSF y se configura en el faces-config.xml.

Escrito por fetishcode

Noviembre 4, 2008 a 3:27 pm

Escrito en JSF

Etiquetado con , ,

Conversores en JSF

sin comentarios

En Jdevloperla publicamos un nuevo articulo, dentro de la secciona JSF, Conversores en JSF, donde se trata el tema de las conversiones estandars en JSF y como crear nuestros propios conversores.

Escrito por fetishcode

Agosto 12, 2008 a 5:09 pm

Escrito en JSF

Etiquetado con ,

JavaServer Faces Expression Language

sin comentarios

En algunos posts anteriores comentábamos que no siempre sacamos el máximo del .jspx en nuestras aplicaciones JSF. A menudo olvidamos que una de las partes fundamentales que componen JSF es un lenguaje de expresiones ( EL) .

A continuación les dejamos un enlace de Sun donde explican en detalle todas las operaciones que podemos realizar mediante EL, JSF Expression Language.

Escrito por fetishcode

Febrero 24, 2008 a 9:31 pm

Escrito en JSF

Etiquetado con ,

JavaServer Pages Standard Tag Library en ADF Faces

con un comentario

Muchas veces cuando desarrollamos en ADF/JSF nos limitamos a hacer uso de los componentes que ofrece la librería de componentes adf faces, xmlns:af=http://xmlns.oracle.com/adf/faces , y dejamos de lado otras librerias.
Es el caso de una librería tan potente como JSTL(JavaServer Pages Standard Tag Library)xmlns:c=http://java.sun.com/jsp/jstl/core.Esta librería nos permite poder realizar ciertas rutinas de programación como son la declaración de variables, condicionantes, recorridos,etc.

Para poder hacer uso de ella simplemente hay que añadir al principio del jspx

<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:af="http://xmlns.oracle.com/adf/faces"
          xmlns:afh="http://xmlns.oracle.com/adf/faces/html"
          xmlns:c="http://java.sun.com/jsp/jstl/core">

Y hacemos uso de de ella con el prefijo c.

Seguramente el poco uso que yo he visto de esta librería se deba a que cuando se quiere realizar algun tipo de programación asociada a la página se hace uso de los backings, managed beans o de la capa de Modelo.

Quiza muchos de ustedes ya conocen esta librería o han trabajado con struts o jsp pero aquí les dejo el enlace para todos aquellos que quieran darle un añadido a sus páginas.

API-JSTL
JavaServer Pages Standard Tag Library

Escrito por fetishcode

Noviembre 19, 2007 a 3:21 pm

Escrito en JSF

Etiquetado con ,

selectInputDate

sin comentarios

this post explain how display and getting the date in a selectInputDate and on the other hand explain one of the possibilities of getting current date in java

Cuando trabajamos con selectInputDate es frecuente tener que cargar la fecha actual, recoger la fecha en cierto formato, etc.

Para cargar la fecha actual en el campo nada mas se cargue la página haremos uso del método set del componente en el backing bean.

public void setSelectInputDate1(CoreSelectInputDate selectInputDate1) {
       this.selectInputDate1 = selectInputDate1;
       this.selectInputDate1.setValue(getfecha());
}

y para obtener la fecha actual hay diversas maneras…cada una con sus mas y sus menos.

A mí me gusta esta:

private String getfecha(){
     SimpleDateFormat formatter = new SimpleDateFormat ("dd/MM/yyyy");
     java.util.Date factual = new java.util.Date();
     String dateString = formatter.format(factual);
     System.out.println("--> Date actual: " + dateString);
     return dateString;
}

Hay que tener cuidado con los patrones de SimpleDateFormat ya que MM no es lo mismo que mm.
Por último para recoger el valor de un selectInputDate podemos cargar un valueChangeListener e implementarlo de la siguiente forma.

public void seleccionFechaChange(ValueChangeEvent valueChangeEvent) {
   SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
   String fecha=(format.format(getSelectInputDate1().getValue()));
   System.out.println("fecha: " +fecha);
}

Escrito por fetishcode

Noviembre 14, 2006 a 9:40 am

Escrito en JSF

Etiquetado con

Validaciones en JSF

sin comentarios

Hace unos días hemos subido un articulo sobre las distintas validaciones en JSF en el portal de Jdeveloperla.

Aqui tienen el enlace, validaciones en JSF

Espero que les sea de utilidad.

Escrito por fetishcode

Noviembre 3, 2006 a 5:08 pm

Escrito en JSF

Etiquetado con , ,

Postback y Scope en el backing

sin comentarios

this post explain how to ensure that the code will be executed only one time using Postback condition

Hay veces que queremos realizar una tarea solo al principio, al cargar la pagina.
Lo mas lógico seria intentar implementar dicha tarea o método en el backing, mas concretamente en el setbindings o en el constructor del bb. Entonces nos encontramos que si nuestro scope es de tipo request pasaremos por dichos métodos cada vez que se realice una petición en la pagina.

Para solucionar esto podemos jugar con la siguiente condición:

.if(!AdfFacesContext.getCurrentInstance().isPostback()){
//the code
}

De este modo garantizamos que solo se ejecutara una sola vez, al cargarse la pagina. Independientemente del tipo de scope de nuestro backing bean.

Escrito por fetishcode

Octubre 23, 2006 a 11:04 am

Escrito en JSF

Etiquetado con

Obtener parámetros de configuración del web.xml

sin comentarios

A veces cuando desarrollamos aplicaciones necesitamos disponer de ciertos parámetros o variables globales.

Una forma sencilla de crear esos parámetros y poder consultarlos en cualquier momento desde nuestro proyecto es definirlos en el fichero web.xml.

<context-param>
<description>Servidor de correo de sistema</description>
<param-name>NUESTRO_PARAMETRO</param-name>
<param-value>parametro</param-value>
</context-param>

Una vez mapeado nuestro parámetro se puede acceder a el desde el bb de la siguiente forma:

String param = FacesContext.getCurrentInstance().getExternalContext().
getInitParameter(“NUESTRO_PARAMETRO”);

Escrito por fetishcode

Julio 27, 2006 a 1:38 pm

Escrito en JSF