Archive

Posts Tagged ‘RichFaces’

Disponible RichFaces 3.3 Beta4

Diciembre 17th, 2008

El dia 9 de Diciembre se liberó y ya puedes descargarlo, esta versión 3.3 trae algunas novedades, dos componenetes muy interesantes, ademas de corregir varios bugs, puedes ver el detalle aqui.

  • rich:editor - editor WYSIWYG que permite introducir texto formateado. Mas Info
  • a4j:queue. Mecanismos de colas Globales por Defecto seran implementadas. Separando coponentes de las colas de definicion creadas. Mas Info

Puedes descargar las nuevas librerias aquí.

http://repository.jboss.org/maven2/org/richfaces/ui/richfaces-ui/3.3.0.BETA4/

Tags: Java, RichFaces

Java, Programación, RichFaces ,

La Seguridad Perfecta con Spring y el dropDownMenu de RichFaces

Diciembre 7th, 2008

Bueno, sigo con la seguridad de Spring 2.0 o el conocido como el antiguo Acegi Security, ahora voy a proponer una alternativa para generar una seguridad con un componente de RichFaces, el dropDownMenu. ToolBar y menuItem.

Primero te recomiendo sigas la configuración de Spring con JDBC, o con LDAP, como tu lo desees, porque de todas formas todos los Roles ( o Permisos) quedan almacenados en la misma variable de Spring. También si deseas integrarlo con Facelest, aqui tenes los pasos a seguir.

Lo primero que hay que hacer, es construir el menú, para eso usamos un Tool Bar:

<rich:toolBar>
 
<rich:dropDownMenu >
<f:facet name="label">
        <h:panelGroup>
<h:graphicImage value="#{initParam['rootimages']}/images/icons/contexthelp.png" />
	<h:outputText value="JotaDeveloper" />
	</h:panelGroup>
</f:facet>
	<rich:menuItem submitMode="ajax" value="Articulos"></rich:menuItem>
	<rich:menuItem submitMode="ajax" value="Tutoriales"></rich:menuItem>
	<rich:menuItem submitMode="ajax" value="Ayuda"></rich:menuItem>
</rich:dropDownMenu>
</rich:toolBar>

El código es bien sencillo, no hace falta explicar mucho, solo que para poder colocar un dropDownMenu , es necesario el toolBar, y para el menuItem , debe estar dentro de un dropDownMenu.

Depues de esto, y espero que hayas leido los 3 articulos que sugerí anteriormente, vamos a crear un Bean, donde tendremos la logica de nuestra seguridad con el dropDownMenu.

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.security.Authentication;
import org.springframework.security.GrantedAuthority;
import org.springframework.security.context.SecurityContext;
import org.springframework.security.context.SecurityContextHolder;
import org.springframework.security.ui.WebAuthenticationDetails;
 
public class JotaDeveloperMenuBean {
 
	// Un objeto Booleano por cada elemento del Menu
	private Boolean rootJotaDeveloper;
	private Boolean rootTutoriales;
	private Boolean rootArticulos;
	private Boolean rootAyuda;
 
	// Objetos Spring Security
	private Object seguridadAcegi;
	// El GrantedAuthority es un Array con todos los Roles que recupera de la BD
	private GrantedAuthority[] listaAutoridades;
	private SecurityContext contexto;
	private Authentication autenticacion;
	private List<String> ListAutoridades = new ArrayList<String>();
	private String nombreUsuario;
	private Boolean estaAutenticado;
	private WebAuthenticationDetails webAu;
 
	/**
	 * Constructor que accede a toda la información de Spring Security
	 */
 
	public JotaDeveloperMenuBean() {
		this.seguridadAcegi = SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal();
		this.contexto = SecurityContextHolder.getContext();
		this.autenticacion = SecurityContextHolder.getContext()
				.getAuthentication();
		this.listaAutoridades = SecurityContextHolder.getContext()
				.getAuthentication().getAuthorities();
		convertirArrayAuthoritiesToListAuthorities();
		this.nombreUsuario = this.autenticacion.getName();
		this.estaAutenticado = this.autenticacion.isAuthenticated();
	}
 
	/**
	 * Este metodo convierte el Array de Roles poco manejable en un List
	 */
	private void convertirArrayAuthoritiesToListAuthorities() {
		int it_cont;
		for (it_cont = 0; it_cont < listaAutoridades.length; it_cont++) {
			String ROL = listaAutoridades[it_cont].toString();
			ListAutoridades.add(ROL);
		}
	}
 
	/**
	 * Comprueba si existe determinado Rol en la Lista de Autoridades del
	 * Usuario Logeado
	 * 
	 * @param cadena
	 *            ROL
	 * @return El resultado de la Busqueda
	 */
	private Boolean comprobarRol(String cadena) {
		Integer id = ListAutoridades.indexOf(cadena);
		// Si el Id es -1, el valor no fue encontrado.
		if (id != -1) {
			return false;
		} else {
			return true;
		}
	}
 
	/**
	 * Los Getters que va leer cada elemento del Menu
	 */
 
