Blogia

JavaForDummies

INTRODUCCIÓN A ANT

Tareas básicas

Descripción

En este artículo vamos a hablar de las tareas más comunes que vienen implementadas por defecto en Ant. La versión utilizada es la 1.4.

Para aquellos que no conozcan Ant, existe un artículo previo que explica qué es Ant y cómo se usa.

javac

La tarea javac sirve para compilar uno o más ficheros fuente en Java. Únicamente se compilan los ficheros que no tengan un fichero .class actualizado (es decir, cuando no existe, o cuando existe pero es más antiguo que el fichero fuente).

Un ejemplo sencillo de uso es el siguiente:

Con esta tarea, se compilan todas las fuentes del directorio fuentes (que deben estar situados en el directorio actual). Las clases resultantes se guardan en el directorio classes (ídem). El classpath en el que buscar clases existentes es /home/jh/lib.

Este ejemplo es equivalente a ejecutar "javac -sourcepath fuentes -classpath /home/jh/lib -d clases *.java"

Por defecto, se utiliza el compilador disponible en el sistema. Para ello, la variable de entorno JAVA_HOME debe apuntar al directorio base del JDK disponible.

Sin embargo, es posible que queramos compilar con otro compilador distinto. Para ello, podemos modificar la propiedad "build.compiler". En el siguiente ejemplo se usa el compilador jikes:

       

       

               

       

 

Otros valores de esta propiedad son: classic (javac 1.1 y 1.2), modern (javac 1.3 y 1.4), kjc (del proyecto KOPI), gcj (de GNU), sj (de Symantec), extJava y jvc (de Microsoft).

Algunos de los atributos que admite esta tarea son:

  • verbose: produce información más detallada sobre el proceso de compilación
  • debug: indica si las clases generadas incluyen información de debug (por defecto, off)
  • nowarn: pasa el modificador -nowarn al compilador, para que no genere mensajes de warning (por defecto, off)
  • deprecation: pasa el modificador -deprecation al compilador, para que muestre información detallada sobre el uso de métodos en desuso (por defecto, off)
  • target: genera código para una versión concreta de la máquina virtual, mediante el modificador target pasado al compilador (por ejemplo, target="1.1")
  • optimize: indica al compilador que produzca código optimizado
  • failonerror: indica si el compilador debe seguir compilando cuando encuentre errores (por defecto, true)

Un ejemplo de uso con todos ellos podría ser:

       

               

                       verbose="true" debug="true" nowarn="false" deprecation="false"

                       target="1.2" optimize="true" failonerror="true"/>

       

 

Existen más atributos, de uso más específico. Además, algunos pueden ser utilizados como elementos internos del elemento javac, en lugar de atributos. Para información detallada sobre todo ello, se recomienda consultar la documentación oficial de Ant.

java

La tarea java sirve para ejecutar una aplicación Java. Por defecto, la aplicación se ejecuta en la misma máquina virtual que el propio Ant.

Algunos de los atributos más comunes son:

  • classname: clase Java a ejecutar
  • classpath: classpath a utilizar en la ejecución
  • fork: indica que la aplicación debe iniciarse en una máquina virtual distinta a la de Ant (por defecto, está desactivado)
  • jar: fichero .jar a utilizar (que debe tener una clase con un método main). Si se utiliza este atributo, debe usarse también el atributo fork.
  • dir: en caso de usar fork, indica el directorio desde el que se lanza la nueva máquina virtual
  • jvm: en caso de usar fork, indica el comando para invocar a la nueva máquina virtual (por defecto, java)

Es posible indicar argumentos para la clase (o fichero .jar) a ejecutar. Para ello deben utilizarse elementos arg anidados, de la siguiente manera:

                   

 

Este ejemplo es equivalente a ejecutar "javac -claspath clases Prueba 1"

Análogamente, es posible indicar argumentos para la máquina virtual, mediante elementos jvmarg anidados:

                   

                   

 

También es posible determinar el valor de una propiedad de sistema mediante un elemento sysproperty anidado, de la siguiente manera:

                   

                   

 

Las propiedades definidas de esta manera son accesibles desde el código Java, mediante el método System.getProperty(), pasando como parámetro el nombre de la propiedad ("prueba.nombre" en el ejemplo anterior).

Existen otros atributos y opciones más específicos. Para más detalles se recomienda consultar la documentación oficial de Ant.

javadoc

La tarea javadoc sirve para generar la documentación de los fuentes en formato Javadoc. La mayor parte de sus atributos se corresponden con opciones del comando javadoc, por lo que se recomienda consultar la documentación oficial de javadoc.

Un ejemplo de uso bastante completo sería el siguiente:

                    packagenames="p1.sub1,p1.sub2,p2"

                    verbose="true" author="true" locale="es_ES"

                    nodeprecated="true" nodeprecatedlist="true"

                    private="true" splitindex="true" version="true"

                    windowtitle="Documentación de mi aplicación"

                    doctitle="Aplicación"

                    header="Documentación de mi aplicación"

                    footer="Una aplicación interesante..."

                    stylesheet="css/estilos.css"

/>

