sábado, 27 de febrero de 2010

lunes, 22 de febrero de 2010

Catálogo de tutoriales Java

No sé si ya lo sabíais, pero yo recién lo encontré.

Existe un catálogo de bastantes (y eso es poco) ejemplos de Java, para todos los gustos y sabores.

http://www.java2s.com/Tutorial/Java/CatalogJava.htm

También hay catálogos para otros lenguajes, pero lo que a mi me importa es Java :)

Provecho

Ahora en java.net

Apuntes de java ya tiene su alojamiento en java.net.

https://apuntes.dev.java.net/

Será más fácil para reunir y atender foros, preguntas, publicar proyectos, ejemplos, vídeos, colaboración en todos, etc.

Como todo proyecto, comienza con algo pequeño y terminará siendo grande.

sábado, 20 de febrero de 2010

Ajax en JSF 2.0 - Ejemplo 1: Combo cambia texto

La técnica Ajax es muy útil para hacer aplicaciones donde solo se actualiza una parte de la página y no toda.

Cuando salió JSF no tenía esta característica, pero otros frameworks (como ICEfaces) proporcionaban el Ajax como manera natural. También se podía utilizar otros complementos al JSF para que pueda funcionar.. pero ya no era el JSF natural.

Con JSF 2.0, el Ajax ya es natural. Mostraremos un conjunto de ejemplos de Ajax con JSf 2.0.

En este post haremos un ejemplo de cómo un combo puede cambiar el valor de un texto. Primero lo haremos sin Ajax, y luego con Ajax.

El ManagedBean

Primero haremos un ManagedBean llamado FormBean. Tendrá una propiedad que contiene las opciones del combo, y luego un atributo donde tendrá el valor seleccionado del combo.

package jsf;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.model.SelectItem;
@ManagedBean(name = "FormBean")
@RequestScoped
public class FormBean {

    private SelectItem[] opciones = new SelectItem[]{new SelectItem("01", "Opción 1"),
        new SelectItem("02", "Opción 2"),
        new SelectItem("03", "Opción 3")};

    private String opcionActual;

    public FormBean() {
    }

    public SelectItem[] getOpciones() {
        return opciones;
    }

    public String getOpcionActual() {
        return opcionActual;
    }

    public void setOpcionActual(String opcionActual) {
        this.opcionActual = opcionActual;
    }       

}

El archivo .xhtml

Ahora, en nuestro .xhtml mostraremos el combo, ponemos un botón para ejecute el formulario y un outputText para que se muestre el valor seleccionado:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Ejemplo Combo Cambia Texto</title>
    </h:head>
    <h:body>
        <h:form>
            Opciones: <h:selectOneMenu value="#{FormBean.opcionActual}">
                <f:selectItems value="#{FormBean.opciones}" />
            </h:selectOneMenu><br/>
            <h:commandButton value="Mostrar" />
            <br/>
            Opción seleccionada: <h:outputText id="opcionActual" value="#{FormBean.opcionActual}" />
        </h:form>
    </h:body>
</html>

Al ejecutarlo, veremos que se muestra el combo, cambiamos el valor de este, hacemos clic en el botón y se actualiza el valor de abajo. Muy simple :). Pero el problema es que tenemos que hacer clic en el botón para actualizar el texto inferior. Lo ideal es que se actualiza solo cuando se haga el cambio en el combo, si necesidad de hacer submit. Ahí es donde entra Ajax.

Implementado Ajax en JSF 2.0

En JSF 2.0 es tan fácil implementar Ajax como escribir un tag.
Pongamos el tag <f:ajax /> dentro del combo a mostrar. Pero como queremos que cambie solo el valor del outputText, le indicamos el id del tag en el atributo render. Así quedaría el .xhtml final.

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Ejemplo Combo Cambia Texto</title>
    </h:head>
    <h:body>
        <h:form>
            Opciones: <h:selectOneMenu value="#{FormBean.opcionActual}">
                <f:selectItems value="#{FormBean.opciones}" />
                <f:ajax render="opcionActual" />
            </h:selectOneMenu><br/>
            <h:commandButton value="Mostrar" />
            <br/>
            Opción seleccionada: <h:outputText id="opcionActual" value="#{FormBean.opcionActual}" />
        </h:form>
    </h:body>
</html>

Ahora, ejecutamos el proyecto y veremos qué pasa cuando cambiamos el combo.

El código fuente de este proyecto, está disponible aquí:
http://diesil-java.googlecode.com/files/JSF20AjaxComboCambiatexto.tar.gz

Y aquí un vídeo para que vean que no estoy mintiendo :P

martes, 16 de febrero de 2010

Spring 3 en NB 6.9

En la nueva versión de NB, se incluirá la biblioteca Spring 3, tanto el framework como el MVC

