martes, 29 de abril de 2008

JUnit y TestNG

Son dos framework que se utilizan para la programacion de pruebas unitarias.
  • JUnit-->hasta hace poco se utilizaba el JUnit. JUnit tiene DBUnit para pruebas de integración con base de datos,existe HttpUnit para probar que la página que verá el usuario contiene lo que debe contener, es decir formulario, mensaje ....JUnit en sus últimas versiones trabaja con anotaciones pero antes funcionaba por herencia.Se utiliza para pruebas mas simples.
  • TestNG -->pruebas unitarias en esteroide , tiene todo lo que tiene Junit 4 y más,está basado en Annotations.Maneja los mismos conceptos. Tiene Clases que corren las pruebas y arman reportes. Es mucho más sofisticado. Las pruebas pueden depender unas de otras. Es útil para otro tipo de pruebas más complejas.

Los dos proporcionan plugins para integrar con el IDE preferido es decir: eclipse, netBeans, intellijIdea ....

lunes, 28 de abril de 2008

Leer de fichero y guardar en un HashMap

Map provincias= new HashMap();
try {
FileReader fr = new FileReader("/temp/provincias.txt");
BufferedReader bf = new BufferedReader(fr);
String linea;
while ((linea = bf.readLine()) != null) {
String[] cadenas = linea.split("\t");
provincias.put(cadenas[0], cadenas[1]);
}
fr.close();
System.out.println("Provincias importadas correctamente");
} catch (FileNotFoundException e) {
System.out.println("Fichero no encontrado");
e.printStackTrace();
} catch (IOException e) {
System.out.println("Error de E/S");
e.printStackTrace();
}

}

He tenido un pequeño problema al leer de esta forma los fichero pues los carateres como la ñ o los acentos nolos leia y metia unos simbolos raros,como un combox con una iterrogracion.
Para arreglar este problema he cambiado la forma de leer los ficheros

FileInputStream fis = new FileInputStream("/temp/provincias.txt");
InputStreamReader is = new InputStreamReader(fis, "ISO-8859-1");
BufferedReader bf = new BufferedReader(is);

Asi le indico el tipo de encoding.

Estructura HashMap

Un mapa es una estructura de Java que nos permite almacenar pares clave/valor. De tal manera que para una clave solamente tenemos un valor.

Si añadimos un nuevo elemento clave/valor cuando la clave ya existe, se sobrescribe el valor almacenado anteriormente.

La estructura a listar que utilizamos como mapa es un HashMap. Lo primero que tenemos que hacer es crear el mapa y añadirle elementos:

Map mapa = new HashMap();

mapa.put("String","String");


Si intentamos añadir otro elemento con una clave ya existente, sobreescribe el valor. Ya que no puede haber elementos duplicados.

Para recorrerlo nos apoyaremos sobre un Iterator que será el puntero encargado en recorrer los elementos del mapa. Obtendremos un iterador sobre la estructura invocando los métodos .entrySet() e .iterator(). Usar iteradores permite separar la lógica de la clase de la lógica de la iteración. Los iteradores tienen un comportamiento similar a los enumerados.

Para mover el iterador utilizaremos el método .next() y si queremos comprobar que el iterador ha llegado al final de la estructura tenemos el método .hasNext()


Iterator it = mapa.entrySet().iterator();

while (it.hasNext()) {
Map.Entry e = (Map.Entry)it.next();
System.out.println(e.getKey() + " " + e.getValue());
}

Si queremos sacar un sólo dato,ponemos mapa.get(key que contiene ese valor);

NOTA:
El HashMap espera siempre un Object,lo digo porque me cree uno Map que esperaba 2 string le meti un int y no me daba error,porque espera un object,y ponga lo que ponga no da error,se lo traga,y me volvi loca,buscando que era lo que fallaba. Por qué no me imprimía el dato.Cosas tontas.

AJAX

AJAX es una técnica de desarrollo para crear aplicaciones Web basada en tres tecnologías ya existentes.
No es un lenguaje de programación, como creen algunas personas.
Antes de Ajax estaba el Scripting Remoto.

