Č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:
September 19, 2017 10:00 AM
All times are UTC

Sponsored by
sponsored by Oracle

visit NetBeans website
AVBravo - August 11, 2017 01:21 AM
Contador mediante Reflexión

Algunas ocasiones tenemos que contar una cantidad valores en los atributos, generalmente tendríamos que hacerlo propiedad por propiedad.
Contamos con un Entity


 necesitaríamos implementar un código donde veríamos múltiples condiciones y tenemos que usar cada atributo mediante el método get, en este ejemplo serian 31 campos. Imaginemos el escenario que sea una cantidad mayor, tendríamos un segmento de código mas o menos como el que mostramos aquí.

 for (Agente a : agenteList) {
                t1 = 0;
                t2 = 0;
                t3 = 0;
                t4 = 0;
for (Reservadoagente r : reservadoagenteList) {
if(r.getTurno1() == 1 || r.getTurno2() == 1 || r.getTurno3() == 1 || r.getTurno4() ==1 ,,, r.getTurno31()==1 ){
t1++;
}
else{
    if(r.getTurno1() == 2 || r.getTurno2() == 2 || r.getTurno3() == 2 || r.getTurno4() ==2 ,,,      
        r.getTurno31()==2 ){
        t2++;

   }
else{
    if(r.getTurno1() == 3 || r.getTurno2() == 3 || r.getTurno3() == 3 || r.getTurno4() ==3 ,,,      
        r.getTurno31()==3){
        t3++;

   }else{
 if(r.getTurno1() == 4 || r.getTurno2() == 4 || r.getTurno3() == 4 || r.getTurno4() ==4 ,,,      
        r.getTurno31()==4){
        t2++;

   }
 }

}
...


Para evitar todo esto podemos usar el API reflexión.
Simplemente invocamos los métodos get de los atributos Turnodia, y comparamos el resultado para determinar si es un 1, 2, 3, 4. Y con esto tendremos un contador de cada valor,.
        Class noparams[] = {};
                for (Reservadoagente r : reservadoagenteList) {

                        Class cls = r.getClass();
                        Object obj = r;
                        for (Method method : Reservadoagente.class.getDeclaredMethods()) {
                            if (method.getName().contains("getTurnodia")) {
                                String name = method.getName();
                                Method methodrun = cls.getDeclaredMethod(name, noparams);
                                Object result = methodrun.invoke(obj, null);
                                switch (Integer.parseInt(result.toString().trim())) {
                                    case 0:
                                        break;
                                    case 1:
                                        t1++;
                                        break;
                                    case 2:
                                        t2++;
                                        break;
                                    case 3:
                                        t3++;
                                        break;
                                    case 4:
                                        t4++;
                                        break;
                                    default:

                                }
                            }
                        }
                    }
                }


Tendríamos una representación gráfica de la siguiente manera.


AVBravo - June 27, 2017 09:05 PM
Api para seguridad mediante HttpSession

Este api simplifica el manejo de HttpSession en aplicaciones Java EE, para ayudar al desarrollador a implementar el control de las sesiones de los usuarios.
Validar login

Controlar si existe ese usuario logeado en otra sesión.



Anular las sesiones enviar token al email del usuario



Administrar las sesiones


 Manual (Online/pdf)
https://www.gitbook.com/book/avbravo/avbravosecurity/details

<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
Agregar la dependencias

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



 <dependency>
<groupId>com.github.avbravo</groupId>
<artifactId>avbravoutils</artifactId>
<version>0.11</version>
</dependency>

Para su uso simplemente implementamos SecurityInterface en el controller.
@Named
@SessionScoped
public class LoginController implements Serializable, SecurityInterface {


La clase BrowserSession gestiona le información de la sesión del usuario su id, tiempo de inicio, ip, browser, asigna un token automático, almacena el objeto HttpSession que permite terminar una sesión mediante métodos de la interface, y controla la cantidad de segundos para la inactividad.


  • Para verificar si hay un usuario logueado en la sesión actual

         usernameRecover = usernameRecoveryOfSession();


  • Para guardar el nombre del usuario que se logea y especificar en segundos el tiempo de inactividad  
      saveUserInSession(username, 300);


  • Para salir de la sesión
    logout("/seguridad/faces/index.xhtml?faces-redirect=true");


  • Destruir la sesión por el username
     destroyByUsername(username);

  • Obtener el token por el username
        tokenOfUsername(username)

  • Para destruir la sesión por el username y token
        destroyByToken(username, mytoken);




  • Invalidar my sesion
      invalidateMySession()



  • Obtener todas las sesiones
         List<BrowserSession> browserSessionsList  = allBrowserSessionList();


  • Eliminar todas las sesiones
        cancelAllSesion()


  • Inactivar por un browserSession
         inactiveSession(browserSesssion)


  • Obtener la fecha de expiración de un HttpSession
        getDateTiemExpiration(session)

  • Segundos para inactividad
        JsfUtil.milisegundosToTiempoString(milisegundosForInactivate(session))

  • Tiempo de creación(Date)
new Date(session.getCreationTime())


  • Tiempo de conexión (String formateado)
JsfUtil.milisegundosToTiempoString(miliSecondsOfConnection(session));

  • Ultima conexion
              new Date(session.getLastAccessedTime())

AVBravo - May 06, 2017 03:08 AM
JMoordb MongoDBRepository

Andrea Covino parte del equipo de JMoordb, trabajando en la implementación de MongoRepository, (desarrollo interno, estos cambios no estan en el repositorio oficial),   esto permite que solo definamos un entity y mediante el uso de MongoRepository desde un controller tengamos las funcionalidades que ofrece el Facade(experimental).

Observe que se dispone de una nueva anotación @DocumentInfo que permite indicar el nombre de la colección.

El modelo anterior {Entity+Facade+Controller}
Nuevo modelo {Entity +Controller{MongoRepository}}



@Getter
@Setter
@DocumentInfo(name = "planeta")
public class Planeta {
    @Id
    private String idPlaneta;
 
    private String planeta;
 
    private Date fecha;
 
    public Planeta(){ }
 
    public Planeta(String idPlaneta, String planeta, Date fecha){
        this.idPlaneta = idPlaneta;
        this.planeta = planeta;
        this.fecha = fecha;
    }

    @Override
    public String toString(){
        return "Palnetas{ idplaneta=" + idPlaneta + ", planeta=" + planeta + ", fecha=" + fecha +"}";
    }
         

}
Facade: No es necesario implementar un Facade.


Podemos observar un simple test.



     
       Planeta expectedPlaneta = new Planeta(randomId, randomId+"Plutón", new Date());
     

        MongoRepository<Planeta> planetaRepo = new MongoRepository<>(Planeta.class);
         
        planetaRepo.save(expectedPlaneta):


Nota: Es código en fases de desarrollo interno, aun no esta implementado de manera oficial,
         
       

AVBravo - May 03, 2017 01:05 AM
Jmoordb en Certificatic- Semana JEspañol

Hace aproximadamente 2 años se creo la comunidad JEspañol, http://www.jespanol.org/, con la iniciativa de Alexis Lopez(Colombia) , Cesar Hernandez(Guatemala), Jose Diaz(Perú), Diego Silva(Perú), Jorge Vargas(México) , Aristides Villarreal Bravo(Panamá), Victor Orozco(Guatemala).
La finalidad era reunir los lideres de grupos de usuarios Java de Latinomerica, con el objetivo de promover el lenguaje de programación Java.
Nuestro lema:
Un lenguaje, un idioma, Java en español.

Somos una comunidad que busca aumentar la difusión y adopción de la tecnología Java en idioma español. Para lograrlo, fomentamos la colaboración e interacción entre los grupos de usuarios Java de habla hispana, generando documentación, laboratorios y eventos en los países participantes.




Nuestros amigos de CertificaTic, (https://www.certificatic.org/) organizaron la semana de JEspañol con el lema 1 era Reunión Virtual JEspañol.




Agenda de temas










En esta oportunidad  presente:
JMoordb un API Java para NoSQL


Video en Facebook
https://www.facebook.com/CertificaTIC/videos/1744733459100643/



Libro gratis sobre JMoordb

Modelo




AVBravo - April 01, 2017 01:05 AM
The Definitive Guide to DateTime Manipulation

The Definitive Guide to DateTime Manipulation

Interesante publicación de nuestros amigos de Toptal, donde muestran una guía para manipular fechas con JavaScript.
El uso de fechas es muy común en todas las aplicaciones que desarrollemos, aqui se muestra una guía muy interesante.


var today = new Date().toLocaleDateString('en-GB', {  
day : 'numeric',
month : 'short',
year : 'numeric'
})


AVBravo - March 29, 2017 12:16 AM
Java Server Faces 2.3

Java Server Faces 2.3

Ya esta disponible JSF 2.3

Algunos enlaces

Repositorios Maven

What's new in JSF 2.3?

http://arjan-tijms.omnifaces.org/p/jsf-23.html





AVBravo - March 26, 2017 08:21 PM
AutoComplete findRegex() Expresiones Regulares ejbjmoordb

AutoComplete findRegex() Expresiones Regulares 
Desarrollaremos un ejemplo sencillo de una autocomplete utilzando expresiones regulares para busquedas en una coleccion en MongoDB, utilizando ejbmoordb.
Libro sobre jmoordb
https://www.gitbook.com/book/avbravo/jmoordb/details


Crear el Services

exit: Ctrl + ↩

@Stateless


public class AulasServices {


@Inject


AulasFacade aulasFacade;


public static LocalTime getHour(){


return LocalTime.now();


}


public List<Aulas> complete(String query) {


List<Aulas> suggestions = new ArrayList<>();


try {


query = query.trim();


if (query.length() < 1) {


return suggestions;


}


suggestions = aulasFacade.findRegex("idaula", query,true,new Document("idaula",1));




} catch (Exception e) {


JsfUtil.addErrorMessage("complete() " + e.getLocalizedMessage());


}


return suggestions;


}


}











En el Controller





exit: Ctrl + ↩


@Inject


AulasServices aulasServices;


Aulas aulasSelected;




public AulasServices getAulasServices() {


return aulasServices;


}


public void setAulasServices(AulasServices aulasServices) {


this.aulasServices = aulasServices;


}


public Aulas getAulasSelected() {


return aulasSelected;


}


public void setAulasSelected(Aulas aulasSelected) {


this.aulasSelected = aulasSelected;


}


@Override


public void handleSelect(SelectEvent event) {


try {


aulasList.removeAll(aulasList);


aulasList.add(aulasSelected);


aulasFiltered = aulasList;


aulasDataModel = new AulasDataModel(aulasList);


} catch (Exception ex) {


JsfUtil.addErrorMessage("handleSelect() " + ex.getLocalizedMessage());


}


}





En la página xhtml



<div class="form-group row">


<p:outputLabel class="col-xs-2 col-form-label" value="#{msg['info.by']} #{msg.idaula}"/>


<div class="col-xs-4">


<p:autoComplete scrollHeight="250" dropdown="false" size="45" emptyMessage="#{msg['info.nohayregistros']}"


title="#{msg['info.by']} #{msg.idaula}"


label="#{msg['info.by']} #{msg.idaula}"


alt="#{msg['info.searchby']} #{msg.idaula}"


value="#{aulasController.aulasSelected}"


completeMethod="#{aulasController.aulasServices.complete}"


var="p" itemLabel="#{p.idaula}" itemValue="#{p}" forceSelection="true">


<f:converter binding="#{aulasConverter}"/>


<p:ajax event="itemSelect" listener="#{aulasController.handleSelect}" update=" :form:msgs,:form:dataTable" />


<f:facet name="itemtip">


<h:panelGrid columns="1" cellpadding="5">


<h:outputText value="#{p.idaula}" />


<h:outputText value="#{p.maximo}" />


</h:panelGrid>


</f:facet>


</p:autoComplete>


</div>





Resultado









AVBravo - March 25, 2017 08:03 PM
jmoordb version 0.2/ findText()

Ya esta disponible la versión 0.2 de jmoordb y ejbmoordb. Se incluye el soporte para busquedas por texto y expresiones regulares que se utilizan en MongoDB.


Búsquedas por Texto findText

Base de datos
MongoDB
Sintaxis:
public List<T> findText(String key, String value,Boolean caseSensitive,Boolean diacriticSensitive, Document... docSort)
AtributoDescripción
caseSensitivetrue :Habilita la búsqueda sensitiva (mayúscula y minúscula) false: Deshabilita la búsqueda sensitiva
diacriticSensitiveHabilita o deshabilita la búsqueda diacritico.

El índice de texto de la versión 3 es diacrítico insensible. Es decir, el índice no distingue entre caracteres que contienen marcas diacríticas y su contraparte no marcada, como é, ê y e.


Las búsquedas por texto en MongoDB se basan en la descripción: Búsquedas por Texto MongoDB
En nuestro caso son útiles por ejemplo en una aplicación Java EE para usar autocomplete o búsquedas por un texto.
https://docs.mongodb.com/manual/reference/operator/query/text/
Se define un indice de texto
db.planetas.createIndex( { idplaneta: "text" } )
Se pueden ejecutar consultas
db.planetas.find( { $text: { $search: "tier" } } )

Usando JMoordb

Crear el indice


if(paisesFacade.createIndex(new Document("idpais","text"))){


System.out.println("creo el indice");


}else{


System.out.println("no creo el indice");


}

Ejemplo Realizar la consulta

Buscar los documentos que el atributo idplaneta tenga una letra a

String query ="a";


List<Planetas> suggestions = planetasFacade.findText("idplaneta", query,true,true, new Document("idplaneta",1));










AVBravo - March 25, 2017 08:02 PM
jmoordb version 0.2

Para utilizar jmoordb/ejbmoordb
Maven:

<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependency>
     <groupId>com.github.avbravo</groupId>
<artifactId>jmoordb</artifactId>
<version>0.2</version>
</dependency>
<dependency>
     <groupId>com.github.avbravo</groupId>
<artifactId>ejbjmoordb</artifactId>
<version>0.2</version>
</dependency>

AVBravo - March 25, 2017 08:01 PM
jmoordb 0.2 /findRegex()

La versión 0.2 de jmoordb/ejbmoordb soporta las busquedas mediante expresiones regulares, lo que permite que se ejecuten consultas en MongoDB similiar a una consulta Like en una base de datos relacional
B

úsquedas Expresiones Regulares (Regex)
Se utilizan para consultas mediante patrones. Funcionan de manera similar a las sentencias like en el modelo relacional en donde generalmente usamos el comodín "%s" para ampliar las operaciones de búsquedas.
Es una implementación de regex en mongodb
https://docs.mongodb.com/manual/reference/operator/query/regex
Método:
MétodoBases de datos NoSQL
public List< T > findRegex(String key, String value, Document... docSort)MongoDB
Nota: Para bases de datos couchbase puede ser el método find() en el statement puede colocar el filtro.

Ejemplo MongoDB:

Buscar un país que inicie con pan.
List< Paises > list = paisesFacade.findRegex("Pais", "pan");
Buscar un país que inicie con pan y devuelva la lista de entitys ordenados
List< Paises > list = paisesFacade.findRegex("pais","pan",true,new Document("pais",1));

Ejemplo desde consola

Creamos una colección llamada aulas

Mostrar todos

db.aulas.find()
Resultado

{ "_id" : ObjectId("58d099b6bea22215f5f24db7"), "idaula" : "PE-1", "maximo" : 40, "matriculados" : 4, "anio" : 2017 }


{ "_id" : ObjectId("58d099c1bea22215f5f24db8"), "idaula" : "PE-2", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d099cbbea22215f5f24db9"), "idaula" : "PE-3", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d099debea22215f5f24dba"), "idaula" : "PE-4", "maximo" : 40, "matriculados" : 3, "anio" : 2017 }


{ "_id" : ObjectId("58d099e7bea22215f5f24dbb"), "idaula" : "PE-5", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d099f1bea22215f5f24dbc"), "idaula" : "PE-6", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d099febea22215f5f24dbd"), "idaula" : "PD-2", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d09a22bea22209d62eeec9"), "idaula" : "PD-3", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d09a33bea22209d62eeeca"), "idaula" : "PD-4", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d09a39bea22209d62eeecb"), "idaula" : "PD-5", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d09a40bea22209d62eeecc"), "idaula" : "PD-6", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d09a47bea22209d62eeecd"), "idaula" : "PD-7", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d09aadbea22209d62eeece"), "idaula" : "CE-1", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d09ab9bea22209d62eeecf"), "idaula" : "CE-13", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d09ac1bea22209d62eeed0"), "idaula" : "CE-14", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d09ac8bea22209d62eeed1"), "idaula" : "CE-15", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d09ad0bea22209d62eeed2"), "idaula" : "CE-16", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }

Buscar los que inician con CE

db.aulas.find( {idaula: { $regex: "CE" }}  )
Resultado

{ "_id" : ObjectId("58d09aadbea22209d62eeece"), "idaula" : "CE-1", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d09ab9bea22209d62eeecf"), "idaula" : "CE-13", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d09ac1bea22209d62eeed0"), "idaula" : "CE-14", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d09ac8bea22209d62eeed1"), "idaula" : "CE-15", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d09ad0bea22209d62eeed2"), "idaula" : "CE-16", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }

Buscar CE-13
db.aulas.find( {idaula: { $regex: "CE-13" }}  )
Resultado
{ "_id" : ObjectId("58d09ab9bea22209d62eeecf"), "idaula" : "CE-13", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


Usando / / buscar todos que inicien con CE-

db.aulas.find( {idaula: { $regex: /CE-/ }}  )

Resultado


{ "_id" : ObjectId("58d09aadbea22209d62eeece"), "idaula" : "CE-1", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d09ab9bea22209d62eeecf"), "idaula" : "CE-13", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d09ac1bea22209d62eeed0"), "idaula" : "CE-14", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d09ac8bea22209d62eeed1"), "idaula" : "CE-15", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }


{ "_id" : ObjectId("58d09ad0bea22209d62eeed2"), "idaula" : "CE-16", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }



Buscar cE-1 exactamente

db.aulas.find( {idaula: { $regex: /cE-1$/ }}  )

Resultado

Vacio no devuelve nada porque no existe cE-1 existe CE-1

Buscar cE-1 ignorando mayúsculas y minúsculas

 db.aulas.find( {idaula: { $regex: /cE-1$/i }}  )
Resultado
{ "_id" : ObjectId("58d09aadbea22209d62eeece"), "idaula" : "CE-1", "maximo" : 40, "matriculados" : 0, "anio" : 2017 }

Ejemplo de uso
Busca las aulas que tengan los caracteres ce, el parámetro true indica que se pueda buscar sin importar mayúscula o minúsculas.
List<Aulas> list = aulasFacade.findRegex("idaula", "ce",true,new Document("idaula",1));

AVBravo - February 28, 2017 02:40 PM
Entendiendo Promise en JavaScript

JavaScript Promises: A Tutorial with Examples
Balint Erdi de Toptal, muestra un interesante articulo donde explica Promises en Java, script mediante ejemplos muy claros.
https://www.toptal.com/javascript/javascript-promises

promise.then(function(value) {
// Do something with the 'value'
});


Es un buen articulo para entender su implementación.

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>




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.