lunes, 4 de mayo de 2009

Resumen para curriculum

Systemas operativos: Windows
Lenguajes de programación:Java J2EE
Bases de datos: MySQL. Utilizo habitualmente Hibernate para mapeo O-R.
Programación Web: CSS

IDE's: Eclipse. Plugins de eclipse: subclipse(subversion), testng, jboss, m2eclipse(maven)
Servidores Web: Tomcat y Jetty
Servidores de aplicaciones: JBoss
Frameworks de desarrollo web en java: Servlets, JSP, JSTL, Struts, SpringFramework, JBoss Seam, JSF, EJB

Frameworks de pruebas: TestNG, Mockito

Herramientas de automatización y estandarización en el desarrollo: Ant, Maven, Subversion, log4j, commons-logging



Contenido del master en java j2se y j2ee
Desarrollo de Componentes Web Con Tecnología Java (84 Horas)
  • Introducción al desarrollo de Aplicaciones Web con Java
  • introducción al Control de Versiones utilizando la herramienta Subversion
  • introducción a la POO (Programación Orientada a Objetos) a través del estudio del framework de colecciones de java y su comprobación a través de pruebas con testNG
  • introducción a las excepciones, su diseño y su gestión en un programa
  • introducción al seguimiento del programa por consola (logging) y configuración. Uso de la herramienta Log de la librería commons-logging y log4j de Apache
  • introducción a Apache ANT: herramienta de automatización de tareas en el desarrollo
  • introducción al api jdbc: Java Data Base Connectivity
  • profundización en el uso y creación de anotaciones
  • introducción a la herramienta MAVEN: herramienta de estandarización del desarrollo (automatización de tareas) en proyectos java, destacando la gestión de dependencias
  • servidores web
  • desarrollo de servlets modelo 1 :listeners, filters, servlets
  • introducción a JSP - Java Server Pages. Modelo 2 de desarrollo con Servlets
  • introducción a JSTL - Java Standar Tag Library
  • introducción al patrón de desarrollo Controlador Frontal
  • introducción al patrón de desarrollo MVC - Modelo Vista Controlador


Desarrollo de Aplicaciones J2EE (56,50 Horas)
  • Arquitectura J2EE.
  • servidores de aplicaciones
  • introducción a Struts 1
  • introducción a EL - Expression Language
  • introducción a la internacionalización de aplicaciones
  • introducción a SiteMesh - Patrón Filtro Decorador
  • introducción a Hibernate "con XML"
  • introducción a Spring
  • introducción a DI - Inyección de Dependencias
  • introducción a JSF Java Server Faces



Acceso a Base de Datos. Hibernate (42 Horas)
  • Persistencia de Objetos
  • Configuración de Hibernate
  • Introducción a un proyecto con Hibernate
  • API
  • Propiedades De Hibernate
  • HQL - Hibernate Query Language
  • Hibernate Criteria Query
  • Persistencia De Colecciones

Desarrollo Aplicaciones De Negocio Enterprise JavaBeans (73,50 Horas)
  • Análisis de los componentes EJB
    • Session Beans.
      • stateless
      • statefull
    • Entity Beans.
    • MDB.
  • ciclo de vida y contextos de EJB
  • Uso del lenguaje de consulta de EJB (EJB QL)
  • Implementación de transacciones
  • Manejo de excepciones
  • Implementación de la seguridad
  • introducción a JBoss Seam como herramienta de integración de JSF y EJB

lunes, 20 de abril de 2009

Seam: CarritoCompra

package org.domain.seamcea2.session;

import javax.persistence.EntityManager;

import org.jboss.seam.Component;
import org.jboss.seam.annotations.intercept.AroundInvoke;
import org.jboss.seam.intercept.InvocationContext;
import org.jboss.seam.security.Identity;
import org.jboss.seam.security.NotLoggedInException;

public class Espia {

@AroundInvoke
public Object meDaIgual(InvocationContext llamadaMetodo)
throws Exception {





String nombreMetodoInvocado = llamadaMetodo.getMethod().getName();
Object[] parameters = llamadaMetodo.getParameters();
Object resultadoAccion = llamadaMetodo.proceed();
ListaDiscoBean listaDiscoBean =
(ListaDiscoBean) llamadaMetodo.getTarget();
Disco discoSelccionado=listaDiscoBean.discoSelccionado;


if(nombreMetodoInvocado.equals("incluye")){
EntityManager entityManager = (EntityManager) Component
.getInstance("entityManager");
Estadistica stadistica=new Estadistica();
stadistica.setDisco(discoSelccionado);
entityManager.persist(stadistica);

}
return resultadoAccion;
}

}




package org.domain.seamcea2.session;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.jboss.seam.annotations.intercept.Interceptors;

import sun.reflect.annotation.AnnotationType;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Interceptors(Espia.class)
public @interface EspiaAnotacion {

}



Aplicar la inyección de dependencias al carrito de la compra

Convertir un Entity en un Bean accesible por su nombre (desde la vista y desde otros beans) de la aplicación

(Pagina 152 tutorial de seam)Interceptar el carrito para implementar estadisticas y seguridad de forma transparente

Generar consultas JPQL para saber los detalles de las entidades relacionadas con disco y estadistica

viernes, 17 de abril de 2009

Request-JSF-Seam

Problematica de recuperar parametros

Solucion casi igual a Servlets
@RequestParameter(value="nombreParametro")
Long id;

Solucion orientada a objetos aprovechando JSF e inyeccion de dependencias
Binding de HtmlDataTable y aprovechar el metodo datatable.getRowData() para obtener el objeto de la fila actual...

Solucion Seam .... @DataModel @DataModelSelection

Carrito compra-> inyeccion

miércoles, 15 de abril de 2009

calendar/time pattern

info recogida de: http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html






















