Mostrando entradas con la etiqueta Consejos. Mostrar todas las entradas
Mostrando entradas con la etiqueta Consejos. Mostrar todas las entradas

lunes, 4 de mayo de 2009

Día 59: ANT y Ejemplos JBoss-seam

Instalar ejemplos del seam

Abrir el documento "seam_reference.pdf" para tenerlo de referencia.
Mirar el capítulo 1 para lanzar los ejemplos.
Crear un proyecto de la fuente del jboss seam "jboss-seam-2.1.1.GA" para tener todo el código fuente de los ejemplos a mano.

Ejemplo 1
Desplegar el ejemplo registration
Configuraremos las propiedades del ANT

Desplegamos la carpeta "examples" y dentro el "registration" para acceder al archivo "build.xml" (o control+mayuscula+r y buscamos build.xml), aunque en realidad lo mejor es abrir el plugin de ANT (window>show view>Ant) y arrastrar el archivo a él. Trabaja también con el build.xml principal contenido el build y también utiliza un archivo properties.
El archivo "default.build.properties" contenido en el "build". Modificamos la propiedad jboss.home y le indicamos donde tenemos nuestro servidor (en mi caso: C:\Documents and Settings\javaape\Escritorio\JAVA\servers\jboss-4.2.3.GA )
(Si quisieramos arrancar el método principal del ANT nos iriamos a la carpeta del build.xml por consola y escribir "ant deploy".)
Hacemos doble click en el método principal y debería funcionar todo.
Arrancamos el servidor jboss.
Accedemos a la página "http://localhost:8080/seam-registration/register.seam" y debería ir.

Los JSF tienen el faces-config.xml
Los JPA tienen el persistence.xml
Y Los The Seam component deployment descriptor el components.xml

Ejemplo 2
Ahora desplegaremos el blog, hacemos como antes:
"Tiramos" el build.xml a la vista del ANT y arrancamos el método deploy.
Y si tenemos el jboss ya arrancado directamente podemos acceder ya al ejemplo: "http://localhost:8080/seam-blog/"
Una vez accedido a la página vamos "bicheando" un poco sobre su funcionamiento mirando sus clases java y sus archivos de configuración.

Sobre el ANT
Si se desarrolla lo ideal es hacer un explode, para que los cambios se guarden, pero si queremos lanzarlo tenemos que deshacer el explode y hacer un deploy.

Ejemplo 3
Desplegamos el ejemplo "booking" y los mismos pasos que antes.
Para acceder a él: "http://localhost:8080/seam-booking/home.seam"
Aqui se pueden ver y retomar conversaciones, por ejemplo si se está mirando en una pestaña un hotel y en otra pestaña otro hotel y podemos elegir entre los dos.


El resto del tiempo de hoy lo dedicamos de forma libre: a continuar con el proyecto que teniamos entre manos antes de feria.. o investigar un poco estos ejemplos del jboss y tocarlos.

Consejo:Para los tipos de datos que estamos más acostumbrados, String, Objeto X, Objeto Y, usamos los métodos "getLoQueSea" o su "set" pero para los tipos primitivos de datos, por ejemplo un booleano, se debe de usar "isAlgo"

viernes, 24 de abril de 2009

Día 58: EJB y JSF (16ªP) / JBoss-Seam (9ºP)

En la página del login el seam ya tiene preinstalado unos componentes. Los campos de texto usa "credentials" y el chekbox y el botón de "Identity".
Identity es de sesión
Credentials es de evento


@Out



Consejos:
Los EntityManager no funcionará nunca si una clase no es un EJB


---Entrada incompleta---

viernes, 17 de abril de 2009

Día 54: EJB y JSF (12ªP) / JBoss-Seam (5ºP)


