lunes, 9 de febrero de 2009

Atajos de teclado en Eclipse II

  • May+Alt+L: crea una variable que almacena el valor de retorno de un método
  • Ctrl+May+T: abre un cuadro de diálogo para abrir un tipo (clase, interfaz,...)
  • Ctrl+May+R: abre un cuadro de diálogo que nos permite abrir un fichero
  • Ctrl+May+flecha arriba o abajo: nos permite copiar la línea en la que está el cursor
  • Ctrl+D: elimina la línea en la que está el cursor
  • Alt+flecha arriba o abajo: mueve la línea en la que está el cursor
  • Ctrl+7: añade la dobre barra de comentario en la línea en la que está el cursor

Uso de la herramienta de Log de Apache

Apache nos ofrece dos librerías para hacer log de nuestras aplicaciones en consola con funcionalidades más amplias al típico System.out.println().

Introducción a las pruebas con TestNG

Como realizar pruebas con este framework

Introducción al modelo de aplicaciones web en capas

Este modelo divide nuestra aplición en distintas capas que se encargan de distintos aspectos. La siguiente figura muestra este modelo:

Organización de las clases en paquetes

Las clases que conforman nuestra aplicación deberían estar organizadas en paquetes según funcionalidades comunes. En la siguiente figura se muestra un esquema de ello:

Introducción a JSP (Java Server Pages)

Las JavaServer Pages (JSP) nos permiten separar la parte dinámica de nuestras páginas Web del HTML estático. Básicamente, conseguimos incrustar código java dentro de un documento HTML cuya extensión ha de ser *.jsp.
Hay tres tipos de construcciones JSP que embeberemos en una página: elementos de script, directivas y acciones. Los elementos de script nos permiten especificar código Java que se convertirá en parte del servlet resultante, las directivas nos permiten controlar la estructura general del servlet, y las acciones nos permiten especificar componentes que deberían ser usuados, y de otro modo controlar el comportamiento del motor JSP. En el siguiente enlace podemos ver una tabla detallada de estas construcciones.
En el modelo MVC, JSP conformaría la vista de nuestra aplicación. En el siguiente tutorial se muestra más detalladamente la especificación JSP:
- Tutorial Servlets y JSP

Patrón de diseño Controlador Frontal

¿QUÉ ES UN PATRÓN DE DISEÑO?

Los patrones del diseño tratan los problemas del diseño que se repiten y que se presentan en situaciones particulares del diseño, con el fin de proponer soluciones a ellas. Por lo tanto, los patrones de diseño son soluciones exitosas a problemas comunes.

¿QUÉ ES EL PATRÓN CONTROLADOR FRONTAL (FRONT CONTROLLER)?

Es un patrón de diseño que se basa en usar un controlador como punto inicial para la gestión de las peticiones. El controlador gestiona estas peticiones, y realiza algunas funciones como: comprobación de restricciones de seguridad, manejo de errores, mapear y delegación de las peticiones a otros componentes de la aplicación que se encargarán de generar la vista adecuada para el usuario. La siguiente figura muestra un esquema de ello:



Ventajas:
  • Tenemos centralizado en un único punto la gestión de las peticiones
  • Aumentamos la reusabilidad de código
  • Mejoramos la gestión de la seguridad
Desventajas:
  • La velocidad de respuesta disminuye al tener que ser procesadas las peticiones primero por el controlador.
En el siguiente enlace se puede ver una explicación más detallada de este patrón.

jueves, 5 de febrero de 2009

Principios POO

En este artículo resumo cinco principios básicos de la programación orientada a objetos:

  • Responsabilidad única
No debe existir más de una razón para cambiar una clase.
  • Abierto / Cerrado
Los artefactos software deben ser abiertos para su extensión, pero cerrados ante una modificación.
  • Sustitución
Toda clase debe poder ser reemplazada por cualquiera de sus subclases

  • Inversión de dependencia
Los módulos de nivel superior no deben depender de módulos de bajo nivel. Ambos deben depender de abstracciones.
  • Segregación de Interface
Los clientes no deben ser forzados a depender de interfaces que no utilizan.

En los siguientes enlaces se encuentran explicaciones más detalladas a cerca de estos principios
-Principios POO 1
-Principios POO 2

miércoles, 4 de febrero de 2009

Instalación de testNG en Eclipse

¿QUÉ ES TESTNG?

TestNG es un framework para pruebas y testing que nos permite desarrollar nuestro proyectos usando TDD (Test Driven Development -desarrollo guiado por pruebas). Esta técnica de desarrollo se podría resumir en los siguientes pasos:
  • Se crea una prueba unitaria
  • Se verifica que falle
  • Se implementa el código que hace que la prueba no falle
  • Se verifica que no falle
  • Se refactoriza el código
TRABAJAR CON TESTNG EN ECLIPSE