Letter
Date or Time Component
Presentation
Examples
G
Era designator
Text
AD
y
Year
Year
1996; 96
M
Month in year
Month
July; Jul; 07
w
Week in year
Number
27
W
Week in month
Number
2
D
Day in year
Number
189
d
Day in month
Number
10
F
Day of week in month
Number
2
E
Day in week
Text
Tuesday; Tue
a
Am/pm marker
Text
PM
H
Hour in day (0-23)
Number
0
k
Hour in day (1-24)
Number
24
K
Hour in am/pm (0-11)
Number
0
h
Hour in am/pm (1-12)
Number
12
m
Minute in hour
Number
30
s
Second in minute
Number
55
S
Millisecond
Number
978
z
Time zone
General time zone
Pacific Standard Time; PST; GMT-08:00
Z
Time zone
RFC 822 time zone
-0800

Seam: JSF+EJB

Practica de componentes JSF a través de edición de Disco. Comenzamos solo editando nombre para después utilizar
  • componente calendario para editar la fecha del Disco
  • componente selectOneMenu para editar el Cantante del Disco
  • componente validador para validar que la fecha del Disco siempre sea anterior al día actual
  • conversores
  • binding e inyección de ejbs dentro de bindings
  • listeners en JSF: ActionEvent y ValueChangeEvent
Componente CarritoCompra (Mantener en session información de usuario y detallarla)


gestión de Excepciones en Seam

i18n en Seam

Tests en Seam



Debugear una aplicación java

lunes, 13 de abril de 2009

SeamFramework=EJB3+JSF(Richfaces)

Richfaces es una implementacion de jsf

gettingstartedwithjbosstools

java.net.BindException: Address already in use: JVM_Bind.

  1. Localizar el proceso que ocupa el puerto con el comando: netstat -a -n -o
  2. finalizar el proceso desde el administrador de porcesos/tareas

domingo, 29 de marzo de 2009

JSF un framework orientado a componentes y eventos

glassfish y jetty

otro servidor de aplicaciones: glassfish (de sun)
¿cómo instalar el plugin para eclipse?

instalar el servidor jetty
seguir el mismo procedimiento de instalacion de plugin
incluir librerias de cliente


cambio de configuracion de plugin de jetty para que arranque en otro puerto

<plugin>

<groupId>org.mortbay.jetty</groupId>

<artifactId>maven-jetty-plugin</artifactId>

<version>6.0.1</version>

<configuration>


<scanIntervalSeconds>1</scanIntervalSeconds>

<connectors>

<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">

<port>9090</port>

<maxIdleTime>60000</maxIdleTime>

</connector>

</connectors>

</configuration>

</plugin>

miércoles, 25 de marzo de 2009

jsf

Ejercicio Registro de usuario utilizando JSF...
  1. secuencia de pantallas de registro simulando regla de negocio
  2. arrancar JPA(Hibernate) con modelo de Usuario
  3. crear un EJB que conecte con JPA y realice busquedas
  4. inyectar ej EJB remoto en la aplicación JSF


Proyecto jsf1

intro a jsf
jsf api y doc



Crear nuevo proyecto jsf con maven y eclipse...
new maven project
no create a simple project (no skip archetype selection)
catalog internal
filter: jsf
softeu-archetype-jsf

descargas: http://code.google.com/p/cursoj2ee/downloads/list

org.hibernate.Session o javax.persistence.EntityManager

Contextualización de Hibernate ORM en un servidor servlets

EntityBeans->Cap 08

EntityManager-> 09


Java Persistence API, más conocida por su sigla JPA, es la API de persistencia desarrollada para la plataforma Java EE e incluida en el estándar EJB3. Esta API busca unificar la manera en que funcionan las utilidades que proveen un mapeo objeto-relacional. El objetivo que persigue el diseño de esta API es no perder las ventajas de la orientación a objetos al interactuar con una base de datos, como sí pasaba con EJB2, y permitir usar objetos regulares (conocidos como POJOs).


lunes, 23 de marzo de 2009

Acceso a Base de Datos. Hibernate

Modelo de negocio para implementar en ejemplos...
Productora, Disco, Cancion,
Grupo Musica, Musico, Pedido, Cliente

Problemas a resolver por un ORM


Arranque (y configuración) de Hibernate
Propiedades De Hibernate (Session y SessionFactory)

Opciones para mapeo de clases persistentes con hibernate:

Lenguajes disponibles de consultas con hibernate:

Mejorar rendimiento:

Documentacion:

martes, 10 de marzo de 2009

mirrors de maven

<mirror>

<id>ibiblio.org</id>

<name>ibiblio Mirror of http://repo1.maven.org/maven2/</name>

<url>http://mirrors.ibiblio.org/pub/mirrors/maven2</url>

<mirrorOf>central</mirrorOf>

</mirror>

<mirror>

<id>jboss-repository-mirror</id>

<name>jboss-repository</name>

<url>http://repository.jboss.org/maven2</url>

</mirror>

<mirror>

<id>rodcoffin</id>

<name>rodcoffin</name>

<url>http://maven.rodcoffin.com/repo</url>


</mirror>

<mirror>

<id>struts</id>

<name>struts</name>

<url>http://people.apache.org/repo/m2-snapshot-repository</url>


</mirror>

SpringFramework

http://groups.google.com/group/eticom-master-java/web/spring

lunes, 9 de marzo de 2009

Struts2 y SpringFramework

Inyección de dependencias con Spring: proyecto spring-di

Demostración de la factoria de objetos que representa Spring, y la inyección de dependencias indicada en el applicationContext.xml



En Struts2 se utiliza Spring para inicializar la factoria de sessiones y la session e inyectarla en la acción correspondiente...
http://code.google.com/p/cursoj2ee/source/detail?r=184

... y todavia quedaria abrir y cerrar las transacciones... (lo hará spring también)


en repo: struts2 y spring-di

viernes, 6 de marzo de 2009

Mockito: Test de caja blanca - de comunicación entre objetos

copiar /serverad/mockito en C:\Documents and Settings\javaape\.m2\repository\org


incluir la dependencia en nuestro pom.xml de mockito-all

mirar los ejemplos de test de acciones de struts en repo
http://code.google.com/p/cursoj2ee/source/detail?r=179




Mockito 1.7

http://code.google.com/p/mockito/

mockito-core:

  <groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.7</version>

mockito-all:

  <groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.7</version>




*** IMPORTS STATICS

ANT - Automatizacion de tareas en el desarrollo

repo: ant-ejemplos

http://ant.apache.org/manual/tasksoverview.html