Las tecnologías que forman AJAX son:
  • Html-->las páginas web que son parte de la aplicacion web Ajax se crean con html y css,tambien se puede utilizar Xhtml.
  • DOM-->esto perimite acceder a los elementos de la web(tabla,formularios) ,mediante javascript permite tratar los elementos como objetos con sus métodos y propiedades.
  • Xml-->las transmisiones entre el cliente y el servidor se haran de forma asincrona mediante xml.Aunque tambien permite el intercambio con texto plano , pre-formateado...

jueves, 17 de abril de 2008

Cómo sabe Hibernate que algo ha cambiado

Las tablas de la base de datos tiene 2 campos un @Id y el otro @Version.
Cada vez que se cambia algo la version se incrementa en 1.
Asi se sabe cuando se ha cambiado los datos y que 2 usuarios no puedan cambiar los datos a la vez.

Más sobre Hibernate

Al arrancar la aplicacion se crea un objeto de SessionFactory(fábrica de sesiones) de ámbito application que a través del método configure() lee las configuraciones de persistencia,pueden estar en archivos xml,hibernate.properties,@anotaciones o podemos configurar hibernate para que al arrancar lea el archivo import.sql.
El tiempo de arranque dependerá del numero de clases persistentes que haya en la aplicación.

Una vez arrancado,se crea un objeto de session que es el que inyectamos en nuestros componentes persistentes a través de la etiqueta @In del EntityManager.

Para que los datos que la session ha creado,eliminado,modificado quede bien reflejado y guardado en la base de datos se tiene que hacer dentro de una transacion hay que abrirla mediante el método session.beginTransaction(); y se cerrará con la sentencia tx.commit();.
Mientras no se cierre la transacción, ésta se considera "caliente" y el programador podra realizar cambios en ella sin preocuparse de la Base de Datos, ya que hibernate las modificará y actualizará automáticamente.

Bean con estado y sin estado

Un Bean con estado da servicio todos los usuarios y a varios beans,
Un Bean sin estado si no tiene estado solo puede dar servicio a un solo usuario.

martes, 15 de abril de 2008

Esquema Servlet

lunes, 14 de abril de 2008

JDeveloper + JSF Configuración del faces-config.xml

JDeveloper tiene una interface gráfica para poder configurarlo más facilmente.


Con esta ventanita podemos crearnos los beans o las reglas de navegación entre páginas entre otras cosas.
En el caso de los beans tenemos la siguiente ventana:
Le ponemos el nombre que queramos ,elegimos la clase que va a corresponder ese beans y el ambito que va a tener que puede ser:
  1. Application
  2. Session
  3. Request
Voy a poner de la imagen del código que genera esta pantalla de un proyecto que tengo hecho anteriormente:
Cuando queramos inyectar un bean en otro(recordar siempre la dirección de inyecciones de beans que escribi entre post)
Y desde la interface gráfica se pincha en el bean que le queremos inyectar otro beans,le damos a Managed Properties /New,ponemos el nombre de la propieda y la clase,más abajo aparece Managed Property y le ponemos el nombre del bean a inyectar con #{nombre del bean}

Declaración de etiquetas jsp

Las etiquetas JSP son poderosas y encapsulan tareas que serían difíciles o llevarián mucho tiempo de programar.Los lenguajes de script que tenemos disponibles dependen del motor JSP que estemos usando. Con la implementación JSP de Sun, debemos usar el lenguaje Java como lenguaje de script, pero otros motores de JSP de terceras partes podrían incluir soporte para otros lenguajes.