.. a ver si también incluyen Spring Roo :)

NetBeans 6.9 en ML1

NetBeans.org ha anunciado hoy el lanzamiento de la versión Milestone 1 de NetBeans 6.9





sábado, 13 de febrero de 2010

Acceder a ManagedBean desde otro ManagedBean en JSF 2.0

Cuando se trabaja con variables sesión en JSP/Servlets es fácil guardar estas variables y también accederlas... bueno, al menos para quien ha trabajado bastante con este tipo de variables de sesión: Desde un servlet se debería escribir

request.setAttribute("obj1",obj1);

... cuando se desea guardar una variable de sesión de alcance "request".Para uno de alcance "sesión" es una historia similar.

Y desde un JSP para acceder a esta variable de sesión, usando EL, deberíamos usar algo como esto:
 Mostrando objeto: ${ob1}


Pero en JSF (en especial la versión 2.0), ya no se debería utilizar variables de sesión ya que JSF propone ManagedBeans que tengan alcance Scope, Request, Application, Custom y none. Pues bien, esto funcionaría así.

Un ManagedBean:
@ManagedBean(name="bean1")
@SessionScoped
public class Bean1 {

    public Bean1() {
    }
    private String nombre;

    public String getNombre() {
        return nombre;
    }

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

}

Y para accederlo desde una página JSF, debería ser así:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            Nombre:<h:inputText value="#{bean1.nombre}" />
            <br/><h:commandButton value="Guardar" />
        </h:form>
    </h:body>
</html>

Todo normal.. y si accedemos desde otra página, bastaría con escribir #{bean1.nombre}

Hasta ahí todo normal y muy bien.. pero que pasaría si tenemos otro managedBean y queremos acceder al primer managedBean?

Pues bien, se debería declarar una propiedad (con set/get) del tipo del primer ManagedBean, y agregarle la anotación @ManagedProperty("#{bean1}") (Donde bean1 es el nombre del otro managedbean. Y listo!! solo usar.

@ManagedBean(name = "bean2")
@RequestScoped
public class Bean2 {

    @ManagedProperty("#{bean1}")
    private Bean1 bean1;

    /** Creates a new instance of Bean2 */
    public Bean2() {
    }

    public String getSaludo() {
        return "Hola " + bean1.getNombre();
    }

    public Bean1 getBean1() {
        return bean1;
    }

    public void setBean1(Bean1 bean1) {
        this.bean1 = bean1;
    }

    
}

El código fuente de este ejemplo se encuentra aquí: http://diesil-java.googlecode.com/files/ScopesJSF20.tar.gz

jueves, 11 de febrero de 2010

Concatenar filas en una columna (MySQL)

Este truco lo vi en la documentación de MySQL (vamos, sí, sí. no es Java, pero es algo que encontré y quiero compartirlo).

Imaginemos que tenemos una tabla así
+--------+--------+
| campo1 | campo2 |
+--------+--------+
| fila1  |   a    |
| fila2  |   b    |
| fila2  |   c    |
| fila1  |   b    |
| fila3  |   b    |
| fila2  |   c    |
+--------+--------+

Y queremos concatenar todos los valores del campo2 por cada fila no repetida de campo1 así:
+--------+--------+
| campo1 | campo2 |
+--------+--------+
| fila1  |  a,b   |
| fila2  |  b,c   |
| fila3  |   b    |
+--------+--------+

Para ello, hay que usar la función de agregación GROUP_CONCAT


SELECT campo1,group_concat(distinct campo2) FROM tabla GROUP BY 1

miércoles, 10 de febrero de 2010

Java EE 6 Codecamp (graduados)

Sang Shin de javapassion.com ha dejado de trabajar para sun.com, y sus cursos tan buenos que ha publicado para la comunidad, serán ahora accedidos bajo un pago anual de $89.
Yo creo que es lo justo para tan buen material elaborado por este Evangelista de Java.

El 8 de febrero se publicó la lista de los graduados de la 1ra sesión del CodeCamp Java EE 6. Ha sido un buen curso donde se ha aprendido más a profundidad sobre esta nueva tecnología.

Muchas gracias Sang Shin por tu trabajo a la comunidad.

con referencia a: Graduates of Java EE 6 Codecamp (ver en Google Sidewiki)

martes, 9 de febrero de 2010

Parche 1 de NB 6.8

Desde el 4 de febrero está disponible el parche 1 de NB 6.8.


Éste se puede obtener desde Herramientas > Complementos y luego hacer clic en el botón "Volver a cargar el catálogo"


Si no dispones de una conexión directa para actualizar los .nbm, se pueden descargar directamente desde esta dirección:

http://updates.netbeans.org/netbeans/updates/6.8/uc/final/stable/patch1/

Solo que se tendría que bajar uno por uno.