http://groups.google.com/group/eticom-master-java/web/ant

http://www.chuidiang.com/java/herramientas/ant.php


Ejercicios:
  1. realizar con ant una estructura de directorios tipica de una aplicacion web en java
  2. desplegar una aplicación web java a nuestro servidor tomcat realizando las siguientes tareas: compilar, empaquetar, desplegar

jueves, 5 de marzo de 2009

RUBY y RUBYONRAILS

Para programadores con inquietudes... probar este lenguaje...
RUBY
(un lenguaje entre php y java)
http://www.ruby-lang.org/es/
Prueba a programar con ruby utilizando tu navegador.... http://tryruby.hobix.com/

RUBYONRAILS para desarrollo WEB
http://www.rubyonrails.org.es/

Struts2 Introduccion

Creación desde consola de un nuevo proyecto struts2 utilizando el comando maven archetype:create enlace
  • cd workspace
  • mvn archetype:create -DgroupId=es.cea -DartifactId=struts2 -DarchetypeGroupId=org.apache.struts -DarchetypeArtifactId=struts2-archetype-starter -DarchetypeVersion=2.0.5-SNAPSHOT -DremoteRepositories=http://people.apache.org/repo/m2-snapshot-repository
  • cd struts2
  • mvn eclipse:eclipse
  • para arrancar la aplicacion en un servidor podemos utilizar jetty o tomcat: mvn jetty:run ó mvn tomcat:run
  • http://localhost:8080/struts2


En Eclipse:
  • abrimos el proyecto en eclipse
  • mavenizamos el proyecto
  • comparamos las vistas de navigator y proyect explorer en perspectiva java ee

Cambios struts2 respecto a struts1
  • la peticion struts antes era .do y ahora pasa a ser .action


integrando con hibernate http://www.zabada.com/tutorials/spring-and-hibernate-integration.php

miércoles, 4 de marzo de 2009

Reflexion

Plugin en Struts, Sitemesh

plugins de struts (¿qué es un plugin en Struts?)
definidos en struts-config.xml, implementan org.apache.struts.action.PlugIn y sus correspondientes métodos

ejemplo plugin de hibernate!!




UTILIZAR EL PATRON DECORATOR (casualmente con Struts):
decoración y layout para páginas web con sitemesh de com.opensymphony

instalación: maven dependencia, web.xml filter

mockito! o ¿cómo testear la comunicación entre objetos?

Strutus: editar entidades y utilizar selects

MAVEN: source:jar install
y después configurar eclipse> maven > dowload artifacts y podremos navegar por el codigo java de nuestras dependencias!


Con el ejemplo de editar libro en el cual hay que seleccionar uno de los autores existentes...
http://code.google.com/p/cursoj2ee/source/detail?r=171



Linkografía:

Para la info del select

lunes, 2 de marzo de 2009

Struts un Framework de Componentes MVC, patron decorador y plugins

Struts importante comprender y notar!
  • arranque de Struts: lectura de struts-config.xml, servlet de struts como controlador frontal
  • documento xml struts-config.xml, DTD y struts version
  • scope de actionsforms (request-session)
  • acceso al request y al response desde execute...
  • inyeccion de dependencias



COMPONENTES DE STRUTS !!! PARA VISTA, MODELO y CONTROLADOR
http://struts.apache.org/1.2.x/userGuide/



Ejemplo de utilizacion de etiqueta de iteracion de struts para iterar colecciones
<logic:iterate collection="${requestScope.libros}" id="libro" >

Next element is ${libro.titulo}

</logic:iterate>


Proyecto a desarrollar
EN REPO:
  • struts-avanzado (aplicación librería)
Dependencias
EN REPO:
  • libreria-model
  • libreria-dao
  • libreria-dao-hibernate-xml

i18n - Internationalization and localization

Internacionalización en jsp en repo:i18n

wikipedia

sun java internacionalizacion

viernes, 27 de febrero de 2009

Struts Basico

en repo: struts-basico
probar jetty y comparar con tomcat


en foro, pagina que explica funcionamiento de struts básico

ActionForm, Action,
Navegacion se evalua en función del resultado del controlador (separación de papeles)
i18n

validadación y envío de errores y mensajes a usuario

Etiquetas de struts:





maven con struts: creación de proyectos

Maven y TestNG

Para utilizar el framework de pruebas TestNG con MAVEN hay que incluir un plugin al archivo pom.xml para que quede de esta forma:


<
build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.3</version>
<configuration>
</configuration>
</plugin>
</plugins>
</build>


Y después añadir la dependencia (la libreria) de TestNG

<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>5.8</version>
<classifier>jdk15</classifier>
</dependency>



al final el pom.xml tendrá más o menos esta forma.


jueves, 26 de febrero de 2009

Maven Basico Practica

Estructura de directorios de un proyecto maven:


crear un proyecto maven con eclipse


creacion de proyecto/servicio (cada proyecto tendrá solamente una clase en el caso de las implementaciones y una interfaz en el caso de las apis):
  • servicioCalculadoraAPI: contiene interfaz con metodo multiplica 2 long y devuelve String con tipo de moneda
    • servicioCalculadoraImplEuropea
    • servicioCalculadoraImplAmericana
  • servicioTraduccionAPI: contiene interfaz con metodo traduce que recibe una clave: ej: welcome
    • servicioTraduccionAndaluz
    • servicioTraduccionVasco
    • servicioTraduccionCatalan
  • servicioAleatorioAPI: contiene interfaz con metodo que recibe un numero (x) y devuelve un numero aleatorio de 0 a x
    • servicioAleatorioImpl

Creamos una aplicación web (web01) con maven y eclipse y utilizamos las dependencias anteriormente instaladas para su uso desde este proyecto

Creamos otra aplicación web (web02) con maven y eclipse con las mismas dependencias pero la inicialización o instanciación de los servicios los realizamos en listeners de aplicación que activamos o desactivamos selectivamente en el web.xml. Y desde nuestros controladores, unicamente accedemos a estos servicios a través del servletContext.getAttribute("servicioCalculadora") o servletContext.getAttribute("servicioTraduccion")

Maven Basico