Las etiquetas JSP tienen diferentes categorías:

  • Comentarios: <%-- mi comentario --%>

  • Declaraciones: se utiliza para declarar variables de tipos simples,objetos y métodos. .Ejemplo: <%! int contador = 0; %&gt. La sintaxis es puro Java y se continua con la vieja regla de "declarar antes de usar".

  • Expresiones: al procesar la página la salida es el valor de la expresión delimitada por <%= %>, por ejemplo podemos insertar la expresión dentro de una línea HTML típica

       & ltp&gtLa cuenta es: <%=contador%> &ltp&gtEl cuadrado de la cuenta es: <%=cuadrado( contador )%>  <%-- Llamada a método --%>
  • Scriptlets: un conjunto de instrucciones Java. Formato: <% scriptlet %>. Ejemplo:

            <%! int base = 5, altura = 7 ; %>         <% base * altura / 2.0;         new java.util.Date(); %>         &ltBR> Hola HTML         <% System.out.println( "de regreso a scriplets" );      base + altura; %> 

  • Directivas: su sintaxis general es <%@ directiva {atributo ="valor"} %> dónde la directiva debe tener al menos un atributo:

    • Directivas page: en función del atributo utilizado sirven para la configuración general: importar clases, definir tipo MIME, etc.

                      <%@ page import="paquete.clase" %>                 <%@ page contentType="tipo MIME" %>                 

      Para contentType los valores por defecto son contentType="text/html; charset=iso-8859-1".

      Algunos atributos:

      • import="package.*,clase.class" Sirve para importar paquetes y clases.

      • session="true|false" Por defecto es true. Indica si mantiene atributos de sesión para la página.

      • isThreadSafe="true|false" Por defecto es true. Si es true cada petición corre en un hilo y por tanto el procesador maneja las peticiones de forma asíncrona ("simultáneamente"). Con false se gestionan las peticiones en un hilo (una por una).

      • info="text" Información de la página a la que se puede acceder a través del método Servlet.getServletInfo()

      • errorPage="pagina_error". Página que manejará las excepciones.

      • isErrorPage="true|false". Indica si es una página que manejará errores.

      Ejemplos:

              <%@ page import=”com.myco.*” buffer=”26k” errorPage=”/oops.jsp”%>

      Para reenviar una excepción a una página tiene: <%@ page errorPage="07_errorPage.jsp"%> En la página de error (07_errorPage.jsp) tenemos una forma de capturar el error por medio del objeto implícito "exception":

      <%@ page isErrorPage="true" %>

      &lthtml>

      &lthead>&lttitle>Ejemplo de errorPage

      &ltbody>

      &lth1>Se ha producido un error

      &ltp>Error: <%= exception %>

                                       

      Esta página capta las excepciones. No capta los errores debidos a fallos de enlace (URL).

    • Directivas include: se inserta un fichero en el lugar de la directiva. Matiz: se inserta el fichero, no su valor o resultado. Utiles, entre otras cosas, para insertar código HTML o JSP que se repite. La URL debe ser relativa. Ejemplo:

      <%@ include file="cabecera.html" %>

    • Directivas Taglib: indica la referencia a la librería de etiquetas definidas por el programador (etiquetas personalizadas). El motor JSP utiliza esta librería para saber como interpretar las etiquetas personalizadas de la página JSP.Ejemplo:

      <%@ taglib uri="URI_de_librería" prefix="prefijo_de_etiquetas" %>

      URI es el descriptor único de la librería. No tiene valor por defecto. Si no se especifica aparece una excepción. El prefijo es el prefijo en la expresión prefijo:etiqueta, que sirve para definir la etiqueta personalizada. Cuando el motor de JSP se encuentra en la página con la expresión prefijo_de_etiquetas:etiqueta, entonces se dirige a la librería señalada en URI para interpretar la etiqueta. Las etiquetas personalizadas son importantes en el manejo de JSP.

  • Acciones: realizan una tarea en el momento en que se solicita la página. Sirven para acceder a beans, etc. La acción de inclusión, a diferencia de la directiva de inclusión, implica la sustitución por el valor o resultado del archivo en el momento de la petición. Ejemplo:

    &ltjsp:include page="también una URL relativa" flush="true"/>

    Otra acción es jsp:forward, que tiene el mismo comportamiento que javax.servlet.RequestDispatcher. Su sintaxis admite (o no) parámetros. La ejecución de la página invocante se detiene para resolver el forward. Sintaxis:

    &ltjsp:forward page="también una URL relativa">

    &ltjsp:param name="nombre_parametro" value="valor" />


domingo, 13 de abril de 2008

Bijection

Para entender el funcionamiento básico de JBoss Seam debes familiarizarte con dos conceptos: Contexto y Componente.