Algunos de los atributos más comunes de javadoc son:

  • sourcefiles: lista separada por comas de los ficheros fuente .java a utilizar
  • sourcepath: ruta donde buscar ficheros fuente .java a utilizar
  • classpath: ruta donde buscar ficheros .class a utilizar
  • destdir: directorio donde guardar la documentación generada como páginas HTML
  • packagenames: lista separada por comas de los paquetes a utilizar
  • excludepackagenames: lista separada por comas de paquetes a excluir (para no ser utilizados en la generación de la documentación)
  • packageList: nombre de un fichero que contiene una lista de nombres de paquetes a utilizar
  • verbose: indicador para mostrar mensajes acerca de la ejecución de javadoc
  • access: indicador del tipo de acceso que tienen los miembros y métodos a documentar de las clases. Debe ser public, protected, package o private.
  • author: indicador para incluir las etiquetas @author
  • locale: locale a usar (ej.: es_ES)
  • nodeprecated: indicador para ignorar las etiqetas @deprecated
  • nodeprecatedlist: indicador para no generar una lista con elementos en desuso
  • nohelp: indicador para no generar un enlace de ayuda
  • noindex: indicador para no generar el índice de identificadores
  • nonavbar: indicador para no generar la barra de navegación
  • notree: indicador para no generar el árbol jerárquico de clases
  • package: indicador para mostrar únicamente los miembros y métodos de las clases con modificadores de acceso public y protected y sin modificador
  • private: indicador para mostrar todos los miembros y métodos
  • protected: indicador para mostrar únicamente los miembros y métodos públicos y protegidos de las clases
  • public: indicador para mostrar únicamente los miembros y métodos públicos de las clases
  • splitindex: indicador para dividir por letras el índice de identificadores
  • use: indicador para generar páginas de uso de las clases y paquetes
  • version: indicador para incluir las etiquetas @version
  • old: indicador para generar la salida en formato 1.1
  • windowtitle: título a mostrar en la barra de título del navegador
  • doctitle: texto HTML a usar como título del índice de paquetes
  • header: texto HTML a usar como encabezado de cada página generada
  • footer: texto HTML a usar como pie de cada página generada
  • bottom: texto HTML a usar al final de cada página generada
  • stylesheet: hoja de estilos CSS a usar

copy

La tarea copy sirve para copiar ficheros y directorios, igual que cp en Linux o copy en MS-DOS y Windows. Por defecto, sólo se copian ficheros que sean más recientes que el destino o que sean nuevos.

La forma de indicar qué ficheros hay que copiar es mediante atributos o mediante filesets. Los filesets serán explicados en un artículo posterior. De momento, utilizaremos algunos ejemplos sencillos:

Para copiar un único fichero f, a otro f2:

Para copiar un fichero f a un directorio d:

Para copiar un directorio d1 a otro directorio d2:

                   

 

Para copiar todos los ficheros .xml a un directorio d:

                   

 

Los atributos de la tarea copy son:

  • file: el fichero a copiar, si sólo es uno
  • tofile: el fichero destino, cuando se copia un único fichero
  • todir: el directorio de destino
  • overwrite: fuerza la escritura de los ficheros, aún cuando el destino sea más reciente que el origen (por defecto es no)
  • preservelastmodified: mantiene la fecha de modificación del fichero original (por defecto es no)
  • includeEmptyDirs: copia directorios vacíos (por defecto es no)
  • flatten: copia todos los ficheros a un mismo directorio, ignorando la estructura de directorios existente
  • filtering: indica si en la copia se hace filtrado de palabras, mediante elementos filterset (por defecto, es no). Los filterset serán explicados en un artículo posterior.

delete

La tarea delete sirve para eliminar ficheros y directorios, igual que rm en Linux o delete en MS-DOS y Windows. Algunos ejemplos de uso son:

Para borrar un único fichero f:

Para borrar un directorio d entero, incluyendo los subdirectorios no vacíos:

Para borrar los ficheros .class de un directorio d:

                   

 

Los atributos de delete son:

  • file: el fichero a borrar, si es uno solo
  • dir: el directorio a borrar
  • verbose: indica el nombre de cada fichero a borrar (por defecto es false)
  • quiet: en caso de error no se muestra ningún mensaje, a menos que se haya ejecutado Ant con -verbose o -debug (por defecto es false). Este indicador intenta simular el parámetro -f del rm de UNIX.
  • failonerror: si el atributo quiet es false, indica si un error en el borrado debe o no detener la ejecución de la tarea (por defecto es true). Si quiet es true, se ignora el valor de failonerror.
  • includeEmptyDirs: si está puesto a true, también borra los directorios vacíos (por defecto es false) Existen cinco atributos más, oficialmente declarados en desuso. Por ello no los comentaremos aquí.

mkdir

La tarea mkdir sirve para crear un directorio.

El único atributo que tiene es dir, con el directorio a crear.

Un ejemplo de uso es:

move

La tarea move sirve mover uno o más ficheros o un directorio, a un nuevo directorio, igual que mv en Linux o move en MS-DOS y Windows. Por defecto, si el destino existe, es sobreescrito. Si la sobreescritura se deshabilita, el origen sólo es movido si es más reciente que el destino, o si éste no existe.

Es posible usar filsets para seleccionar conjuntos de ficheros, al igual que con la tarea copy.

Algunos ejemplos de uso son:

Para cambiar de nombre un fichero, de f1 a f2:

Para mover un fichero f a un directorio d:

Para mover un directorio d1 a otro d2:

                   

 

Para mover todos los ficheros .xml a un directorio d:

                   

 

Los atributos de la tarea move son:

  • file: fichero origen a mover
  • tofile: fichero destino
  • todir: directorio al que mover el origen
  • overwrite: indicador para habilitar la sobreescritura (por defecto es true)
  • includeEmptyDirs: incluye los directorios vacíos (por defecto es yes)
  • flatten: mueve todos los ficheros a un mismo directorio, ignorando la estructura de directorios existente
  • filtering: indica si al mover se hace filtrado de palabras, mediante elementos filterset (por defecto, es no). Los filterset serán explicados en un artículo posterior.

chmod

La tarea chmod sirve para cambiar los permisos de acceso de los ficheros. Esta tarea sólo tiene efecto en sistemas de ficheros UNIX, similar al comando chmod. Se recomienda consultar la ayuda del comando chmod (man chmod, info chmod o chmod --help) para más información.

Un ejemplo sencillo de uso es el siguiente, para añadir el permiso de ejecución al propietario y al grupo del fichero:

Si en lugar de un fichero se indica un directorio, se cambiarán los permisos del directorio pero no los permisos de los ficheros que hay en el mismo.

Para cambiar los mismos permisos de todos los ficheros de un directorio d, usaríamos algo como:

o alternativamente

                   

 

En el ejemplo anterior no se modifican los permisos del propio directorio (sí los permisos de los ficheros guardados en él).

Los atributos de la tarea chmod son:

  • file: fichero o directorio al cual queremos cambiar los permisos
  • dir: directorio en el cual están los ficheros a los que queremos cambiar los permisos (los permisos del directorio en sí no se cambian)
  • perm: expresión que indica los nuevos permisos
  • parallel: en caso de indicar más de un fichero, todos los cambios se hacen usando un único comando chmod (por defecto es true)
  • type: puede valer file (sólo se cambian los permisos de los ficheros), dir (sólo se cambian los permisos de los directorios) o both (se cambian los permisos tanto de ficheros como de directorios). Por defecto, es file. Además, se pueden usar los atributos includes, includesfile, excludes, excludesfile y defaultexcludes, para indicar conjuntos de ficheros. El uso de estos atributos se explicará en un próximo artículo dedicado a conceptos avanzados.

touch

La tarea touch sirve para cambiar la fecha y hora de modificación de un fichero. Por defecto, se asigna la fecha y hora actuales. En caso de que el fichero no exista, lo crea.

Un ejemplo de uso es:

Para indicar una hora concreta, se podría hacer:

Es posible usar touch sobre un conjunto de ficheros, mediante un elemento fileset anidado. Para cambiar la fecha y hora de todos los ficheros de un directorio d, se usaría algo como:

                   

 

Los atributos de touch son:

  • file: nombre del fichero cuya fecha y hora de modificación se quieren cambiar
  • millis: nueva fecha y hora de modificación, expresada en milisegundos, desde el 1 de Enero de 1970
  • datetime: nueva fecha y hora de modificación, en formato "MM/DD/AA HH:MM AM_o_PM"

echo

La tarea echo sirve para mostrar un mensaje en la salida estándar o en un fichero.

Para mostrar un mensaje por pantalla:

Para guardar un mensaje en un fichero de texto f, que será creado o sobreescrito:

Para añadir un mensaje a un fichero f2, creándolo si no existe:

sleep

La tarea sleep sirve para producir un retardo de duración determinada. No se garantiza en absoluto que el retardo tenga la duración indicado, ni siquiera que llegue a producirse, ya que es una prestación que depende del sistema operativo, de la granularidad de su reloj, de la carga del sistema, etc.

El tiempo a esperar se obtiene como la suma de las horas, minutos, segundos y milisegundos indicados. Alguno de estos valores puede ser negativo siempre y cuando la suma total sea positiva.

Para esperar 1 hora, 20 minutos, 35 segundos y 500 milisegundos, usaríamos algo como:

Además, es posible utilizar el atributo failonerror para detener la ejecución de ant en caso de que se produzca un error durante la espera.

También es posibe usar sleep sin ningún atributo. En este caso no se produce ninguna espera. Simplemente, Ant cede el procesador a otros procesos del sistema.

exec

La tarea exec sirve para ejecutar comandos de sistema. Es posible indicar un sistema operativo en el que ejecutar el comando. En este caso, el comando sólo se ejecutará si el sistema operativo actual es el indicado.

Un ejemplo muy básico, para listar en formato ancho el contenido de "C:" en un sistema Windows 2000:

Los atributos más importantes de exec son:

  • executable: orden a ejecutar, sin parámetros (los parámetros deben indicarse mediante un elemento anidado arg)
  • dir: directorio en el que ejecutar el comando
  • os: nombre del sistema operativo en el que se debe ejecutar el comando
  • output: fichero al cual dirigir la salida del comando
  • timeout: tiempo en milisegundos para que el comando termine (pasado ese tiempo, el comando será interrumpido)
  • failonerror: indicador para detener Ant en caso de que el comando devuelva un código de retorno no nulo (por defecto es false)
  • newenvironment: indicador para utilizar un entorno vacío sin ninguna variable de entorno definida (por defecto es false)

Es posible pasar variables de entorno al comando a ejecutar, de la siguiente manera:

                   

                   

 

 

Fuente: http://www.javahispano.org/contenidos/es/ant_4_tareas_bsicas/#modulo_descargas

Ciclo de STRUTS

Todo parte de un link en una pagina o el browser

http://localhost:8080/myproject/hola.do

Va la peticion web al servidor y es tomada por STRUTS.jar

este genera un ActionForm en este caso "holaForm" con los datos obtenidos del formulario de la pagina si lo hay.

Invoca al Action, en este caso "holaAction", en el evento excecute y le pasa como parametro el holaForm

public ActionForward execute(ActionMapping mapping, ActionForm form,

   HttpServletRequest request, HttpServletResponse response) {
return mapping.findForward("succesfull");
}

 

Si hacemos que en el struts-config.xml algo como:

<action-mappings>

<action path="/hola" type="com.struts.actions.holaAction" scope="request" validate="false" name="holaForm">

<forward name="succesfull" path="/hola.jsp" />

</action>

</action-mappings>

entonces como el forward dice que vaya al path= /hola.jsp mostraremos esa pagina donde deberia tener vinculos a actiones ".do" con lo que arrancaria este ciclo de nuevo

Patrones para usar el LOG 4 j

Conversion CharacterEffect
cUsed to output the category of the logging event. The category conversion specifier can be optionally followed by precision specifier, that is a decimal constant in brackets.

If a precision specifier is given, then only the corresponding number of right most components of the category name will be printed. By default the category name is printed in full.

For example, for the category name "a.b.c" the pattern %c{2} will output "b.c".

CUsed to output the fully qualified class name of the caller issuing the logging request. This conversion specifier can be optionally followed by precision specifier, that is a decimal constant in brackets.

If a precision specifier is given, then only the corresponding number of right most components of the class name will be printed. By default the class name is output in fully qualified form.

For example, for the class name "org.apache.xyz.SomeClass", the pattern %C{1} will output "SomeClass".

WARNING Generating the caller class information is slow. Thus, use should be avoided unless execution speed is not an issue.

dUsed to output the date of the logging event. The date conversion specifier may be followed by a date format specifier enclosed between braces. For example,%d{HH:mm:ss,SSS} or %d{dd MMM yyyy HH:mm:ss,SSS}. If no date format specifier is given then ISO8601 format is assumed.

The date format specifier admits the same syntax as the time pattern string of the SimpleDateFormat. Although part of the standard JDK, the performance ofSimpleDateFormat is quite poor.