Ejercicio1
El objetivo del ejercicio de ahora es, que modificando el ejercicio de ayer, que el enlace de edición vaya a una acción de un ejb y que esa acción rellene un objeto de tipo Disco gracias a un componente, una clase, que hemos creado que se enlaza a la lista, y que nos rediriga a la página de edición simplemente llamando a su url, sin ninguna acción más ya que el disco ya lo tiene.
  • Duplicamos los bean (y sus interfaces): ListaDiscoBean y EditaDiscoBean y en los xhtml igualmente pero en el de lista de disco quitamos el parametro al s:link, o mejor dicho... quitamos el s:link completo y usamos mejor un h:commandButton o un h:commandLink con la acción redirigiendola a "EditaDiscoBean2"
  • Creamos una clase java, que se llame "MiComponente" con una anotación anteponiendo la clase: "@Name("miComp")".
    Le añadimos como atributo: "HtmlDataTable tabla" con sus métodos getter y setter y creamos su método principal:
    public String selecciona(){
    Object o = tabla.getRowData();
    Disco d =(Disco) o;
    return null;
    }
  • Creamos ahora el ejb con la acción que estaba enlazada la lista con el "editar"
    Lo nuevo en esta clase es que hay un objeto del tipo componente que hemos creado antes y con una anotación que lo hace dependiente:
    @In(value="miComp",create=true)
    MiComponente miComponente;

    Y su método principal:
    public String selecciona(){
    disco=(Disco) miComponente.getTabla().getRowData();
    System.out.println(">>>>>>>>>Nombre del disco: "+disco.getNombre()+"!!!!!!!!!!!!!!!!!!");
    return "/editaDisco2.xhtml";
    }

    El return puede devolver directamente la url o podria devolver un valor y poner una regla de navegación en el "pages.xml"
  • Para que a la hora de probar los enlaces la consola no se nos vaya disparada por las consultas sql que se nos muestra editaremos el archivo "persistence.xml" usando el buscador de archivos del eclipse y editamos la propiedad "hibernate.show_sql" a false

Ejercicio2
El objetivo de este segundo ejercicio es el de hacer lo mismo pero con las clases que creamos hace unos dias, específicamente con la clase "Cliente"
Hacer una lista de clientes, que haya un enlace y que se pueda editar.
Como "novedad" usaremos el mismo componente, así que simplemente duplicamos los métodos que nos hagan falta pero para la clase Cliente

Pseudo-Ejercicio3
Bueno, esto es ya a modo personal, no me enteré bien en su día y no lo llegé a hacer pero hoy si me he enterado y lo he hecho.
El objetivo del ejercicio es que a la hora de editar un disco también aparezca un menú desplegable para cambiarle su autor y que se guarde.
Podemos cojer el ejercicio 1 de hoy y mejorarlo con esto.
  • La clase "ListaDiscosBean2":
    • Añadir un nuevo Query en el método de carga que seleccione todos los cantantes.
    • Añadir también una lista de cantantes y su método getter y "subirlo" a la interfaz.
  • La página "listaDiscos2.xhtml":
    • Añadir a la tabla una columna nueva para ver el nombre del cantante (para comprobar que se ha guardado): #{d.cantante.nombre}
  • La página "editaDisco2.xhtml"
    • Añadir el select teniendo cuidado al nombre de la variable que le pongamos para mostrar la lista.
    • Primer nivel// h:selectOneMenu value="#{editaDisco2.disco.cantante}" required="true"
    • Segundo nivel// s:selectItems value="#{listaDiscos2.listaCant} var="_cantante" label="#{_cantante.nombre}" noselectionlabel="#{Selecciona cantante}" \\ cierre
    • Segundo nivel// s:convertEntity \\ cierre
    • \\cierre del primer nivel
  • En la clase persistente "Cantante" añadir el Hashcode y el equals


Consejo:
No nos olvidemos del atajo de eclipse: Control+Shift+R para buscar un archivo que no sepamos donde está!!!

lunes, 30 de marzo de 2009

Día 45: EJB (4ª Parte) y JSF (3ª parte)


Hoy comenzamos cambiando el puerto en la que abre las aplicaciones. Para ello modificamos las propiedades de configuración del pluggin jetty de maven del proyecto que queremos arrancar (modificar el archivo "pom.xml").
Después añadimos todas las librerías que están en: "jboss-5.0.1.GA\client" a las librerías del proyecto "jsf1"