Crear un proyecto java básico:
>> cd workspace
>> mvn archetype:create -DgroupId=es.cea -DartifactId=EjemploMaven
>> cd EjemploMaven

http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html


Comandos básicos:
  • >>mvn clean
  • >>mvn compile
  • >>mvn package

Para abrirlo en eclipse
  • >>mvn eclipse:eclipse


Crear un proyecto java web básico:
  • >> cd workspace
  • >> >> mvn archetype:create -DgroupId=es.cea -DartifactId=web00 -DarchetypeArtifactId=maven-archetype-webapp
  • >> cd web00
  • >> mvn tomcat:run-war
  • http://localhost:8080/web00

martes, 24 de febrero de 2009

Proyectos servlet corregidos

Los comentarios/correcciones y evaluaciones en las memorias de los proyectos

PD: parece que tenéis muy buena base de Servlets

lunes, 23 de febrero de 2009

Instalar MAVEN

Instalar maven

(en server/java/apache-maven-2.0.9) o bajarse el zip de maven, desempaquetarlo y poner su directorio bin en el path de busqueda de ejecutables.

En mi caso lo he desempaquetado en C:\, con lo que se me ha creado el directorio C:\maven-2.0.9

Para meter el subdirectorio bin en el path de ejecutables, le doy con el botón derecho del ratón sobre el icono de "Mi PC" y elijo "Propiedades", "Avanzado" y "Variables de Entorno". Busco "Path" y le doy a "Editar". Añado al final ";C:\maven-2.0.9\bin" (con punto y coma delante, para separarlo de lo que ya haya escrito)


En el caso de windows hay que abrir una ventana de comandos nueva después de haber realizado los cambios y para probar que todo va bien, podemos ejecutar

>> mvn --version
Maven version: 2.0.9


>> mvn archetype:create -DgroupId=es.cea -DartifactId=EjemploMaven

Implementacion MYSQL

Wink: documentación en video

Primero instalamos MYSQL y MySQLTools con la ayuda de los videos

SQL: INTRODUCCIÓN
http://es.wikipedia.org/wiki/SQL
tutorial en español:
http://www.desarrolloweb.com/manuales/9/


Java y SQL-> JDBC Java Database Connectivity

http://es.wikipedia.org/wiki/JDBC

Ejemplo:

http://www.chuidiang.com/chuwiki/index.php?title=Conectar_java_con_mysql

http://www.chuidiang.com/java/mysql/mysql-java-basico.php

http://www.chuidiang.com/java/mysql/EjemploJava.php


Instalar proyecto: mysqlcea desde repo (mysql+testng+tdd+maven)


vincular proyectos en eclipse, exportar jar y wars

Implementacion de DaoBibliotecaMYSQL

Pasar a session el DAO y a listener de evento abrir y cerrar conexion!

Incluir un proyecto como dependencia en otro proyecto en eclipse

exportar como jar

viernes, 20 de febrero de 2009

Tutoriales

Tutoriales muy buenos de sun
http://java.sun.com/docs/books/tutorial/index.html

lunes, 16 de febrero de 2009

Libro EJB3 del curso

Titulo: ENTERPRISE JAVABEANS 3.0 CON ECLIPSE Y JBOSS
Editorial: Marcombo
enlace a libro

miércoles, 11 de febrero de 2009

Proyecto Biblioteca MVC

El proyecto biblioteca tendrá los mismos casos de uso que el anterior desarrollado con servlets

El proyecto se desarrollará con las siguientes tecnologías
  • Patrón de desarrollo MVC (Modelo Vista Controlador)
  • Servlets: Listener, Filters, Servlets
  • JSP
  • JSTL (tags implicitos en JSP, tags de JSTL y tags personalizados)
  • Pruebas


Especial atención a:
  • modularización de la vista con uso de la etiqueta jsp:include
  • paquetes separando aspectos/finalidades/roles de las clases java
  • aislamiento de acceso a datos en una sola clase con una interfaz
  • nomenclatura
  • características standars de proyecto web java.

Plazo y forma de desarrollo:
Forma de desarrollo: equipo
Inicio: 12 febrero
Fin: 20febrero (ambos días incluidos!)

Publicación en el mismo repositorio svn de equipo

Total horas por persona: 24 Horas
Total horas por equipo: 24x4= 96 Horas

JSTL: continuacion

http://jakarta.apache.org/taglibs/site/tutorial.html

http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSTL.html

La etiqueta tag en el tld puede contener las siguientes porpiedades
  • name
  • tagclass: clase java que implementa javax.servlet.jsp.tagext.Tag
  • bodycontent: jsp, tagdependent, empty
  • atributes: los atributos que puede recibir, especificando su name, required y rtexprvalue

Etiquetas implicitas en jsp:

(fuente wikipedia en español)

Son las etiquetas pertenecientes a la especificación JSP. Proporcionan una funcionalidad básica.

Un primer grupo de etiquetas proporciona funcionalidad a nivel de la página de una manera muy simple:

  • * <jsp:forward>, redirige la request a otra URL
  • * <jsp:include>, incluye el texto de un fichero dentro de la página
  • * <jsp:plugin>, descarga un plugin de Java (una applet o un Bean).

Un segundo grupo permite manipular componentes JavaBean sin conocimientos de Java.

  • * <jsp:useBean>, permite manipular un Bean (si no existe, se creará el Bean), especificando su ámbito (scope), la clase y el tipo.
  • * <jsp:getProperty>, obtiene la propiedad especificada de un bean previamente declarado y la escribe en el objeto response.
  • * <jsp:setProperty>, establece el valor de una propiedad de un bean previamente declarado.


libreria de funciones para aplicar en EL JSTL: functions
http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSTL8.html
http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html

lunes, 9 de febrero de 2009

JSTL: la especificacion de JSPs trae JSTL

Tag=Etiqueta=Componente Web

JSP = Java Server Pages
JSTL = Java Standard Tag Library

http://jakarta.apache.org/taglibs/site/tutorial.html


Tutorial de SUN: http://java.sun.com/j2ee/1.3/docs/tutorial/doc/JSTL.html

La especificación JSP viene acompañada de la especificación JSTL, cuyo finalidad es no escribir codigo java en la vista (codigo HTML) para seguir utilizando una pseudosintaxis HTML.

