Paginación con RichFaces, rich:datascroller

14 Comments

La paginación en paginas web siempre fue un dolor de cabeza, pero RichFaces nos brinda un componente que nos permite hacerlo sin esfuerzo, ya no necesitamos LIMITS ni nada por el estilo en nuestro SQL, si usas Hibernate no tendras que paginar con funciones, RichFaces hace eso por ti, el componente rich:datascroller solo se agrega a cualquier rich:dataTable y listo, asi de facil.

public class echoBean {
 
	private String name;
	private Integer count;
        private int scrollerPage;
 
       public List listaTabla(){
       List lista = new ArrayList();
       lista.add("sss");
       lista.add("sss");
       lista.add("sss");
       return lista;
        }
 
	public Integer getCount() {
		return count;
	}
 
	public String getName() {
		return name;
	}
 
	public void setName(String name) {
		this.name = name;
	}
 
       public int getScrollerPage() {
		return scrollerPage;
	}
 
	public void setScrollerPage(int scrollerPage) {
		this.scrollerPage = scrollerPage;
	}
}
 
<rich:dataTable id="testpList" 	value="#{echoBean.listaTabla}" var="grupo" width="100%"
				rows="15">
 
				<f:facet name="header">
					<rich:columnGroup>
						<rich:column>
							<h:outputText value="test" />
						</rich:column>
						<rich:column>
							<h:outputText value="Nombre test" />
						</rich:column>
 
 
					</rich:columnGroup>
				</f:facet>
				<rich:column>
				h:outputText value="#{grupo.valido}" />
				</rich:column>
				<rich:column>
				<h:outputText value=" #{grupo.test}" styleClass="label" />
				</rich:column>
				<f:facet name="footer">
					<rich:datascroller align="left" for="testpList" maxPages="20"
						page="#{echoBean.scrollerPage}" id="down" reRender="up" />
				</f:facet>
			</rich:dataTable>
  • for: Debes de asignar este paginador a una tabla, aqui pondrias el ID de el DataTable
  • maxPages: Maximo del paginador, osea, si quieres que te aparezcan solo 20 paginas, solo sadran los botones de 1,2,3,4 …20, y asi.. cuando avances a la pagina 6, te aparecera del 6 al 26 y asi consecutivamente.
  • page: En un bean tienes que manejar la paginacion, osea que el bean que tambien maneja tu dataTable, debes agregarle la propiedad “scrollerPage”, puede ser cualquier nombre, pero debe ser Integer, con su Get y Set, no necesariamente debe ser el mismo Bean.
  • reRender: Esta propiedad esta presente en todos los componentes, su función es actualizar diferentes componentes cuando paginas, en nuestro caso seria el dataTable, depende de lo que quieras hacer y tal vez te interesa renderizar otros componentes simultaneamente.

InputFilter, Protege tus variables en PHP de XSS

1 Comment

Uno de los problemas más comunes del internet es la vulnerabilidad cross-site scripting XSS, este tipo de vulverabilidad está en que normalmente no se validan correctamente los datos de entrada que son usados en cierta aplicación. Mas sobre XSS

Pero aqui una de las mejores soluciones que existen para el filtrado de variables en PHP, se llama InputFilter, muy sencilla de usar.

$result;
// Primero instancia la clase con un require_once,
// te recomiendo uses este, porque si usas el requiere,
// cuando uses AJAX tendras problemas con estas importaciones.
require_once("misclases/class.inputfilter_clean.php");
//Instancias la clase
 $myFilter = new InputFilter();
// Procedes a filtrar la variable
$result = $myFilter->process($_POST["input"]);

Tiene ademas de esta sencilla aplicacion un sin numero de opciones, puedes verlas en este ejemplo.

Integrando JSF + Facelets + Spring Security 2.0

2 Comments

Facelets es un sistema de plantillas, parecido a Tiles para Struts, el problema de este toolkit para JSF es la poca integración que tiene con otros frameworks, uno de ellos es Spring Security 2.0, no dispone de tagslibs para trabajarlo con los .xhtml, yo encontre una solucion bastante buena, se llama acegi-jsf con integracion para Spring Security 2.0.

Puedes descargarla aqui.

Ya con Facelest configurado, solo tienes que poner lo siguiente en el faces-config.xml.

<component>
   <component-type>net.sf.jsfcomp.acegijsf.Authorize</component-type>
   <component-class>net.sf.jsfcomp.acegijsf.Authorize</component-class>
</component>
<component>
   <component-type>net.sf.jsfcomp.acegijsf.Authentication</component-type>
   <component-class>net.sf.jsfcomp.acegijsf.Authentication</component-class>
</component>

Lo siguiente que tienes que hacer, es usar las etiquetas, por ejemplo esta:

 <acegijsf:authorize ifAllGranted="ROLE_ADMIN">
   Agregar los componentes que solo seran visibles para ROLE_ADMIN.