Creamos un nuevo servicio, ServicioCadenas que lo que hace es recibir una cadena de caracteres y devolver el número de su longitud.
El método para hacerlo es como lo hemos hecho anteriormente.




Consejos
Atajo del eclipse: (Alt+T) Botón secundario, Refactor y "Pull up" y marcamos los métodos que queramos "subir" de una implementación a una interfaz.
Problemas con proyectos remotos EJB: Las soluciones son varias al igual que los problemas, pero lo más común es:
  • Reponer la librería del proyecto: Run As, Maven Clean (Eliminará la librería del proyecto en el servidor JBoss) y después Run As, Maven Package (volverá a poner la librería)
  • Si se nos ha olvidado instalar el proyecto: Run As, Maven Install (Añadirá una librería del proyecto en el repositorio del maven) y después: Run As, Maven package (lo de antes, ...)
  • Lo que casi todo en la informática, reiniciar:
    > Cerrar y volver a encender el servidor jetty (Control+c y después S)
    > Cerrar y volver a encender el JBoss
    > Combinar orden de encendidos y apagados, ...
  • Se admiten más consejos

viernes, 27 de marzo de 2009

Día 44: EJB (3ª Parte) y JSF (2ª parte)

JSF

Funcionalidades del proyecto en grupo / ideas
El JSF controla la Vista y el Modelo
Usará EJBs usando tambien Entidades

Tareas con JSF-> (MVC) Reglas de navegación, formularios, botones de acciones e inyeccion de dependencias.
Tareas con Reglas de negocio (EJB) -> Acceso a persistencia, transacciones, realizará las consultas.
Tareas con Entidades -> Clases persistentes, clase Libro, clase Género, etc.
Disco disco = new Disco();
session.save(disco);, etc

Ejercicio 1
Dentro del proyecto de ayer (jsf1) creamos una nueva funcionalidad, la de registro.
  • Primero creamos "registro.xhtml" y usamos las etiquetas predefinidas de "h" y colocamos un "inputText" y un "inputSecret", que serán el mail y la clave.
  • Seguidamente creamos "registroCorrecto.xhtml" que simplemente mostrará que lo hemos conseguido y mostrando el mail que introdujimos.
  • Creamos, en el paquete "es.cea", la clase "Registro" cuyas propiedades son un mail y una clave y sus métodos getter y setters.
  • Hacemos un "RegistroAction" que será la acción del registro cuando pulsamos el botón. Tendrá una propiedad de tipo "Registro" y que tenga un método llamado "registra". En el método si el mail que se recibe no es "(un email que queramos)" que devuelva nulo y si es el mail que queremos pues que devuelva "válido"
  • En el archivo de configuración "my-config.xml" añadimos el bean de registro (managed-bean) y su acción y en éste último no nos olvidemos de la inyección de la dependencia (managed-property).
  • Tampoco nos olvidemos de la regla de navegación en el "my-config.xml" (navigation-rule) sobre si el mail es válido o no.
  • Probar que funciona arrancando el jetty desde la línea de comandos en el proyecto. (recuerdo que era: "mvn jetty:run")

Ejercicio 2 (variante del 1)
Este ejercicio consiste en lo mismo que el ejercicio anterior.
Recojemos el proyecto "discografia-hibernate" y hacemos "Run As...", "Maven install" y en el proyecto que estamos trabajando, "jsf1", le añadimos la dependencia desde maven del proyecto de la discografía y hacemos lo mismo que el ejercicio anterior, que haya una página de cantante, que se introduzca su nombre, que haya una acción, que redijira, etc etc. (no vuelvo a repetir los pasos porque son los mismos)

Esqueleto de proyecto JSF-EJB-Hibernate
Unos puntos clave (ha sido muy intensa la clase así que más o menos de lo que me acuerde xD)
  • Necesitamos 3 proyectos: "discografía-hibernate" , "ejbProject" y "ejbProjectClient"
  • Debemos "empaquetar" los dos primeros proyectos. (Run As.., Maven package)
  • Arrancar el servidor JBoss y si nos falla revisar en la carpeta deploy (jboss-5.0.1.GA\server\default\deploy)
  • Abriremos la clase java "DiscograficaDAOClient" del proyecto "ejbProjectClient" que será en donde veremos que funciona toda la estructura del proyecto.
  • En los Beans "Cancion", "Cantante", "Disco" tenemos que implementar la interfaz serializable (del paquete java.io) y haciendo Control+1 (marcar la 2ª opción) añadir el serialVersionUID para que a la hora de pasar la clase persistente a travez de la red se serialice y despues se deserialice en su destino.
  • Abrimos el "pom.xml" del proyecto "ejbProject" y copiamos:
    Copiar la etiqueta "Properties" (Al principio) que es la ruta en donde se empaquetará el proyecto en el servidor JBoss
    Copiar el plugin cuyo artifactId se llama "maven-jar-plugin"
    Copiar el plugin cuyo artifactId se llama "maven-clean-plugin"
    Pegarlos todos en su respectivo lugar en el "pom.xml" del proyecto "discografia-hibernate"
  • Abrir el archivo "persistence.xml" del proyecto "discografia-hibernate" y comprobar que el nombre de la unidad persistente concuerde con el que se nombra en el archivo "discografica-ds.xml" que está en el "deploy" del server

Consejos
Sobre Ejercicio 1 y 2:
Si queremos que aparezca un mensaje de error en el jsf lo que tenemos que hacer es un control en la acción, que si no devuelve success o válido (o lo que hayamos puesto que sea afirmativo) que envíe un mensaje de error y lo hacemos de la siguiente manera:
FacesMessage message =
new FacesMessage(FacesMessage.SEVERITY_INFO,"El mail no se corresponde",null);
FacesContext.getCurrentInstance().addMessage("mail", message);
Para que funcione en la página del formulario ".xhtml" debemos indicar la etiqueta "h:messages" encima del primer input del formulario y cuando introduzcamos un valor incorrecto nos aparecerá.
Aviso!!: para que funcione no tiene que haber una regla de navegación en el "my-config.xml" (a ver si encuentro el porqué)

jueves, 26 de marzo de 2009

Día 43: EJB (2ª Parte) y JSF

EJB

EJB + JBoss AS
Proyecto Eclipse Configuración

Primero tener en el build path la librería de tiempo de ejecución del JBoss.