proyecto jsps+jstls en repo


Instalación:
  • incluir librerias en WEB-INF/lib incluidas en jakarta-taglibs-standard-1.0.6/lib
  • incluir documentos descriptores de librerías (tlds*) desde jakarta-taglibs-standard-1.0.6/tld hasta nuestroProyecto/WebContent/tld
  • definir en web.xml los tlds que vamos a utilizar en nuestro jsp

Novedades incluidas:



Implicit Objects

The JSTL expression language defines a set of implicit objects:

  • pageContext - the PageContext object
  • pageScope - a Map that maps page-scoped attribute names to their values
  • requestScope - a Map that maps request-scoped attribute names to their values
  • sessionScope - a Map that maps session-scoped attribute names to their values
  • applicationScope - a Map that maps application-scoped attribute names to their values
  • param - a Map that maps parameter names to a single String parameter value (obtained by calling ServletRequest.getParameter(String))
  • paramValues - a Map that maps parameter names to a String[ ] of all values for that parameter (obtained by calling ServletRequest.getParameterValues(String))
  • header - a Map that maps header names to a single String header value (obtained by calling ServletRequest.getheader(String))
  • headerValues - a Map that maps header names to a String[ ] of all values for that parameter (obtained by calling ServletRequest.getHeaders(String))
  • cookie - a Map that maps cookie names to a single Cookie (obtained by calling HttpServletRequest.getCookie(String))
  • initParam - a Map that maps a parameter names to a single String parameter value (obtained by calling ServletRequest.getInitParameter(String))



** el uri es el identificativo: http://code.google.com/p/cursoj2ee/source/detail?r=88





JSTL -> especificación extensible->herencia->etiquetas personalizadas..
pasos a seguir para realizar una etiqueta o librería de etiquetas personalizadas...
  1. crear la clase java que hereda de tag
  2. crear (si no existe el tld) e incluir el tag recien creado
  3. incluir el tld en el web.xml
  4. incluir el tld en el jsp
  5. usar el tag en el jsp
http://groups.google.com/group/eticom-master-java/web/jstl-y-etiquetas-personalizadas-2




ejemplo c:foreach


viernes, 6 de febrero de 2009

Pruebas a colecciones y diseño en capas de una aplicacion

Diseño en capas.

Separación de los diferentes

Comprobar con pruebas, la ordenacion de listas y la utilización de objetos como claves en mapas

jueves, 5 de febrero de 2009

TestNG

intro a tdd e instalación de plugin de eclipse para testNG

Antes de empezar necesitamos...

Directorios source folders simetricos:

src
---es.cea

test
---es.cea

¿cómo instalo la libreria (no el plugin, sino la libreria) de testng?
boton derecho sobre el nombre del proyecto>Build Path>configure build path>pestaña librerias>add external jars>seleccionaren nuestro disco duro: testng-5.8-jdk15.jar

¿dónde me creo la clase de prueba?
En el source folder "test" en el mismo paquete que la clase a probar

¿qué nombre le pongo?
El mismo nombre que la clase a probar más el sufijo "Test". Ejemplo: si voy a probar el ServicioCalendarios me hago la clase ServicioCalendariosTest

¿cómo hago un método de prueba?
Un método de prueba es un método publico que no devuelve nada y que no recibe parametros. Además lleva la anotación @Test, para lo cual hay que importar la clase org.testng.annotations.Test

¿qué escribo dentro del método de prueba?
el escenario de pruebas
la invocación del "programa"
las aserciones/confirmaciones correspondientes

¿cómo lanzo la prueba?
boton derecho sobre la clase en el package explorer> run as...>testng test

Esencial en Proyecto Java

librerías:
  • log4j.jar
  • commons-logging.jar
  • testng.jar

En código:
  • protected final Log logger = LogFactory.getLog(getClass());

Source Folders:
  • src
  • resources
  • test
JavaDoc - documentación:
  • definición de clases
  • métodos y párametros que reciben o devuelven

logging y colecciones

logging
seguir el funcionamiento de nuestro programa en consola con la herramienta:
commons-logging de apache




colecciones

http://groups.google.com/group/eticom-master-java/web/colecciones-de-objetos
http://java.sun.com/j2se/1.4.2/docs/api/java/util/package-summary.html

miércoles, 4 de febrero de 2009

Aplicacion en capas

CONTROLADORES
--------------------
SERVICIOS
--------------------
DAO
--------------------
DATABASE


Aislamos en nuestro proyecto de biblioteca la capa de DAO, es decir todo lo relacionado con la creación, modificación y eliminación de objetos de negocio (libros, autores, generos ...)
Aislar significa centralizar en un paquete y una o varias clases el código correspondiente

JSPs

proyecto de ejemplo de jsps descargable del repositorio del curso en la dirección:
http://code.google.com/p/cursoj2ee/source/browse/trunk/jspEjemplo/



  • imports de clases
  • acceso a aplication
  • acceso a request
  • scripts
  • <%=%>
  • includes
  • ...

POO y Servlets

Programación Orientada a Objetos y Servlets...

  • ¿en que objetos nos apoyamos para realizar el desarrollo de las funcionalidades (a parte de los objetos implicitos del framework y del modelo)?
  • ¿quien invoca los news filters, servlets, listeners?

Proyecto Final Conclusiones:
  • ¿qué logica se ha implementado en los listeners?
  • ¿qué logica se ha implementado en los servlets?
  • ¿qué logica se ha implementado en los filtros?
  • ¿qué tienen en común los objetos almacenados en el SevletContext (setAttribute y getAttribute)?
  • ¿qué tienen en común los objetos almacenados en el Session(setAttribute y getAttribute)?
  • ¿qué tienen en común los objetos almacenados en el Request (setAttribute y getAttribute)?

Refactorizacion:
  • eliminar redundancia
  • mejorar nombres de clases y metodos y parametros
  • encapsular objetos

martes, 3 de febrero de 2009

Controlador Frontal - Front Controller

Patrón controlador Frontal

Patrón Controlador Frontal:
  • que consiste en utilizar un único punto de entrada a cada aplicación. Concretamente, todas las peticiones que realiza el usuario se controlan mediante un único servlet (solo un servlet en web.xml), que se encarga de redirigir las peticiones a los servicios implicados

http://www.programacion.com/java/articulo/corej2ee_patterns/


REPO:
http://code.google.com/p/cursoj2ee/source/browse/trunk/controladorFrontal#controladorFrontal/src

Crear un servicio para calculo de intervalo entre dos fechas

Conversores de datos: Calendar to String, y String to Calendar

A través de TDD generar un ServicioCalendarios que contenga funcionalidad relacionada con fechas y tratamiento de estas, incluyendo la comprobacion del intervalo entre dos fechas (necesario para funcionlidad de reserva en biblioteca)

lunes, 2 de febrero de 2009

TDD: Desarrollo Orientado a Pruebas - Test Driven Development

http://es.wikipedia.org/wiki/Tdd

Pruebas con TestNG

http://testng.org/doc/

instalación de plugin para eclipse

  • Select Help / Software updates / Find and Install.
  • Search for new features to install.
  • New remote site.
  • Enter http://beust.com/eclipse in the URL and whatever description you want.
  • Make sure the check box next to http://beust.com/eclipse is checked and click Next.
  • Eclipse will then guide you through the process.

funcionamiento del plugin para eclipse

http://testng.org/doc/eclipse.html

Ciclo de desarrollo orientado a pruebas:

http://es.wikipedia.org/wiki/Tdd#Ciclo_De_Desarrollo_Conducido_por_Pruebas


Consecuencias del TDD

  • Las pruebas pueden llegar a sustituir a la documentación.

lunes, 26 de enero de 2009

Proyecto Final Servlet elaboracion en equipo

se utilizará Google code y subversion (SVN y subclipse: plugin de eclipse para SVN)

Proyecto Final Servlet elaboracion en equipo

Cada grupo realizará un proyecto (fecha limite: 3 febrero - 12 Horas) y entregará una memoria (fecha limite: viernes 6 febrero ) en el que se explicará las decisiones adoptadas en el diseño de clases y rol elegido. Se valorará la puesta en practica de los diferentes recursos disponibles. En el desarrollo del proyecto puede intervenir el profesor como tester-cliente y redefinición de usabilidad.
*** La aplicación debe estar preparada en los casos que el usuario intente hacer algo mal a proposito: pedir un libro que no existe, realizar un prestamo sin permiso, modificar un autor sin ser administrador ...

Servicio Préstamo de Biblioteca:

Programa de gestión de servicio de préstamo de una biblioteca.
  • El usuario anónimo podrá consultar el catálogo de la biblioteca el cual podrá estar ordenado/clasificado en géneros (ensayo, policíaco, aventuras...) y/o autores.
  • Cada libro tiene: referencia, autor, fecha publicación, genero, titulo.
  • Cada autor tiene: nombre y una lista de libros.
  • Cada genero tiene: nombre y una lista de libros. Cada usuario de la biblioteca tiene: nombre, clave, mail y lista de libros en prestamo.
  • La aplicacion/biblioteca tiene: lista de libros, lista de generos, lista de autores y lista de usuarios y un administrador (usuario especial que al registrarse tiene permisos especiales)
  • El usuario podrá ver los detalles de libro y proceder a su préstamo.
  • Para realizar un préstamo el usuario tiene que estar registrado.
  • Para registrarse el usuario debe antes existir en la lista de usuarios de la aplicación. El registro consiste en un formulario donde el usuario inserta su mail y clave y estos deben coincidir con un usuario de la lista de usuarios de la aplicacion.
  • Un usuario podrá tener un máximo de 3 libros en préstamo.
  • Un usuario no podrá tener dos libros iguales en prestamo
  • Un usuario registrado puede consultar los libros que tiene en prestamo.
  • Para realizar un préstamo de libro el usuario indica el dia de inicio y fin de prestamo que no puede ser superior a 5 dias.
  • Un usuario que no existe en la biblioteca puede solicitar a el administrador mediante un formulario el ingreso en la aplicacion para posteriormente poder registrarse
  • El administrador del programa se registra con usuario: admin, clave:admin.
  • El administrador no puede realizar prestamos pero hace tareas de administacion.
  • El administrador del programa puede aceptar las solicitudes de usuarios pendientes y convertirlos en usuarios que pueden realizar prestamos
  • El administrador del programa puede crear/modificar/borrar libros, autores y generos
  • El administrador del programa puede consultar todos los libros reservados (fecha inicio y fin y usuario que realizó el préstamo) desde que se inicio la aplicación.
  • El administrador del programa puede prohibir a un usuario el préstamo

EXTRAS OPCIONALES:
  • aplicar estilos CSS
  • separar la capa de datos (DAO) y conectar con MYSQL

Aplicacion carrito de la compra

aplicacion carrito de la compra paso a paso en:
http://groups.google.com/group/curso-j2ee/web/aplicacion-tienda-con-servlets

miércoles, 21 de enero de 2009

Ejercicios: contador visitas, cronometro, chat

Proyecto contador:
  • El Contador contabilizara todas las peticiones de todos los usuarios!
  • ContadorUsuarios contabilizará los usuarios que se han conectado a la aplicación desde que se inicia la app
  • ContadorUsuriosConectados contabilizará los usuarios conectados en el momento actual a la aplicación.




pdf: filtros en la practica


filtros project
damos de alta un servlet para el registro de usuario (formulario de registro)
activacion de seguridad con filtro de registro de usuario


algunos ejemplos sobre filtros...


martes, 20 de enero de 2009

Listeners en el api de servlet y colecciones en java.util

Listeners en servlets
  • application - ServletContext
  • javax.servlet.ServletContextListener
  • javax.servlet.ServletContextAttributeListener
  • session
  • javax.servlet.http.HttpSessionListener
  • javax.servlet.http.HttpSessionAttributeListener
  • javax.servlet.http.HttpSessionActivationListener
  • javax.servlet.http.HttpSessionBindingListener
  • request - event
  • javax.servlet.ServletRequestListener
  • javax.servlet.ServletRequestAtributeListener

Ejemplos de creacion de listeners y activacion en web.xml