For better results it is recommended to use the log4j date formatters. These can be specified using one of the strings "ABSOLUTE", "DATE" and "ISO8601" for specifying AbsoluteTimeDateFormatDateTimeDateFormat and respectively ISO8601DateFormat. For example, %d{ISO8601} or %d{ABSOLUTE}.

These dedicated date formatters perform significantly better than SimpleDateFormat.

FUsed to output the file name where the logging request was issued.

WARNING Generating caller location information is extremely slow and should be avoided unless execution speed is not an issue.

lUsed to output location information of the caller which generated the logging event.

The location information depends on the JVM implementation but usually consists of the fully qualified name of the calling method followed by the callers source the file name and line number between parentheses.

The location information can be very useful. However, its generation is extremely slow and should be avoided unless execution speed is not an issue.

LUsed to output the line number from where the logging request was issued.

WARNING Generating caller location information is extremely slow and should be avoided unless execution speed is not an issue.

mUsed to output the application supplied message associated with the logging event.
MUsed to output the method name where the logging request was issued.

WARNING Generating caller location information is extremely slow and should be avoided unless execution speed is not an issue.

nOutputs the platform dependent line separator character or characters.

This conversion character offers practically the same performance as using non-portable line separator strings such as "n", or "rn". Thus, it is the preferred way of specifying a line separator.

pUsed to output the priority of the logging event.
rUsed to output the number of milliseconds elapsed from the construction of the layout until the creation of the logging event.
tUsed to output the name of the thread that generated the logging event.
xUsed to output the NDC (nested diagnostic context) associated with the thread that generated the logging event.
X

Used to output the MDC (mapped diagnostic context) associated with the thread that generated the logging event. The X conversion character must be followed by the key for the map placed between braces, as in %X{clientNumber} where clientNumber is the key. The value in the MDC corresponding to the key will be output.

See MDC class for more details.

%The sequence %% outputs a single percent sign.

 

Ejemplo de Archivo Log4j.properties

 

log4j.rootLogger=DEBUG, CA, RFA

log4j.appender.CA=org.apache.log4j.ConsoleAppender

log4j.appender.CA.layout=org.apache.log4j.PatternLayout

log4j.appender.CA.layout.ConversionPattern=%d %-5p %c [%t] - %m%n

 

2010-11-26 14:46:39,498 DEBUG com.integrador.soporte.MyLogger [main] - lucas no viene

Ant Tareas Básicas

Descripción

En este artículo vamos a hablar de las tareas más comunes que vienen implementadas por defecto en Ant. La versión utilizada es la 1.4.

javac

La tarea javac sirve para compilar uno o más ficheros fuente en Java. Únicamente se compilan los ficheros que no tengan un fichero .class actualizado (es decir, cuando no existe, o cuando existe pero es más antiguo que el fichero fuente).

Un ejemplo sencillo de uso es el siguiente:


Con esta tarea, se compilan todos los fuentes del directorio fuentes (que debe estar situado en el directorio actual). Las clases resultantes se guardan en el directorio classes (ídem). El classpath en el que buscar clases existentes es /home/jh/lib.

Este ejemplo es equivalente a ejecutar "javac -sourcepath fuentes -classpath /home/jh/lib -d clases *.java"

Por defecto, se utiliza el compilador disponible en el sistema. Para ello, la variable de entorno JAVA_HOME debe apuntar al directorio base del JDK disponible.

Sin embargo, es posible que queramos compilar con otro compilador distinto. Para ello, podemos modificar la propiedad "build.compiler". En el siguiente ejemplo se usa el compilador jikes:








Otros valores de esta propiedad son: classic (javac 1.1 y 1.2), modern (javac 1.3 y 1.4), kjc (del proyecto KOPI), gcj (de GNU), sj (de Symantec), extJava y jvc (de Microsoft).

Algunos de los atributos que admite esta tarea son:

  • verbose: produce información más detallada sobre el proceso de compilación
  • debug: indica si las clases generadas incluyen información de debug (por defecto, off)
  • nowarn: pasa el modificador -nowarn al compilador, para que no genere mensajes de warning (por defecto, off)
  • deprecation: pasa el modificador -deprecation al compilador, para que muestre información detallada sobre el uso de métodos en desuso (por defecto, off)
  • target: genera código para una versión concreta de la máquina virtual, mediante el modificador target pasado al compilador (por ejemplo, target="1.1")
  • optimize: indica al compilador que produzca código optimizado
  • failonerror: indica si el compilador debe seguir compilando cuando encuentre errores (por defecto, true)

Un ejemplo de uso con todos ellos podría ser:




verbose="true" debug="true" nowarn="false" deprecation="false"
target="1.2" optimize="true" failonerror="true"/>


Existen más atributos, de uso más específico. Además, algunos pueden ser utilizados como elementos internos del elemento javac, en lugar de atributos. Para información detallada sobre todo ello, se recomienda consultar la documentación oficial de Ant.

java

La tarea java sirve para ejecutar una aplicación Java. Por defecto, la aplicación se ejecuta en la misma máquina virtual que el propio Ant.

Algunos de los atributos más comunes son:

  • classname: clase Java a ejecutar
  • classpath: classpath a utilizar en la ejecución
  • fork: indica que la aplicación debe iniciarse en una máquina virtual distinta a la de Ant (por defecto, está desactivado)
  • jar: fichero .jar a utilizar (que debe tener una clase con un método main). Si se utiliza este atributo, debe usarse también el atributo fork.
  • dir: en caso de usar fork, indica el directorio desde el que se lanza la nueva máquina virtual
  • jvm: en caso de usar fork, indica el comando para invocar a la nueva máquina virtual (por defecto, java)

Es posible indicar argumentos para la clase (o fichero .jar) a ejecutar. Para ello deben utilizarse elementos arg anidados, de la siguiente manera:




Este ejemplo es equivalente a ejecutar "javac -claspath clases Prueba 1"

Análogamente, es posible indicar argumentos para la máquina virtual, mediante elementos jvmarg anidados:





También es posible determinar el valor de una propiedad de sistema mediante un elemento sysproperty anidado, de la siguiente manera:





Las propiedades definidas de esta manera son accesibles desde el código Java, mediante el método System.getProperty(), pasando como parámetro el nombre de la propiedad ("prueba.nombre" en el ejemplo anterior).