	public Boolean getRootJotaDeveloper() {
		return rootJotaDeveloper = comprobarRol("ROLE_ROOT_JOTADEVELOPER");
	}
 
	public Boolean getRootTutoriales() {
		return rootTutoriales = comprobarRol("ROLE_ROOT_TUTORIALES");
	}
 
	public Boolean getRootAyuda() {
		return rootArticulos = comprobarRol("ROLE_ROOT_AYUDA");
	}
 
	public Boolean getRootArticulos() {
		return rootAyuda = comprobarRol("ROLE_ROOT_ARTICULOS");
	}
 
}

Despues de esto y incluir el Bean el el ManageBean de faces-config.xml, solo agregamos a la propiedad disabled del MenuItem el get del Bean.

<rich:toolBar>
<acegijsf:authorize ifAllGranted="ROLE_ROOT_JOTADEVELOPER">
<rich:dropDownMenu >
<f:facet name="label">
        <h:panelGroup>
<h:graphicImage value="#{initParam['rootimages']}/images/icons/contexthelp.png" />
	<h:outputText value="JotaDeveloper" />
	</h:panelGroup>
</f:facet>
	<rich:menuItem submitMode="ajax" value="Articulos" disabled="#{jotaDeveloperMenuBean.rootArticulos}"></rich:menuItem>
	<rich:menuItem submitMode="ajax" value="Tutoriales" disabled="#{jotaDeveloperMenuBean.rootTutoriales}"></rich:menuItem>
	<rich:menuItem submitMode="ajax" value="Ayuda" disabled="#{jotaDeveloperMenuBean.rootAyuda}"></rich:menuItem>
</rich:dropDownMenu>
</acegijsf:authorize>
</rich:toolBar>

El resultado de todo esto, es que cuando inices sesión, el GrantedAuthority que genera en la sesión del usuario Spring Security, lo convertimos en un List, luego cada elemente del menu que tu crees, va preguntarle al List si existe, si Existe, regresa True, sino, False, y apareceran los menus cuales el usuario no tenga permiso desactivados, ademas de eso, no podra acceder via URL, si has configurado correctamente el security.xml del Spring Security.

Tags: Ajax, Java, RichFaces, spring security

Java, RichFaces , , ,

Paginación con RichFaces, rich:datascroller

Octubre 29th, 2008

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="groupList" 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.
Tags: paginacion, RichFaces

Articulos, Java, RichFaces ,

Richfaces, el indicador a4j:status

Octubre 16th, 2008

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.
  • Tags: Ajax, loader, RichFaces

    Java, RichFaces , ,

Ejemplo Sencillo de RichFaces con JSF

Septiembre 7th, 2008

Richfaces es un framework para Java con el cual puedes crear un ambiente AJAX de manera facil, rapida y limpia, a continuación presentare un ejemplo sencillo, donde podras ver el poder de este framework.

Primero, necesitamos el JavaBean, como el siguiente, como puedes ver tenemos una operacion con un ActionEvent, esta servirá para comunicarse con el Boton Submit del Formulario y escuchara sus llamados.

package events.richfaces;
 
import javax.faces.event.ActionEvent;
 
public class echoBean {
 
	private String name;
	private Integer count;
 
	public Integer getCount() {
		return count;
	}
 
	public String getName() {
		return name;
	}
 
	public void setName(String name) {
		this.name = name;
	}
 
	public void countListener (ActionEvent event){
		count = name.length();
		}
 
}

Después tenemos que ponerlo en nuestro faces-config.xml, para tener acceso a el Bean desde las paginas web

  <managed-bean>
  <managed-bean-name>echoBean</managed-bean-name>
  <managed-bean-class>events.richfaces.echoBean</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
 </managed-bean>

Una vez lista la logica, vamos con la capa de presentación, vamos a explicar brevemente la función de algunas etiquetas:

  • a4j:support : Este componente activa la funcionalidad AJAX para tu pagina en cualquier componente JSF, se agrega como un hijo del componente y se configura segun convenga.
  • actionListener=”#{echoBean.countListener}”: Se puede poner dentro del a4j, y al ejecutar el evento, a su vez, ejecuta la operación del bean.
  • reRender=”echo, count”: Sin estas etiquetas no se mostraria los datos actualizados despues de la petición ajax, y hace que las etiquetas con los ID listados, se actualicen, esas etiquetas deben estar ligadas con el GET del bean.
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<h:form>
	<rich:panel>
		<h:panelGrid columns="2">
			<h:outputText value="Nombre" />
			<h:inputText value="#{echoBean.name}" />
			<h:outputText  value="echo:" />
			<h:outputText id="echo" value="#{echoBean.name}" />
			<h:outputText value="Count" />
			<h:outputText  id="count" value="#{echoBean.count}" />
 
		</h:panelGrid>
		<!--<h:commandButton actionListener="#{echoBean.countListener}" value="Submit" />-->
		<a4j:commandButton actionListener="#{echoBean.countListener}" value="Submit" reRender="echo,count" />
	</rich:panel>
	</h:form>
Tags: ejemplo, Java, RichFaces

Ajax, Articulos, Java, Programación , ,