Česky   |  Deutsch   |  English   |  Español   |  Français   |  Indonesia   |  日本語   |  한글   |  Polski   |  Português (BR)   |  Türkçe   |  中文   |  正體中文   |  Tu idioma  
PlanetNetbeans
Planet NetBeans es un rama de NetBeans relacionado con toda la Blogosphere.
Feeds
[RSS 1.0 Feed] [RSS 2.0 Feed]
[FOAF Subscriptions] [OPML Subscriptions]
¿Tienes un blog acerca de NetBeans? Agrega tu blog a PlanetNetBeans.
Feed Subscripciones

Powered by:    Planet

Última actualización:
February 23, 2017 09:05 AM
All times are UTC

Sponsored by
sponsored by Oracle

visit NetBeans website
AVBravo - February 15, 2017 03:34 PM
Bidirectional Relationship Support in JSON

un interesante articulo que nos muestra una solución elegante a este tipo de relaciones dentro de JSON.

AVBravo - February 14, 2017 02:01 AM
Migrar documentos de MongoDB a Couchbase con jmoordb

Migrar documentos de MongoDB a Couchbase con jmoordb

Los pasos son:

  • Definir el Entity
  • Definir el Facade MongoDB
  • Definir el Facade Couchbase
  • Definir el Provider para MongoDB
  • Definir el Provider para Couchbase




Definimos el Entity
@Getter
@Setter
public class Planetas {

    @Id
    private String idplaneta;
    private String planeta;
    @Ignore
    private Date fecha;

    public Planetas() {
    }

    public Planetas(String idplaneta, String planeta, Date fecha) {
        this.idplaneta = idplaneta;
        this.planeta = planeta;
        this.fecha = fecha;
    }

 

}


Definir el facade MongoDB

public class PlanetasFacade extends AbstractFacade<Planetas> {
 MongoClientProvider mongoclientProvider = new MongoClientProvider();
    public PlanetasFacade() {
        super(Planetas.class, "fantasy", "planetas");
    }

    @Override
    protected MongoClient getMongoClient() {
       return mongoclientProvider.getMongoClient();
    }

   @Override
    public Object findById(String key, String value) {
       return search(key,value);
    }

    @Override
    public Object findById(String key, Integer value) {
        return search(key,value);
    }

}


Definir el Facade Couchbase

public class PlanetasFacade extends CouchbaseAbstractFacade<Planetas> {
 CouchbaseClientProvider couchbseclientProvider = new  CouchbaseClientProvider();
    public PlanetasFacade() {
        super(Planetas.class, "planetas", "planetas");
    }

    @Override
    protected Cluster getCluster() {
    return  couchbseclientProvider.getCluster();
    }

     @Override
    public Object findById(String key, String value) {
        return search(key, value);
    }

    @Override
    public Object findById(String key, Integer value) {
        return search(key, value);
    }


}


Definir la clase MongoClientProvider

public class MongoClientProvider {

    private MongoClient mongoClient = null;

    public MongoClient getMongoClient() {
        mongoClient = new MongoClient();
        try {
       
        } catch (Exception e) {
            System.out.println("getMongoClient() " + e.getLocalizedMessage());
        }
        return mongoClient;
    }

}

Definir la clase CouchbaseClientProvider

public class CouchbaseClientProvider {
private Cluster cluster;


    public Cluster getCluster() {
           CouchbaseEnvironment env = DefaultCouchbaseEnvironment.builder()
                    .connectTimeout(10000) //10000ms = 10s, default is 5s
                    .build();
            cluster = CouchbaseCluster.create("localhost");
        return cluster;
    }


}


Código para ejecutar la migración


  com.migrador.couchbase.ejb.PlanetasFacade planetascouchbaseFacade = new PlanetasFacade() ;
            com.migrador.mongodb.ejb.PlanetasFacade planetasmongodbFacade = new com.migrador.mongodb.ejb.PlanetasFacade() ;
            
            List<Planetas> list = planetasmongodbFacade.findAll();
            if(!list.isEmpty()){
                list.forEach((p) -> {
                    planetascouchbaseFacade.save(p,false);
                });
            }

Base de datos en MongoDB



Couchbase después de la migración:






AVBravo - February 04, 2017 04:49 AM
jmoordb 0.1.9.2


jmoordb

Libro:
https://avbravo.gitbooks.io/jmoordb/content/

Jmoordb es un Object Document Mapper para Java que soporta bases de datos NoSQL (MongoDB ,OrientDB,Couchbase).

Es un Framework orientado a desarrolladores Java, ya que pueden interactuar con bases de datos NoSQL desde su código Java, para los expertos en NoSQL permite interactuar desde Java con la sintaxis de NoSQL de la base de datos que utiliza, para los expertos que vienen del mundo relacional permite ejecutar instrucciones SQL que son convertidas a instrucciones NoSQL.


  • Ofrece una sintaxis similar a JPA
  • Permite el uso de Objetos java para operaciones CRUD
  • Permite el uso de Document para operaciones con las colecciones de documentos
  • Ofrece un soporte para SQL
  • Soporta Java 8
  • Soporta Anotaciones
  • Soporta Beans Validation (JSR 349)
  • Soporta documentos embebidos
  • Soporta documentos referenciados
  • Definición sencilla de Entitys
  • Métodos para operaciones de creación, eliminación, actualización , búsquedas avanzadas.

Esta basado en: Driver Java para MongoDB, Couchbase, OrientDB
Forma de uso muy sencillo:
Definir un Entity:
@Getter
@Setter
public class Planetas {
  @Id
  private String idplaneta;
  private String planeta;
  @Ignore
  private Date fecha;
  public Planetas() {
  }
}
En el controller invocar los métodos del facade:

planetasFacade.save(planetas);
Con esto generados el documento que es almacenado en la base de datos NoSQL
Planetas{ "_id" : ObjectId("587cf876a6cca92842bf2ea9"),
"idplaneta" : "tr",
"planeta" : "Tierra"
}

AVBravo - February 01, 2017 12:57 AM
Dos interesantes Articulos sobre Java Script

En Toptal podemos encontrar dos excelentes artículos:
Gulp: A Web Developer's Secret Weapon for Maximizing Site Speed
En donde se muestra el proceso de automatización y optimización con Gulp.js

Este otro articulo

Immutability in JavaScript using Redux

Muestra el proceso de crear Actions, usar inmutables librerías.
Ambos son excelentes articulos para analizar.



AVBravo - January 25, 2017 01:09 AM
Why You Need to Upgrade to Java 8 Already

Why You Need to Upgrade to Java 8 Already, enlace https://www.toptal.com/java/why-you-need-to-upgrade-to-java-8-already

Los amigos de Toptal han publicado un interesante articulo sobre Java 8,  se tratan temas interesantes:


  • Lambda expressions.
  • Stream API for working with Collections.
  • Asynchronous task chaining with CompletableFuture.
  • Brand new Time API.

Ejemplo de implementación de  funciones 

(Integer i1, Integer i2) -> i1 % 2 - i2 % 

Descripción de métodos referenciados, Stream APi

books.stream()
.filter(book -> book.year > 2005) // filter out books published in or before 2005
.map(Book::getAuthor) // get the list of authors for the remaining books
.filter(Objects::nonNull) // remove null authors from the list
.map(Author::getName) // get the list of names for the remaining authors
.forEach(System.out::println); // print the value of each remaining element



Sin duda un excelente articulo de referencia que muestra las principales características de Java8.




AVBravo - January 13, 2017 07:27 PM
Definir un Entity Simple en JGMongo

Definir un Entity Simple en JGMongo

Un Entity representa el documento en MongoDB, por lo que debemos describir su estructura en Java.
Reglas

  •  La clase debe extender de GenericsBeans
  •  Implementar @Getter /@Setter
  •  El atributo  @SerializedName("") es opcional, lo usamos cuando los nombres de campo (key) en el documento son diferentes a los nombres de propiedades
  • @Id idenficar el PrimaryKey
  •  Crear método toDocument() para convertir de Java o Document
  •  Crear método toPojo()

Contamos con un documento llamado Pais:
{
  "_id" : ObjectId("57bc789da6cca9237822eafb"),
  "Siglas" : "1",
  "Pais" : "Name1",
  "Logo" : "--"
}
Representación visual:

Si observa el nombre de campos (key) inician con la primera letra en mayúsculas,  y nuestros Entity deben iniciar con la primera letra en minúsculas.
MongoDB("Siglas"
Java(siglas)
Por lo tanto debemos indicar cual es el nombre del campo en el documento en este caso usamos la anotación : @SerializedName( colocar el nombre del documento), si este campo inicia en minúsculas o es el mismo que el atributo en nuestra clase en java no es necesario especificarlo.
     @SerializedName("Siglas")
       private String siglas;

Llave Primaria @Id
Si es el campo que usamos como llave primaria agregamos la anotación @Id.

Crear el método toDocument() que devolverá un Documento en base al objeto Java.

 public Document toDocument(Paises paises) {
       return toDoc(paises);
 }


Crear el método toPojo que recibe un Documento y lo convierte a objeto Java

public Paises toPojo(Document doc) {
        return (Paises) toJava(doc, new Paises().getClass());
    }


Ejemplo 1: 
Nombres de campo en MongoDB diferentes a nombres de atributos de clases en Java.

import com.google.gson.annotations.SerializedName;
import com.jgmongo.anotaciones.Id;
import com.jgmongo.services.GenericBeans;
import lombok.Getter;
import lombok.Setter;
import org.bson.Document;

/**
 *
 * @author avbravo
 */
@Getter
@Setter
public class Paises extends GenericBeans {

    @Id
    @SerializedName("Siglas")
    private String siglas;
    @SerializedName("Pais")
    private String pais;
    @SerializedName("Logo")
    private String logo;

    public Document toDocument(Paises paises) {
          return toDoc(paises);
    }

    public Paises toPojo(Document doc) {
       return (Paises) toJava(doc, new Paises().getClass());
    }

    @Override
    public String toString() {
        return "Paises{" + "siglas=" + siglas + ", pais=" + pais + '}';
    }
}


Ejemplo 2: 
Nombres de campo en MongoDB iguales a nombres de atributos de clases en Java. No es necesario utilizar la anotación  @SerializedName("")
Paises:
{
  "_id" : ObjectId("57bc789da6cca9237822eafe"),
  "siglas" : "2",
  "pais" : "Name2",
  "logo" : "--"

}

Representación visual

import com.google.gson.annotations.SerializedName;
import com.jgmongo.anotaciones.Id;
import com.jgmongo.services.GenericBeans;
import lombok.Getter;
import lombok.Setter;
import org.bson.Document;

/**
 *
 * @author avbravo
 */
@Getter
@Setter
public class Paises extends GenericBeans {

    @Id
    private String siglas;
    private String pais;
    private String logo;

    public Document toDocument(Paises paises) {
        return toDoc(paises);
    }

    public Paises toPojo(Document doc) {
          return (Paises) toJava(doc, new Paises().getClass());
    }

    @Override
    public String toString() {
        return "Paises{" + "siglas=" + siglas + ", pais=" + pais + '}';
    }
}




AVBravo - January 10, 2017 01:51 AM
Hunting Memory Leaks in Java

Hunting Memory Leaks in Java

Un excelente articulo publicado en Toptal.com


donde se realiza un análisis profundo y incluye ejemplo del uso de  Java VisualVM

AVBravo - January 06, 2017 05:06 PM
Buggy Java Code: The Top 10 Most Common Mistakes That Java Developers Make

Buggy Java Code: The Top 10 Most Common Mistakes That Java Developers Make

es interesante articulo donde se muestran 10 de los errores más comunes al programa en Java.

Toptal hace evaluaciones interesantes sobre diversas tecnologías y en esta ocasión sobre Java.
Este es el listado:

#1: Neglecting Existing Libraries
#2: Missing the ‘break’ Keyword in a Switch-Case Block
#3: Forgetting to Free Resources

 #4: Memory Leaks

#5: Excessive Garbage Allocation
#6: Using Null References without Need

#7: Ignoring Exceptions

#8: Concurrent Modification Exception

#9: Breaking Contracts

 #10: Using Raw Type Instead of a Parameterized One

AVBravo - January 05, 2017 06:43 PM
Autoincrementable en MongoDB con findOneAndUpdate() JGMongo

Existen muchas maneras de administrar campos autoincrementables, en esta ocasión mostrare la implementación que use en JGMongo https://github.com/avbravo/jgmongo/ utilizando en metodo findOneAndUpdate().

Implementaremos el método de la clase AbstractFacade

 public T findOneAndUpdate(String key, String value,String field,Integer... incremento) 

Key : es el campo a buscar
value: el valor de ese campo
field: es el campo numérico a implementar
incremento: Opcional si no se pasa ningún valor incrementa en uno el campo
Problema 1:

Existe una colección de documentos donde se maneja un campo entero que funcionara como autoincrementable:  
Agenda{"Id":1,"evento":"A"},{"Id":2,"evento":"B"},{"Id":3,"evento":"C"}
  • Si se elimina el evento 3, 

Agenda{"Id":1,"evento":"A"},{"Id":2,"evento":"B"}
  • Cuando se desee insertar un documento  con el {"evento":"D"}, se pueden producir algunas situaciones

1. Utilizar la función count() para conocer la cantidad de documentos que tiene la colección, este devolverá 2 y al sumarle 1 tendrá el valor de 3, que ya fue usado para el {"evento":"C"}. 
Al insertarlo quedaría de la siguiente manera:
Agenda{"Id":1,"evento":"A"},{"Id":2,"evento":"B"},{"Id":3,"evento":"D"}

2. Si buscamos el ultimo documento de la colección {"Id":2,"evento":"B"} , el valor del id es 2 al sumarle 1 quedara en 3, por lo tanto al insertar el evento {"evento":"D"} a la colección este tendria el valor de 3 para el id y este ya fue usado en el {"evento" :"C"}.
Al insertarlo quedaría de la siguiente manera:
Agenda{"Id":1,"evento":"A"},{"Id":2,"evento":"B"},{"Id":3,"evento":"D"}


Utilizando findOneAndUpdate()

1- Crear una colección para que lleve el contador de los documentos y sus id que se usan en otras colecciones. Autoincrementable{"Documento":"Agenda","Valor":1}
De esta manera en la colección Agenda utilizara el valor que devuelva el campo valor de la colección Autoincrementable.
El metodo findOneAndUpdate() busca el documento que cumpla la condición y realiza el incremento automático y devuelve el documento actualizado.
  • findOneAndUpdate("Documento", "Agenda", "Valor"); // incrementa en 1 el campo Valor
  • findOneAndUpdate("Documento", "Agenda", "Valor",8); // incrementa en 8 el campo Valor, le podemos indicar el valor que deseamos de incremento

Al insertarlo quedaría de la siguiente manera:
Incrementa el campo valor y devuelve el documento actualizado
 Autoincrementable{"Documento":"Agenda","Valor":4}
y este se asigna al id de la colección Agenda
Agenda{"Id":1,"evento":"A"},{"Id":2,"evento":"B"},{"Id":4,"evento":"D"}

Código en Java
 Autoincrementable autoincrementable = new Autoincrementable();
      autoincrementable=autoincrementableFacade.findOneAndUpdate("Documento", "Agenda", "Valor");
                agenda.setIdagenda(autoincrementable.getValor());
                




AVBravo - January 04, 2017 04:44 PM
Arrays en documentos con Mongodb con JGMongo

Arrays en documentos con Mongodb con JGMongo
Un documento en MongoDB, es una estructura compuesta por pares (key, value).

En esta ocasión mostrare como manejar Arrays de documentos mediante jgmongo  https://github.com/avbravo/jgmongo  Un framework que estoy desarrollando para MongoDB




Documentos de Paises y Sedes.


Tenemos dos colecciones: paises con información como esta:
@Getter
@Setter
public class Paises extends GenericBeans {
@Id
    @SerializedName("Siglas")
    private String siglas;
    @SerializedName("Pais")
    private String pais;
    @SerializedName("Logo")
    private String logo;



y el documento sedes:
@Getter
@Setter

public class Sedes extends GenericBeans {
@Id
    @SerializedName("Idsede")
    private String idsede;
    @SerializedName("Sede")
    private String sede;
@SerializedName("Paises")
    private List<Paises> paises;


Para almacenar los datos en la colección desde Java usamos:
Agregamos el repositorio:
<repositories>
     
         <repository>
            <id>jitpack.io</id>
            <url>https://jitpack.io</url>
        </repository>
    </repositories>
    <dependencies>
        <dependency>
            <groupId>com.github.avbravo</groupId>
            <artifactId>jgmongo</artifactId>
            <version>0.9</version>
        </dependency>
    </dependencies>

Creamos los Entity



Paises.java


/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.utica.mavenproject1q.entity;


import com.google.gson.annotations.SerializedName;
import com.jgmongo.anotaciones.Id;
import com.jgmongo.services.GenericBeans;
import lombok.Getter;
import lombok.Setter;
import org.bson.Document;

/**
 *
 * @author avbravo
 */
@Getter
@Setter
public class Paises extends GenericBeans {
    @Id
    @SerializedName("Siglas")
    private String siglas;
    @SerializedName("Pais")
    private String pais;
    @SerializedName("Logo")
    private String logo;
 

    public Document toDocument(Paises paises) {
        Document doc = new Document();
        try {                      
            doc = Document.parse(getGson().toJson(paises));
        } catch (Exception e) {
            System.out.println("toDocument() " + e.getLocalizedMessage());
        }
        return doc;
    }

    public Paises toPojo(Document doc) {
        Paises paises = new Paises();
        try {
             paises = (Paises) fromJsontoPojo(doc.toJson(), new Paises().getClass());
        } catch (Exception e) {
            System.out.println("toPojo() " + e.getLocalizedMessage());
        }
        return paises;
    }

    @Override
    public String toString() {
        return "Paises{" + "siglas=" + siglas + ", pais=" + pais + '}';
    }

}



Sedes.java


/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.utica.mavenproject1q.entity;


import com.google.gson.annotations.SerializedName;
import com.jgmongo.anotaciones.Id;
import com.jgmongo.services.GenericBeans;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
import org.bson.Document;

/**
 *
 * @author avbravo
 */
@Getter
@Setter
public class Sedes extends GenericBeans {
    @Id
    @SerializedName("Idsede")
    private String idsede;
    @SerializedName("Sede")
    private String sede;
@SerializedName("Paises")
    private List<Paises> paises;

    public Document toDocument(Sedes sedes) {
        Document doc = new Document();
        try {                      
            doc = Document.parse(getGson().toJson(sedes));
        } catch (Exception e) {
            System.out.println("toDocument() " + e.getLocalizedMessage());
        }
        return doc;
    }

    public Sedes toPojo(Document doc) {
        Sedes sedes = new Sedes();
        try {
             sedes = (Sedes) fromJsontoPojo(doc.toJson(), new Sedes().getClass());
        } catch (Exception e) {
            System.out.println("toPojo() " + e.getLocalizedMessage());
        }
        return sedes;
    }

    @Override
    public String toString() {
        return "Sedes{" + "idsede=" + idsede + ", sede=" + sede + '}';
    }


}


Creamos los Facade

PaisesFacade.java


import com.jgmongo.persistence.AbstractFacade;
import com.mongodb.MongoClient;
import com.utica.mavenproject1q.entity.Paises;

/**
 *
 * @author avbravo
 */
public class PaisesFacade extends AbstractFacade<Paises>{

    public PaisesFacade( ){
        super(Paises.class, "fantasy", "paises");
    }

    @Override
    protected MongoClient getMongoClient() {
         MongoClient mongoClient = new MongoClient();
         return mongoClient;
    }

}


SedesFacade.java


import com.jgmongo.persistence.AbstractFacade;
import com.mongodb.MongoClient;
import com.utica.mavenproject1q.entity.Sedes;

/**
 *
 * @author avbravo
 */
public class SedesFacade extends AbstractFacade<Sedes>{

    public SedesFacade( ){
        super(Sedes.class, "fantasy", "sedes");
    }

    @Override
    protected MongoClient getMongoClient() {
         MongoClient mongoClient = new MongoClient();
         return mongoClient;
    }

}



Programa Principal

  public static void main(String[] args) {
        // TODO code application logic here
        try {

            PaisesFacade paisesFacade = new PaisesFacade();
            SedesFacade sedesFacade = new SedesFacade();
            List<Paises> list = new ArrayList<>();
            list = paisesFacade.findAll();
            if (!list.isEmpty()) {
                Sedes sedes = new Sedes();
                sedes.setIdsede("s-1");
                sedes.setSede("Sede 1");
                sedes.setPaises(list);
                sedesFacade.save(sedes);
            }

       
        } catch (Exception e) {
            System.out.println("error " + e.getLocalizedMessage());
        }

    }

Resultado



Proyecto de ejemplo que implementa la funcionalidad
https://github.com/avbravo/jgmongodesktopexample






AVBravo - November 10, 2016 08:27 PM
Aroug San Luis- Inicio del ODT 2016

Cuando mi amigo Marcelo Burgos me invito a participar del Oracle Development Tour en San Luis, y ser parte del inicio del Tour que recorrerá varios países (Argentina, Brasil,Mexico, Guatemala, Colombia , Costa Rica y Panamá),  pensé en el tema que podría ser mi conferencia y al conversar con Marcelo y Jose Preda, que por más de un mes habian estado pendiente y coordinando todos los detalles para mi asistencia al evento.
Mi tema fue sobre JGMongo (Un framework Java que desarrolle para MongoDB) con JEE8
https://github.com/avbravo/jgmongo


En especial mi agradecimiento al Ing. Ruben Espitia, que hizo todos los tramites y gestiones incluso en ocasiones que el estaba fuera del país por Universidad Tecnológica.


El evento organizado por

ArOUG Regional San Luis

http://arougsanluis.blogspot.com.ar/
Un evento de muy alta calidad, una organización impecable, un ambiente muy agradable, el trato y la cordialidad de los amigos de ArOUG, fueron de primer nivel.
La sede fue la Universidad de La Punta en San Luis, donde las instalaciones fueron excelentes.


La reunion con los participantes y demás expositores fue de mucha cordialidad y sencillez, caracterizando un evento muy bien planificado, este es el listado de los oradores que participamos del  ODT en San Luis.

La agenda del evento http://arougsanluis.blogspot.com.ar/p/odt-2016-agenda.html





Algo de mi participación, hablando un poco sobre JGMongo con Java EE8, utilizando NetBeans como IDE de referencia.


Una foto final del grupo que participo en el ODT-San Luis




En conclusiones un evento de primer nivel, que ha demostrado una estrategia organizativa excelente, y cuando organicen ArOUG un evento sin lugar a dudas sera muy exitoso, mis agradecimientos a Marcerlo, Jose, miembros de ArOUG y amigos que participamos de esta actividad.



AVBravo - September 27, 2016 09:06 PM
JGMongo con JEE7

JGMongo con JEE7

Una aplicación usando JGMongo con JEE7


AVBravo - September 13, 2016 01:40 PM
Apache NetBeans

Apache NetBeans
https://wiki.apache.org/incubator/NetBeansProposal

Si, algo que se esperaba desde hace muchos años, una liberación de NetBeans, para convertirlo en un IDE más abierto, y que permita mayor contribución de la comunidad y de otras empresas, ya inicio su primera etapa en la incubadora de la Fundación Apache.
Las implicaciones que esto conlleva son múltiples por una parte esta la evolución de NetBeans, al permitir que más contribuyentes puedan aportar a sus mejoras, también garantiza que aquellas instituciones no sientan que es una sola organización la que controla la evolución. A las comunidades les permite sentirse que participan de un proyecto con todas las garantías que ofrece la Fundación Apache.

Muchos pensaran que Oracle esta dejando morir el proyecto, la realidad es diferente, hay muchos ingenieros que están participando del proyecto en la fundación Apache.
Es una noticia excelente para los desarrolladores, instituciones, empresas que utilizan NetBeans , se estima que es utilizado por 1.5 millones de personas mensualmente, y se han creado excelentes herramientas y aplicaciones.
Entre algunos de los ejemplos:


Esta liberación de NetBeans es un paso más en la evolución del IDE, y deja de lado los temores que el mismo no seguirá evolucionando.
En las primeras conversaciones que tuve con Bruno Souza después de la compra de Sun Microsystem, por parte de Oracle , Bruno me comentaba la necesidad de liberar NetBeans llevarlo a la comunidad completamente, han pasado varios años, y hoy es una realidad.





AVBravo - August 27, 2016 04:17 PM
JPA Modeler con Angular js

JPA Modeler con Angular js esta disponible.
Mezclar lo mejor de ambos mundos Java+ Angular js muchas veces resulta algo difícil, para los iniciados en ambos mundos.
Gaurav Gupta el creador de JPA Modeler, y su equipo avanzan constantemente en el mejoramiento del mismo y ampliando el soporte a un sin numero de plataformas.
En esta ocasión con la integración para Angular js, puedes encontrar la descripción completa aqui
El uso es muy sencillo:
Requerimientos:

  1. Java 1.8
  2. NetBeans 8.1
  3. JPA Modeler 2.5.1
  4. GlassFish 4.1 / Payara 4.1
Pasos:
1. Crear un proyecto Web con NetBeans IDE

2. Crear un diagrama JPA
Desde File --> New--> Category Persistence
seleccionar JPA Modeler

luego ingrese el nombre del Model

se habilitara el diseñador

Arrastre desde la paleta el componente Entity, allí puede renombrar las propiedades y crear los atributos.


repita el mismo procedimiento y cree las otras entidades y sus relaciones

Luego como se explica en la guía oficial genere los Entity.
Luego genere los servicios del sistema, entre estos los Facade, que funcionan como una capa de abstracción para comunicar los entity con la base de datos mediante el uso de JPA.
Seleccione Rest Controller

luego se configuran los paquetes donde serán creados,  y debemos configurar la aplicación

debemos indicar el Viewer, en este caso es Angular

simplemente dar clic en Generate y se crea toda la estructura del proyecto


Esto es todo lo que necesitamos para crear nuestra aplicación , luego hacemos un deploy y ejecutamos el proyecto. algunas de los formularios generados
Realmente el tiempo de desarrollo es mínimo para lograr una excelente integración, sin duda una herramienta indispensable para los desarrolladores.


AVBravo - August 24, 2016 01:29 AM
JGMongo v0.3

JGMongo v0.3
Esta disponible JGMongo 0.3, entre las características que ofrece, nuevos métodos,  implementación de Filter, creación de Indices

<repository>

<id>jitpack.io</id>

<url>https://jitpack.io</url>

</repository>
 <dependency>

<groupId>com.github.avbravo</groupId>

<artifactId>jgmongo</artifactId>

<version>0.3</version>

</dependency>

Puedes ver todas las características en el Wiki
https://github.com/avbravo/jgmongo/wiki/

AVBravo - August 21, 2016 04:49 AM
JGMongo v0.2

Ya esta disponible la versión 0.2 de JGMongo

<repositories>

<repository>

<id>jitpack.io</id>

<url>https://jitpack.io</url>

</repository>

</repositories>


<dependencies>
<dependency>
<groupId>com.github.avbravo</groupId>
<artifactId>jgmongo</artifactId>
<version>0.2</version>
</dependency>
</dependencies>
Algunas mejoras:
1. Anotación @Id  para definir llave primaria
2. Nuevos métodos para realizar operaciones
3. Mejoras en métodos save, update búsqueda y verificación automática de llave primaria para evitar  duplicidad de documentos.
4. Los métodos toPojo() y to Document() se redefinieron, son más sencillos de usar

@Getter


@Setter


public class Paises extends GenericBeans {

@Id  

@SerializedName("Siglas")

private String siglas;

@SerializedName("Pais")

private String pais;

@SerializedName("Logo")

private String logo;

@SerializedName("Continente")

private Continente continente;


public Document toDocument(Paises paises) {

return toDoc(paises);

}

public Paises toPojo(Document doc) {

return (Paises) toJava(doc, Paises.class);

}

@Override

public String toString() {

return "Paises{" + "siglas=" + siglas + ", pais=" + pais + '}';

}
}

AVBravo - August 19, 2016 07:07 PM
JGMongo + JEE8 (MongoDB)

Aunque JEE8,  debe estar terminado para el próximo año 2017, hace un tiempo publique un ejemplo usando MySQL como motor de base de datos utilizando JPA Modeler , que es una excelente herramienta grafica para crear modelos relacionados, utilizando JPA.
El creador de JPA Modeler  es  Gaurav Gupta 
Aqui puedes encontrar el tutorial anterior donde  se muestra el ejemplo usando(JPA Modeler  + GlassFish+ JEE8 +JPA + MySQL) JavaEE 8 con JPA muy fácil.

Con el desarrollo de JGMongo que es un Java Object Mapper para MongoDB, mostrare como utilizar JGMongo con JEE8. 
Al ejecutar la aplicación

Listado de países


    @GET
    @Path("list")
    @Controller
    public String findAllPaises() {

        model.put("PAISES_LIST", facade.findAll(new Document()));
        return "/view/paises/list.jsp";
    }


Crear un nuevo país

  @POST
    @Path("new")
    @Controller
    @ValidateOnExecution(type = ExecutableType.NONE)
    @CsrfValid
    public String createPaies(@Valid
            @BeanParam Paises paises) {
        if (validationResult.isFailed()) {
            return ValidationUtil.getResponse(validationResult, error);
        }
        facade.save(paises);
        return "redirect:paises/list";
    }


Vista
 @GET
    @Path("{siglas}")
    @Controller
    public String findPaises(@PathParam("siglas") String siglas) {
        model.put("PAISES", facade.find("Siglas",siglas));
        return "/view/paises/view.jsp";
    }



Usaremos la estructura de proyecto creado con JPA Modeler y haremos la implementación con JGMongo.
Pasos:
1. Crear el proyecto Maven 

2. Agregar las dependencias  (pom.xml)
  <dependencies>
       
        <dependency>
            <groupId>com.jgmongo</groupId>
            <artifactId>jgmongo</artifactId>
            <version>0.1</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
          <!-- Needed until Java EE 8 -->
        <dependency>
            <groupId>javax.mvc</groupId>
            <artifactId>javax.mvc-api</artifactId>
            <version>1.0-edr2</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.ozark</groupId>
            <artifactId>ozark</artifactId>
            <version>1.0.0-m02</version>
            <scope>runtime</scope>
        </dependency>

    </dependencies>

3. Crear MongoClientProvider
@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
public class MongoClientProvider {
    private MongoClient mongoClient = null;

@Lock(LockType.READ)
public MongoClient getMongoClient(){
return mongoClient;
}

@PostConstruct
public void init() {
            try {
               mongoClient = new MongoClient();
            } catch (Exception e) {
                JSFUtil.addErrorMessage("init() "+e.getLocalizedMessage());
            }
}
}

4. Crear el entity Paises

@Getter
@Setter
public class Paises extends GenericBeans {

    @Id
    @FormParam("siglas")
    @SerializedName("Siglas")
    private String siglas;
    @FormParam("pais")
    @SerializedName("Pais")
    private String pais;
    @FormParam("logo")
    @SerializedName("Logo")
    private String logo;

    public Paises() {

    }

    public Document toDocument(Paises paises) {
        Document doc = new Document();
        try {
            doc = Document.parse(getGson().toJson(paises));
        } catch (Exception e) {
            System.out.println("toDocument() " + e.getLocalizedMessage());
        }
        return doc;
    }

    public Paises toPojo(Document doc) {
        Paises paises = new Paises();
        try {
            paises = (Paises) fromJsontoPojo(doc.toJson(), new Paises().getClass());
        } catch (Exception e) {
            System.out.println("toPojo() " + e.getLocalizedMessage());
        }
        return paises;
    }

    @Override
    public String toString() {
        return "Paises{" + "siglas=" + siglas + ", pais=" + pais + '}';
    }


}


5. Crear el Facade
@Stateless
@Named("paises")
public class PaisesFacade extends AbstractFacade<Paises> {
   @EJB
    MongoClientProvider mongoClientProvider;
    List<Paises> list = new ArrayList<>();
    Paises paises = new Paises();

  @Override
    protected MongoClient getMongoClient() {
        return mongoClientProvider.getMongoClient();
    }
    public PaisesFacade() {      
        super(Paises.class, "fantasy", "paises");
    }

}

6. Editar las paginas 



6.1 Editar create.jsp
 <form role="form" action="${appPath}/paises/new" method="POST">
                           <div class="form-group">
                                    <label for="siglas">Siglas</label>
                     <input class="form-control" type="text" name="siglas" path="siglas"  required="required" autofocus="autofocus"  />
                                </div>
                                <div class="form-group">
                                    <label for="pais">Pais</label>
                                    <input class="form-control" type="text" name="pais" path="pais"  />
                                </div>
                                <div class="form-group">
                                    <label for="logo">Logo</label>
                                    <input class="form-control" type="text" name="logo" path="logo"  />
                                </div>
                                
                                
                                <input type="hidden" name="${mvc.csrf.name}" value="${mvc.csrf.token}"/>
                                <button type="submit" class="btn btn-primary"><i class="fa fa-check fa-fw"></i>Submit</button>
                                <a href="${appPath}/paises/list" class="btn btn-default"><i class="fa fa-close fa-fw"></i>Cancel</a>
                            </form>

6.2 Editar list.jsp
 <c:forEach items="${PAISES_LIST}" var="PAISES">
                                    <tr>
                                        <td>${mvc.encoders.html(PAISES.siglas)}</td>

                                        <td>${mvc.encoders.html(PAISES.pais)}</td>

                                        <td>${mvc.encoders.html(PAISES.logo)}</td>


                                        <td>
                                            <div class="pull-right">
                                                <div class="btn-group">
                                                    <button type="button" class="btn btn-primary btn-xs dropdown-toggle" data-toggle="dropdown">
                                                        <i class="fa fa-gear"></i>  <span class="caret"></span>
                                                    </button>
                                                    <ul class="dropdown-menu pull-right" role="menu">
                                                        <li><a href="${PAISES.siglas}"><i class="fa fa-level-up fa-fw"></i>  View</a></li>
                                                        <li><a href="${appPath}/paises/update/${PAISES.siglas}"><i class="fa fa-edit fa-fw"></i>  Edit</a></li>
                                                        <li class="divider"></li>
                                                        <li><a data-toggle="modal" data-target="#confirm_delete_${PAISES.siglas}" href="#"  ><i class="fa fa-trash-o fa-fw"></i> Delete</a>
                                                        </li>
                                                    </ul>
                                                </div>
                                            </div>
                                            <!-- Modal -->
        <div class="modal fade" id="confirm_delete_${PAISES.siglas}" tabindex="-1" role="dialog" aria-hidden="true">
                                                <div class="modal-dialog">
                                                    <div class="modal-content">
                                                        <div class="modal-header">
           <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                                                            <h4 class="modal-title">Confirmation</h4>
                                                        </div>
                                                        <div class="modal-body">
                                                            <p>Are you sure to delete Pais ?</p>
                                                        </div>
                                                        <div class="modal-footer">
                                                            <form action="${appPath}/paises/remove/${PAISES.siglas}" method="DELETE">
                                                                <a href="#" class="btn" data-dismiss="modal">Cancel</a> <button type="submit" class="btn btn-primary">Confirm</button>
                                                            </form>
                                                        </div>
                                                    </div>
                                                    <!-- /.modal-content -->
                                                </div>
                                                <!-- /.modal-dialog -->
                                            </div>
                                            <!-- /.modal -->
                                        </td>

                                    </tr>

                                </c:forEach>


AVBravo - August 18, 2016 03:21 PM
JGMongo con JEE7 +(Primefaces+MongoDB+GlassFish)

Mostrare un ejemplo básico del uso de JGMongo, (Java Mapper Object para MongoDB), en un entorno JavaEE 7.


Desarrollaremos una simple aplicación maven Java Enterprise Edition, que utiliza la base de datos NoSQL MongoDB, NetBeans como IDE de Desarrollo, Java Server Faces como Framework en conjunto con PrimeFaces.
Es un ejemplo muy básico donde se almacena los datos de los países en una colección llama paises
La vista final sera la siguiente un formulario para captar los datos


Y una pagina donde se muestran los países almacenados en la base de datos.

Pasos previos:
1. Instalar MongoDB
2. Crear el proyecto Maven
3. Agregar la dependencia al archivo pom.xml
  <repositories>
<repository>
   <id>jitpack.io</id>
   <url>https://jitpack.io</url>
</repository>
</repositories>

    <dependency>
   <groupId>com.github.avbravo</groupId>
   <artifactId>jgmongo</artifactId>
   <version>0.1</version>
</dependency>

4. Crear el entity Paises

import com.google.gson.annotations.SerializedName;
import com.jgmongo.services.GenericBeans;
import lombok.Getter;
import lombok.Setter;
import org.bson.Document;

/**
 *
 * @author avbravo
 */
@Getter
@Setter
public class Paises extends GenericBeans {

    @SerializedName("Siglas")
    private String siglas;
    @SerializedName("Pais")
    private String pais;
    @SerializedName("Logo")
    private String logo;
    

    public Document toDocument(Paises paises) {
        Document doc = new Document();
        try {                        
            doc = Document.parse(getGson().toJson(paises));
        } catch (Exception e) {
            System.out.println("toDocument() " + e.getLocalizedMessage());
        }
        return doc;
    }

    public Paises toPojo(Document doc) {
        Paises paises = new Paises();
        try {
             paises = (Paises) fromJsontoPojo(doc.toJson(), new Paises().getClass());
        } catch (Exception e) {
            System.out.println("toPojo() " + e.getLocalizedMessage());
        }
        return paises;
    }

    @Override
    public String toString() {
        return "Paises{" + "siglas=" + siglas + ", pais=" + pais + '}';
    } 
}

5. Crear MongoClientProvider para gestionar la conexión  a MongoDB

@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
public class MongoClientProvider {
    private MongoClient mongoClient = null;
@Lock(LockType.READ)
public MongoClient getMongoClient(){
return mongoClient;
}
@PostConstruct
public void init() {
            try {
                mongoClient = new MongoClient();
            } catch (Exception e) {
                JSFUtil.addErrorMessage("init() "+e.getLocalizedMessage());
            }
}
}

6. Crear al Facade

@Stateless
public class PaisesFacade extends AbstractFacade<Paises> {
   @EJB
    MongoClientProvider mongoClientProvider;
    List<Paises> list = new ArrayList<>();
    Paises paises = new Paises();

  @Override
    protected MongoClient getMongoClient() {
        return mongoClientProvider.getMongoClient();
    }
    public PaisesFacade() {      
        super(Paises.class, "mydatabase", "paises");
    }
}

7. Crear el Controller

@Named
@ViewScoped
@Getter
@Setter
public class PaisesController Serializable {

    private static final long serialVersionUID = 1L;

    @Inject
    PaisesFacade paisesFacade;
    List<Paises> paisesList = new ArrayList<>();
    Paises paises = new Paises();
    Paises selectedPaises = new Paises();


    /**
     * Creates a new instance of PaisesController
     */
    @PostConstruct
    public void init() {
            paisesList = paisesFacade.findAll(new Document());
       }

    public PaisesController() {
    }

   
    public void save() {
             paisesFacade.save(paises)) {
   }

    public String remove(Paises paises) {
        
   paisesFacade.remove(new Document("Siglas",paises.getSiglas())) ;
    }
    public String removeAll(Paises paises) {        
       paisesFacade.removeAll( );
        }
  
}


8. Pagina paises.xhtml

 <p:outputLabel for="siglas" value="#{msg.siglas}"/>
      <p:inputText id="siglas" value="#{paisesController.paises.siglas}"                                                               />

                            <p:outputLabel for="pais" value="#{msg.pais}"/>
                            <p:inputText id="pais" value="#{paisesController.paises.pais}"/>

                            <p:fileUpload   auto="true" label="Foto" fileUploadListener="#{paisesController.handleFileUpload}" style="max-width:90px;" update=":form:growl,:form:foto"/>
                            <h:graphicImage id="foto" value="/resources/fotos/paises/#{paisesController.paises.logo}" height="80" width="80"/>

                            <p:outputLabel for="btn" value=" " />
                            <p:commandButton id="btn" value="#{app['boton.save']}" icon="fa fa-edit Fs14 White"  style="max-width:150px;"
                                             update=":form:growl"
                                             action="#{paisesController.save()}"
                                             />


9. Pagina paisesdatatable.xhtml
          <p:dataTable id="paisesDataTable" var="item" value="#{paisesController.paisesList}" 
                                 selectionMode="single" 
                                 selection="#{paisesController.selectedPaises}"
                                 rowKey="#{item.siglas}"
                                 rows="10" paginator="true" paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                                 rowsPerPageTemplate="5,10,15" emptyMessage="No cars found with given criteria" reflow="true">
                        <f:facet name="header">
                            <p:outputLabel value="#{msg.paises}"/>
                        </f:facet>

                        <p:ajax event="rowSelect" update=":form:paisesDetaill" oncomplete="PF('paisesDialog').show()" />

         <p:column headerText="#{msg.siglas}" sortBy="#{item.siglas}" footerText="#{msg.siglas}">
                            <h:outputText value="#{item.siglas}" />
          </p:column>
           
         <p:column headerText="#{msg.pais}" sortBy="#{item.pais}" footerText="#{msg.pais}">
                            <h:outputText value="#{item.pais}" />
           </p:column>
                        
                        
               <p:column>
                            <f:facet name="header">
                                   <p:outputLabel value="#{msg.logo}"/>
                            </f:facet>
               <h:graphicImage id="foto" value="/resources/fotos/paises/#{item.logo}" height="30" width="30"/>
              </p:column>
  </p:dataTable>

Si agregas el plugin de MongoDB para NetBeans puedes consultarlo desde el mismo IDE

o desde consola de MongoDB







AVBravo - August 18, 2016 02:31 AM
JGMongo

JGMongo un Java Mapper para MongoDB

Hace algún tiempo estaba interesado en la creación de un framework para trabajar
con MongoDB.
Esta versión que les presento es v0.1, permite realizar las operaciones de consultas, eliminación, ordenación, implementaciones de helpers, implementaciones Query, contadores, todo a traves de simples invocaciones de metodos Java.

El esquema general
1. Definir los beans
2. Crear un facade que herede de AbstractFacade
Con esto es todo lo que necesitas para interactuar con tu base de datos mongodb





La idea es que puedas trabajar de manera muy fácil  MongoDB desde aplicaciones Java

Los pasos son sencillos
Si usas Maven agrega al archivo  pom.xml

    <repositories>

<repository>

 <id>jitpack.io</id>

  <url>https://jitpack.io</url>

</repository>

</repositories>

   
    <dependencies>
         <dependency>
   <groupId>com.github.avbravo</groupId>
   <artifactId>jgmongo</artifactId>
   <version>0.1</version>
</dependency>
    </dependencies>


Cree los beans
Deben heredar de GenericBeans, implementar los métodos toDocument(), toPojo()

@Getter

@Setter

public class Paises extends GenericBeans  {

    @SerializedName("Siglas")
    private String siglas;
    @SerializedName("Pais")
    private String pais;
    @SerializedName("Logo")
    private String logo;
 

    public Document toDocument(Paises paises) {
        Document doc = new Document();              
        doc = Document.parse(getGson().toJson(paises));  
        return doc;
    }

    public Paises toPojo(Document doc) {
        Paises paises = new Paises();
        paises = (Paises) fromJsontoPojo(doc.toJson(), new Paises().getClass());
        return paises;
    }

    @Override
    public String toString() {
        return "Paises{" + "siglas=" + siglas + ", pais=" + pais + '}';
    }
}


Para la versión  Java Standar Edition



Crear el  Facade

public class PaisesFacade extends AbstractFacade<Paises>{

    public PaisesFacade( ){
        super(Paises.class, "mydatabase", "paises");
    }

    @Override
    protected MongoClient getMongoClient() {
         MongoClient mongoClient = new MongoClient();
         return mongoClient;
    }
 
}

Ejemplo de Uso

   PaisesFacade paisesFacade =new PaisesFacade();
     
        Paises paises = new Paises();
        paises.setSiglas("pa");
        paises.setPais("Panama");
        paises.setLogo("");
        //save document
        paisesFacade.save(paises);
        //list all document
        List<Paises> list = paisesFacade.findAll(new Document());
        list.stream().forEach((p) -> {
            System.out.println(p.toString());
        });

Para Java Enterprise Edition

Cree   MongoClientProvider 
Este  fue desarrollado por Adrian Matei en este enlace

Permite mediante un Singleton conectarse a MongoDB en aplicaciones Java Enterprise Edition

@Singleton

@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)

public class MongoClientProvider {

    private MongoClient mongoClient = null;

@Lock(LockType.READ)
public MongoClient getMongoClient(){
return mongoClient;
}

@PostConstruct
public void init() {
            try {
                mongoClient = new MongoClient();
            } catch (Exception e) {
                JSFUtil.addErrorMessage("init() "+e.getLocalizedMessage());
            }

}

}

 Cree el Facade

@Stateless

public class PaisesFacade extends AbstractFacade<Paises> {


    @EJB

     MongoClientProvider mongoClientProvider;


     List<Paises> list = new ArrayList<>();

     Paises paises = new Paises();

   @Override

    protected MongoClient getMongoClient() {

         return mongoClientProvider.getMongoClient();

    }

    public PaisesFacade() {    

         super(Paises.class, "mydatabase", "paises");

    }

}


Ejemplo de Uso

@Named

@ViewScoped

public class PaisesController implements Serializable {

@Inject

PaisesFacade paisesFacade;

public Boolean save(Paises paises){

       return paisesFacade.save(paises);

}


public List<Paises> getPaises(){

      return paisesFacade.findAll(new Document());
}

AVBravo - July 14, 2016 05:29 PM
COMPILATION ERROR : error: cannot find symbol en Maven

Entre algunos errores que podemos encontrar al crear un proyecto  maven
COMPILATION ERROR :  error: cannot find symbol.
Generalmente tenemos una clase en uno de los paquetes , y esta la importamos en otro paquete pero al compilar el proyecto se genera errores como este:

Editamos el archivo pom.xml y agregamos
    <build>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>


AVBravo - July 13, 2016 03:11 AM
Un ejemplo sencillo de Refactorización y Genericos

Un ejemplo sencillo de Refactorización y Genericos

public class Refactorizador<K, V> {

    public V copyFromBeans(K k, V v) {
        try {
            Class claseK = k.getClass();
            Class claseV = v.getClass();

            Method[] metodosK = claseK.getMethods();

            for (Method method : metodosK) {
                if (isGetter(method)) {
                    Method metodoGetK = claseK.getDeclaredMethod(method.getName());
                    Method metodoSetV = claseV.getDeclaredMethod(changeGetBySet(method.getName()), method.getReturnType());
                    metodoSetV.invoke(v, metodoGetK.invoke(k));
                }

            }

        } catch (Exception e) {
            System.out.println("refactorizador() " + e.getLocalizedMessage());
        }
        return v;
    }
   
     public  boolean isGetter(Method method) {

        if (!method.getName().startsWith("get")) {
            return false;
        }
        if (method.getName().startsWith("getClass")) {
            return false;
        }

        if (method.getParameterTypes().length != 0) {
            return false;
        }
        if (void.class.equals(method.getReturnType())) {
            return false;
        }
        return true;
    }

    public  boolean isSetter(Method method) {
        if (!method.getName().startsWith("set")) {
            return false;
        }
        if (method.getParameterTypes().length != 1) {
            return false;
        }
        return true;
    }

    /**
     * cambia el metodo get por set
     *
     * @param metodo
     * @return
     */
    public String changeGetBySet(String metodo) {
        try {

            metodo = metodo.replace("get", "set");
        } catch (Exception e) {
            System.out.println("changeGetBySet()" + e.getLocalizedMessage());
        }
        return metodo;
    }
  
}
Clases:
public class Persona{
   private String nombre;

   private String direccion;
//get/set

}
public class Generales{
   private String nombre;
   private String direccion;
//get/set
}

Uso:
Copia el contenido de la clase Persona a la clase Generales
Refactorizador refactorizador = new Refactorizador();
Persona persona = new Persona();
persona.setNombre("X12");
persona.setDireccion("Panama");

 Generales generales = new Generales();
generales= (Generales) refactorizador.copyFromBeans(persona,generales);

AVBravo - June 29, 2016 02:35 PM
Entrevista a Adam Bien sobre Microprofile.io

Recientemente se han creado iniciativas para impulsar los avances en la plataforma JEE  como son Java EE Guardians (https://javaee-guardians.io/) con el propósito de impulsar la plataforma JEE8 , y en los últimos días  algunas empresas entre las que figuran (Redhat,Payara, IBM,Tomitribe, LJC) se unieron para  MicroProfile ( http://microprofile.io), para promover la implementación de Microservicios dentro de JEE.
En esta oportunidad entreviste por segunda vez a Adam Bien( http://www.adam-bien.com/), sobre algunos aspectos generales de Microprofile.



1. Do you consider that microservices is fundamental to the Java Ecosystem?

In most projects we built “microservices” for several years without knowing the term. Microservices are not fundamental, they are rather natural fit to Java EE.

2. Do you believe that there is a delay in the adoption of microservices?

No. My clients are perfectly happy with Java EE 7 full profile. It is surprisingly lean.
However, monitoring could be even more standardized (beyond JSR-77) and exposed via stock JAX-RS.

Monitoring and other non-functional requirements are not the part of the microprofile.io, but this is just the start.

3. Why does this alliance arise prior to a JCP specification?

Do you mean microprofile.io? It is just a pragmatic way to involve community. The goal is to standardize whatever possible with JCP. But we should involve the community first.


4.Will major changes in the use of microservices affect the  develop meant of business applications?
All project driven by actual requirements and not by esoteric architectures should look already surprisingly microservices compliant.

5- Was us your opinion about  Java EE Guardians  and  MicroProfile.io?
I did not created Java EE Guardians (JEG). Because of lack of time I’m watching “from outside” what they are doing. IMO The JEG try to explain Oracle that Java EE is important for business. I share their opinion: http://www.adam-bien.com/roller/abien/entry/oracle_moves_in_strange_ways

microprofile.io focusses on a minimal Enterprise Java profile. I’m not sure whether we can officially call it Java EE 8 MicroProfile.

It wouldn’t surprise me, if another Java EE related website is going to be published soon :-)






6. What recommendations  could you give us?

Write 90% business code, focus on domain, forget the fashion. Simplicity wins in long term.

Agradecido a Adam Bien por su tiempo y sus aportes.


AVBravo - June 26, 2016 07:58 PM
Funciones Year en JPA

Si deseas usar funciones SQL con JPA, podemos hacerlo mediante FUNC('funcion',nombre-columna')


public List<Recibos> findByIdentificadorAnioActividades(Identificador id, Integer anio, Actividades idactividades) {
        Query query = em.createQuery("SELECT r FROM Recibos r WHERE r.id = :id and FUNC('YEAR',r.fecha) = :anio and r.idactividades = :idactividades and r.anulado ='no'");
        query.setParameter("idactividades", idactividades);
        query.setParameter("anio", anio);
        return query.setParameter("id", id).getResultList();
    }

AVBravo - June 15, 2016 03:20 AM
JavaEE Guardians Petición


Como parte de las actividades del grupo Java EE Guardians, https://javaee-guardians.io/, se creo una petición para lograr avances en una de las plataformas de desarrollo mas robustas Java EE.
Puedes firmarla si estas de acuerdo con la propuesta en el siguiente enlace:
https://www.change.org/p/larry-ellison-tell-oracle-to-move-forward-java-ee-as-a-critical-part-of-the-global-it-industry

Hasta este momento lleva más de 800 firmas, de desarrolladores, lideres de grupos de usuarios,etc.

AVBravo - June 11, 2016 03:45 PM
JavaEE 8 con JPA muy fácil

JavaEE 8 con JPA muy fácil
Que tan fácil es programar en JavaEE8, aun no esta terminado JavaEE8, pero desde hace algún tiempo tenemos la oportunidad de ir probando  las características que implementa.
Usaremos un proyecto creado con JPA Modeler, y mostraremos lo sencillo que es implementar un nuevo modulo en este ejemplo para almacenar la información de una persona en una tabla en MySQL.
Agregamos a la pagina principal el nuevo modulo llamado persona.


Creamos un formulario con los datos de la persona

Lo mostramos en una tabla


Creamos un entity llamado Persona
@Entity
public class Persona implements Serializable {

    @Id
    @FormParam("id")
    private Long id;

    @Column(name = "nombre")
    @Basic
    @NotNull
    @Size(min = 5, max = 50, message = "El nombre debe tener entre 5 y 50 caracters")
    @FormParam("nombre")
    private String nombre;

    @Basic
    @FormParam("direccion")
    private String direccion;
//get/set
}

Creamos el facade PersonaFacade
@Stateless
@Named("persona")
public class PersonaFacade extends AbstractFacade<Persona> {

    @PersistenceContext(unitName = "DEFAULT_PU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public PersonaFacade() {
        super(Persona.class);
    }
    
}

Creamos el controller PersonaController
@Path("persona")
public class PersonaController {

    @Inject
    private Models model;
    @Inject
    private PersonaFacade facade;
    @Inject
    private BindingResult validationResult;
    @Inject
    private ErrorBean error;

    @GET
    @Path("new")
    @Controller
    public String emptyPersona() {
        return "/view/persona/create.jsp";
    }

    @POST
    @Path("new")
    @Controller
    @ValidateOnExecution(type = ExecutableType.NONE)
    @CsrfValid
    public String createPersona(@Valid
            @BeanParam Persona entity) {
        if (validationResult.isFailed()) {
            return ValidationUtil.getResponse(validationResult, error);
        }
        facade.create(entity);
        return "redirect:persona/list";
    }

    @GET
    @Path("update/{id}")
    @Controller
    public String editPersona(@PathParam("id") Long id) {
        model.put("PERSONA", facade.find(id));
        return "/view/persona/update.jsp";
    }

    @POST
    @Path("update")
    @Controller
    @ValidateOnExecution(type = ExecutableType.NONE)
    @CsrfValid
    public String updatePersona(@Valid
            @BeanParam Persona entity) {
        if (validationResult.isFailed()) {
            return ValidationUtil.getResponse(validationResult, error);
        }
        facade.edit(entity);
        return "redirect:persona/list";
    }

    @GET
    @Path("remove/{id}")
    @Controller
    public String removePersona(@PathParam("id") Long id) {
        facade.remove(facade.find(id));
        return "redirect:persona/list";
    }

    @GET
    @Path("{id}")
    @Controller
    public String findPersona(@PathParam("id") Long id) {
        model.put("PERSONA", facade.find(id));
        return "/view/persona/view.jsp";
    }

    @GET
    @Path("list")
    @Controller
    public String findAllPersona() {
        model.put("PERSONA_LIST", facade.findAll());
        return "/view/persona/list.jsp";
    }
    
}



Ejemplo del jsp









AVBravo - June 08, 2016 01:37 AM
Java EE Guardians

Java EE Guardians



Después de unos meses sin escribir, ya que me encontraba en algunos proyectos que me han mantenido con un retraso en la publicación de algunas cosas sobre NetBeans , Java,JavaEE.
En esta ocasión deseo compartir con ustedes este iniciativa Java EE Guardians.
En la cual deseo agradecer a Reza  Rahman por la invitación a participar de este incitativa.

Java EE Guardians es un grupo de personas comprometidas con el futuro de Java EE, preocupados por los retrasos en los avances de JEE8 , el objetivo es preservar los intereses de la comunidad incluyendo Oracle para continuar con el éxito de JEE en el lado del servidor.
JEE es muy importante para el ecosistema de Java en general,  es usado en aplicaciones de misión critica y grandes cantidades de aplicaciones están escritas en JEE, por lo cual es fundamental la evolución de la plataforma.

Que actividades se están haciendo:

  • Evangelización de JEE, JEE8
  • Apoyo a los JSRs de Java EE 8
  • Discusiones activas con los miembros del grupo de expertos de JavaEE8
Hay muchas actividades en las que puedes participar.
Algunos enlaces de interés donde se amplían los detalles en el sitio oficial https://javaee-guardians.io/

Twitter:
JavaEE Guardian

Reza Rahman







AVBravo - December 02, 2015 02:23 AM
Web Responsive con Primefaces

Web Responsibe con Primefaces

Primefaces 5.3 soporta Web Responsive, por ejemplo



en el panelGrid indicamos la propiedad layout con el valor de grid
<p:panelGrid columns="3" layout="grid">


AVBravo - December 01, 2015 01:11 AM
Reportes con imagenes en Java Server Faces

Reportes con imagenes en Java Server Faces
Deseamos mostrar en el reporte la imagen escudonacional.gif, que está almacenada en
/resources/imagenes


En el controller que usamos para imprimir crear el metodo 
 public static String getPath() { 
        try { 
            ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance() 
                    .getExternalContext().getContext(); 
            return ctx.getRealPath("/"); 

        } catch (Exception e) { 

           JSFUtil.addErrorMessage("getPath() " + e.getLocalizedMessage()); 
   } 
        return null; 

    } 


En el método imprimir, generar el path mediante el llamado a getPath(), y colocar la 
ubicación de la imagen. 

private String imprimirGeneralIngresos(List<InformeGeneralIngresos> list, Double 
totalenviado, Double totalcomision, Double totalitbm, Double total) { 
        try { 

            String ruta = "/resources/reportes/informes/informegeneralingresos.jasper"; 
            HashMap parameters = new HashMap(); 


            ​
String path = getPath() + "resources/imagenes/escudonacional.gif"; 
                  parameters.put("P_RUTAIMAGEN", path);  


            gestorImpresion.imprimir(list, ruta, parameters); 
        } catch (Exception ex) { 
            JSFUtil.addErrorMessage("imprimirEnviados() " + ex.getLocalizedMessage()); 
        } 
        return null; 
    } 




 En el diseñador de Reporte  
Agregar el parámetro P_RUTAIMAGEN de tipo String 

Arrastrar un objeto de tipo image 

se muestra el dialogo para seleccionar la imagen 

Darle clic en Cancelar para no seleccionar ninguna imagen 

se muestra el icono que representa a la imagen 


dar clic en el image y buscar en properties , la propiedad Image Expression 

dar clic en el boton ... 

En el diálogo dar clic en Parameters y  seleccionar P_RUTAIMAGEN 

Quedaría de la siguiente manera, dar clic en Ok 


El icono que se mostraba anteriormente desaparece y queda el área de la imagen que será 
reemplaza por la que indiquemos en el controller 

Compilar el reporte 

Al ejecutar el proyecto se muestra la imagen en el reporte. 














AVBravo - November 21, 2015 04:30 AM
Usar un splitButton con datatable primefaces

En algunas ocasiones necesitamos desplegar varias opciones en un datatable, para evitar tener que definir muchas columnas, podemos utilizar un splitButton , que invoca un dialogo en base a cada opción seleccionada.


Al seleccionar la opción detalle, muestra un dialogo con el detalle de la fila seleccionada.
    <p:column style="width:40px;">  

                                    <p:fragment autoUpdate="true"> 

                                        <p:splitButton title="#{msg.opciones}"    icon="fa fa-align-left">
                                            
                                            <p:menuitem value="#{msg.detalle}" title="#{msg.detalle}" update=":form:growl,:form:datatableImpuestos   ,:form:panelcomentario" oncomplete= "PF('detalleDialogVar').show()"  icon="fa fa-file-text-o" >
                                                  <f:setPropertyActionListener value="#{item}" target="#{impuestoscontribuyentesController.selected}" />  
                                            </p:menuitem>
                                          
                                             <p:menuitem value="#{msg.pagos}" title="#{msg.pagos}" update=":form:growl,:form:datatableImpuestos   ,:form:panelpagos" oncomplete= "PF('pagosDialogVar').show()"  icon="fa fa-pinterest-p" >
                                                  <f:setPropertyActionListener value="#{item}" target="#{impuestoscontribuyentesController.selected}" />  
                                            </p:menuitem>
                                                 <p:separator />
                                            <p:menuitem value="#{msg.morosidad}" title="#{msg.morosidad}" update=":form:growl,:form:datatableImpuestos   ,:form:panelmorosidad" oncomplete= "PF('morosidadDialogVar').show()"  icon="fa fa-medium" >
                                                  <f:setPropertyActionListener value="#{item}" target="#{impuestoscontribuyentesController.selected}" />  
                                            </p:menuitem>
                                         <p:menuitem value="#{msg.recargo}" title="#{msg.recargo}" update=":form:growl,:form:datatableImpuestos   ,:form:panelrecargo" oncomplete= "PF('recargoDialogVar').show()"  icon="fa fa-bell" >
                                                  <f:setPropertyActionListener value="#{item}" target="#{impuestoscontribuyentesController.selected}" />  
                                            </p:menuitem>
                                       
                                           
                                        </p:splitButton>

                                      
                                    </p:fragment>


                                </p:column>


El dialogo
  <p:dialog  modal="false" 
                                   height="220"  width="510" draggable="true"
                                   id="pagarDialogVar"
                                   widgetVar="detalleDialogVar">

                            <b:panel id="panelcomentario2" look="primary" title="#{msg.detalle}">
                                <!--<p:panelGrid columns="2" id="panelcomentario">-->
                                <b:panelGrid id="paneldetalle" colSpans="2,10">
                                    <p:outputLabel value="#{msg.idnivel6}"/>
                                    <p:outputLabel value="#{impuestoscontribuyentesController.selected.idnivel6.idnivel6}"/>
                                    <p:outputLabel value="#{msg.nombre}"/>

                                    <p:outputLabel value="#{impuestoscontribuyentesController.selected.idnivel6.nombre}"/>


                                    <h:outputText value="#{msg.rango}"/>

                                    <h:outputText value="( #{impuestoscontribuyentesController.selected.idnivel6.minimo} a #{impuestoscontribuyentesController.selected.idnivel6.maximo} )"/>





                                    <p:commandButton 
                                        icon="ui-icon-close"
                                        update=":form:datatableImpuestos   ,:form:growl"
                                        onclick="PF('comentarioDialogVar').hide();"
                                        type="button" />


                                </b:panelGrid>


                            </b:panel>

                        </p:dialog>




APIDesign - Blogs - November 29, 2014 01:07 PM
Converting Truffle

I've just converted Truffle to OSGi bundle with following simple script. As I was interested only in PolyglotEngine class, I exported just the single package:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <artifactId>truffleosgi</artifactId>
    <groupId>org.apidesign.demo</groupId>
    <packaging>bundle</packaging>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>com.oracle.truffle</groupId>
            <artifactId>truffle-api</artifactId>
            <version>0.22</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>2.3.7</version>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <!-- I am interested only in PolyglotEngine -->
                        <Export-Package>com.oracle.truffle.api.vm</Export-Package>
                        <!-- list other packages that should be included in your bundle -->
                        <Private-Package>META-INF.*,com.*</Private-Package>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

--JaroslavTulach 13:07, 29 November 2014 (UTC)

Duke Choice Award

DukeScript has been awarded a Duke Choice Award! Here is picture of Toni Epple and me holding the Duke Choice Award on Sep 28, 2014:

Image:DukeChoiceAward.jpg

Long live Java and HTML on every device (iOS, Android and co.)!

--JaroslavTulach 17:37, 29 September 2014 (UTC)

Play MineSweeper to Become iOS, Android, JavaFX & co. Developer

Since Sep 15, 2014 the MineSweeper NetBeans integration can be used as a starting point to develop own DukeScript applications. Just press the Develop button and a new project wizard will be opened as following picture shows:

Image:MineSweeperDevelop.png

--JaroslavTulach 10:57, 15 September 2014 (UTC)

JavaOne2014: Need Speakers for My Session!

JavaOne2014 is around the corner and my sessions have been scheduled. I start with a BOF on Monday evening called Virtually Inside-Out! - it is going to be discussion between authors of alternative JVMs. So far we are two: I have mine Bck2Brwsr and Niklas has RoboVM.

Don't you know a developer working on own JVM who will be at JavaOne2014? If so, please tell him to contact me and stop by! I plan to make the BOF a lively chat (how did you implemented lambdas?, how did you implemented defender methods?), but in case we don't have a topic to talk about, I am ready to explain why value classes should not be in JVM and why InvokeDynamic is a completely stupid idea. Anyone from JDK team to defend these proposals?

On Tuesday morning Toni and me will continue with DukeScript tutorial. In case you use Java and want to learn how to code for iOS, Android, JavaFX and browsers, stop by. We will help you create your first application that is written once and displayed anywhere!

I'll finish on Tuesday noon talking about API Design checklist. I'd like to name at least ten things one should check for, but so far I have about two. Don't you have any idea what could be in such checklist? If so, please talkback!

--JaroslavTulach 18:56, 10 September 2014 (UTC)

Develop in NetBeans and Deploy to AppStore

Minesweeper for iOS has been published. First iBrwsr powered DukeScript application has been deployed to AppStore. If you own an iPad or iPhone, give it a try: https://itunes.apple.com/us/app/fair-minesweeper/id903688146

And don't forget you can use NetBeans to develop such applications yourself! Install DukeScript NetBeans support.

--JaroslavTulach 15:29, 21 August 2014 (UTC)

Develop in NetBeans and Deploy to GooglePlay

Minesweeper for Android has been published. First DlvkBrwsr powered DukeScript application has been deployed to GooglePlay. Give it a try: https://play.google.com/store/apps/details?id=org.apidesign.demo.minesweeper

And don't forget you can use NetBeans to develop such applications yourself! Install DukeScript NetBeans support.

--JaroslavTulach 05:17, 31 July 2014 (UTC)

Japanese Translation is Real

Cover of Japanese translation of TheAPIBook. I am amazed, the book is about 30% shorter, yet is seems to contain all the content of the original one!

Image:PracticalAPIDesignInJapanese.jpg

Great work Yoshiki!

--JaroslavTulach 06:51, 17 July 2014 (UTC)

Bck2Brwsr Revision 0.9 is Released!

Version 0.9 eliminates useless stack assignments. Instead of doing

var stI0 = lcI0;
var stI1 = lcI1;
var stI0 = stI0 + stI1;
return stI0;

the now generated code is

return lcI0 + lcI1;

which is shorter and more human readable. However I doubt the V8 virtual machine sees any benefits - I think the final native code remains the same. But at least the debugging of the generated JavaScript code is now easier - there is less Step Over invocations and it mimics more closely the original Java source.


Optimized the ahead-of-time compilation, so now the http://xelfi.cz/minesweeper/bck2brwsr/ demo starts up instantly. I had to do it, because it was so embarrassing to see TeaVM to boot the same application so quickly: The initial delay is gone, and moreover it downloads necessary libraries in parallel and on background. Now we are ready for next step: share the libraries between different applications.

Can ObfuscatePerLibrary - e.g. each JAR gets compiled ahead-of-time into its own JavaScript file, which can be shared between many applications.

--JaroslavTulach 06:34, 10 June 2014 (UTC)

Podcast related to Japanese Translation

Japanese translation announcement: --JaroslavTulach 18:45, 2 June 2014 (UTC)

Debug Mixed Java/JavaScript Applications

Before Nashorn (the JDK8 JavaScript engine) performing calls between Java and JavaScript was a pain. Especially when it came to debugging. But now, one can completely freely mix Java and JavaScript inside of a single thread and still be able to debug and inspect the slightest details of Java as well as JavaScript stack frames.

See video showing the power of the synergy between NetBeans 8.0 and Nashorn!

--JaroslavTulach 15:53, 20 February 2014 (UTC)

Japanese Translation of Practical API Design

The Japanese translation of my book has been in progress for several months. Recently I've been asked by Yoshiki to write a preface.

I wrote one and I tried to express how wonderful experience it had been to participate in the Japanese translation. I believe the Japanese version of my book will be great.

Thanks Yoshiki for your work. Dear (Japanese reading) readers, enjoy!

--JaroslavTulach 09:28, 27 January 2014 (UTC)

Unify Eclipse and NetBeans UI

I've managed to prototype a way to share UI between two rich client platforms. These days it is popular to use HTML, so I did it. However in addition to that I managed to remove all need for JavaScript. Design in HTML and code your application logic in Knockout4Java.

See how!

--JaroslavTulach 18:01, 21 December 2013 (UTC)

JavaFX for iOS via NetBeans

I am pleased to announce there is now a way to develop applications for iOS using your favorite language (I mean Java) and your favorite development IDE (I mean NetBeans).

With the help of Prague's JavaFX iOS team we now have a NetBeans plugin that helps anyone develop JavaFX based Java apps for iOS. Many thanks should also go to RoboVM guys for creating such easy to use Maven plugin.

Enjoy JavaFX on iOS!

--JaroslavTulach 12:42, 10 December 2013 (UTC)

API Design Guidelines

I have discovered a nice checklist of guidelines considered good for API design.

--JaroslavTulach 09:30, 2 December 2013 (UTC)

Cloud IDE for Kids

Scratch is getting better and better. If you have not done that yet, give it a try!

--JaroslavTulach 08:48, 2 December 2013 (UTC)


The Smallest Linux JDK

The profiles support is coming for JDK8. Not only it is coming, it works! In case you are searching for a small Java, give profiles a try. They are easy to start with.

--JaroslavTulach 15:12, 27 November 2013 (UTC)

DEW - Java Meets Web with Your Help!

I'm proud to announce DEW - the development environment for web (of course in Java). I am tired of observing JavaScript being on the rise while pretending it is more than just a script language. The real language is Java and it does quite well with HTML. Check DEW here: http://dew.apidesign.org/dew/ and you will not regret!

The more you fiddle with DEW and the more you alter (and save) the samples, the more we will help Java get Bck2Brwsr!

--JaroslavTulach 16:56, 28 October 2013 (UTC)

Maven and Bck2Brwsr 0.8

I've just updated instructions to use bck2brwsr 0.8 from command line. Me and Jonathan Fuerth also verified that the Bck2Brwsr Maven archetype can now be used in Eclipse.

Nothing can stop us from bringing Java Bck2Brwsr!

--JaroslavTulach 12:22, 29 September 2013 (UTC)

Use the Debugger, Stupid!

Debugger is a very useful tool. I greatly recommend it to everyone who asks stupid questions on mailing lists and reports vague bugs into bug tracking systems. If your application does not work: use the debugger! Read here to learn how.

--JaroslavTulach 09:17, 20 August 2013 (UTC)

Bck2Brwsr 0.7 Released!

Write applications once and deploy them to FXBrwsr as well as Bck2Brwsr:

--JaroslavTulach 07:50, 9 May 2013 (UTC)

Bck2Brwsr 0.6 is Released!

Now you can write your own real applications for browser in Java:

  • Full featured demo Twttr demo
  • Bck2Brwsr provides better binding of complex classes (defined by a special @Model) annotation
  • The @Model classes can be obtained from a server via JSON and JSONP. Use @OnReceive annotation
  • Browser testing harness has nicer output with UL and expandable LI

--JaroslavTulach 21:24, 14 April 2013 (UTC)

Older Blog Posts

OlderBlogPosts...

--JaroslavTulach 21:00, 14 April 2013 (UTC)


diesil java - May 28, 2009 07:43 PM
JavaScript en NetBeans 6.1

Esta entrada fue movida a

http://apuntesdejava.blogspot.com/2008/04/javascript-en-netbeans-61.html

diesil java - May 06, 2009 06:52 PM
Mudado...!!

Si eras una de las personas que visitaba este humilde blog, pues te informo que todo lo he cambiado a otra dirección:

http://apuntesdejava.blogspot.com

Ahí están todos los posts... menos los comentarios.

Por ahora no he activado el foro ya que... vamos... no me da tiempo de responder las preguntas.

Programación Web y Tecnologías Informáticas - March 13, 2008 05:08 AM
Java Server Pages: Directiva include

Esta directiva nos permite incluir ficheros en el momento en que la página JSP es traducida a un servlet. La directiva se parece a esto:

<%@ include file="cabecera.html" %>
La URL especificada normalmente se interpreta como relativa a la página JSP a la que se refiere, pero, al igual que las URLs relativas en general, podemos decirle al sistema que interpreta la URL relativa al directorio home del servidor Web empezando la URL con una barra invertida. Los contenidos del fichero incluido son analizados como texto normal JSP, y así pueden incluir HTML estático, elementos de script, directivas y acciones. Por ejemplo, muchas sites incluyen una pequeña barra de navegación en cada página. Debido a los problemas con los marcos HTML, esto normalmente se implementa mediante una pequeña tabla que cruza la parte superior de la página o el lado izquierdo, con el HTML repetido para cada página de la site. La directiva include es una forma natural de hacer esto, ahorrando a los desarroladores el mantenimiento engorroso de copiar realmente el HTML en cada fichero separado. Aquí tenemos un código representativo:
<HTML> <HEAD> <TITLE>Ejemplo del uso de la directiva include en JSP</TITLE> </HEAD> <BODY> <%@ include file="/navbar.html" %> <!-- Contenido de la página --> </BODY> </HTML>
Es importante tener presente que como la directiva include inserta los ficheros en el momento en que la página es traducida, si la página incluida cambia, necesitamos re-traducir todas las páginas JSP que la refieren. Esto es un buen compromiso en una situación como esta, ya que esto generalmente se utiliza en las páginas de un sitio que no cambian frecuentemente, y queremos que el proceso de inclusión sea tan eficiente como sea posible. Si los ficheros incluidos cambian de forma más frecuente, podríamos usar la acción jsp:include en su lugar. Esto incluye el fichero en el momento en que se solicita la página JSP.

Programación Web y Tecnologías Informáticas - March 12, 2008 05:03 AM
Java Server Pages: Directiva taglib

Indica al contenedor JSP que la página va a utilizar "tag libraries" o librerías de etiquetas. Estas librerías contienen etiquetas creadas por el propio programador con sus correspondientes atributos que encapsulan determinada funcionalidad. Lo habitual es utilizar librerías públicas que han diseñado otros programadores y han sido profundamente probadas. La sintaxis de esta directiva tiene dos atributos. El contenido del atributo uri permite localizar el fichero descriptor de la librería de extensión tld. El atributo prefix especifica el identificador que todas las etiquetas de la librería deben incorporar. Es una directiva muy interesante que facilita y complementa la programación habitual de las páginas JSP. Las taglibs son simplemente un cambio de interfaz con respecto al código Java normal; te ahorran insertar código dentro de las páginas, y son, en general, más fáciles de mantener, porque, en el más puro estilo OO, encapsulan su lógica y el que las usa no tiene que preocuparse por cómo hacen lo que hacen, sólo por acceder a ellas. Desarrollar sitios web utilizando etiquetas presenta ciertas ventajas como: • Facilitar el aprendizaje. • Facilitar el mantenimiento. • Fomentar la modularidad y la reutilización. • Simplificar el código y reducir el número de líneas necesarias. Su sintaxis es como se muestra en el ejemplo siguiente:

<%@ taglib uri="/taglib/lycka" prefix="lycka" %> <!-- ( ... ) --> <lycka:hola/> <!-- ( ... ) -->
A la hora de generar el código Java de la Servlet, esta etiqueta hola será interpretada por el Servidor como perteneciente a la librería de etiquetas (Tag Library) lycka. Esta librería estará identificada en el fichero descriptor de nuestra aplicación (web.xml) con el nombre de recurso (URI) /taglib/lycka de la siguiente forma:
<taglib-uri>/taglib/lycka</taglib-uri> <taglib-location>/WEB-INF/tags/lycka.tld</taglib-location>
Para profundizar sobre el tema de la directiva taglib le recomiendo este archivo PDF con una descripción más detallada y con algunos ejemplos prácticos.

Programación Web y Tecnologías Informáticas - March 11, 2008 03:23 PM
Tecnologías del lado del cliente: Applet

Un applet es un componente de una aplicación que se ejecuta en el contexto de otro programa, por ejemplo un navegador web. El applet debe ejecutarse en un contenedor, que lo proporciona un programa anfitrión, mediante un plugin, o en aplicaciones como teléfonos móviles que soportan el modelo de programación por applets. A diferencia de un programa, un applet no puede ejecutarse de manera independiente, ofrece información gráfica y a veces interactúa con el usuario, típicamente carece de sesión y tiene privilegios de seguridad restringidos. Un applet normalmente lleva a cabo una función muy específica que carece de uso independiente. Cuando un Navegador carga una página Web que contiene un Applet, este se descarga en el navegador Web y comienza a ejecutarse esto nos permite crear programas que cualquier usuario puede ejecutar con tan solo cargar la página Web en su navegador. Ejemplos comunes de applets son las Java applets y las animaciones Flash. Otro ejemplo es el Windows Media Player utilizado para desplegar archivos de video incrustados en los navegadores como el Internet Explorer. Otros plugins permiten mostrar modelos 3D que funcionan con un applet. Applet de Java Un Java applet es un código Java que carece de un método main, por eso se utiliza principalmente para el trabajo de páginas web, ya que es un subprograma o pequeño programa que es utilizado en una página HTML y representado por una pequeña pantalla gráfica dentro de ésta. Por otra parte, la diferencia entre una aplicación Java y un applet radica en cómo se ejecutan. Para cargar una aplicación Java se utiliza el intérprete de Java. En cambio, un applet se puede cargar y ejecutar desde cualquier explorador que soporte Java (Nescape, Internet Explorer de Windows, Mozilla Firefox, etc.). Entre sus características podemos mencionar un esquema de seguridad que permite que los applets que se ejecutan en el equipo no tengan acceso a partes sensibles, por ejemplo no pueden escribir archivos, a menos que uno mismo le dé los permisos necesarios en el sistema; la desventaja de este enfoque es que la entrega de permisos es engorrosa para el usuario común, lo cual juega en contra de uno de los objetivos de los Java applets: proporcionar una forma fácil de ejecutar aplicaciones desde el navegador web. Ventajas de los applet de Java • Funcionan en Linux, Windows y Mac OS, son multiplataforma • El mismo applet pueden trabajar en "todas" las versiones de Java, y no sólo la última versión del plug-in. Sin embargo, si un applet requiere una versión posterior de la JRE, el cliente se verá obligado a esperar durante la gran descarga. • Es soportado por la mayoría de los navegadores Web • Puede ser almacenado en la memoria cache de la mayoría de los navegadores Web, de modo que se cargará rápidamente cuando se vuelva a cargar la página Web, aunque puede quedar atascado en la caché, causando problemas cuando se liberan nuevas versiones. • Puede tener acceso completo a la máquina en la que se está ejecutando, si el usuario lo permite • Puede ejecutarse con velocidades comparables (pero en general más lento) a la de otros lenguajes compilados, como C + +, pero muchas veces más rápida que la de JavaScript • Puede trasladar el trabajo del servidor al cliente, haciendo una solución Web más escalable tomando en cuenta el número de usuarios / clientes Desventajas de los applet de Java • Requiere el plug-in de Java, que no está disponible por defecto en todos los navegadores web. • Sun no ha creado una implementación del plug-in para los procesadores de 64 bits • No puede iniciar la ejecución hasta que la Máquina virtual de Java está en funcionamiento, y esto puede tomar tiempo la primera vez que se ejecuta un applet. • Si no esta firmado como confiable, tiene un acceso limitado al sistema del usuario - en particular no tiene acceso directo al disco duro del cliente o al portapapeles. • Algunas organizaciones sólo permiten la instalación de software a los administradores. Como resultado, muchos usuarios (sin privilegios para instalar el plug-in en su navegador) no pueden ver los applets. • Un Applet podría exigir una versión específica del JRE. Cómo crear un applet de java Para crear un applet necesitamos escribir una clase que herede de la clase Applet del paquete java.applet.*;

import java.applet.*; public class MiApplet extends Applet { //Cuerpo del ''applet''. }
El código anterior declara una nueva clase MiApplet que hereda todas las capacidades de la clase Applet de Java. El resultado es un fichero MiApplet.java. Una vez creada la clase que compone el applet, escribimos el resto del código y después lo compilamos, obteniendo el fichero MiApplet.class. Para poder crear el applet se necesita compilar el código Java en un intérprete.
import java.applet.*; import java.awt.*; import java.util.*; import java.text.DateFormat; public class MiApplet extends Applet implements Runnable { private Thread hilo = null; private Font fuente; private String horaActual = "00:00:00"; public void init() { fuente = new Font("Verdana", Font.BOLD, 24); } public void start() { if (hilo == null) { hilo = new Thread(this, "Reloj"); hilo.start(); } } public void run() { Thread hiloActual = Thread.currentThread(); while (hilo == hiloActual) { //obtener la hora actual Calendar cal = Calendar.getInstance(); Date hora = cal.getTime(); DateFormat df = DateFormat.getTimeInstance(); horaActual = df.format(hora); repaint(); try { Thread.sleep(1000); } catch (InterruptedException e){} } } public void paint(Graphics g) { //Dibujar un rectangulo alrededor del contenedor g.draw3DRect(1, 1, getSize().width-3, getSize().height-3, false); //Establecer la Fuente g.setFont(fuente); //mostrar la Hora g.drawString(horaActual,14,40); } public void stop() { hilo = null; } }
Finalmente, para ejecutar el applet hay que crear una página Web que haga referencia al mismo. La etiqueta HTML que permite hacer eso es <applet>:
<html> <applet code="MiApplet.class" width="370" height="270"> </applet> </html>
Los parámetros "MiApplet.class", "370" y "270" correspondientes a la ubicación del archivo que contiene la clase, el ancho y el alto del applet, se pueden modificar.

Programación Web y Tecnologías Informáticas - March 11, 2008 03:21 PM
Tecnologías del lado del cliente: Java Virtual Machine Plugin

Una Máquina virtual Java (en inglés Java Virtual Machine, JVM) es un programa nativo, es decir, ejecutable en una plataforma específica, capaz de interpretar y ejecutar instrucciones expresadas en un código binario especial (el Java bytecode), el cual es generado por el compilador del lenguaje Java. El código binario de Java no es un lenguaje de alto nivel, sino un verdadero código máquina de bajo nivel, viable incluso como lenguaje de entrada para un microprocesador físico. Como todas las piezas del rompecabezas Java, fue desarrollado originalmente por Sun Microsystems. La JVM es una de las piezas fundamentales de la plataforma Java. Básicamente se sitúa en un nivel superior al Hardware del sistema sobre el que se pretende ejecutar la aplicación, y este actúa como un puente que entiende tanto el bytecode, como el sistema sobre el que se pretende ejecutar. Así, cuando se escribe una aplicación Java, se hace pensando que será ejecutada en una máquina virtual Java en concreto, siendo ésta la que en última instancia convierte de código bytecode a código nativo del dispositivo final. La gran ventaja de la máquina virtual java es aportar portabilidad al lenguaje de manera que desde Sun Microsystems se han creado diferentes máquinas virtuales java para diferentes arquitecturas y así un programa .class escrito en un Windows puede ser interpretado en un entorno Linux. Tan solo es necesario disponer de dicha máquina virtual para dichos entornos. De ahí el famoso axioma que sigue a Java, "escríbelo una vez, ejecútalo en cualquier parte", o "Write once, run anywhere". La máquina virtual de Java puede estar implementada en software, hardware, una herramienta de desarrollo o un Web browser; lee y ejecuta código precompilado bytecode que es independiente de la plataforma multiplataforma. La JVM provee definiciones para un conjunto de instrucciones, un conjunto de registros, un formato para archivos de clases, la pila, un heap con recolector de basura y un área de memoria. Cualquier implementación de la JVM que sea aprobada por SUN debe ser capaz de ejecutar cualquier clase que cumpla con la especificación. Existen varias versiones, en orden cronológico, de la máquina virtual de Java. En general la definición del Java bytecode no cambia significativamente entre versiones, y si lo hacen, los desarrolladores del lenguaje procuran que exista compatibilidad hacia atrás con los productos anteriores. En un sentido amplio, la Máquina Virtual de Java actúa como un puente entre el resultado de la compilación (el bytecode) y el sistema sobre el que se ejecuta la aplicación. Para cada dispositivo debe haber una JVM específica, ya sea un teléfono móvil, un PC con Windows XP, o un microondas. En cualquier caso, cada máquina virtual conoce el conjunto de instrucciones de la plataforma destino, y traduce un código escrito en lenguaje Java (común para todas) al código nativo que es capaz de entender el Hardware de la plataforma. Una arquitectura de maquina virtual permite un control granular fino sobre las acciones que el código puede hacer dentro de la máquina. Esto está diseñado para permitir ejecución segura de código no confiable desde fuentes remotas, un modelo usado muy famoso son las Java applets. Applets se ejecutan dentro de una VM incorporada en el navegador del usuario, ejecutando código descargado desde un servidor HTTP remoto. El código remoto se ejecuta en un entorno cerrado y altamente restringido, llamado también sandbox, el cual está diseñado para proteger al usuario de código erróneo o malicioso. Los Publicadores con recursos financieros suficientes pueden conseguir un certificado con el cual hacer applets con firma digital que las caractericen como seguras ("safe"), dándoles entonces permisos para salir de la sandbox y acceder al sistema de ficheros local y sistema de red, presumiblemente bajo el control del usuario.

Programación Web y Tecnologías Informáticas - March 11, 2008 03:14 PM
Java Server Pages: Directiva page

Esta directiva da instrucciones al motor que procesa las páginas JSP; estas instrucciones se aplican a todo el fichero fuente. Utilizando esta directiva se podría especificar un comentario informativo que formará parte del fichero JSP compilado, el lenguaje de script usado en el fichero fuente JSP, los paquetes de ficheros fuentes que serán importados, o la página de error que se llamará si ocurren errores o excepciones, entre otros aspectos. Podemos usar la directiva page en cualquier lugar del fichero JSP, pero es muy recomendable situarlo en la parte superior del fichero. Como es una etiqueta JSP, podemos situarla antes de la etiqueta de apertura <html>. Un ejemplo de uso de esta directiva es el siguiente:

<%@ page language='java' contentType="text/html" info='Mi primera página en JSP" import='java.util.*' errorPage='paginadeerror.jsp' %>
A continuación detallamos todos los parámetros que se pueden definir utilizando la directiva page, con un ejemplo en cada caso.

Atributo

Sintaxis

Utilización

import

<%@ page import="java.utils.*" %>

Importa clases y paquetes Java para ser utilizadas dentro del fichero JSP.

session

<%@ page session="false" %>

Especifica si utiliza los datos contenidos en sesión; por defecto "true".

contentType

<%@ page contentType="class; class" %>

Especifica el tipo MIME del objeto "response"; por defecto "text/html; charset=ISO-8859-1".

buffer

<%@ page buffer="12KB" %>

Buffer utilizado por el objeto writer "out"; puede tomar el valor de "none"; por defecto "8KB".

errorPage

<%@ page errorPage="/error_page.jsp" %>

Especifíca la ruta de la página de error que será invocada en caso de producirse una excepción durante la ejecución de este fichero JSP.

isThreadSafe

<%@ page isThreadSafe="false" %>

Un valor de true (por defecto) indica un procesamiento del servlet normal, donde múltiples peticiones pueden procesarse simultáneamente con un sólo ejemplar del servlet, bajo la suposición que del autor sincroniza las variables de ejemplar. Un valor de false indica que el servlet debería implementar SingleThreadModel, con peticiones enviadas serialmente o con peticiones simultáneas siendo entregadas por ejemplares separados del servelt.

autoflush

<%@ page autoflush="true" %>

Un valor de true (por defecto) indica que el buffer debería descargase cuando esté lleno. Un valor de false, raramente utilizado, indica que se debe lanzar una excepción cuando el buffer se sobrecargue. Un valor de false es ilegal cuando usamos buffer="none".

extends

<%@ page extends="package.class" %>

Esto indica la superclase del servlet que se va a generar. Debemos usarla con extrema precaución, ya que el servidor podría utilizar una superclase personalizada.

info

<%@ page info="Mi página JSP" %>

Define un string que puede usarse para ser recuperado mediante el método getServletInfo.

language

<%@ page language="java" %>

En algunos momentos, esto está pensado para especificar el lenguaje a utilizar. Por ahora, no debemos preocuparnos por él ya que java es tanto el valor por defecto como la única opción legal.

isErrorPage

<%@ page isErrorPage="true" %>

Determina si este fichero JSP es una página que maneja excepciones. Únicamente a este tipo de páginas pueden acceder a la variable implícita "exception", que contiene la excepción que provocó la llamada a la página de error.

Programación Web y Tecnologías Informáticas - March 11, 2008 03:13 PM
Java Server Pages: Directivas

Java Server PagesLas directivas en las Java Server Pages son órdenes que se ejecutan antes de que se comience a procesar el archivo JSP y modifican de alguna forma el resultado del mismo. Todas las directivas en JSP se indican con una arroba (@) después del comienzo de la orden JSP (<%). La sintaxis de una directiva es como se muestra en el ejemplo siguiente:

<%@ directiva atributo="valor" %>
Es importante destacar que los atributos de estas directivas son sensibles a las mayúsculas. En los post siguientes abordaremos las características más importantes de las directivas page, taglib e inlude.