Localizaciones a recordar:
JBoss : Para que arranquen las aplicaciones debemos tener presente: JBoss/server/default/deploy/* (con extensiones como .ear, .war o .jar)
TomCat : Tomcat/webapps/*.jar

Practicar la creación de un proyecto EJB:
  • Nuevo proyecto maven
  • Crear un simple proyect
  • Group Id: nombre del paquete
    Artifac id: nombre del jar
  • Build Path, añadir libreria, server runtime, JBoss
  • Crear un paquete es.cea y dentro una interfaz: ServicioCalculadoraRemote
  • Añadir una anotación "@Remote" encima del nombre de la intefaz y crear un método "suma"
  • Crear una clase ServicioCalculadora que implemente ServicioCalculadoraRemote e implemente el método "suma" y añadir en la cabecera de la clase la etiqueta de sin estado "@Stateless"
  • Botón secundario encima del proyecto, Export y marcamos el paquete es.cea que están nuestras dos clases.
    La librería se colocará en "..\servers\jboss-5.0.1.GA\server\default\deploy\" y le ponemos de nombre "calculadora.jar"
  • También tenemos otro modo de hacer lo mismo y es botón secundario encima del proyecto, Run As.. y marcamos "Maven Package" y la librería que nos crea lo copiamos en la misma ruta antes dicha.
  • Si queremos acceder desde una clase java
  • Copiamos del proyecto de ayer la clase "PrimerBeanClient" y lo modificamos. Recordemos que llamamos a las interfaces, no a las clases.
  • El main debe quedar tal que así:
    try {
    Properties p = new Properties();
    p.put(Context.INITIAL_CONTEXT_FACTORY,
    "org.jnp.interfaces.NamingContextFactory");
    p.put(Context.URL_PKG_PREFIXES,
    "org.jboss.naming:org.jnp.interfaces");
    p.put(Context.PROVIDER_URL, "jnp://localhost:1099");
    Context ctx = new InitialContext(p);
    Object ref = ctx.lookup("ServicioCalculadora/remote");
    ServicioCalculadoraRemote servCalc = (ServicioCalculadoraRemote) PortableRemoteObject
    .narrow(ref, ServicioCalculadoraRemote.class);
    System.out.println("1 + 2 = " + servCalc.suma(1, 2));
    } catch (NamingException e) {
    e.printStackTrace();
    }

Ejercicio:
Pequeño manual de enviar un mensaje de correo usando gmail: Manual
Teniendo este código: Java Mail
Tenemos que hacer un EJB de servicio de mail usando nuestra cuenta de GMail.
  • Primero creamos un proyecto, lo llamaremos servicioMail
  • Configuramos el "build Path" y añadimos una librería nueva de tipo "Server runtime" y seleccionamos el JBoss
  • Creamos una interfaz "ServicioMailRemote" y su clase implementación "ServicioMail" en el paquete "es.cea"
  • En la interfaz añadimos la anotación @Remote y creamos la cabecera del método de enviar el Email.
  • En la clase implementación ("ServicioMail") añadimos la anotación @Stateless e implementamos el método según el enlace que puse antes pero cambiando algunas cosas:
  • Cambiar: props.setProperty("mail.smtp.port","465");
    Añadir: props.setProperty("mail.smtp.socketFactory.class",
    "javax.net.ssl.SSLSocketFactory");
  • El código completo sería:
    // Propiedades de la conexión
    Properties props = new Properties();
    props.setProperty("mail.smtp.host", "smtp.gmail.com");
    props.setProperty("mail.smtp.starttls.enable", "true");
    props.setProperty("mail.smtp.port", "465");
    props.setProperty("mail.smtp.socketFactory.class",
    "javax.net.ssl.SSLSocketFactory");

    props.setProperty("mail.smtp.user", origen);
    props.setProperty("mail.smtp.auth", "true");
    // Preparamos la sesion
    Session session = Session.getDefaultInstance(props);
    // Construimos el mensaje
    MimeMessage message = new MimeMessage(session);
    message.setFrom(new InternetAddress(origen));
    message.addRecipient(
    Message.RecipientType.TO,
    new InternetAddress(destinatario));
    message.setSubject(asunto);
    message.setText(mensaje);
    // Lo enviamos.
    Transport t = session.getTransport("smtp");
    t.connect(origen, password);
    t.sendMessage(message, message.getAllRecipients());
    // Cierre.
    t.close();
  • Despues de esto exportamos el paquete al JBoss como explicamos antes.
  • Run As.. Java Application y listo

Ejercicio expandido (opcional):
Usando el mismo ejercicio usar el ANT para automatizar copiar el jar a la carpeta de destino del servidor y otra tarea de borrar para "desinstalar" la aplicación.

JSF
Java Server Faces

Es una herramienta de modelo vista controlador (MVC)

Más información AQUÍ

Abrimos el proyecto "jsf1" que sólo arrancará desde el jetty y desde la línea de comandos (mvn jetty:run)
Vamos al localhost/jsf1/ y ahí lo veremos.

El proyecto consiste en que hay unas clases bean (Modelo), un xhtml y unos archivos de configuración.
Un xhtml (Vista) tiene un formulario, cuyo botón de submit se envía a una clase de acción que controlará (controlador) el formulario. Un archivo xml enlazará todo y si recibe de los controladores el "success" mostrará los xhtml de respuesta.

Consejo:
Toda página que hagamos tiene que ser xhtml y no html

jueves, 19 de febrero de 2009

Día 26: Proyecto MVC, continuación 5

Continuación, ...
Continuamos con el proyecto con algo de prisa porque mañana ya termina el plazo.
Consejo sobre la validación
Servlet
...doGet()..{
try{
compruebaNoNulos(req,"mail","clave");
}catch(){
req.setAtribute("error",...);
}
...
}

Método
public void compruebaNoNulos(HttpRequest req,String ... parametros){
foreach(String para:parametros)
if(request.getParameter(par)==null) throw new (par);
}

miércoles, 11 de febrero de 2009

Día 20: JSTL - Parte 3, Proyecto2 e Introducción al MVC

JSTL

Etiquetas implícitas

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.

Un Bean tiene un id, un scope y una class.


Consejo:
Para poder usar variables de una clase y mostrarlas primeramente invocamos la clase con un "id", después las variables que manejaremos se tienen que colocar en una variable que manejará el jsp y despues mostrarlos ya que el jsp no sabe manejar las variables de las clases, no sabe de qué tipo son. (aunque si ponemos un valor que no corresponde, un int a un String por ej. dará error.)

<jsp:useBean id="miCosa" scope="request" class="es.cea.Cosa"/>
<jsp:setProperty name="miCosa" property="propiedad1" value="hola"/>
<jsp:setProperty name="miCosa" property="propiedad2" value="40"/>
Propiedad1 de miCosa: <jsp:getProperty name="miCosa" property="propiedad1"/>


Para crear etiquetas con un cuerpo la clase java tiene que extender de la clase padre "BodyTagSupport" aunque se puede tranquilamente con el "TagSupport"

Ejercicios
Primer ejercicio:
Probar en "functions.jsp" todas los métodos posibles de "jsp:", mirando las apis de java.

Segundo ejercicio:
La página del formulario: que hayan inputs de tipo text, password, inputbutton, etc.
Hacer que haya herencia en los tags.


Proyecto 2


Retomamos el proyecto de la biblioteca para expandirlo con lo último que hemos dado.
- Crear menus
- Dividir el proyecto en distintos paquetes segun sus funcionalidades.
- Que haya solo una clase para la manipulación de datos, cuya interfaz se llamará DAO y que en un futuro se usará para manejar bases de datos.

Un ejemplo del último punto:
List lista = new ArrayList();
convertirlo a:
Dao dao = new DaoSimple();
o si accedieramos a una base de datos:
Dao dao = new DaoMySQL();

- Implementar logueo por consola
- Incluir pruebas

Eso es remarcando lo más importante, pero el guión del proyecto es:


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.

MVC
Cojemos el proyecto mvc y lo abrimos en el Eclipse para ver un ejemplo simple el funcionamiento básico de un Modelo Vista Controlador.


lunes, 9 de febrero de 2009

Día 18: JSTL

JSTL
Primeramente un poco de siglas:

Tag = Etiqueta = Referencia a una clase java
JSP = Java Server Pages
JSTL = Java Standard Tag Library
TLD = Tag Library Descriptor
EL = Expression Lenguaje

En las vistas se intenta eliminar el código java o al menos la menor cantidad posible y con JSTL se usan etiquetas parecidas a HTML.

En vez de usar el request.getParameter("x"); ahora se usa el Param.x
Las variables empiezan como en php, con el $

Un recuerdo de una de las etiquetas que usaremos para que funcionen nuestras aplicaciones usando JSTL:

Directivas - <%@... ...%> - Son importantes, por ejemplo
<%@page import=”java.util.*”%> - Para importar una librería

<%@taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
Donde referencia los tag que voy a utilizar. Con esta librería podremos hacer un if, un for, un for each, y más.

Cuando vayamos a incluir alguna librería de este tipo:
En algún lugar debemos tener los archivos descriptores de tags
Y añadir la librería que usaremos en el web.xml.

Cómo crear una etiqueta personalizada
Una etiqueta es una clase java que extiende de la clase TagSupport
Para ello debemos sobreescribir los métodos: doStartTag y doEndTag

Ahora hacemos una nueva etiqueta, copiandonos de una ya hecha y después tendremos que hacer una etiqueta que formatee monedas.

Otro ejercicio es crear una etiqueta que liste un mapa.

Servlet --> getServletContext().getAttribute("");
JSP --> application.getAttribute("");
JSTL+EL -->

Objetos Implícitos
El lenguaje de expresion JSTL define un conjunto de obletos implícitos:
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))

Por ahora empezaremos a usar el "
applicationScope"


Consejos
1- Si tenemos que modificar el web.xml a mano (= no se haya instalado bien el pluggin en el Eclipse para hacerlo visualmente) cada librería de tags que queramos usar tendremos que introducirlos dentro del mismo jsp-config, y cada librería en su respectivo taglib
2- Si una aplicación web de las que hagamos da un error antes de arrancar la aplicación, lo más probable es que el error será del web.xml.

viernes, 6 de febrero de 2009

Día 17: Test a Colecciones e introducción a Capas

Repaso a Objetos

Al empezar la clase comenzamos importando un nuevo proyecto que copiamos en el workspace.
Repasamos también la idea básica de los objetos y es que a la hora de introducirlo a una lista, de "sacarlo" a una variable, modificarlo y demás, en realidad siempre estamos trabajando con un mismo objeto, porque siempre estamos haciendo referencia al mismo objeto, no lo estamos copiando constantemente (para eso ya hay un método específico: clone()).

Colecciones
Si tenemos una lista de elementos y queremos ordenarlas tenemos dos maneras:

Sin pasarle el criterio del orden:
Collections.sort(clase)
Se da por hecho que la lista es de un tipo de objeto tiene que implementar Comparable. Si no se implementa no puedo utilizar el método.
Solamente funciona para clases que implementan
Comparable.
public class Alumno implements Comparable{ ...

Y cuando decimos que nuestra clase implementa
Comparable estamos obligados a implementar el método CompareTo() y ahí es donde decimos la comparación.
public int compareTo(Alumno o){
return this.dni.compareTo(o.dni);
}

Al pasarle el criterio del orden
Collections.sort(clase,ObjetoDeCriterio)
La clase no tiene porque implementar la clase Comparable.
El criterio es una clase que tenemos que crear implementando el Comparator.
public class AlumnoNombreComparator implements Comparator {
public int compare(Alumno alumno1, Alumno alumno2) {
return alumno1.nombre.compareTo(alumno2.nombre);
}
}
Se puede invertir el orden, si "alumno1" es mayor que "alumno2", devuelve 1 y si es menor -1 y si son iguales 0.

Diseño de un programa en capas
Es un patrón de desarrollo.
Las responsabilidades de las clases son las capas.

Capa DAO: son clases que acceden a datos.
Las capas no ven entre capas. Por ejemplo, los controladores no pueden ver a la capa DAOs, sólo a la capa Servicios.
Si se realiza un cambio en una capa DAO no se debe de "enterar" la capa Controladores. A eso se le llama un programa robusto, porque si se cambia la capa DAO y se entera todo el mundo, entonces es frágil, no compila.

Los servicios no se relacionan con las clases, sino con las interfaces.

jueves, 5 de febrero de 2009

Día 16: Log, Colecciones, Consejos y Test

loggin
Primeramente recojemos las librerías: commons-logging-1.1.1.jar y log4j-1.2.15.jar y las colocamos en una carpeta "Librerias" de nuestro Workspace del Eclipse (para tenerlo más a mano) y en los proyectos que vayamos a realizar simplemente los seleccionamos y los arrastramos a la carpeta "lib" del proyecto.

La clase Log (del cual crearemos una variable de ésta clase llamado logger) es capaz de mostrar información según el nivel que le pongamos.

De mayor a menor gravedad:
fatal: Para errores fatales.
error: Lanza un mensaje de la causa del error.
warn: Lanza un aviso.
info: Para mostrar alguna información importante.
debug: Imprimir lo que sea para depuración.

Si se quiere ver un mensaje de tipo warn, el info y el debug no se verá.

Crearemos un nuevo xml que sera un archivo de source pero para no mezclar el xml con el código.
Creamos un nuevo source folder, en paralelo al src de toda la vida y creamos un archivo nuevo xml y copiamos: Codigo
Una vez hecho podemos ver la estructura de un xml que configura el logger.
Lo primero que vemos es la configuración que le da al logger, para que la información que queramos mostrar aparezca en la consola, esa parte no la tocamos.
En otro elemento del documentor podemos especificarle el paquete y el nivel de información que se mostrará y con eso nos damos cuenta la gran utilidad de agrupar un proyecto en varios paquetes para que cada uno pueda mostrar un nivel u otro.


Hacemos una revisión de las colecciones de objetos: Colecciones



Tipos de colecciones de objetos
Lista: Colección de elementos que pueden ser repetidos y se ordenan desde 0 en adelante.
Set: Si se le añade dos objetos iguales, pasa de nosotros y sólo mete 1.
Map: Es una colección de claves-valor. Son objetos ambas.
TreeSet o TreeMap: directamente ordena los elementos que les introduzcamos.

Clases de utilidades:
Collections: Conviete una enumeración en una colección, y otras conversiones, ordena listas, etc
Arrays:

testNG - Repaso
Creamos un nuevo proyecto, le ponemos el nombre que queramos y ahora:
Le decimos que haga 2 source folder: src y test
En la pestaña de "Libraries" le añadimos un JAR externo: "testng-5.8-jdk15.jar" y finalizamos la creación.
Si esto último nos lo saltamos podemos hacer: 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
Creamos en src y en test dos paquetes simétricos: "es.cea"
Creamos una nueva clase llamada "ExamenTest" y lo probamos haciendo un println, no debería saltar ninguna excepción a la hora de arrancarlo (Botón derecho encima de la clase>Run as>TestNG test)

Creamos una clase Examen que tenga 2 campos (1 de ellos lo inicializa el constructor) que sean "referencia" y "numeroPreguntas".
El esquema básico de una prueba es:

Un escenario de prueba
Examen examen1=new Examen("ref1");
Examen examen2=new Examen("ref2");
Examen examen1Bis=new Examen("ref1");

Una invocación
boolean equals1 = examen1.equals(examen2);

Una confirmación
assert(!equals1):" el examen 1 debe ser diferente del 2";

boolean equals2 = examen1.equals(examen1Bis);
assert(equals2):" el examen 1bis debe ser igual a examen 1";

Si ponemos el código así y hacemos el test, fallará, así que implementamos el equals y el hashcode en Examen y ya funcionará el test.

Una vez probado el test lo expandimos haciendo una clase "Pregunta" que como parámetros tendra un Examen y un número de preguntas.
Al hacer una nueva clase, también hacemos su correspondiente clase de test: PreguntaTest, que haga lo mismo, creamos unos cuantos objetos de tipo Pregunta y comparamos si son iguales, etc.

Y como ejercicio debemos hacer un ejercicio para probar los test creando una clase "Aula" y otra clase "Localización"
Aula: Atributos: Localización y Nombre
Localización: Atributos: String referencia y Integer planta.

Y para terminar unos consejos para el Eclipse y nuestros proyectos:

Atajos de teclado del Eclipse:
Control+Alt: Copia la linea entera en la que nos encontremos usando los cursores arriba o abajo.
Control+D: Borra la línea en la que nos encontremos.
Alt: Usando también los cursores movemos la línea arriba o abajo.
Control+7: Comenta la línea que nos encontremos.

A partir de hoy en los proyectos que hagamos debemos tener una estructura determinada:
Con respecto a las librerías:
Incluir siempre estas tres librerías:
log4j.jar
commons-logging.jar
testng.jar

Con respecto al código:
Siempre poner la variable logger:
protected final Log logger = LogFactory.getLog(getClass());

Con respecto a los source folders:
Tener siempre el source folder src, resources y test.