Para descargar el proyecto:
Para instalar el plugin en Eclipse:
  • Abrimos Help->Software Updates
  • Pulsamos sobre Add Site...
  • En el diálogo escribimos la dirección http://beust.com/eclipse
  • Seleccionamos el nuevo sitio y pulsamos sobre Install
  • Seguimos el asistente de instalación
  • Reiniciamos Eclipse
Para crear un proyecto con testNG:
  • Descomprimimos el *.zip del proyecto en nuestra carpeta de trabajo de Eclipse
  • Creamos un nuevo proyecto, por ejemplo, un proyecto java
  • Le damos el nombre, por ejemplo, testeo y pulsamos siguiente
  • Creamos dos nuevas carpetas de fuentes pulsando sobre Create new source folder: a una la llamamos java/src y a la otra java/test. Lo importante es que ambas carpetas tengan la misma raíz, es decir, java (o el nombre que elijamos).
  • En la pestaña Libraries del mismo cuadro de diálogo pulsamos sobre Add External JARs...
  • En el cuadro de selección de ficheros nos dirigimos a la carpeta del proyecto testng que está en la carpeta workspace de Eclipse y seleccionamos el fichero testng-5.8-jdk15.jar
  • Pulsamos sobre finalizar
  • En nuetro nuevo proyecto, dentro de la carpeta java/src creamos un nuevo paquete, por ejemplo, es.cea y dentro de la carpeta java/test creamos exactamente el mismo (es.cea). Es muy importante que ambas carpetas el nombre del paquete sea el mismo
Para abrir la perspectiva TestNG:
  • Pulsamos sobre Window->Show View->Other...
  • En el campo de texto del diálogo que nos aparece, escribimos testng y nos debe aparecer la vista
  • La seleccionamos y listo
Para lanzar un test:
  • Seleccionamos la clase que queremos comprobar
  • Abrimos el menú contextual y seleccionamos Run As->TestNG Test

martes, 3 de febrero de 2009

Evitar recorrer listas con bucles implementando el método equals()

Cuando tenemos una lista de objetos y necesitamos comprobar que un elemento existe en ella podemos resolverlo creando un bucle(for,while,..) junto con una sentencia if que compruebe en cada iteración si el objeto existe. Una opción a esto consiste en lo siguiente:
  • Sobreescribir el método equals() de la clase de dicho objeto y establecer qué atributos se tienen en cuenta a la hora de comparar.
  • Instanciar un objeto de dicha clase con los mismos valores que el que buscamos
  • Usar el método contains(Object o) de la lista con el objeto que hemos creado para comprobar si existe uno igual
En este enlace se muestra el código de dos clases: Agenda y Persona. La clase Agenda posee un atributo de tipo List que guarda la lista de personas y posee dos métodos para comprobar si existe un elemento en la lista. El primero, existeModo1(), utiliza un bucle for para hallar el elemento y el segundo, existeModo2(), utiliza el método contains().

Métodos forward(), include(),init() y sendRedirect()

INTRODUCCIÓN

Un servlet/JSP puede invocar de modo directo a un recurso de la web. La idea es poder reenviar la petición (request) a dicho recurso. Para hacer esto necesitamos un RequestDispatcher, que es un referencia que encapsula el recurso. En el siguiente ejemplo (véase la clase PruebaDispatcher) el servlet tiene como "dispatcher" otro servlet (sc es un ServletContext que se obtiene en init()):

RequestDispatcher dispatcher = sc.getRequestDispatcher("/requestimagen");


Observar que el argumento corresponde con el url-pattern de web.xml. La creación del dispatcher se podría escribir de otra forma:

ResquestDispatcher dispatcher = request.getRequestDispatcher("/requestimagen");

Pero se puede observar que este método en ocasiones falla y la documentación de Sun recomienda la primera forma: sc.getRequestDispatcher(arg). El argumento es la ruta del recurso, que debe comenzar con "/" y es interpretado como relativo al contexto actual. Conviene usar getContext() para obtener un RequestDispatcher de recursos en contextos externos.
getRequestDispatcher(arg) retorna null si el ServletContext no puede retornar un RequestDispatcher.

La invocación al recurso se puede hacer de dos formas:
  • Incluir el recurso en el flujo de salida. La salida de "/requestimagen" se incluye en la salida del primer servlet.
dispatcher.include(request, response);
  • Redirigir (forward) la petición al recurso. Funcionalmente semejante a sendRedirect(). Se trata de redirigir la petición a otro componente:
dispatcher.forward(request, response);

La diferencia entre sendRedirect() y forward() (o también include()) es:
  • En sendRedirect() la petición acaba bajo el control del segundo servlet. La URL que se puede ver en el navegador es la del segundo servlet. Además sendRedirect() es un método de HttpResponse
  • En forward() o include() la petición se controla por el primer servlet. La URL que se puede ver en el navegador es la del primer servlet.
Aquí se puede ver el código de las clases PruebaDipatcher y RequestImagen.