¿para qué sirve escuchar (y hacer algo en ese momento) cuando arranca la aplicacion o cuando se conecta por primera vez un usuario nuevo a la aplicación ?
Cuando arranca la aplicación es el momento oportuno para iniciar los recursos comunes a los componentes de la aplicación o situar en un estado concreto la información. Ejemplos de esto pueden ser: conectar con la base de datos, comenzar con una información especifica (zoo con algunos animales dentro...)...
Igualmente es interesante poder limpiar o cambiar recursos al parar o desactivar la aplicación, por ejemplo: desconectar de la base de datos, escribir mail de desactivación, escribir un registro en un fichero ...

Cuando se conecta un usuario es muy util saberlo para inicializar aquellos objetos que el usuario puede utilizar, por ejemplo: el carrito de la compra, servicios, colecciones de objetos ...
Igualmente cuando se desconecta el usuario es util para limpiar recursos asociados con su uso (session)






Ejercicio continuacion de zoo: implementacion de listener de session y de aplicacion

Iniciar la session de usuario con las colecciones iniciadas.
Finalizar la session de usuario añadiendo sus colecciones a un atributo de aplicacion que se llamara "todosLosAnimales" y que será una coleccion de animales de todos los usuarios
session
al iniciar la aplicacion...
arg0.getSession().getServletContext().setAttribute("todosLosAnimales", coleccion);
al finalizar la aplicacion...
List coleccion=arg0.getSession().getServletContext().getAttribute("todosLosAnimales");
coleccion.addAll(arg0.getSession().getAttribute("animales"));





viernes, 16 de enero de 2009

Entender la sobreescritura de metodos 2: sobreescribir equals()

Cómo mantener información de usuario utilizando el objeto session
(y con ello Demostración de llamadas a métodos de la clase java.lang.Object: equals y hascode en relación al uso de colecciones
)


Para la siguiente demostración vamos a crear una discoteca: programa para coleccionar discos.
La funcionalidad va a consistir en 2 paginas web o URLs. Una pagina o peticion(/discoteca) para mostrar el contenido de los discos almacenados en la coleccion del usuario (para almacenar objetos de tipo disco vamos a utilizar la clase java.util.List). Otra pagina o solicitud para (/disco) para mostrar formulario de incluir nuevo disco.

Comenzamos definiendo la clase Disco con las propiedades: titulo, cantante y referencia.

Seguimos con el formulario de nuevo disco que se enviara a la discoteca...
Es decir creamos un nuevo servlet que pintará el formulario y lo damos de alta en el web.xml para que escuche las peticiones en /disco


Creamos el servlet discoteca y lo damos de alta en el web.xml.
El servlet discoteca en esta primera fase de desarrollo, lo unico que hace es comprobar que la discoteca (List ) esta en la session y en caso contrario la crea. Posteriormente la pinta en pantalla (aunque por ahora siempre estará vacía)

En dicho servlet accedemos al objeto session (HttpSession) a través del objeto request.getSession(), obteniendo con este objeto la capacidad de acceder a atributos session.getAttribute("clave") o incluir atributos session.setAttribute("clave", objeto).


Una vez que esto funciona, modificamos el codigo para que: si recibimos el formulario de /disco entonces creamos un nuevo Disco y lo metemos en la coleccion.

Sobreescribimos el metodo toString() de la clase Disco para que imprima el nombre y autor del disco



Limitamos los discos duplicados (implementamos metodo equals y hascode en la clase Disco) para poder utilizar el metodo de la clase List contains: boolean existe=coleccion.contains(object)

Ejercicio: zoo.
Paquete es.cea.zoo
Para practicar los conceptos anteriores: atributos de session, servlets, sobreescritura de metodos (equals y tostring) vamos a realizar un programa para la gestion de un zoologico...
  1. Creamos en eclipse un nuevo proyecto web dinamico. Como nombre le indicamos "zoo"
  2. seleccionamos la pestañita de "servers" dentro de eclipse y boton derecho ->add and remove projects... y le añadimos el recien creado
  3. Los animales que tendremos que gestionar en el zoo serán: leones, jirafas, panteras. Cada animal tendra un nombre y una edad
  4. Creamos un servlet que responda a la peticion "/visita" y nos pinte en pantalla la coleccion de leones, de jirafas y de panteras (en tres lineas, una debajo de la otra)
  5. Creamos un servlet que pinte un formulario para introducir una nueva jirafa en la URL: '/jirafa', con los datos: nombre y edad. Dicho formulario se enviará a '/visita'
  6. Creamos un servlet que pinte un formulario para introducir una nueva pantera en la URL: '/pantera', con los datos: nombre y edad. Dicho formulario se enviará a '/visita'
  7. Creamos un servlet que pinte un formulario para introducir un nuevo leon en la URL: '/leon', con los datos: nombre y edad. Dicho formulario se enviará a '/visita'
  8. Cuando el servlet encargado del URL: '/visita' reciba los parametros del formulario '/jirafa', entonces creará una nueva jirafa y la incluira a la coleccion de jirafas existentes
  9. Cuando el servlet encargado del URL: '/visita' reciba los parametros del formulario '/pantera', entonces creará una nueva pantera y la incluira a la coleccion de panteras existentes
  10. Cuando el servlet encargado del URL: '/visita' reciba los parametros del formulario '/leon', entonces creará un nuevo leon y lo incluira a la coleccion de leones existentes
  11. Modificar el metodo equals de las clases correspondientes (Leon, Jirafa, Pantera) para que al incluirlas a la coleccion no existan duplicados [dos animales se consideran iguales si su nombre y edad es igual*]
  12. aplicar herencia entre las diferentes clases de animales para eliminar el codigo redundante



más sobre la clase Object


En java todo es un objeto! (excepto los tipos primitivos)

Java es un lenguaje orientado a objetos porque existe una herencia "invisible" (sin declarar de forma especifica) de la clase java.lang.Object . Esto quiere decir que todas nuestras clases heredan de la clase java.lang.Object, y con ella 5 de los metodos que declara:
  • clone()
  • equals(Object)
  • finalize()
  • hascode()
  • toString()