Un componente es un objeto con estado (normalmente stateful session beans). Una instancia de un componente vive en un contexto y se le asigna un nombre en dicho contexto.
Para asociar la instancia de un componente al nombre de dicho componente en un contexto Seam proporciona el mecanismo de Bijection

          Bijection = Injection + Outjection

El mecanismo de injection permite a un componente A obtener de un contexto una referencia a una
instancia de un componente B, haciendo que el contenedor de aplicaciones ”inyecte” el componente B en una variable del componente A.
El mecanismo de outjection permite que un componente B esté disponible en un contexto para poder ser inyectado en un componente A.
Es decir, mediante outjection se toma una instancia de un componente y se deposita en un contexto
y mediante injection se toma una instancia de un componente de un contexto y se asocia a una
variable de otro componente.

A diferencia del mecanismo de Injection, el mecanismo de Bijection es:

  • contextual: Es usada para asociar componentes con estado desde diferentes contextos.
  • bidireccional: Los componentes pueden ser depositados en el contexto o tomados de él.
  • dinámico: Como los valores de las variables de los contextos cambian con el tiempo y los
    componentes tienen un estado definido, la bijection sucede cada vez que el componente es
    invocado.

Las conversaciones con SEAM

Definición:

Se puede entender por una conversación en Seam algo muy parecido de lo que hacemos cuando conversamos entre personas.
Existe un lugar (AplicationContext), un tiempo (SessionContext) y después una serie de objetos implicados en la conversación. Entre los objetos implicados en la conversación se encuentra el usuario, que participa a través de eventos, de tipo:

  • JSF
  • jBMP
  • Seam page actions
  • Seam component-drive events


Las clases implicadas son:
org.jboss.seam.core.ConversationEntry
org.jboss.seam.core.ConversationList
org.jboss.seam.core.Manager

Estos datos los he cogido del blog http://enjava.blogspot.com,que es de mi profesor Juan Antonio,un maestro en esto del j2ee.(que pelota no?)
Gracias por compartir tus conocimientos!!!!!

jueves, 3 de abril de 2008

Annotations (Seguimo utilizando JBoss + Seam-gen)

En las etiquetas de persistencias hay: (estas solamente las lees el EntityManager)

  1. @Entity en la definición clase .(se utiliza para las transaciones)
  2. @Id en la definición de campo que hará de identificador.(se utiliza para las transaciones)
  3. @Column para decir que el campo /propieda es persistente aunque sino lo ponemos por el mero hecho de estar en una entidad persisten se considera.
  4. @Trasient,si queremos que un componente de la clase no sea persistente se le pone la etiqueta .
  5. @ManyToMany(mappedBy="nombre clases relacionar"),son para implementar las relacion mucho a muchos
  6. OneToMany(mappedBy="nombre clases relacionar"),. son para las relaciones uno a mucho.
  7. @OrderBy("nombre del campo a ordenar").
  8. @Scope(CONVERSATION) esto es para decir que el ámbito es de tipo conversacional .esto es una solicitud en los términos de J2EE.Si se coloca un objeto en el período de sesiones los usuarios que estará disponible en todas las páginas afectadas, el usuario formula.


JBOSS + Seam-gen Empezando nuevos proyectos

Si estamos utilizando el framework jboss-seam dentro de esto tenemos una utilizad para generar proyectos.

Dentro de la carpeta jboss-seam/seam-gen/tenemos un archivo llamado build.xml ,lo cogemos y lo arrastramos a la ventana Ant(pluging de eclipse para lanzar tareas).
Lanzamos la tarea seam-gen>reset para resetear la información del archivo seam-gen/build.properties que se utilizará en la generación de la aplicación nueva.


Lanzamos la tarea seam-gen>setup para configurar la información del archivo seam-gen/build.properties:

Nos irá saliendo una ventanitas que tendremos que meter la siguiente información:

  • Directorio de workspace: nuestro directorio desde c: al workspace.
  • Directorio de jboss: nuestro directorio desde c: al servidor jboss.
  • Nombre del proyecto.
  • Richfaces skin:blueSky (este sale por defecto).
  • Ear o war project: ear .
  • El package de nuestra aplicación.
  • El package de nuestros EJBs.
  • El package de nuestros tests.
  • Tipo de Base de datos.
  • Hibernate dialect: org.hibernate.dialect.MySQLDialect .
  • Path a la libreria de mysql: nuestro directorio desde c: al jar de mysql: mysql-connector-java-5.0.3-bin.jar
  • Jdbc driver: com.mysql.jdbc.Driver .
  • Jdbc url: jdbc:mysql://localhost/delicious?createDatabaseIfNotExist=true
    user database,clave database,database name.
  • Are you working with tables that already exist ...:n .
  • Do you want to drop and recreate the database ...: y .
  • Enter your icefaces directory: dejar este campo vacio.