</acegijsf:authorize>

Otra lista de atributos son:

  • ifAllGranted = El usuario debe tener todos los roles
  • ifAnyGranted = El usuario debe tener algun rol
  • ifNotGranted = No necesita roles

Visto en
http://vigilbose.blogspot.com/2008/06/integrating-spring-security-with.html

Richfaces, el indicador a4j:status

5 Comments

Desde que existe la Web 2.0, se puso de moda usar Ajax para darle un aspecto de escritorio a nuestras aplicaciones Web, una de las mas usadas, el el LOADING AJAX, en PHP es facil con las librerias Prototype y jQuery, pero en Java es otra historia, pero no, no crean, desde que aparecio Richfaces, el gallo canta mas temprano, les presento el . Nunca fue mas facil implementar uno.

a4j:status es un indicador de una petición Ajax que tiene 2 estados, iniciado y detenido. El estado de inicio indica que una peticion Ajax esta en progreso, cuando la respuesta Ajax viene de regreso corresponde el componente cambia al estado detenido.

  <a4j:region id="editando">
                    <h:inputText value="#{userBean.name}">
                        <a4j:support event="onkeyup" reRender="outname" />
                    </h:inputText>
<a4j:status for="editando"
onstart="Richfaces.showModalPanel('ajaxLoadingModalBox',{width:100, top:100})"
onstop="Richfaces.hideModalPanel('ajaxLoadingModalBox')"></a4j:status>
</a4j:region>
<rich:modalPanel id="ajaxLoadingModalBox" minHeight="100"
				minWidth="200" height="80" width="400" zindex="100">
	<h2><h:outputText value="Validando...">
	</h:outputText></h2>
</rich:modalPanel>

  • La propiedad for, indica con que region va a trabajar el indicador de estado, en nuestro ejemplo se llama “editando”, cuando se ejecute la peticion Ajax del inputText con el a4j:support, el buscara un indicador de estado para la región a la cual pertenece el input, este sera nuestro indicador el que sea invocado.
  • Las propiedades onstart y onstop, estan encargadas de ejecutar lo que en ellas este indicadas, pueda ser un bean, o codigo JavaScript, pero en nuestro caso usamos un componente ModalPanel “ajaxLoadingModalBox”, que aparecera mientras el indicador de estado pasa de Iniciado a Detenido.

Modelando Java con UML I : Clases

11 Comments

A muchos programadores, sobretodo en Nicaragua, se lanzan al ruedo sin saber analizado tan si quiera lo mas minimo un sistema, web o de escritorio, mi experiencia es en el ambiente web, y como analista y programador, como a muchos les debe de pasar, las empresas nunca tienen tiempo para dedicarle al Análisis, luego vienen los clavos, y la culpa, siempre del Programador.

La mejor forma de analizar es con la Metodología, UML es un buen lenguaje para analizar. Yo anteriormente presente una Metodología muy buena, que use en mi Monografia, Fusión.

Pero lo dificiles para muchos, sobre todo los que inician programando y luego usan UML como herramienta de documentacion (mala idea), se les hace dificil modelar.

Iniciare con algo sencillo.

Herencia

La herencia, simplemente se dibuja como una Generalización en UML y se representa en Java como un extends.

package org.jp.developer.test;
 
public class Padre {
 
}
 
public class Hijo extends Padre {
 
}

Asociación

Las asociaciones son instancias de clases dentro de otras clases, pero sin ninguna relacion directa o indirecta, solo estan relacionadas.

//Asociacion Directa
public class Hijo {
	Padre padre;
}
Asociacion Directa

En este ejemplo, Padre e Hijo, Padre es el cabeza de familia, pero la Vida del Hijo no depende de la del padre, solo tiene una relacion familiar, por eso la relación directa, se dibuja una flecha de Hijo->Padre, pues Hijo es el que tiene relacion con el Padre. Si en el caso que Padre tuviese una instancia de Hijo la relacion seria Bidireccional y se dibuja como una linea recta.

Asociaciones con Multiplicidad

Existe multiplicidad, cuando existen Objetos como Array, List, Vector, Collection, donde representa que se pueden almacenar uno o muchos objetos, en este caso Padre.

//Asociacion 0 a Muchos
public class Hijo {
	private List ListaPadres;
}

Agregación y Composición

La agregación y la composición pueden ser un poco confusas, una agregación en Java se representa como una Asociación, pero tiene un enfoque diferente, la agregacion representa una parte de un todo, pero no necesariamente tiene que existir para que el todo exista, es el caso de Aplicacion y Base de Datos, una aplicación puede existir sin ella, igualmente una Base de Datos no necesita una Aplicación para existir. En el caso de la composición, es diferente, en el ejemplo puse la clase Codigo, que es parte de la composición de Aplicación, que no puede existir sin Código, por eso se dibujo como una Composición.

package org.jp.developer.test;
 
public class Aplicacion {
	private Codigo codigo;
	private BaseDeDatos bd;
}
public class Codigo {
}
public class BaseDeDatos {
}

Relación Muchos a Muchos en Hibernate 3.2

1 Comment

Quien ha trabajado con hibernate y ha tenido este problema, bueno, yo para empezar, asi que como logre hacerlo voy a publicar la solución, bien sencillo, despues de generar con Hibernate Tools los pojos, hbm.xml y los DAO, eso es sencillo, pondre dos clases de ejemplo.

En este ejemplo tendremos 3 tablas, Servicio, Variable y Servicio_Variable, que es la tabla que relaciona muchos servicios con muchas variables.

Clase Servicio

public class BmServicios implements java.io.Serializable {
	private int idServicio;
	private String nombre;
	private Set<bmVariable> bmVariables = new HashSet<bmVariable>(0);
 
	public BmServicios() {
	}
 
	public BmServicios(int idServicio,
			 String nombre) {
		this.idServicio = idServicio;
		this.nombre = nombre;
	}
 
	public BmServicios(int idServicio,Set<bmVariable> bmVariables,
		 {
		this.idServicio = idServicio;
 
		this.nombre = nombre;
 
	}
 
	public int getIdServicio() {
		return this.idServicio;
	}
 
	public void setIdServicio(int idServicio) {
		this.idServicio = idServicio;
	}
 
	public String getNombre() {
		return this.nombre;
	}
 
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
 
	public Set<bmVariable> getBmVariables() {
		return this.bmVariables;
	}
 
	public void setBmVariables(Set<bmVariable> bmVariables) {
		this.bmVariables = bmVariables;
	}
 
 
}

Clase Variable

public class BmVariable implements java.io.Serializable {
 
	private int idVariable;
	private String nombre;
	private String descripcion;
	private String tipoDeDato;
	private Set<bmServicios> bmServicioses = new HashSet<bmServicios>(0);
 
	public BmVariable() {
	}
 
	public BmVariable(int idVariable) {
		this.idVariable = idVariable;
	}
 
	public BmVariable(int idVariable,  String nombre,
			String descripcion, String tipoDeDato,
			Set<bmServicios> bmServicioses) {
		this.idVariable = idVariable;
		this.nombre = nombre;
		this.descripcion = descripcion;
		this.tipoDeDato = tipoDeDato;
		this.bmServicioses = bmServicioses;
	}
 
	public int getIdVariable() {
		return this.idVariable;
	}
 
	public void setIdVariable(int idVariable) {
		this.idVariable = idVariable;
	}
 
	public String getNombre() {
		return this.nombre;
	}
 
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
 
	public String getDescripcion() {
		return this.descripcion;
	}
 
	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}
 
	public String getTipoDeDato() {
		return this.tipoDeDato;
	}
 
	public void setTipoDeDato(String tipoDeDato) {
		this.tipoDeDato = tipoDeDato;
	}
 
	public Set<bmServicios> getBmServicioses() {
		return this.bmServicioses;
	}
 
	public void setBmServicioses(Set<bmServicios> bmServicioses) {
		this.bmServicioses = bmServicioses;
	}
 
}

Ahora, como hago para guardar unr registro en Servicio_Variable, si el Hibernate Tools no me genera un pojo para esa tabla (ojo, no la genera porque no tiene mas que los ID (PK) de las tablas Servicio y Variable.

Esta es la solución

//Buscamos registros de ejemplo en Servicio
BmServicio servicio= (BmServicio ) session.get(BmServicio .class, new Integer(2));
//Buscamos registros de ejemplo en Variable
BmVariable variable= (BmVariable ) session.get(BmVariable .class, new Integer(2));
 
//Creamos una variable Set Generica en base al Pojo Servicio
	Set<bmServicio> setServicio = new HashSet<bmServicio>();
//Igual para Variable
		Set<bmVariable> setVariable = new HashSet<bmVariable>();
		setVariable .add(variable);
		setServicio .add(servicio);
		BmVariable .setBmServicio(setServicio);
		//Luego hacemos un session.save(), eso es lo que hacen estas funciones respectivamente para cada tabla.
                crearVariable(variable);
		crearSerivicio(servicio);
 
//Pueden crear un crearRegistro mas generico, para reutilizar codigo, (Gracias Comando 83)
public static void crearRegistro(Object tabla)
	{
		Transaction tx = null;
		Session session = HibernateUtil.getSession();
		try {
			tx = session.beginTransaction();
			session.save(tabla);
			//JOptionPane.showConfirmDialog(null, "codigo: "+((Sistema)tabla).getCodigo());
			tx.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			if (tx != null && tx.isActive())
				tx.rollback();
		}
	}

Y listo, se guarda el registro en Variable_Sesion.