Ya hemos visto como sobreescribir el comportamiento del metodo toString() en la entrada anterior, y ahora vamos a cambiar el comportamiento del metodo equals(Object).
Este metodo esta diseñado para saber si un objeto es igual a otro objeto. Un ejemplo de esto sería con cadenas de texto:
String una="ejemplo";
String dos="ejemplo2";
String unaBis="ejemplo";

una.equals(dos)==false
una.equals(unaBis)==true

Este comportamiento sería el esperado, pero si lo probamos en objetos que no son de tipo String entonces comprobaremos que el metodo equals no responde a nuestras expectativas...
http://code.google.com/p/cursoj2ee/source/detail?r=15

En el ejemplo anterior se pone de manifiesto que dos alumnos con el mismo nombre e igual DNI no son iguales como objeto. Es decir al compararlos con equals nos devuelve false.
La razón de ello es que la comparación de objetos no se realiza por sus propiedades sino por la implementación del metodo equals en la clase correspondiente. Si no sobreescribimos el metodo equals dos objetos (obtenidos con new ClaseDeObjeto()) nunca son iguales aunque sus propiedades sean iguales.


Diferencias entre igualdad e identidad
boolean iguales=a.equals(b);
boolean identicos=(a == b);

5dia

Ejercicio: Sobreescribir metodo tostring

4 dia

Entender la Sobreescritura de metodos (Override methods ...)


  • En el siguiente Servlet (Clase java que extiende de HttpServlet) se imprimen dos objetos que se crean en el mismo Servlet. En concreto se crea un objeto de tipo Alumno y otro de tipo Profe, ambos reciben al construirse un parametro de tipo String con el nombre de cada uno...
  • Para imprimir un objeto (de cualquier tipo) se hace de la misma forma que un String, es decir pw.println(objeto+"comentario"+objeto2)
  • Cuando se imprime un objeto en realidad se llama al metodo toString() que comparten todos los objetos, y que nos permite imprimir la dirección del objeto y su clase, pero no valores inteligibles para el usuario
  • Al sobreescribir este metodo cambiaremos la forma de imprimirse un objeto...
  • si intentamos pintar colecciones de objetos (List, Set ...) se imprimiran los objetos contenidos segun la implementacion de toString de cada uno de ellos


rediseñamos la herencia al comprobar puntos comunes entre diferentes clases



Nomenclatura


  • Nombres de clases comienzan con mayuscula y continuan con sintaxis de camello
  • Nombres de clases de prueba con mayuscula y continuan con sintaxis de camello y acaban en Test
  • Nombres de propiedades/objetos/variables comienzan con misnúscula y continuan con sintaxis de camello
  • Nombres de métodos comienzan con misnúscula y continuan con sintaxis de camello
  • Nombres de paquetes: todas las letras en minúscula

Ejercicios Servlets

¿Qué es una aplicación web y que archivos y configuración son necesarios?

aplicacion/
_______/archivo.html
_______/archivo.jsp
_______/imgs/...
_______/css/...
_______/masjsps/archivo.jsp
_______/mashtmls/archivo.jsp
_______/WEB-INF/
web.xml
_______
/WEB-INF/classes/es.cea...
_______
/WEB-INF/lib/librerias.jar

Ejemplos

¿Cómo crear un servlet?
  1. Se crea una clase java que herede (extienda) de HttpServlet (javax.servlet.http.HttpServlet)
  2. se sobreescriben los dos metodos encargados de procesar las solicitudes via GET y via POST
  3. public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
  4. public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
  5. Se reenvia todo lo que pase por doPost a doGet incluyendo en la implementacion del metodo doPost la siguiente linea: doGet(req,res);
  6. Se escribe la respuesta en el metodo doGet utilizando el objeto Writer a traves del objeto response: res.getWriter()
  7. Se da de alta el servlet en el archivo de configuración de la aplicación web: web.xml
  8. Se despliega la aplicación
  9. Consultamos el servlet en la dirección http://localhost:8090/nombreAplicacion/bienvenida


¿cómo imprimimos los resultados del servlet en la pagina web?
  1. Accedemos al objeto PrintWriter para imprimir los resultados: PrintWriter pw = res.getWriter();
  2. Imprimimos lineas con el metodo println("mensaje"): pw.println("

    HOLA SOY UN SERVLET

    ");
  3. Cerramos el objeto de impresion pw.close();

Ejercicios
  1. crear otro servlet que responda a la peticion http://localhost:8090/nombreAplicacion/ciudad y que imprima la palabra SEVILLA
  2. crear otro servlet que responda a la peticion http://localhost:8090/nombreAplicacion/academia y que imprima la palabra CEA
  3. crear otro servlet que responda a la peticion http://localhost:8090/nombreAplicacion/enlaces y que imprima los enlaces del blog del curso
  4. crear otro servlet que responda a la peticion http://localhost:8090/nombreAplicacion/formulario y que imprima este formulario
  5. crear otro servlet que responda a la peticion http://localhost:8090/nombreAplicacion/calculadora y que imprima este otro formulario
  6. crear otro servlet que responda a la peticion http://localhost:8090/nombreAplicacion/registro y que imprima un formulario con los campos usuario y clave y se envie(atributo action) a la direcion /registrar



¿cómo recuperamos los parametros que el usuario nos envia a traves de URLs?
  1. Accedemos al objeto request y utilizamos su metodo getParameter("nombreParametroEsperado")
  2. El valor que retorna se lo asignamos a una variable
  3. si la variable es diferente de null entonces lo imprimios en el resultado
Ejercicios
  1. crear otro servlet que responda a la peticion http://localhost:8090/nombreAplicacion/envioFormulario y que imprima los valores nombre y apellidos
  2. crear otro servlet que responda a la peticion http://localhost:8090/nombreAplicacion/calcular y que imprima el resultado de los parametros sumando1 y sumando2
  3. crear otro servlet que responda a la peticion http://localhost:8090/nombreAplicacion/registro y que imprima el resultado de los parametros usuario y clave.

miércoles, 14 de enero de 2009

Instalacion de herramientas

descarga e instalacion de eclipse
descarga e instalacion de jboss tools
descarga e instalacion de tomcat

creacion de cuenta gmail, blogger y delicious
configuracion de firefox con delicious

configuracion de eclipse con tomcat, nuevo proyecto web dinamico y despligue