Existen otros atributos y opciones más específicos. Para más detalles se recomienda consultar la documentación oficial de Ant.

javadoc

La tarea javadoc sirve para generar la documentación de los fuentes en formato Javadoc. La mayor parte de sus atributos se corresponden con opciones del comando javadoc, por lo que se recomienda consultar la documentación oficial de javadoc.

Un ejemplo de uso bastante completo sería el siguiente:

	packagenames="p1.sub1,p1.sub2,p2"
verbose="true" author="true" locale="es_ES"
nodeprecated="true" nodeprecatedlist="true"
private="true" splitindex="true" version="true"
windowtitle="Documentación de mi aplicación"
doctitle="Aplicación"
header="Documentación de mi aplicación"
footer="Una aplicación interesante..."
stylesheet="css/estilos.css"
/>

Algunos de los atributos más comunes de javadoc son:

  • sourcefiles: lista separada por comas de los ficheros fuente .java a utilizar
  • sourcepath: ruta donde buscar ficheros fuente .java a utilizar
  • classpath: ruta donde buscar ficheros .class a utilizar
  • destdir: directorio donde guardar la documentación generada como páginas HTML
  • packagenames: lista separada por comas de los paquetes a utilizar
  • excludepackagenames: lista separada por comas de paquetes a excluir (para no ser utilizados en la generación de la documentación)
  • packageList: nombre de un fichero que contiene una lista de nombres de paquetes a utilizar
  • verbose: indicador para mostrar mensajes acerca de la ejecución de javadoc
  • access: indicador del tipo de acceso que tienen los miembros y métodos a documentar de las clases. Debe ser public, protected, package o private.
  • author: indicador para incluir las etiquetas @author
  • locale: locale a usar (ej.: es_ES)
  • nodeprecated: indicador para ignorar las etiqetas @deprecated
  • nodeprecatedlist: indicador para no generar una lista con elementos en desuso
  • nohelp: indicador para no generar un enlace de ayuda
  • noindex: indicador para no generar el índice de identificadores
  • nonavbar: indicador para no generar la barra de navegación
  • notree: indicador para no generar el árbol jerárquico de clases
  • package: indicador para mostrar únicamente los miembros y métodos de las clases con modificadores de acceso public y protected y sin modificador
  • private: indicador para mostrar todos los miembros y métodos
  • protected: indicador para mostrar únicamente los miembros y métodos públicos y protegidos de las clases
  • public: indicador para mostrar únicamente los miembros y métodos públicos de las clases
  • splitindex: indicador para dividir por letras el índice de identificadores
  • use: indicador para generar páginas de uso de las clases y paquetes
  • version: indicador para incluir las etiquetas @version
  • old: indicador para generar la salida en formato 1.1
  • windowtitle: título a mostrar en la barra de título del navegador
  • doctitle: texto HTML a usar como título del índice de paquetes
  • header: texto HTML a usar como encabezado de cada página generada
  • footer: texto HTML a usar como pie de cada página generada
  • bottom: texto HTML a usar al final de cada página generada
  • stylesheet: hoja de estilos CSS a usar

copy

La tarea copy sirve para copiar ficheros y directorios, igual que cp en Linux o copy en MS-DOS y Windows. Por defecto, sólo se copian ficheros que sean más recientes que el destino o que sean nuevos.

La forma de indicar qué ficheros hay que copiar es mediante atributos o mediante filesets. Los filesets serán explicados en un artículo posterior. De momento, utilizaremos algunos ejemplos sencillos:

Para copiar un único fichero f, a otro f2:


Para copiar un fichero f a un directorio d:


Para copiar un directorio d1 a otro directorio d2:




Para copiar todos los ficheros .xml a un directorio d:




Los atributos de la tarea copy son:

  • file: el fichero a copiar, si sólo es uno
  • tofile: el fichero destino, cuando se copia un único fichero
  • todir: el directorio de destino
  • overwrite: fuerza la escritura de los ficheros, aún cuando el destino sea más reciente que el origen (por defecto es no)
  • preservelastmodified: mantiene la fecha de modificación del fichero original (por defecto es no)
  • includeEmptyDirs: copia directorios vacíos (por defecto es no)
  • flatten: copia todos los ficheros a un mismo directorio, ignorando la estructura de directorios existente
  • filtering: indica si en la copia se hace filtrado de palabras, mediante elementos filterset (por defecto, es no). Los filterset serán explicados en un artículo posterior.

delete

La tarea delete sirve para eliminar ficheros y directorios, igual que rm en Linux o delete en MS-DOS y Windows. Algunos ejemplos de uso son:

Para borrar un único fichero f:


Para borrar un directorio d entero, incluyendo los subdirectorios no vacíos:


Para borrar los ficheros .class de un directorio d:




Los atributos de delete son:

  • file: el fichero a borrar, si es uno solo
  • dir: el directorio a borrar
  • verbose: indica el nombre de cada fichero a borrar (por defecto es false)
  • quiet: en caso de error no se muestra ningún mensaje, a menos que se haya ejecutado Ant con -verbose o -debug (por defecto es false). Este indicador intenta simular el parámetro -f del rm de UNIX.
  • failonerror: si el atributo quiet es false, indica si un error en el borrado debe o no detener la ejecución de la tarea (por defecto es true). Si quiet es true, se ignora el valor de failonerror.
  • includeEmptyDirs: si está puesto a true, también borra los directorios vacíos (por defecto es false) Existen cinco atributos más, oficialmente declarados en desuso. Por ello no los comentaremos aquí.

mkdir

La tarea mkdir sirve para crear un directorio.

El único atributo que tiene es dir, con el directorio a crear.

Un ejemplo de uso es:


move

La tarea move sirve mover uno o más ficheros o un directorio, a un nuevo directorio, igual que mv en Linux o move en MS-DOS y Windows. Por defecto, si el destino existe, es sobreescrito. Si la sobreescritura se deshabilita, el origen sólo es movido si es más reciente que el destino, o si éste no existe.

Es posible usar filsets para seleccionar conjuntos de ficheros, al igual que con la tarea copy.

Algunos ejemplos de uso son:

Para cambiar de nombre un fichero, de f1 a f2:


Para mover un fichero f a un directorio d:


Para mover un directorio d1 a otro d2:




Para mover todos los ficheros .xml a un directorio d:




Los atributos de la tarea move son:

  • file: fichero origen a mover
  • tofile: fichero destino
  • todir: directorio al que mover el origen
  • overwrite: indicador para habilitar la sobreescritura (por defecto es true)
  • includeEmptyDirs: incluye los directorios vacíos (por defecto es yes)
  • flatten: mueve todos los ficheros a un mismo directorio, ignorando la estructura de directorios existente
  • filtering: indica si al mover se hace filtrado de palabras, mediante elementos filterset (por defecto, es no). Los filterset serán explicados en un artículo posterior.

chmod

La tarea chmod sirve para cambiar los permisos de acceso de los ficheros. Esta tarea sólo tiene efecto en sistemas de ficheros UNIX, similar al comando chmod. Se recomienda consultar la ayuda del comando chmod (man chmod, info chmod o chmod --help) para más información.

Un ejemplo sencillo de uso es el siguiente, para añadir el permiso de ejecución al propietario y al grupo del fichero:


Si en lugar de un fichero se indica un directorio, se cambiarán los permisos del directorio pero no los permisos de los ficheros que hay en el mismo.

Para cambiar los mismos permisos de todos los ficheros de un directorio d, usaríamos algo como:


o alternativamente




En el ejemplo anterior no se modifican los permisos del propio directorio (sí los permisos de los ficheros guardados en él).

Los atributos de la tarea chmod son:

  • file: fichero o directorio al cual queremos cambiar los permisos
  • dir: directorio en el cual están los ficheros a los que queremos cambiar los permisos (los permisos del directorio en sí no se cambian)
  • perm: expresión que indica los nuevos permisos
  • parallel: en caso de indicar más de un fichero, todos los cambios se hacen usando un único comando chmod (por defecto es true)
  • type: puede valer file (sólo se cambian los permisos de los ficheros), dir (sólo se cambian los permisos de los directorios) o both (se cambian los permisos tanto de ficheros como de directorios). Por defecto, es file. Además, se pueden usar los atributos includes, includesfile, excludes, excludesfile y defaultexcludes, para indicar conjuntos de ficheros. El uso de estos atributos se explicará en un próximo artículo dedicado a conceptos avanzados.

touch

La tarea touch sirve para cambiar la fecha y hora de modificación de un fichero. Por defecto, se asigna la fecha y hora actuales. En caso de que el fichero no exista, lo crea.

Un ejemplo de uso es:


Para indicar una hora concreta, se podría hacer:


Es posible usar touch sobre un conjunto de ficheros, mediante un elemento fileset anidado. Para cambiar la fecha y hora de todos los ficheros de un directorio d, se usaría algo como:




Los atributos de touch son:

  • file: nombre del fichero cuya fecha y hora de modificación se quieren cambiar
  • millis: nueva fecha y hora de modificación, expresada en milisegundos, desde el 1 de Enero de 1970
  • datetime: nueva fecha y hora de modificación, en formato "MM/DD/AA HH:MM AM_o_PM"

echo

La tarea echo sirve para mostrar un mensaje en la salida estándar o en un fichero.

Para mostrar un mensaje por pantalla:


Para guardar un mensaje en un fichero de texto f, que será creado o sobreescrito:


Para añadir un mensaje a un fichero f2, creándolo si no existe:


sleep

La tarea sleep sirve para producir un retardo de duración determinada. No se garantiza en absoluto que el retardo tenga la duración indicado, ni siquiera que llegue a producirse, ya que es una prestación que depende del sistema operativo, de la granularidad de su reloj, de la carga del sistema, etc.

El tiempo a esperar se obtiene como la suma de las horas, minutos, segundos y milisegundos indicados. Alguno de estos valores puede ser negativo siempre y cuando la suma total sea positiva.

Para esperar 1 hora, 20 minutos, 35 segundos y 500 milisegundos, usaríamos algo como:


Además, es posible utilizar el atributo failonerror para detener la ejecución de ant en caso de que se produzca un error durante la espera.

También es posibe usar sleep sin ningún atributo. En este caso no se produce ninguna espera. Simplemente, Ant cede el procesador a otros procesos del sistema.

exec

La tarea exec sirve para ejecutar comandos de sistema. Es posible indicar un sistema operativo en el que ejecutar el comando. En este caso, el comando sólo se ejecutará si el sistema operativo actual es el indicado.

Un ejemplo muy básico, para listar en formato ancho el contenido de "C:" en un sistema Windows 2000:

 

Los atributos más importantes de exec son:

  • executable: orden a ejecutar, sin parámetros (los parámetros deben indicarse mediante un elemento anidado arg)
  • dir: directorio en el que ejecutar el comando
  • os: nombre del sistema operativo en el que se debe ejecutar el comando
  • output: fichero al cual dirigir la salida del comando
  • timeout: tiempo en milisegundos para que el comando termine (pasado ese tiempo, el comando será interrumpido)
  • failonerror: indicador para detener Ant en caso de que el comando devuelva un código de retorno no nulo (por defecto es false)
  • newenvironment: indicador para utilizar un entorno vacío sin ninguna variable de entorno definida (por defecto es false)

Es posible pasar variables de entorno al comando a ejecutar, de la siguiente manera:




war - estructura de directorios de una aplicación web

Los ficheros .war (Web ARchives) son los archivos que contienen una aplicación web, y no son más que los archivos de la aplicación web estructurado según el formato de las especficaciones de sun.

Esta estructura de directorios la podemos consultar en el capítulo 9.5 del documento Especificaciones Servlets 2.4 Sun de las especificaciones 2.4. Expondré un posible ejemplo, en negrita lo que es obligatorio:

/index.jsp
/WebContent/jsp/welcome.jsp
/WebContent/css/estilo.css
/WebContent/js/utils.js
/WebContent/img/welcome.jpg
/WEB-INF/web.xml
/WEB-INF/struts-config.xml
/WEB-INF/lib/struts.jar
/WEB-INF/src/com/empresa/proyecto/action/welcomeAction.java
/WEB-INF/classess/com/empresa/proyecto/action/welcomeAction.class

Generar claves unicas para objetos

java.util.UUID.randomUUID()

Devuelve una clave única para objetos, que puede usarse para guardar los objetos en la base de datos.

Link para Struts

http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=strutsb

Configurar JAVA_HOME

 

Stage 1. Locate Install Directory

If you already know the install path for the Java or Software Development Kit, go to Stage 2. Otherwise, find the install path by following these instructions:

  1. Unless you changed the install path for the Java Developement Kit during installation, it will be in a directory under C:Program FilesJava. Using Explorer, open the directoryC:Program FilesJava
  2. Inside that path will be one or more subdirectories such as jdk1.5.0_08. If you just installed the Java Development Kit, it will be installed to the newest directory, which you can find by sorting by date. For example, it may be installed in C:Program FilesJavajdk1.5.0_08. This is the install path.

Stage 2. Apply Setting

Once you have identified the JDK install path:

  1. Right click on the My Computer icon on your desktop and select properties
  2. Click the Advanced Tab
  3. Click the Environment Variables button
  4. Under System Variable, click New
  5. Enter the variable name as JAVA_HOME
  6. Enter the variable value as the install path for the Development Kit
  7. Click OK
  8. Click Apply Changes
  9. If you are running Confluence as a EAR/WAR rather than the Standalone, you may need to restart your application server
    This diagram shows setting the JAVA_HOME variable to an install path of c:/j2sdk1.4.2

Pasar un numero variable de parametros en Java

Esto es para definir funciones donde quiero variar el numero de parametros cuando la use.

 

En realidad se convierte en un array en tiempo de compilación, pero que se le va a hacer, algo es algo. Además, puntos extra por utilizar un foreach para la demostración.

public class Conjunto 
{
public Conjunto(String... cadenas)
{
for (String cadena : cadenas)
System.out.println(cadena);
}

public static void main(String... args)
{
Conjunto saludos = new Conjunto("Hola", "Ciao", "Hello");
Conjunto mascotas = new Conjunto("Pulpo");
}
}

 

Diagrama de Clases

Diagrama de Clases

Probar Conexion ORACLE

Para Agregar el Driver tiene que bajar el archivo ojdbc14.jar (Probe el 16 y no funciona)

Ir al explorar de proyectos (donde esta el arbol con los archivos)

Boton derecho sobre tu proyecto en mi caso INTEGRADOR

Ir a Properties

Ir a JAVA BUILT PATH

Presionar el boton Add External JARs

Selecciona el archivo ojdbc14.jar

 

Lo que esta en negrita tienen que reemplazarlo por sus datos de conexion

-----------------------

import java.sql.*;

import oracle.jdbc.driver.OracleDriver;

class dbAccess {

public static void main(String args[]) throws SQLException, ClassNotFoundException {

String usr = "user";

String pwd = "password";

String url = "jdbc:oracle:thin:@ip_adress:port/data_base_name";

DriverManager.registerDriver(new OracleDriver());

Connection conn = DriverManager.getConnection(url,usr,pwd);

Statement stmt = conn.createStatement();

ResultSet rset = stmt.executeQuery("select BANNER from SYS.V_$VERSION");

while (rset.next()) {

System.out.println(rset.getString(1));

// Print col 1

}

stmt.close();

}

}

Manejar PROPERTIES con SINGLETON

import java.util.ResourceBundle;

public abstract class MyProperties {

private static ResourceBundle myResources;

public static String getProperty(String key){

if(myResources==null){

myResources = ResourceBundle.getBundle("hola");

}

return myResources.getString(key);

}

public static void main(String[] args){

System.out.println(MyProperties.getProperty("titulo"));

}

}

DER y Diagrama de Clases

DER y Diagrama de Clases

SCRIPT BD Integrador

CREATE TABLE Personas

( idPersona INTEGER IDENTITY(1,0) NOT NULL
, nombre VARCHAR(50) NOT NULL
, apellido VARCHAR(50) NOT NULL
, CONSTRAINT pk_personas PRIMARY KEY (idPersona)
);

CREATE TABLE Usuarios

( idUsuario INTEGER IDENTITY(1,0) NOT NULL
, idPersona INTEGER NOT NULL
, user VARCHAR(20) NOT NULL
, password VARCHAR(20) NOT NULL
, CONSTRAINT pk_Usuarios PRIMARY KEY (idUsuario)
, CONSTRAINT fK_Usuario_Persona FOREIGN KEY (idPersona) REFERENCES Personas(idPersona)
);

CREATE TABLE ContactosTipos

( idContactoTipo INTEGER IDENTITY(1,0) NOT NULL
, descripcion VARCHAR(50) NOT NULL
, CONSTRAINT pk_ContactosTipos PRIMARY KEY (idContactoTipo)
);

CREATE TABLE Contactos

( idContacto INTEGER IDENTITY(1,0) NOT NULL
, idPersona INTEGER NOT NULL
, idContactoTipo INTEGER NOT NULL
, idContactoUsuario INTEGER NOT NULL
, CONSTRAINT pk_Contactos PRIMARY KEY (idContacto)
, CONSTRAINT fK_Contacto_ContactoTipo FOREIGN KEY (idContactoTipo) REFERENCES ContactosTipos(idContactoTipo)
);

CREATE TABLE ContactosDomicilios

( idContactoDomicilio INTEGER IDENTITY(1,0) NOT NULL
, idContacto INTEGER NOT NULL
, descripcion VARCHAR(50) NOT NULL
, CONSTRAINT pk_ContactosDomicilios PRIMARY KEY (idContactoDomicilio)
, CONSTRAINT fK_ContactoDomicilio_Contacto FOREIGN KEY (idContacto) REFERENCES Contactos(idContacto)

);

CREATE TABLE ContactosTelefonos

( idContactoTelefono INTEGER IDENTITY(1,0) NOT NULL
, idContacto INTEGER NOT NULL
, codigo VARCHAR(10)
, numero VARCHAR(50) NOT NULL
, CONSTRAINT pk_ContactosTelefonos PRIMARY KEY (idContactoTelefono)
, CONSTRAINT fK_ContactoTelefono_Contacto FOREIGN KEY (idContacto) REFERENCES Contactos(idContacto)
);

INSERT INTO Personas VALUES (1,'Pepe', 'Riquelme');
INSERT INTO Personas VALUES (2,'Leo', 'Pina');
INSERT INTO Personas VALUES (3,'Dolly', 'Gonzalez');
INSERT INTO Personas VALUES (4,'Maxi', 'Sampaoli');
INSERT INTO Personas VALUES (5,'Eugy', 'Etcheverry');
INSERT INTO Personas VALUES (6,'Juan', 'Faricelli');
INSERT INTO Personas VALUES (7,'Luciana', 'Arce');
INSERT INTO Personas VALUES (8,'Nicolas', 'Pereira');


INSERT INTO Usuarios VALUES (1,1,'PepeUser','hola');
INSERT INTO Usuarios VALUES (2,2,'LeoUser','chau');
INSERT INTO Usuarios VALUES (3,3,'DollyUser','juan');
INSERT INTO Usuarios VALUES (4,4,'MaxiUser','pepe');

Uso de Log4J

Como base en el ejemplo de JUnit, vamos a ver una forma muy pero muy (pero muy) simple de la utilizacion de esta librería, enviando a un file los resultados de la ejecucion de los metodos de testeo de la clase Math.

La libreria se divide principalmente en 3 clases Logger, de donde obtenemos el objeto que generará los mensajes, Appender quien recibe los mensajes del Logger y los envia a donde le digamos (archivo, consola, mail, base de datos) y Layout donde configuramos el formato visual que tendrán nuestros mensajes.

La clase Logger dispone de varios niveles de prioridad, de menor a mayor:

log.trace("un mensaje");
log.debug("un mensaje");
log.info("un mensaje");
log.warn("un mensaje");
log.error("un mensaje");
log.fatal("un mensaje");

A continuacion el codigo de la clase TestMath modificado solo el 1er metodo:
import junit.framework.TestCase;
import org.apache.log4j.*;

public class TestMath extends TestCase { 

static Logger log = Logger.getLogger(TestMath.class);

log.setLevel(Level.INFO); //seteamos el nivel minimo de prioridad de //mensajes

//por debajo de este nivel, no nos llegaran mensajes de logs.

//lo que hacemos luego es crear un objeto Appender, que es el que nos envia

//los logs a donde nosotros le especifiquemos

SimpleLayout miLayout = new SimpleLayout(); //el layout es el formato en...

//...el que se mostraran nuestros mensajes log.

Appender miAppender = new FileAppender(miLayout); //los logs seran enviados //a un File...

log.setAppender(miAppender); //asignamos el appender al log.

protected void setUp() { // put common setup code in here   }     

protected void tearDown() { // put common cleanup code in here  }

public void testAdd() {      

int num1 = 3;

int num2 = 2;      

int total = 5;      

int sum = 0;      

sum = Math.add(num1, num2);      

assertEquals(sum, total); 

log.info("El valor de la suma es: " + total);

log.info("El valor obtenido es: " + sum); 

}    

public void testMulitply() {

...

}

public void testDivision() {

...

}

}

En forma muy básica este es el uso de la librería Log4J. Que conste que en aplicaciones empresariales de mayor nivel, todo se configura a través de .properties o archivos XML, tanto los layouts como la salida de los logs (consola, archivos, email, o incluso una base de datos).

Mas info:

http://www.developer.com/open/article.php/3097221/Logging-with-log4jmdashAn-Efficient-Way-to-Log-Java-Applications.htm (el mejor, en INGLÉS)

http://www.apuntesdejava.com/2006/02/log4j.html (el mas completo, pero de mayor complejidad)

http://chuwiki.chuidiang.org/index.php?title=Ejemplo_con_log4j (muy bueno tambien)

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

DAO Interface

public interface Dao<O,K> {

 public abstract void delete(K key);
 
 public abstract void insert(O object);
 
 public abstract void update(K key,O object);
 
 public abstract O getOne(K key);
 
 public abstract O[] getAll();
 
 public abstract int count();

}

Esta interfaz usa generics que muestran los metodos tipicos que tiene un objeto DAO. El objeto DAO encapsulará el acceso a datos cualquiera que sea.

 

Singleton

La clase MyConnection solo debe ser instanciada una vez (por ejemplo puede ser una conexion de red o conexion a un archivo que voy a modificar). La idea es tener un contructor privado.

La clase tiene una instancia de si misma como atributo privado y tiene un método que retorna esa instancia.

public class MyConnection {

 private static MyConnection c;

 private MyConnection() {

...

}

 // SINGLETTON
public static MyConnection getConexion() {

if (c == null) {

c = new MyConnection();

}

return c;

}

}

Cambiar el option a Completion Overwrite.

ir a WINDOW -> PREFERENCES -> JAVA -> EDITOR -> CONTENTASIST -> option Completion overwirte

 

Hotkeys para Eclipse

  • CTRL+L Salta a la Linea
  • CTRL+O Metodos dentro de la clase
  • CTRL+D Borra linea
  • CTRL+7 comenta linea
  • CTRL+SHITF+F Formatea el codigo de la clase
  • CTRL+SHITF+M Agrega import

Properties

Teniendo un paquete que se llama MVC, y en ese paquete se encuentro un archivo llamado app.properties

MyProject/src/MVC/app.properties

No importa desde que paquete quiera llamarlo se invoca asi

ResourceBundle myResources = ResourceBundle.getBundle("MVC.app");

NOTAS:

  • Como se puede ver entre el paquete MVC y el archivo se tiene como separador el "." (punto) y no la "/" (barra)
  • Y no hay que ponerle la extension del archivo ".properties"

 

FRAGMENTO DEL ARCHIVO app.properties ------------------------------

#titulo en ingles
title=MVC es un masa

FIN DEL FRAGMENTO DEL ARCHIVO app.properties ------------------------------

 

Para obtener una propiedad "title" del archivo app.properties se usa

String strTitle = myResources.getString("title");

La cadena strTitle va a contener ahora "MVC es un masa"