Ya tenemos creado las propiedades de nuesta proyecto nuevo

Lanzamos la tarea seam-gen>new-project para generar el proyecto nuevo en el workspace indicado anteriormente y lo abrimos con eclipse.File>new project>java project>create project from existing source>seleccionamos nuestro proyecto en el workspace y le ponemos de nombre al proyecto.


Localizamos el archivo de ant:build.xml de nuestro nuevo proyecto y lo arrastramos a la ventanita de Ant, y a continuación lanzamos la tarea deploy.
Arrancamos nuestro jboss a través de la ventanita servers de nuestro eclipse. Seleccionamos y click en start y cuando acabe de arrancar la aplicación podemos verla en el navegador en la dirección: http://localhost:8080/nombre proyecto dandole al deploy del Ant de nuestro proyecto o al explode(esto esta explicado la diferencia en otro apartado)

Para crearnos las clases(entidades) utilizamos new-entity del archivo build.xml de seam-gen y se nos aparecera 3 ventanitas :

  • enter the entity class name: nombre de la entidad a crear.
  • enter the master page name: la pagina que va a hacer el listado de objetos de esa entidad
  • enter the detail page name: detalle de esos objetos.

Enlas clase que se crean se ven los import de las etiquetas del api de persistencia. Así como un validador de HIbernate: org.hibernate.validator.Length .

Links interesantes de Seam-gem

seam-gen: seam generator
¿qué es seam? http://seamcity.madeinxpain.com/archives/31
biyection: http://seamcity.madeinxpain.com/archives/28
conversaciones: http://seamcity.madeinxpain.com/archives/29
configuración de seam: http://seamcity.madeinxpain.com/archives/30
programación orientada a aspectos: http://ejemplos-seam.blogspot.com/2007/07/crear-estadisticas-en-seam-con.html

martes, 1 de abril de 2008

JSF -->incluir una página en otra

Para incluir una página dentro de otra se utiliza el código siguiente:


Tenemos quu incluir en las páginas principal y la que vamos a incluir las declaraciones de librerias de etiquetas como aparece en esta foto:



JDeveloper + JSF

Vamos a ver como se crea aplicaciones web con jdeveloper y jsf.
Al abrir el programa jdeveloper, en la parte izquiera tenemos una ventanita donde aparece la palabra Applications.

Pinchamos con el botón derecho y elegimos la opción New Application y se nos abrirá una ventana para poner el nombre,el package,la ruta del directorio de la aplicación y una pestaña llamada Application Template donde elegiremos el tipo de plantilla a utilizar en la aplicación,en este caso elegiremos la opción JSF|EJB.

Al darle aceptar se nos creará la aplicación con JSF con la siguiente estructura:
El archivo faces-config.xml es el archivo de configuración y en la carpeta lib contiene 2 archivos jar que serán los que contengan las clases usadas por los JSF.

Para crear una página JSf pinchamos con el botón dereco sobre ViewController en la opción New elegimos JSF/JSF JSP y al darle aceptar se nos abrirá un asistente paras la configuración de la página.
En una de las ventanas nos pide el nombre de la página y abajo tenemos dos opciones una para crear un jsp simple y otro para crear un jspx(utiliza xml para la representación de los jsp),elegimos este último.
La siguiente pantalla podemos crearnos los beans automaticamente o no, al pulsar siguiente nos abre otra pantalla para elegir librerias que queremos o necesitemos usar para este proyecto.
Y la siguente pantalla es para configurar los stylos de la página.
Ya tenemos nuestra primera página creada!!!!!!!!!

JBoss Seams = JSF + EJB3

Aquí tengo varios manuales muy interesantes: