tag:blogger.com,1999:blog-340131162009-07-06T15:47:20.881-03:00HolaMundo.java (online)por Pablo Augusto SznajdlederPabloSZnoreply@blogger.comBlogger35125tag:blogger.com,1999:blog-34013116.post-75613702843295494812008-07-23T07:54:00.010-03:002009-07-06T15:47:20.901-03:00Reestructurando el Blog<span style="color: rgb(255, 255, 255);">.</span><br /><div style="text-align: center;">Estimado lector, a partir del día de la fecha el blog HolaMundo.java comenzará a ser reestructurado (valga la paradoja).<br />Por favor, disculpe las molestias.<br /><br />Pablo.<br /><br /><br /><span style="color: rgb(255, 0, 0);">PROGRESO 68%</span><span style="color: rgb(255, 0, 0);">.....</span><br />(6/Julio/2009)<span style="color: rgb(255, 255, 255);">.</span><br /><br /><span style="color: rgb(255, 0, 0);">PROGRESO 60%</span><span style="color: rgb(255, 0, 0);">.....</span><br />(30/Abril/2009)<br /><br /><span style="color: rgb(255, 0, 0);">Falta poco... solo un poco más de paciencia...</span><br />(29/Diciembre/2008)<br /><br />Este es el responsable de la demora en la reestructuración del blog:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_X1IHMrfIpE8/SlJGhJ2J51I/AAAAAAAAD44/dcOsOaBBq3o/s1600-h/viano1.jpg"><img style="cursor: pointer; width: 154px; height: 225px;" src="http://2.bp.blogspot.com/_X1IHMrfIpE8/SlJGhJ2J51I/AAAAAAAAD44/dcOsOaBBq3o/s400/viano1.jpg" alt="" id="BLOGGER_PHOTO_ID_5355420442289629010" border="0" /></a><br />Las quejas por favor remitirlas a OctavianitoSZ.<br />Gracias.<br /><br />Felíz 2009,<br />Pablo.<br /><span style="color: rgb(255, 255, 255);">.</span><br /></div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34013116-7561370284329549481?l=holamundojava.blogspot.com'/></div>PabloSZnoreply@blogger.com1tag:blogger.com,1999:blog-34013116.post-62985996093035517632008-01-12T14:34:00.001-02:002008-01-13T17:11:59.858-02:00Introducción<span style="color: rgb(255, 255, 255);">.</span><br />Java es un lenguaje de programación orientado a objetos de propósitos generales con una sintaxis similar a la de <span style="font-weight: bold;">C</span> o <span style="font-weight: bold;">C++</span>.<br /><br />Cuando apereció Java (mediados de 1995) llegó con dos propuestas que lo distinguían de los otros lenguajes:<br /><ul><li>La posibilidad de desarrollar <span style="font-weight: bold;">Applets</span></li><li>El hecho de ser un lenguaje <span style="font-weight: bold;">Multiplataforma</span></li></ul><br /><span style="font-weight: bold;font-size:100%;" >Applets</span><br /><br />Los Applets son programas Java con la “habilidad” de poder correr dentro de una página web, dentro de un browser. Una página puede incluir Applets con un TAG especial como se muestra a continuación:<br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax17">&lt;</span><span class="syntax17">html</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 3:</span><span class="syntax17">&lt;</span><span class="syntax17">body</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 4:</span><span class="syntax17">&lt;</span><span class="syntax17">applet</span><span class="syntax17"> </span><span class="syntax17">code</span><span class="syntax17"> </span><span class="syntax18">=</span><span class="syntax13">"</span><span class="syntax13">MiApplet.class</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutterH"> 5:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">height</span><span class="syntax18">=</span><span class="syntax13">"</span><span class="syntax13">300</span><span class="syntax13">"</span><br /><span class="gutter"> 6:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">width</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax18">=</span><span class="syntax17"> </span><span class="syntax13">"</span><span class="syntax13">300</span><span class="syntax13">"</span><span class="syntax17">&gt;</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">applet</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 7:</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">body</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 8:</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">html</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 9:</span><br /></span></pre><br />En aquella época los browsers (<span style="font-weight: bold;">Netscape 3</span>, <span style="font-weight: bold;">Internet Explorer 2</span>) traían incorporada la <span style="font-weight: bold;">máquina virtual Java</span> por lo tanto el mismo browser era suficiente para correr el Applet.<br /><br />El problema de los applets es que si son medianamente complejos pueden ocupar unos cuantos KBytes y (en aquellos tiempos, con modems de 14400) realmente se hacían difíciles de descargar.<br /><br />Hoy en día los Applets tienen otro problema: los browsers no traen la máquina virtual, por lo tanto para poder ver páginas que incluyan Applets tenemos que instalar un plugin especial lo que (al menos para mi) resulta bastante molesto.<br /><br />Podríamos decir que los Applets murieron. Hoy existe tecnología mucho más dinámica y liviana que permite añadir funcionalidad a una página web: AJAX, Flex, etc. Como ejemplo simplemente tenemos que ver cualquiera de los servicios de Google.<br /><br /><span style="font-weight: bold;">Multiplataforma</span><br /><br />La Multiplataforma es el principal feature de Java. Un programa Java puede correr en cualquier sistema operativo y en cualquier hardware sin tener que ser recompilado. Esto se debe a que en realidad el programa corre interpretado por una máquina virtual llamada <span style="font-weight: bold;">JVM </span>(Java Virtual Machine) o <span style="font-weight: bold;">JRE </span>(Java Runtime Enviroment).<br /><br />Actualmente existe JRE disponible practicamente para todas las plataformas (Sistema Operativo + Hardware). Esto quiere decir que un programa Java puede correr en:<br /><ul><li>Windows</li><li>Linux</li><li>Solaris</li><li>AIX</li><li>Macintosh</li><li>AS 400</li><li>Etc.</li></ul>Si el sistema operativo no trae incorporada la máquina virtual o si trae una versión vieja la podemos descargar para instalar y/o actualizar de <a href="http://java.sun.com/">http://java.sun.com</a>.<br /><br /><span style="font-weight: bold;">Versiones</span><br /><br />Cuando comenzé con Java la versión estable era: <span style="font-weight: bold;">JDK1.0.2</span> (Java Development Kit). Luego salió la versión <span style="font-weight: bold;">JDK1.1.<span style="font-style: italic;">x</span></span>, luego la <span style="font-weight: bold;">JDK1.2.<span style="font-style: italic;">x</span></span> y así.<br /><br />Lo interesante es que cada nueva versión incluye a la anterior por lo tanto quien comenzó trabajando con JDK1.0.2 no tuvo que "descartar todo lo que sabia" para pasar a JDK1.1.x.<br /><br /><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_X1IHMrfIpE8/R4jx9A-lvuI/AAAAAAAABoI/oOWknuaURq0/s1600-h/versiones.jpg"><img style="cursor: pointer;" src="http://4.bp.blogspot.com/_X1IHMrfIpE8/R4jx9A-lvuI/AAAAAAAABoI/oOWknuaURq0/s400/versiones.jpg" alt="" id="BLOGGER_PHOTO_ID_5154635804062367458" border="0" /></a><br /><div style="text-align: left;"><br />Sin embargo, entre versión y versión se aplican ciertas mejoras y/o correcciones. Por ejemplo: JDK1.1 incorporó la tecnología <span style="font-weight: bold;">JavaBeans</span>. Basicamente esta tecnología describe un <span style="font-weight: bold;">bean </span>como un objeto con sus <span style="font-weight: bold;">atributos </span>y <span style="font-weight: bold;">métodos de acceso</span> (accesors methods): <span style="font-weight: bold;">setters </span>y <span style="font-weight: bold;">getters</span>, y convirtió a todos los componentes gráficos en beans.<br /><br />En JDK1.1 los componentes gráficos (botones, combos, areas de texto, etc) se convirieron en JavaBeans y se agregaron los métodos de acceso para sus atributos. Por ejemplo: para el atributo <span style="font-weight: bold;">size </span>de los componentes gráficos se agregaron los métodos <span style="font-weight: bold;">getSize </span>y <span style="font-weight: bold;">setSize </span>para asignar un nuevo tamaño al componente. El viejo método que haciá esto se llamaba <span style="font-weight: bold;">resize </span>y quedó obsoleto o <span style="font-weight: bold;">deprecated</span>. Esto implica que si intentamos compilar un programa que aplique el método <span style="font-weight: bold;">resize </span>sobre un componente el compilador va a mostrar un <span style="font-weight: bold;">warning </span>indicando que ese método quedó obsoleto e invitándonos a consultar la documentación para conocer las causas y cual es el método por el cual lo tenemos que reemplazar.<br /><br /><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_X1IHMrfIpE8/R4jzVg-lvvI/AAAAAAAABoQ/idO5pY7Oxbo/s1600-h/deprecated.jpg"><img style="cursor: pointer;" src="http://2.bp.blogspot.com/_X1IHMrfIpE8/R4jzVg-lvvI/AAAAAAAABoQ/idO5pY7Oxbo/s400/deprecated.jpg" alt="" id="BLOGGER_PHOTO_ID_5154637324480790258" border="0" /></a><br /></div><br />La imagen permite ver como <span style="font-weight: bold;">Eclipse </span>(la herramienta que vamos a utilizar) nos indica que estamos utilizando un método <span style="font-weight: bold;">deprecated</span>.<br /><br />A partir de <span style="font-weight: bold;">JDK1.2 </span>se aplicó un cambio de nomemclatura, se comenzó a hablar de <span style="font-weight: bold;">Java 2</span> y se crearon dos distribuciones:<br /><div style="text-align: left;"><ul><li><span style="font-weight: bold;">J2SE </span>– "Java 2 Standard Edition"</li><li><span style="font-weight: bold;">J2EE </span>– "Java 2 Enterprise Edition"</li></ul></div><br /><span style="font-weight: bold;">J2SE </span>es el lenguaje de programación propiamente dicho: compilador, librerías básicas (que incluyen las clases <span style="font-weight: bold;">String</span>, <span style="font-weight: bold;">Object</span>, <span style="font-weight: bold;">System</span>, etc) y herramientas de desarrollo como el debugger, un documentador, etc.<br /><br /><span style="font-weight: bold;">J2EE </span>son “extensiones para el desarrollo de aplicaciones empresariales”. Esto lo veremos un poco más adelante pero podemos ir adelantando que incluye (por ejemplo) la tecnología Java desarrollar aplicaciones WEB: <span style="font-weight: bold;">Servlets</span>, <span style="font-weight: bold;">JSP</span>, etc.<br /><br /><br /><span style="font-weight: bold;font-size:130%;" >Comparando Java con C y C++</span><br /><br /><span style="font-weight: bold;">Algunas diferencias</span><br /><br />Si comparamos Java con C o C++ veremos que Java es mucho más simple. Por ejemplo: en C o C++ los strings son arrays de caracteres con un último caracter ‘\0’ (barra cero). En Java tenemos la clase <span style="font-weight: bold;">String </span>que permite manejar cadenas de caracteres a “alto nivel” como en los otros lenguajes.<br /><br />String s1 = “Hola, ”;<br />String s2 = “que tal...???”;<br />String s3 = s1 + s2;<br /><br />Respecto de los booleans, en C y C++ se manejan con valores numéricos enteros. Una variable <span style="font-weight: bold;">int </span>con valor 0 (cero) representa <span style="font-weight: bold;">false </span>y con valor distinto de cero representa <span style="font-weight: bold;">true</span>. En Java existe el tipo <span style="font-weight: bold;">boolean</span>.<br /><br />boolean b1 = true; <span style="color: rgb(51, 51, 255);">// asigno true a b1</span><br />boolean b2 = !b1; <span style="color: rgb(51, 51, 255);">// asigno la negacion de b1 a b2</span><br />boolean b3 = "esto es una cadena".length()&lt;=0;<br /><br />En <span style="font-weight: bold;">b3</span> estamos asignando el resultado lógico de la proposición:<br /><br />“esto es una cadena”.length()&lt;=0<br /><br />“esto es una cadena” es un<span style="font-weight: bold;"> literal String</span>; es un String por lo tanto es un objeto y como tal tiene métodos. En este caso aplicamos el método <span style="font-weight: bold;">length </span>que retorna la longitud del String y la comparamos con cero para asignar <span style="font-weight: bold;">true </span>o <span style="font-weight: bold;">false </span>según sea el resultado.<br /><br />Otro punto importante que diferencia a Java de C y C++ es la liberación de memoria. En C alocamos memoria y cuando no la necesitamos más la tenemos que liberar.<br /><br />char *s = “Esto es una cadena”;<br />free(s);<br />s = “Esta es otra cadena”:<br /><br />En Java no es necesario liberar la memoria que vamos a desreferenciar porque existe el <span style="font-weight: bold;">Garbage Collector</span> (o recolector de residuos) que se ocupa de liberar la memoria a medida que queda desreferenciada.<br /><br />String s = “Esto es una cadena”;<br />s = “Esto es otra cadena”;<br /><br />Respecto de C++, en Java no existe herencia múltiple. Todas las clases heredan de la clase base <span style="font-weight: bold;">Object </span>(como en Smalltalk). Tampoco existen los destructores ni la sobrecarga de operadores.<br /><br /><span style="font-weight: bold;">Algunas Similitudes</span><br /><br />Los tipos de datos primitivos son idénticos: <span style="font-weight: bold;">short</span>, <span style="font-weight: bold;">int</span>, <span style="font-weight: bold;">long</span>, <span style="font-weight: bold;">float</span>, <span style="font-weight: bold;">double</span>, <span style="font-weight: bold;">char</span>. Java además agrega: <span style="font-weight: bold;">byte </span>y <span style="font-weight: bold;">boolean</span>.<br /><br />Las sentencias para codificar las estructuras de control: <span style="font-weight: bold;">while</span>, <span style="font-weight: bold;">do while</span>, <span style="font-weight: bold;">for</span>, <span style="font-weight: bold;">if </span>y <span style="font-weight: bold;">switch </span>son las mismas.<br /><br />Los operadores lógicos y binarios son los mismos también.<br /><br />Veamos algunas comparaciones:<br /><br /><span style="font-weight: bold;">HolaMundo.c</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">#</span><span class="syntax17">include</span> <span class="syntax13">&lt;</span><span class="syntax13">stdio.h</span><span class="syntax13">&gt;</span><br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax10">int</span> <span class="syntax6">main</span><span class="syntax18">(</span><span class="syntax18">)</span><br /><span class="gutterH"> 5:</span><span class="syntax18">{</span><br /><span class="gutter"> 6:</span> <span class="syntax1">/*</span><span class="syntax1"> </span><span class="syntax1">imprime</span><span class="syntax1"> </span><span class="syntax1">en</span><span class="syntax1"> </span><span class="syntax1">stdout</span><span class="syntax1"> </span><span class="syntax1">*/</span><br /><span class="gutter"> 7:</span> <span class="syntax6">printf</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Hola</span><span class="syntax13"> </span><span class="syntax13">Mundo</span><span class="syntax13"> </span><span class="syntax13">C</span><span class="syntax13">"</span><span class="syntax18">)</span><span class="syntax18">;</span><br /><span class="gutter"> 8:</span><span class="syntax18">}</span><br /><span class="gutter"> 9:</span><br /></span></pre><br /><span style="font-weight: bold;">HolaMundo.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax8">public</span> <span class="syntax10">class</span> HolaMundo<br /><span class="gutter"> 3:</span><span class="syntax18">{</span><br /><span class="gutter"> 4:</span> <span class="syntax8">public</span> <span class="syntax8">static</span> <span class="syntax10">void</span> <span class="syntax6">main</span><span class="syntax18">(</span>String args[]<span class="syntax18">)</span><br /><span class="gutterH"> 5:</span> <span class="syntax18">{</span><br /><span class="gutter"> 6:</span> <span class="syntax1">/*</span><span class="syntax1"> </span><span class="syntax1">imprime</span><span class="syntax1"> </span><span class="syntax1">en</span><span class="syntax1"> </span><span class="syntax1">stdout</span><span class="syntax1"> </span><span class="syntax1">*/</span><br /><span class="gutter"> 7:</span> System.out.<span class="syntax6">println</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Hola</span><span class="syntax13"> </span><span class="syntax13">Mundo</span><span class="syntax13"> </span><span class="syntax13">Java</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 8:</span> <span class="syntax18">}</span><br /><span class="gutter"> 9:</span><span class="syntax18">}</span><br /><span class="gutterH"> 10:</span><br /></span></pre><br />En Java cualquier programa (incluso un simple "Hola Mundo") debe ser una clase ya que es un lenguaje fuertemente orientado a objetos.<br /><br />El "printf" de Java es el <span style="font-weight: bold;">System.out.println</span>. La función <span style="font-weight: bold;">main </span>debe ser pública y estática (temas que veremos en el capítulo de objetos). Los comentarios, llaves y "punto y coma" son idénticos a C (también se puede comentar con "//" como en C++).<br /><br /><span style="font-weight: bold;">Numeros.c</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">#</span><span class="syntax17">include</span> <span class="syntax13">&lt;</span><span class="syntax13">stdio.h</span><span class="syntax13">&gt;</span><br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax10">int</span> <span class="syntax6">main</span><span class="syntax18">(</span><span class="syntax10">int</span> argc<span class="syntax18">,</span> <span class="syntax10">char</span> <span class="syntax18">*</span><span class="syntax18">*</span>argv<span class="syntax18">)</span><br /><span class="gutterH"> 5:</span><span class="syntax18">{</span><br /><span class="gutter"> 6:</span> <span class="syntax10">int</span> i<span class="syntax18">,</span>n<span class="syntax18">;</span><br /><span class="gutter"> 7:</span> <span class="syntax8">if</span><span class="syntax18">(</span> argc<span class="syntax18">&lt;</span><span class="syntax5">2</span> <span class="syntax18">)</span><br /><span class="gutter"> 8:</span> <span class="syntax18">{</span><br /><span class="gutter"> 9:</span> <span class="syntax6">printf</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Debe</span><span class="syntax13"> </span><span class="syntax13">pasar</span><span class="syntax13"> </span><span class="syntax13">el</span><span class="syntax13"> </span><span class="syntax13">argumento</span><span class="syntax13">"</span><span class="syntax18">)</span><span class="syntax18">;</span><br /><span class="gutterH"> 10:</span> <span class="syntax8">return</span> <span class="syntax5">0</span><span class="syntax18">;</span><br /><span class="gutter"> 11:</span> <span class="syntax18">}</span><br /><span class="gutter"> 12:</span><br /><span class="gutter"> 13:</span> n<span class="syntax18">=</span><span class="syntax6">atoi</span><span class="syntax18">(</span>argv<span class="syntax18">[</span><span class="syntax5">1</span><span class="syntax18">]</span><span class="syntax18">)</span><span class="syntax18">;</span><br /><span class="gutter"> 14:</span> <span class="syntax8">for</span><span class="syntax18">(</span> i<span class="syntax18">=</span><span class="syntax5">0</span><span class="syntax18">;</span> i<span class="syntax18">&lt;</span>n<span class="syntax18">;</span> i<span class="syntax18">+</span><span class="syntax18">+</span> <span class="syntax18">)</span><br /><span class="gutterH"> 15:</span> <span class="syntax18">{</span><br /><span class="gutter"> 16:</span> <span class="syntax6">printf</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">%d\n</span><span class="syntax13">"</span><span class="syntax18">,</span>i<span class="syntax18">)</span><span class="syntax18">;</span><br /><span class="gutter"> 17:</span> <span class="syntax18">}</span><br /><span class="gutter"> 18:</span> <span class="syntax8">return</span> <span class="syntax5">0</span><span class="syntax18">;</span><br /><span class="gutter"> 19:</span><span class="syntax18">}</span><br /><span class="gutterH"> 20:</span><br /></span></pre><br /><span style="font-weight: bold;">Numeros.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">import</span> java.lang.*;<br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax8">public</span> <span class="syntax10">class</span> Numeros<br /><span class="gutterH"> 5:</span><span class="syntax18">{</span><br /><span class="gutter"> 6:</span> <span class="syntax8">public</span> <span class="syntax8">static</span> <span class="syntax10">void</span> <span class="syntax6">main</span><span class="syntax18">(</span>String args[]<span class="syntax18">)</span><br /><span class="gutter"> 7:</span> <span class="syntax18">{</span><br /><span class="gutter"> 8:</span> <span class="syntax10">int</span> i,n;<br /><span class="gutter"> 9:</span><br /><span class="gutterH"> 10:</span> <span class="syntax8">if</span><span class="syntax18">(</span> args.length<span class="syntax18">&lt;</span><span class="syntax5">1</span> <span class="syntax18">)</span><br /><span class="gutter"> 11:</span> <span class="syntax18">{</span><br /><span class="gutter"> 12:</span> System.out.<span class="syntax6">println</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Debe</span><span class="syntax13"> </span><span class="syntax13">pasar</span><span class="syntax13"> </span><span class="syntax13">el</span><span class="syntax13"> </span><span class="syntax13">argumento</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 13:</span> <span class="syntax8">return</span>;<br /><span class="gutter"> 14:</span> <span class="syntax18">}</span><br /><span class="gutterH"> 15:</span><br /><span class="gutter"> 16:</span> n <span class="syntax18">=</span> Integer.<span class="syntax6">parseInt</span><span class="syntax18">(</span>args[<span class="syntax5">0</span>] <span class="syntax18">)</span>;<br /><span class="gutter"> 17:</span> <span class="syntax8">for</span><span class="syntax18">(</span> i<span class="syntax18">=</span><span class="syntax5">0</span>; i<span class="syntax18">&lt;</span>n; i<span class="syntax18">+</span><span class="syntax18">+</span> <span class="syntax18">)</span><br /><span class="gutter"> 18:</span> <span class="syntax18">{</span><br /><span class="gutter"> 19:</span> System.out.<span class="syntax6">println</span><span class="syntax18">(</span>i<span class="syntax18">)</span>;<br /><span class="gutterH"> 20:</span> <span class="syntax18">}</span><br /><span class="gutter"> 21:</span> <span class="syntax18">}</span><br /><span class="gutter"> 22:</span><span class="syntax18">}</span><br /><span class="gutter"> 23:</span><br /></span></pre><br />En este ejemplo vemos que el <span style="font-weight: bold;">for</span> y el <span style="font-weight: bold;">if</span> son los mismos que en C. El "atoi" (función de para convertir cadenas en valores enteros) en Java es el <span style="font-weight: bold;">Integer.parseInt</span>.<br /><br /><br /><span style="font-weight: bold;font-size:130%;" >J2EE (o JEE) – “Java Enterprise Edition”</span><br /><br />J2EE es una extensión de Java para facilitar el desarrollo de <span style="font-weight: bold;">aplicaciones empresariales</span> entendiendo “Aplicación Empresarial” como una aplicación marcada por un importante nivel de <span style="font-weight: bold;">requerimientos no funcionales</span>.<br /><br />Por ejemplo, si hablamos de una aplicación de "home banking", un requerimiento funcional podría ser: “dado el número de una cuenta mostrar todos sus movimientos” pero el requerimiento funcional puede acotarse con un requerimiento no funcional diciendo “además, la pantalla que muestra los movimientos debe emitirse en menos de 3 segundos”.<br /><br />De lo anterior se desprende que las aplicaciones enterprise deben tener buena respuesta, buena performance y demás habilidades que (en conjunto) se comocen como atributos de una arquitectura.<br /><ul><li>Disponibilidad</li><li>Escalabilidad</li><li>Confiabilidad</li><li>Seguridad</li></ul>Es decir: una aplicación empresarial siempre debe estar disponible para su acceso, debe soportar incrementos de carga (sin que esto implique un costo demasiado elevado), debe ser segura, etc.<br /><br />Para cumplir con todos estos requisitos las aplicaciones enterprise corren sobre un <span style="font-weight: bold;">entorno operativo</span> compuesto por diferentes <span style="font-weight: bold;">servidores </span>como ser: servidores de bases de datos, servidores de mensajería, servidores de nombres y directorios, de transacciones, etc.<br /><br />J2EE provee <span style="font-weight: bold;">APIs</span> para que desde nuestros programas Java podamos interactuar con los servicios disponibles en un entorno de cómputo empresarial.<br /><br /><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_X1IHMrfIpE8/R4piYw-lvyI/AAAAAAAABoo/XbRJ8AmUtKw/s1600-h/tabla.jpg"><img style="cursor: pointer;" src="http://1.bp.blogspot.com/_X1IHMrfIpE8/R4piYw-lvyI/AAAAAAAABoo/XbRJ8AmUtKw/s400/tabla.jpg" alt="" id="BLOGGER_PHOTO_ID_5155040901082758946" border="0" /></a></div><br />El gráfico muestra como una aplicación accede a los servicios empresariales (entorno operativo) a través de las diferentes APIs provistas por J2EE.<br /><br />Además, por medio de la tecnología de <span style="font-weight: bold;">interfaces</span> y fábricas de instancias (<span style="font-weight: bold;">factory method</span>) J2EE permite que los programas Java accedan a los servidores que componen el entorno operativo sin que el programador tenga que preocuparse por la marca o fabricante del producto.<br /><br /><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_X1IHMrfIpE8/R4lCcw-lvxI/AAAAAAAABog/JpnZY9khGbs/s1600-h/driver.jpg"><img style="cursor: pointer;" src="http://4.bp.blogspot.com/_X1IHMrfIpE8/R4lCcw-lvxI/AAAAAAAABog/JpnZY9khGbs/s400/driver.jpg" alt="" id="BLOGGER_PHOTO_ID_5154724310453436178" border="0" /></a><br /><div style="text-align: left;"><br />El fabricante del producto (Oracle por ejemplo) debe proveer un driver a través del cual se pueda establecer la conexión con su (en este caso) base de datos. El driver se sitúa en el medio, entre la base de datos y un conjunto de métodos definidos por las APIs J2EE en diferentes interfaces de forma tal que nuestro programa accede a los servicios del driver solo a través de los métodos definidos estas APIs. Esto permite que tan solo cambiando el driver nuestro programa pueda conectarse a otra base de datos sin tener que hacer ningún otro cambio.<br /><br />También son parte de J2EE las APIs para generar contenido web dinamicamente. <span style="font-weight: bold;">Servlets </span>y <span style="font-weight: bold;">JSP</span>.<br /><br /><br /><br /><br /><br /><br /><span style="color: rgb(255, 204, 204);">.</span></div></div></div></div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34013116-6298599609303551763?l=holamundojava.blogspot.com'/></div>PabloSZnoreply@blogger.com1tag:blogger.com,1999:blog-34013116.post-39812739975268754192007-10-21T15:40:00.000-03:002007-10-27T11:24:52.741-03:00DWR - AJAX<span style="color: rgb(255, 255, 255);">.</span><br />AJAX es un acrónimo que significa "Asynchonous JavaScript XML".<br /><br />En si AJAX es una técnica de programación web mediante la cual una página web puede intercambiar información con el servidor en forma asincrónica, de manera tal que la página puede actualizarse sin necesidad de ser recargada. El cliente (browser con la página web) y el servidor mantienen una comunicación asincrónica y en background.<br /><br />En sí, AJAX es netamente JavaScript pero en este capítulo vamos a explicar un framework que permite invocar desde JavaScript (browser, cliente) métodos remotos, en el servidor implementados en Java.<br /><br /><br /><span style="font-weight: bold;font-size:130%;" >DWR - Direct Web Remoting</span><br /><br /><a href="http://getahead.org/">DWR</a> es un framework open soucre que ofrece una alternativa estilo RPC (invocación remota de procedimientos) entre el cliente (browser) y el servidor. Utilizando DWR podemos invocar métodos vía JavaScript pero que se procesarán en el server. DWR se encarga de todo el marshalling de la comunicación.<br /><br />DWR cconsiste en dos partes principales:<br /><ul><li>Un <span style="font-weight: bold;">servlet </span>corriendo en el server que procesa los requests y envia los responses al browser</li><li><span style="font-weight: bold;">JavaScript </span>corriendo en el browser que envia los requests y puede dinámicamente actualizar la página HTML.</li></ul>El JavaScript necesario para establecer la invocación remota de métodos se genera “on the fly” por lo que se minimiza bastante el código cliente que debemos escribir.<br /><br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Hola Mundo DWR !</span></span><br /><br />Para comenzar veremos como configurar DWR en nuestro proyecto web y luego desarrollaremos un HolaMundo. El siguiente tutorial (paso a paso) está sacado del sitio oficial de DWR: <a href="http://getahead.org/dwr/getstarted">http://getahead.org/dwr/getstarted</a><br /><br /><span style="font-weight: bold;">1</span> - Descargar el archivo <a href="http://getahead.org/dwr/download">dwr.jar</a> y copiarlo en el directorio WEB-INF/lib de la aplicación web.<br /><br /><span style="font-weight: bold;">2</span> - Agregar las siguientes líneas en el web.xml de la aplicación web.<br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span> <span class="syntax17">&lt;</span><span class="syntax17">servlet</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 3:</span> <span class="syntax17">&lt;</span><span class="syntax17">servlet-name</span><span class="syntax17">&gt;</span>dwr-invoker<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">servlet-name</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 4:</span> <span class="syntax17">&lt;</span><span class="syntax17">servlet-class</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 5:</span> org.directwebremoting.servlet.DwrServlet<br /><span class="gutter"> 6:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">servlet-class</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 7:</span> <span class="syntax17">&lt;</span><span class="syntax17">init-param</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 8:</span> <span class="syntax17">&lt;</span><span class="syntax17">param-name</span><span class="syntax17">&gt;</span>debug<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">param-name</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 9:</span> <span class="syntax17">&lt;</span><span class="syntax17">param-value</span><span class="syntax17">&gt;</span>true<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">param-value</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 10:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">init-param</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 11:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">servlet</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 12:</span><br /><span class="gutter"> 13:</span> <span class="syntax17">&lt;</span><span class="syntax17">servlet-mapping</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 14:</span> <span class="syntax17">&lt;</span><span class="syntax17">servlet-name</span><span class="syntax17">&gt;</span>dwr-invoker<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">servlet-name</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 15:</span> <span class="syntax17">&lt;</span><span class="syntax17">url-pattern</span><span class="syntax17">&gt;</span>/dwr/*<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">url-pattern</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 16:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">servlet-mapping</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 17:</span><br /></span></pre><br /><span style="font-weight: bold;">3</span> - Crear un archivo llamado <span style="font-weight: bold;">dwr.xml</span> en el directorio WEB-INF de la aplicación web, con el siguiente código.<br /><br /><span style="font-weight: bold;">dwr.xml</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">&lt;!</span><span class="syntax9">DOCTYPE</span><span class="syntax9"> </span><span class="syntax9">dwr</span><span class="syntax9"> </span><span class="syntax9">PUBLIC</span><br /><span class="gutter"> 3:</span><span class="syntax13">"</span><span class="syntax13">-//GetAhead</span><span class="syntax13"> </span><span class="syntax13">Limited//DTD</span><span class="syntax13"> </span><span class="syntax13">Direct</span><span class="syntax13"> </span><span class="syntax13">Web</span><span class="syntax13"> </span><span class="syntax13">Remoting</span><span class="syntax13"> </span><span class="syntax13">1.0//EN</span><span class="syntax13">"</span><br /><span class="gutter"> 4:</span><span class="syntax13">"</span><span class="syntax13">http://www.getahead.ltd.uk/dwr/dwr10.dtd</span><span class="syntax13">"</span><span class="syntax9">&gt;</span><br /><span class="gutterH"> 5:</span><br /><span class="gutter"> 6:</span><span class="syntax17">&lt;</span><span class="syntax17">dwr</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 7:</span> <span class="syntax17">&lt;</span><span class="syntax17">allow</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 8:</span> <span class="syntax17">&lt;</span><span class="syntax17">create</span><span class="syntax17"> </span><span class="syntax17">creator</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">new</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">javascript</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">JDate</span><span class="syntax13">"</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 9:</span> <span class="syntax17">&lt;</span><span class="syntax17">param</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">class</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">value</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">java.util.Date</span><span class="syntax13">"</span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 10:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">create</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 11:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">allow</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 12:</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">dwr</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 13:</span><br /></span></pre><br /><span style="font-weight: bold;font-size:100%;" >4</span><span style="font-size:100%;"> - Ahora probemos ingresar en nuestra aplicación web, en el directorio dwr:</span><br /><div style="text-align: center;"><br />http://localhost:8080/[YOUR-WEBAPP]/dwr/<br /><div style="text-align: left;"><br />DWR mostrará una página en la que podremos ver todas las clases publicadas, cuyos métodos podrán ser invocados vía JavaScript.<br /><br /><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_X1IHMrfIpE8/RxutNlhKR5I/AAAAAAAABdw/W9gELRlXxLM/s1600-h/1.jpg"><img style="cursor: pointer;" src="http://2.bp.blogspot.com/_X1IHMrfIpE8/RxutNlhKR5I/AAAAAAAABdw/W9gELRlXxLM/s400/1.jpg" alt="" id="BLOGGER_PHOTO_ID_5123879449985173394" border="0" /></a><br /><br /></div></div></div>En este caso (a modo de ejemplo) solo está publicada la clase JDate (la de java.util). Recordemos que cuando creamos el archivo <span style="font-weight: bold;">dwr.xml</span>, definimos que íbamos a utilizar esta clase.<br /><br /><span style="font-weight: bold;">5</span> - Si hacemos "click" en JDate entonces veremos una página en la que podremos probar todos los métodos de (en este caso) JDate. Algo así:<br /><br /><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_X1IHMrfIpE8/RxutNlhKR4I/AAAAAAAABdo/-liKnSK4fNY/s1600-h/2.jpg"><img style="cursor: pointer;" src="http://2.bp.blogspot.com/_X1IHMrfIpE8/RxutNlhKR4I/AAAAAAAABdo/-liKnSK4fNY/s400/2.jpg" alt="" id="BLOGGER_PHOTO_ID_5123879449985173378" border="0" /></a><br /></div><div style="text-align: center;"><div style="text-align: left;"><br />Además (en la parte superior) veremos el código que tenemos que incluir en nuestro JSP o HTML para poder invocar al objeto remoto.<br /><br /><br /><span style="font-weight: bold;">Ahora si, Hola Mundo !<br /><br /></span>Con el proyecto web correctamente configurado para poder utilizar DWR estamos en condiciones de hacer el primer ejemplo.<span style="font-weight: bold;"><br /></span><span><br /><span style="font-weight: bold;">6</span> - Creamos la clase HolaMundoDWR.<br /><br /><span style="font-weight: bold;">HolaMundoDWR.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span> test;<br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax8">public</span> <span class="syntax10">class</span> HolaMundoDWR<br /><span class="gutterH"> 5:</span><span class="syntax18">{</span><br /><span class="gutter"> 6:</span> <span class="syntax8">public</span> String <span class="syntax6">saludo</span><span class="syntax18">(</span>String n<span class="syntax18">)</span><br /><span class="gutter"> 7:</span> <span class="syntax18">{</span><br /><span class="gutter"> 8:</span> <span class="syntax8">return</span> <span class="syntax13">"</span><span class="syntax13">Hola</span><span class="syntax13"> </span><span class="syntax13">Mundo,</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">+</span>n;<br /><span class="gutter"> 9:</span> <span class="syntax18">}</span><br /><span class="gutterH"> 10:</span><span class="syntax18">}</span><br /><span class="gutter"> 11:</span><br /></span></pre><br /><span style="font-weight: bold;">7</span> - Tenemos que publicar la clase en DWR. Para esto agregamos el siguiente código en el archivo <span style="font-weight: bold;">dwr.xml</span>.<br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span> <span class="syntax18">&lt;</span>create creator<span class="syntax18">=</span><span class="syntax13">"</span><span class="syntax13">new</span><span class="syntax13">"</span> javascript<span class="syntax18">=</span><span class="syntax13">"</span><span class="syntax13">HolaMundoDWR</span><span class="syntax13">"</span><span class="syntax18">&gt;</span><br /><span class="gutter"> 3:</span> <span class="syntax18">&lt;</span>param name<span class="syntax18">=</span><span class="syntax13">"</span><span class="syntax13">class</span><span class="syntax13">"</span> value<span class="syntax18">=</span><span class="syntax13">"</span><span class="syntax13">test.HolaMundoDWR</span><span class="syntax13">"</span><span class="syntax18">/</span><span class="syntax18">&gt;</span><br /><span class="gutter"> 4:</span> <span class="syntax18">&lt;</span><span class="syntax18">/</span>create<span class="syntax18">&gt;</span><br /><span class="gutterH"> 5:</span><br /></span></pre><br /><span style="font-weight: bold;">8</span> - Volvemos a ingresar en el directorio <span style="font-weight: bold;">dwr </span>de la aplicación web para asegurarnos que la clase <span style="font-weight: bold;">HolaMundoDWR </span>fue correctamente deployada.<br /><br /></span><div style="text-align: center;">http://localhost:8080/[YOUR-WEBAPP]/dwr<span style="font-weight: bold;">/test/HolaMundoDWR</span><br /><div style="text-align: left;"><br />Si todo está bien veremos la siguiente página:<br /><br /><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_X1IHMrfIpE8/Rxuy1lhKR6I/AAAAAAAABd4/1hvvhJ--r9M/s1600-h/3.jpg"><img style="cursor: pointer;" src="http://2.bp.blogspot.com/_X1IHMrfIpE8/Rxuy1lhKR6I/AAAAAAAABd4/1hvvhJ--r9M/s400/3.jpg" alt="" id="BLOGGER_PHOTO_ID_5123885634738079650" border="0" /></a><br /><div style="text-align: left;"><br />En esta página podemos probar el método <span style="font-weight: bold;">saludo</span>, pero también DWR nos muestra los scripts que tenemos que incluir en nuestra página JSP si queremos invocar métodos de la clase <span style="font-weight: bold;">HolaMundoDWR</span>. También nos sugiere incluir el script <span style="font-weight: bold;">util.js</span> que será muy util para actualizar dinámicamente contenido HTML.<br /><br /><span style="font-weight: bold;">9</span> - Ahora si, podemos programar la página JSP.<br /><br /><span style="font-weight: bold;">testDWR.jsp</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax17">&lt;</span><span class="syntax17">html</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 3:</span> <span class="syntax17">&lt;</span><span class="syntax17">head</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 4:</span> <span class="syntax1">&lt;!--</span><span class="syntax1"> </span><span class="syntax1">incluimos</span><span class="syntax1"> </span><span class="syntax1">los</span><span class="syntax1"> </span><span class="syntax1">scripts</span><span class="syntax1"> </span><span class="syntax1">que</span><span class="syntax1"> </span><span class="syntax1">nos</span><span class="syntax1"> </span><span class="syntax1">indico</span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1">--&gt;</span><br /><span class="gutterH"> 5:</span> <span class="syntax1">&lt;!--</span><span class="syntax1"> </span><span class="syntax1">la</span><span class="syntax1"> </span><span class="syntax1">pagina</span><span class="syntax1"> </span><span class="syntax1">de</span><span class="syntax1"> </span><span class="syntax1">prueba</span><span class="syntax1"> </span><span class="syntax1">de</span><span class="syntax1"> </span><span class="syntax1">DWR</span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1">--&gt;</span><br /><span class="gutter"> 6:</span> <span class="syntax17">&lt;script</span><span class="syntax17"> </span><br /><span class="gutter"> 7:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">type</span><span class="syntax17">=</span><span class="syntax17">'</span><span class="syntax17">text</span><span class="syntax17">/</span><span class="syntax17">javascript</span><span class="syntax17">'</span><span class="syntax17"> </span><br /><span class="gutter"> 8:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">src=</span><span class="syntax17">'</span><span class="syntax17">/</span><span class="syntax17">ZDWR</span><span class="syntax17">/</span><span class="syntax17">dwr</span><span class="syntax17">/</span><span class="syntax17">interface</span><span class="syntax17">/</span><span class="syntax17">HolaMundoDWR</span><span class="syntax17">.</span><span class="syntax17">js</span><span class="syntax17">'</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 9:</span> <span class="syntax17">&lt;/script&gt;</span><br /><span class="gutterH"> 10:</span> <span class="syntax17">&lt;script</span><span class="syntax17"> </span><span class="syntax17">type</span><span class="syntax17">=</span><span class="syntax17">'</span><span class="syntax17">text</span><span class="syntax17">/</span><span class="syntax17">javascript</span><span class="syntax17">'</span><span class="syntax17"> </span><br /><span class="gutter"> 11:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">src=</span><span class="syntax17">'</span><span class="syntax17">/</span><span class="syntax17">ZDWR</span><span class="syntax17">/</span><span class="syntax17">dwr</span><span class="syntax17">/</span><span class="syntax17">engine</span><span class="syntax17">.</span><span class="syntax17">js</span><span class="syntax17">'</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 12:</span> <span class="syntax17">&lt;/script&gt;</span><br /><span class="gutter"> 13:</span> <span class="syntax17">&lt;script</span><span class="syntax17"> </span><span class="syntax17">type</span><span class="syntax17">=</span><span class="syntax17">'</span><span class="syntax17">text</span><span class="syntax17">/</span><span class="syntax17">javascript</span><span class="syntax17">'</span><span class="syntax17"> </span><br /><span class="gutter"> 14:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">src=</span><span class="syntax17">'</span><span class="syntax17">/</span><span class="syntax17">ZDWR</span><span class="syntax17">/</span><span class="syntax17">dwr</span><span class="syntax17">/</span><span class="syntax17">util</span><span class="syntax17">.</span><span class="syntax17">js</span><span class="syntax17">'</span><span class="syntax17">&gt;</span><span class="syntax17">&lt;/script&gt;</span><br /><span class="gutterH"> 15:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">head</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 16:</span><br /><span class="gutter"> 17:</span> <span class="syntax17">&lt;</span><span class="syntax17">body</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 18:</span> <span class="syntax1">&lt;!--</span><span class="syntax1"> </span><span class="syntax1">es</span><span class="syntax1"> </span><span class="syntax1">muy</span><span class="syntax1"> </span><span class="syntax1">importante</span><span class="syntax1"> </span><span class="syntax1">el</span><span class="syntax1"> </span><span class="syntax1">id</span><span class="syntax1"> </span><span class="syntax1">(</span><span class="syntax1">tfNom</span><span class="syntax1">)</span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> --&gt;</span><br /><span class="gutter"> 19:</span> Nombre <span class="syntax17">&lt;</span><span class="syntax17">input</span><span class="syntax17"> </span><span class="syntax17">type</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">text</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">id</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">tfNom</span><span class="syntax13">"</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 20:</span><br /><span class="gutter"> 21:</span> <span class="syntax1">&lt;!--</span><span class="syntax1"> </span><span class="syntax1">en</span><span class="syntax1"> </span><span class="syntax1">el</span><span class="syntax1"> </span><span class="syntax1">onclick</span><span class="syntax1"> </span><span class="syntax1">del</span><span class="syntax1"> </span><span class="syntax1">boton</span><span class="syntax1"> </span><span class="syntax1">llamamos</span><span class="syntax1"> </span><span class="syntax1">a</span><span class="syntax1"> </span><span class="syntax1">la</span><span class="syntax1"> </span><span class="syntax1">--&gt;</span><br /><span class="gutter"> 22:</span> <span class="syntax1">&lt;!--</span><span class="syntax1"> </span><span class="syntax1">funcion</span><span class="syntax1"> </span><span class="syntax1">saludo</span><span class="syntax1">(</span><span class="syntax1">)</span><span class="syntax1"> </span><span class="syntax1">que</span><span class="syntax1"> </span><span class="syntax1">esta</span><span class="syntax1"> </span><span class="syntax1">mas</span><span class="syntax1"> </span><span class="syntax1">abajo</span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1">--&gt;</span><br /><span class="gutter"> 23:</span><br /><span class="gutter"> 24:</span> <span class="syntax17">&lt;</span><span class="syntax17">input</span><span class="syntax17"> </span><span class="syntax17">value</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">Enviar</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutterH"> 25:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">type</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">button</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutter"> 26:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">onclick</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">saludo</span><span class="syntax13">(</span><span class="syntax13">)</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 27:</span> <span class="syntax17">&lt;</span><span class="syntax17">br</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 28:</span> <span class="syntax1">&lt;!--</span><span class="syntax1"> </span><span class="syntax1">notemos</span><span class="syntax1"> </span><span class="syntax1">que</span><span class="syntax1"> </span><span class="syntax1">el</span><span class="syntax1"> </span><span class="syntax1">spam</span><span class="syntax1"> </span><span class="syntax1">tiene</span><span class="syntax1"> </span><span class="syntax1">un</span><span class="syntax1"> </span><span class="syntax1">id</span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1">--&gt;</span><br /><span class="gutter"> 29:</span> Respuesta: <span class="syntax17">&lt;</span><span class="syntax17">b</span><span class="syntax17">&gt;</span><span class="syntax17">&lt;</span><span class="syntax17">span</span><span class="syntax17"> </span><span class="syntax17">id</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">lblNom</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">b</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 30:</span><br /><span class="gutter"> 31:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">body</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 32:</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">html</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 33:</span><br /><span class="gutter"> 34:</span><span class="syntax1">&lt;!--</span><span class="syntax1"> </span><span class="syntax1">ahora</span><span class="syntax1"> </span><span class="syntax1">desarrollamos</span><span class="syntax1"> </span><span class="syntax1">la</span><span class="syntax1"> </span><span class="syntax1">funcion</span><span class="syntax1"> </span><span class="syntax1">saludo</span><span class="syntax1"> </span><span class="syntax1">que</span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1">--&gt;</span><br /><span class="gutterH"> 35:</span><span class="syntax1">&lt;!--</span><span class="syntax1"> </span><span class="syntax1">obtiene</span><span class="syntax1"> </span><span class="syntax1">el</span><span class="syntax1"> </span><span class="syntax1">nombre</span><span class="syntax1"> </span><span class="syntax1">que</span><span class="syntax1"> </span><span class="syntax1">ingresamos</span><span class="syntax1"> </span><span class="syntax1">en</span><span class="syntax1"> </span><span class="syntax1">tfNom</span><span class="syntax1">,</span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1">--&gt;</span><br /><span class="gutter"> 36:</span><span class="syntax1">&lt;!--</span><span class="syntax1"> </span><span class="syntax1">invoca</span><span class="syntax1"> </span><span class="syntax1">a</span><span class="syntax1"> </span><span class="syntax1">la</span><span class="syntax1"> </span><span class="syntax1">funcion</span><span class="syntax1"> </span><span class="syntax1">remota</span><span class="syntax1"> </span><span class="syntax1">y</span><span class="syntax1"> </span><span class="syntax1">setea</span><span class="syntax1"> </span><span class="syntax1">en</span><span class="syntax1"> </span><span class="syntax1">el</span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1">--&gt;</span><br /><span class="gutter"> 37:</span><span class="syntax1">&lt;!--</span><span class="syntax1"> </span><span class="syntax1">span</span><span class="syntax1"> </span><span class="syntax1">(</span><span class="syntax1">lblNom</span><span class="syntax1">)</span><span class="syntax1"> </span><span class="syntax1">el</span><span class="syntax1"> </span><span class="syntax1">resultado</span><span class="syntax1"> </span><span class="syntax1">recibido</span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1">--&gt;</span><br /><span class="gutter"> 38:</span><span class="syntax17">&lt;script</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 39:</span> <span class="syntax8">function</span> <span class="syntax6">saludo(</span><span class="syntax6">)</span><br /><span class="gutterH"> 40:</span> <span class="syntax18">{</span><br /><span class="gutter"> 41:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">obtenemos</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">nombre</span><span class="syntax2"> </span><span class="syntax2">ingresado</span><span class="syntax2"> </span><span class="syntax2">por</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">usuario</span><br /><span class="gutter"> 42:</span> <span class="syntax8">var</span> nom <span class="syntax18">=</span> dwr<span class="syntax18">.</span>util<span class="syntax18">.</span><span class="syntax6">getValue(</span><span class="syntax13">"</span><span class="syntax13">tfNom</span><span class="syntax13">"</span><span class="syntax6">)</span><span class="syntax18">;</span><br /><span class="gutter"> 43:</span><br /><span class="gutter"> 44:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">invocamos</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">funcion</span><span class="syntax2"> </span><span class="syntax2">remota</span><span class="syntax2"> </span><span class="syntax2">pasandole</span><span class="syntax2"> </span><span class="syntax2">nom</span><span class="syntax2"> </span><br /><span class="gutterH"> 45:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">y</span><span class="syntax2"> </span><span class="syntax2">una</span><span class="syntax2"> </span><span class="syntax2">funcion</span><span class="syntax2"> </span><span class="syntax2">de</span><span class="syntax2"> </span><span class="syntax2">callback</span><span class="syntax2"> </span><span class="syntax2">que</span><span class="syntax2"> </span><span class="syntax2">DWR</span><span class="syntax2"> </span><span class="syntax2">invocara</span><span class="syntax2"> </span><br /><span class="gutter"> 46:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">cuando</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">informacion</span><span class="syntax2"> </span><span class="syntax2">enviada</span><span class="syntax2"> </span><span class="syntax2">por</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">server</span><span class="syntax2"> </span><br /><span class="gutter"> 47:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">este</span><span class="syntax2"> </span><span class="syntax2">disponible</span><span class="syntax2"> </span><span class="syntax2">en</span><span class="syntax2"> </span><span class="syntax2">para</span><span class="syntax2"> </span><span class="syntax2">ser</span><span class="syntax2"> </span><span class="syntax2">utilizada</span><br /><span class="gutter"> 48:</span> HolaMundoDWR<span class="syntax18">.</span><span class="syntax6">saludo(</span>nom<span class="syntax18">,</span> <span class="syntax6">function(</span>data<span class="syntax6">)</span><br /><span class="gutter"> 49:</span> <span class="syntax18">{</span><br /><span class="gutterH"> 50:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">seteamos</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">resultado</span><span class="syntax2"> </span><span class="syntax2">en</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">span</span><br /><span class="gutter"> 51:</span> dwr<span class="syntax18">.</span>util<span class="syntax18">.</span><span class="syntax6">setValue(</span><span class="syntax13">"</span><span class="syntax13">lblNom</span><span class="syntax13">"</span><span class="syntax18">,</span> data<span class="syntax6">)</span><span class="syntax18">;</span><br /><span class="gutter"> 52:</span> <span class="syntax18">}</span><span class="syntax6">)</span><span class="syntax18">;</span><br /><span class="gutter"> 53:</span> <span class="syntax18">}</span><br /><span class="gutter"> 54:</span><span class="syntax17">&lt;/script&gt;</span><br /><span class="gutterH"> 55:</span><br /></span></pre><br />Podemos ver que con la librería <span style="font-weight: bold;">util.js</span> podemos acceder muy facilmente a los objetos de la página para obtener los datos que tienen cargados y para setearles resultados.<br /><br />Para invocar al método remoto <span style="font-weight: bold;">saludo</span> necesitamos utilizar una función de callback. Esto se debe a que Java es sincrónico pero AJAX es asincrónico por lo tanto le pasamos esta función para que DWR la invoque cuando la información enviada por el servidor esté disponible y pueda ser utilizada en el browser. Allí seteamos el resultado en el span <span style="font-weight: bold;">lblNom</span>.<br /><br /><br /><span style="font-weight: bold;font-size:130%;" >Manipulación de Objetos HTML</span><br /><br />Como vemos, DWR resuelve de manera extremadamente simple la invocación remota de métodos entre la página HTML (o JSP) y la clase Java que los implementa. Por lo tanto la mayor complejidad está dada en poder actualizar dinámicamente el contenido HTML con la información que llega desde el servidor.<br /><br />Para esto DWR provee una librería de funciones <span style="font-weight: bold;">JavaScript </span>llamada: <a href="http://getahead.org/dwr/browser/util/"><span style="font-weight: bold;">util.js</span></a>. Veremos algunos ejemplos de como actualizar contenido dinámicamente utilizando esta librería.<br /><br /><br /><span style="font-weight: bold;">Combos Dependientes</span><br /><br />En este ejemplo veremos como actualizar el contenido de un combo dependiendo de lo que el usuario selecciona en otro combo.<br /><br />Para esto programamos la siguiente clase que basicamente proveerá dos métodos:<br /><ul><li>Collection <span style="font-weight: bold;">obtenerArtistas</span>();</li><li>Collection <span style="font-weight: bold;">obtenerDiscos</span>(String artista);</li></ul>Es decir: el primer método retornará una Collection de Strings con los nombres de los artistas "registrados en una base de datos" y el segundo método, dado un nombre de artista retornará todos los discos de ese artista que "tenemos registrados".<br /><br />Para simplificar, los datos los harcodearemos en una Hashtable.<br /><br /><span style="font-weight: bold;">CatalogoCD.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span> test;<br /><span class="gutter"> 3:</span><span class="syntax9">import</span> java.util.*;<br /><span class="gutter"> 4:</span><br /><span class="gutterH"> 5:</span><span class="syntax8">public</span> <span class="syntax10">class</span> CatalogoCD<br /><span class="gutter"> 6:</span><span class="syntax18">{</span><br /><span class="gutter"> 7:</span> <span class="syntax8">private</span> Hashtable artistas;<br /><span class="gutter"> 8:</span><br /><span class="gutter"> 9:</span> <span class="syntax8">public</span> <span class="syntax6">CatalogoCD</span><span class="syntax18">(</span><span class="syntax18">)</span><br /><span class="gutterH"> 10:</span> <span class="syntax18">{</span><br /><span class="gutter"> 11:</span> artistas<span class="syntax18">=</span><span class="syntax8">new</span> <span class="syntax6">Hashtable</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 12:</span> <span class="syntax6">_cargarInformacion</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 13:</span> <span class="syntax18">}</span><br /><span class="gutter"> 14:</span><br /><span class="gutterH"> 15:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">retorna</span><span class="syntax2"> </span><span class="syntax2">una</span><span class="syntax2"> </span><span class="syntax2">Collection</span><span class="syntax2"> </span><span class="syntax2">de</span><span class="syntax2"> </span><span class="syntax2">Strins</span><span class="syntax2"> </span><span class="syntax2">con</span><span class="syntax2"> </span><span class="syntax2">los</span><br /><span class="gutter"> 16:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">artistas</span><span class="syntax2"> </span><span class="syntax2">que</span><span class="syntax2"> </span><span class="syntax2">tenemos</span><span class="syntax2"> </span><span class="syntax2">registrados</span><br /><span class="gutter"> 17:</span> <span class="syntax8">public</span> Collection <span class="syntax6">obtenerArtistas</span><span class="syntax18">(</span><span class="syntax18">)</span><br /><span class="gutter"> 18:</span> <span class="syntax18">{</span><br /><span class="gutter"> 19:</span> Vector v<span class="syntax18">=</span><span class="syntax8">new</span> <span class="syntax6">Vector</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 20:</span> <span class="syntax8">for</span><span class="syntax18">(</span>Enumeration e<span class="syntax18">=</span>artistas.<span class="syntax6">keys</span><span class="syntax18">(</span><span class="syntax18">)</span><br /><span class="gutter"> 21:</span> ;e.<span class="syntax6">hasMoreElements</span><span class="syntax18">(</span><span class="syntax18">)</span>;<span class="syntax18">)</span><br /><span class="gutter"> 22:</span> <span class="syntax18">{</span><br /><span class="gutter"> 23:</span> v.<span class="syntax6">add</span><span class="syntax18">(</span>e.<span class="syntax6">nextElement</span><span class="syntax18">(</span><span class="syntax18">)</span><span class="syntax18">)</span>;<br /><span class="gutter"> 24:</span> <span class="syntax18">}</span><br /><span class="gutterH"> 25:</span> <span class="syntax8">return</span> v;<br /><span class="gutter"> 26:</span> <span class="syntax18">}</span><br /><span class="gutter"> 27:</span><br /><span class="gutter"> 28:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">dado</span><span class="syntax2"> </span><span class="syntax2">un</span><span class="syntax2"> </span><span class="syntax2">artista,</span><span class="syntax2"> </span><span class="syntax2">retorna</span><span class="syntax2"> </span><span class="syntax2">una</span><span class="syntax2"> </span><span class="syntax2">Collection</span><span class="syntax2"> </span><span class="syntax2">de</span><span class="syntax2"> </span><br /><span class="gutter"> 29:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">Strings</span><span class="syntax2"> </span><span class="syntax2">con</span><span class="syntax2"> </span><span class="syntax2">los</span><span class="syntax2"> </span><span class="syntax2">titulos</span><span class="syntax2"> </span><span class="syntax2">de</span><span class="syntax2"> </span><span class="syntax2">los</span><span class="syntax2"> </span><span class="syntax2">discos</span><span class="syntax2"> </span><span class="syntax2">del</span><span class="syntax2"> </span><br /><span class="gutterH"> 30:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">artista</span><span class="syntax2"> </span><span class="syntax2">especificado</span><br /><span class="gutter"> 31:</span> <span class="syntax8">public</span> Collection <span class="syntax6">obtenerDiscos</span><span class="syntax18">(</span>String artista<span class="syntax18">)</span><br /><span class="gutter"> 32:</span> <span class="syntax18">{</span><br /><span class="gutter"> 33:</span> <span class="syntax8">return</span> <span class="syntax18">(</span>Collection<span class="syntax18">)</span> artistas.<span class="syntax6">get</span><span class="syntax18">(</span>artista<span class="syntax18">)</span>;<br /><span class="gutter"> 34:</span> <span class="syntax18">}</span><br /><span class="gutterH"> 35:</span><br /><span class="gutter"> 36:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">todo</span><span class="syntax2"> </span><span class="syntax2">harcodeado...</span><br /><span class="gutter"> 37:</span> <span class="syntax8">private</span> <span class="syntax10">void</span> <span class="syntax6">_cargarInformacion</span><span class="syntax18">(</span><span class="syntax18">)</span><br /><span class="gutter"> 38:</span> <span class="syntax18">{</span><br /><span class="gutter"> 39:</span> Vector v1<span class="syntax18">=</span><span class="syntax8">new</span> <span class="syntax6">Vector</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 40:</span> v1.<span class="syntax6">add</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Please</span><span class="syntax13"> </span><span class="syntax13">Please</span><span class="syntax13"> </span><span class="syntax13">Me</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 41:</span> v1.<span class="syntax6">add</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Abbey</span><span class="syntax13"> </span><span class="syntax13">Road</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 42:</span> v1.<span class="syntax6">add</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Magical</span><span class="syntax13"> </span><span class="syntax13">Mistery</span><span class="syntax13"> </span><span class="syntax13">Tour</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 43:</span> artistas.<span class="syntax6">put</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">The</span><span class="syntax13"> </span><span class="syntax13">Beatles</span><span class="syntax13">"</span>,v1<span class="syntax18">)</span>;<br /><span class="gutter"> 44:</span><br /><span class="gutterH"> 45:</span> Vector v2<span class="syntax18">=</span><span class="syntax8">new</span> <span class="syntax6">Vector</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 46:</span> v2.<span class="syntax6">add</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Demasiado</span><span class="syntax13"> </span><span class="syntax13">Ego</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 47:</span> v2.<span class="syntax6">add</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">La</span><span class="syntax13"> </span><span class="syntax13">Hija</span><span class="syntax13"> </span><span class="syntax13">de</span><span class="syntax13"> </span><span class="syntax13">la</span><span class="syntax13"> </span><span class="syntax13">Lagrima</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 48:</span> v2.<span class="syntax6">add</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Say</span><span class="syntax13"> </span><span class="syntax13">No</span><span class="syntax13"> </span><span class="syntax13">More</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 49:</span> v2.<span class="syntax6">add</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Kill</span><span class="syntax13"> </span><span class="syntax13">Gil</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 50:</span> artistas.<span class="syntax6">put</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Charly</span><span class="syntax13"> </span><span class="syntax13">Garcia</span><span class="syntax13">"</span>,v2<span class="syntax18">)</span>;<br /><span class="gutter"> 51:</span><br /><span class="gutter"> 52:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">sexo</span><span class="syntax2"> </span><span class="syntax2">Ibiza</span><span class="syntax2"> </span><span class="syntax2">Locomia...!</span><br /><span class="gutter"> 53:</span> Vector v3<span class="syntax18">=</span><span class="syntax8">new</span> <span class="syntax6">Vector</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 54:</span> v3.<span class="syntax6">add</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">A</span><span class="syntax13"> </span><span class="syntax13">Ibiza</span><span class="syntax13"> </span><span class="syntax13">con</span><span class="syntax13"> </span><span class="syntax13">Locomia</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 55:</span> v3.<span class="syntax6">add</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Abanicos</span><span class="syntax13"> </span><span class="syntax13">Por</span><span class="syntax13"> </span><span class="syntax13">Doquier!</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 56:</span> artistas.<span class="syntax6">put</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Locomia</span><span class="syntax13">"</span>,v3<span class="syntax18">)</span>;<br /><span class="gutter"> 57:</span> <span class="syntax18">}</span><br /><span class="gutter"> 58:</span><span class="syntax18">}</span><br /><span class="gutter"> 59:</span><br /></span></pre><br />Para registrar la clase como servicio en DWR tenemos que agregar las siguientes líneas en el archivo <span style="font-weight: bold;">dwr.xml</span>.<br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span> <span class="syntax17">&lt;</span><span class="syntax17">create</span><span class="syntax17"> </span><span class="syntax17">creator</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">new</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">javascript</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">CatalogoCD</span><span class="syntax13">"</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 3:</span> <span class="syntax17">&lt;</span><span class="syntax17">param</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">class</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">value</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">test.CatalogoCD</span><span class="syntax13">"</span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 4:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">create</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 5:</span><br /></span></pre><br />Ahora vamos a:<br />http://localhost:8080/[<span style="font-style: italic;">YOUR-WEBAPP</span>]/dwr/test/CatalogoCD<br /><br />para ver los scripts que debemos incluir en la página JSP.<br /><br /><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_X1IHMrfIpE8/RyI-pSCjkZI/AAAAAAAABhM/JeUflmYxsv8/s1600-h/10.jpg"><img style="cursor: pointer;" src="http://1.bp.blogspot.com/_X1IHMrfIpE8/RyI-pSCjkZI/AAAAAAAABhM/JeUflmYxsv8/s400/10.jpg" alt="" id="BLOGGER_PHOTO_ID_5125728204839162258" border="0" /></a><br /></div><br />Y ahora veamos la página JSP:<span><span><br /><br /><span style="font-weight: bold;">discos.jsp</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax17">&lt;</span><span class="syntax17">html</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 3:</span> <span class="syntax17">&lt;</span><span class="syntax17">head</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 4:</span> <span class="syntax17">&lt;script</span><span class="syntax17"> </span><br /><span class="gutterH"> 5:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">type</span><span class="syntax17">=</span><span class="syntax17">'</span><span class="syntax17">text</span><span class="syntax17">/</span><span class="syntax17">javascript</span><span class="syntax17">'</span><span class="syntax17"> </span><br /><span class="gutter"> 6:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">src=</span><span class="syntax17">'</span><span class="syntax17">/</span><span class="syntax17">TestAjax</span><span class="syntax17">/</span><span class="syntax17">dwr</span><span class="syntax17">/</span><span class="syntax17">interface</span><span class="syntax17">/</span><span class="syntax17">CatalogoCD</span><span class="syntax17">.</span><span class="syntax17">js</span><span class="syntax17">'</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 7:</span> <span class="syntax17">&lt;/script&gt;</span><br /><span class="gutter"> 8:</span> <span class="syntax17">&lt;script</span><span class="syntax17"> </span><br /><span class="gutter"> 9:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">type</span><span class="syntax17">=</span><span class="syntax17">'</span><span class="syntax17">text</span><span class="syntax17">/</span><span class="syntax17">javascript</span><span class="syntax17">'</span><span class="syntax17"> </span><br /><span class="gutterH"> 10:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">src=</span><span class="syntax17">'</span><span class="syntax17">/</span><span class="syntax17">TestAjax</span><span class="syntax17">/</span><span class="syntax17">dwr</span><span class="syntax17">/</span><span class="syntax17">engine</span><span class="syntax17">.</span><span class="syntax17">js</span><span class="syntax17">'</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 11:</span> <span class="syntax17">&lt;/script&gt;</span><br /><span class="gutter"> 12:</span> <span class="syntax17">&lt;script</span><span class="syntax17"> </span><br /><span class="gutter"> 13:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">type</span><span class="syntax17">=</span><span class="syntax17">'</span><span class="syntax17">text</span><span class="syntax17">/</span><span class="syntax17">javascript</span><span class="syntax17">'</span><span class="syntax17"> </span><br /><span class="gutter"> 14:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">src=</span><span class="syntax17">'</span><span class="syntax17">/</span><span class="syntax17">TestAjax</span><span class="syntax17">/</span><span class="syntax17">dwr</span><span class="syntax17">/</span><span class="syntax17">util</span><span class="syntax17">.</span><span class="syntax17">js</span><span class="syntax17">'</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 15:</span> <span class="syntax17">&lt;/script&gt;</span><br /><span class="gutter"> 16:</span><br /><span class="gutter"> 17:</span> <span class="syntax17">&lt;script</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 18:</span> <span class="syntax8">function</span> <span class="syntax6">obtenerArtistas(</span><span class="syntax6">)</span><br /><span class="gutter"> 19:</span> <span class="syntax18">{</span><br /><span class="gutterH"> 20:</span> CatalogoCD<span class="syntax18">.</span><span class="syntax6">obtenerArtistas(</span><span class="syntax6">function(</span>data<span class="syntax6">)</span><span class="syntax18">{</span><br /><span class="gutter"> 21:</span> dwr<span class="syntax18">.</span>util<span class="syntax18">.</span><span class="syntax6">removeAllOptions(</span><span class="syntax13">"</span><span class="syntax13">cbArtista</span><span class="syntax13">"</span><span class="syntax6">)</span><span class="syntax18">;</span> <br /><span class="gutter"> 22:</span> dwr<span class="syntax18">.</span>util<span class="syntax18">.</span><span class="syntax6">addOptions(</span><span class="syntax13">"</span><span class="syntax13">cbArtista</span><span class="syntax13">"</span><span class="syntax18">,</span> data<span class="syntax6">)</span><span class="syntax18">;</span><br /><span class="gutter"> 23:</span> <span class="syntax6">obtenerDiscos(</span><span class="syntax6">)</span><span class="syntax18">;</span><br /><span class="gutter"> 24:</span> <span class="syntax18">}</span><span class="syntax6">)</span><span class="syntax18">;</span><br /><span class="gutterH"> 25:</span> <span class="syntax18">}</span><br /><span class="gutter"> 26:</span><br /><span class="gutter"> 27:</span> <span class="syntax8">function</span> <span class="syntax6">obtenerDiscos(</span><span class="syntax6">)</span><br /><span class="gutter"> 28:</span> <span class="syntax18">{</span><br /><span class="gutter"> 29:</span> <span class="syntax8">var</span> art <span class="syntax18">=</span> dwr<span class="syntax18">.</span>util<span class="syntax18">.</span><span class="syntax6">getValue(</span><span class="syntax13">"</span><span class="syntax13">cbArtista</span><span class="syntax13">"</span><span class="syntax6">)</span><span class="syntax18">;</span><br /><span class="gutterH"> 30:</span> CatalogoCD<span class="syntax18">.</span><span class="syntax6">obtenerDiscos(</span>art<span class="syntax18">,</span><span class="syntax6">function(</span>data<span class="syntax6">)</span><br /><span class="gutter"> 31:</span> <span class="syntax18">{</span><br /><span class="gutter"> 32:</span> dwr<span class="syntax18">.</span>util<span class="syntax18">.</span><span class="syntax6">removeAllOptions(</span><span class="syntax13">"</span><span class="syntax13">cbDisco</span><span class="syntax13">"</span><span class="syntax6">)</span><span class="syntax18">;</span><br /><span class="gutter"> 33:</span> dwr<span class="syntax18">.</span>util<span class="syntax18">.</span><span class="syntax6">addOptions(</span><span class="syntax13">"</span><span class="syntax13">cbDisco</span><span class="syntax13">"</span><span class="syntax18">,</span> data<span class="syntax6">)</span><span class="syntax18">;</span><br /><span class="gutter"> 34:</span> <span class="syntax18">}</span><span class="syntax6">)</span><span class="syntax18">;</span><br /><span class="gutterH"> 35:</span> <span class="syntax18">}</span><br /><span class="gutter"> 36:</span> <span class="syntax17">&lt;/script&gt;</span><br /><span class="gutter"> 37:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">head</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 38:</span><br /><span class="gutter"> 39:</span> <span class="syntax17">&lt;</span><span class="syntax17">body</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 40:</span> <span class="syntax17">&lt;</span><span class="syntax17">input</span><span class="syntax17"> </span><span class="syntax17">type</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">button</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutter"> 41:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">value</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">Cargar</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutter"> 42:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">onclick</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">obtenerArtistas</span><span class="syntax13">(</span><span class="syntax13">)</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 43:</span> <span class="syntax17">&lt;</span><span class="syntax17">select</span><span class="syntax17"> </span><span class="syntax17">id</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">cbArtista</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutter"> 44:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">onChange</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">obtenerDiscos</span><span class="syntax13">(</span><span class="syntax13">)</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 45:</span> <span class="syntax17">&lt;</span><span class="syntax17">select</span><span class="syntax17"> </span><span class="syntax17">id</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">cbDisco</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 46:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">body</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 47:</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">html</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 48:</span><br /></span></pre><br />Como vemos, la página en si comie</span></span>nza a partir de la línea 39. Tenemos dos <span style="font-weight: bold;">select</span> (combos), uno con <span style="font-weight: bold;">id</span>="<span style="font-weight: bold;">cbArtista</span>" y el otro con <span style="font-weight: bold;">id</span>="<span style="font-weight: bold;">idDisco</span>" y un <span style="font-weight: bold;">button</span>.<br /><br />En el evento <span style="font-weight: bold;">onclick</span> del botón invocamos a la función <span style="font-weight: bold;">obtenerArtistas</span>, y en el evento <span style="font-weight: bold;">onChange</span> del combo de artistas invocamos a la función <span style="font-weight: bold;">obtenerDiscos</span>.<br /><br />Analicemos entonces la función <span style="font-weight: bold;">obtenerArtistas</span> (que se encuentra a partir de la línea 18).<br /><pre><span class="syntax0"><span class="gutter">17:</span><br /><span class="gutter">18:</span> <span class="syntax8">function</span> <span class="syntax6">obtenerArtistas(</span><span class="syntax6">)</span><br /><span class="gutter">19:</span> <span class="syntax18">{</span><br /><span class="gutterH">20:</span> CatalogoCD<span class="syntax18">.</span><span class="syntax6">obtenerArtistas(</span><span class="syntax6">function(</span>data<span class="syntax6">)</span><span class="syntax18">{</span><br /><span class="gutter">21:</span> dwr<span class="syntax18">.</span>util<span class="syntax18">.</span><span class="syntax6">removeAllOptions(</span><span class="syntax13">"</span><span class="syntax13">cbArtista</span><span class="syntax13">"</span><span class="syntax6">)</span><span class="syntax18">;</span> <br /><span class="gutter">22:</span> dwr<span class="syntax18">.</span>util<span class="syntax18">.</span><span class="syntax6">addOptions(</span><span class="syntax13">"</span><span class="syntax13">cbArtista</span><span class="syntax13">"</span><span class="syntax18">,</span> data<span class="syntax6">)</span><span class="syntax18">;</span><br /><span class="gutter">23:</span> <span class="syntax6">obtenerDiscos(</span><span class="syntax6">)</span><span class="syntax18">;</span><br /><span class="gutter">24:</span> <span class="syntax18">}</span><span class="syntax6">)</span><span class="syntax18">;</span><br /><span class="gutterH">25:</span> <span class="syntax18">}</span><br /><span class="gutter">26:</span><br /></span></pre><br />La función invoca a <span style="font-weight: bold;">CatalogoCD.obtenerArtistas</span> pasándole una función callback en la que primero removemos todos los items del combo y luego seteamos en el combo de artistas la colección que retorna el método Java. Por último invocamos a la función <span style="font-weight: bold;">obtenerDiscos</span> para cargargar los discos del artistas que quedó seleccionado.<br /><br />El código de la función <span style="font-weight: bold;">obtenerDiscos</span> está a partir de la línea 27 y lo podemos ver a continuación.<br /><pre><span class="syntax0"><span class="gutter">26:</span> <br /><span class="gutter">27:</span> <span class="syntax8">function</span> <span class="syntax6">obtenerDiscos(</span><span class="syntax6">)</span><br /><span class="gutter">28:</span> <span class="syntax18">{</span><br /><span class="gutter">29:</span> <span class="syntax8">var</span> art <span class="syntax18">=</span> dwr<span class="syntax18">.</span>util<span class="syntax18">.</span><span class="syntax6">getValue(</span><span class="syntax13">"</span><span class="syntax13">cbArtista</span><span class="syntax13">"</span><span class="syntax6">)</span><span class="syntax18">;</span><br /><span class="gutterH">30:</span> CatalogoCD<span class="syntax18">.</span><span class="syntax6">obtenerDiscos(</span>art<span class="syntax18">,</span><span class="syntax6">function(</span>data<span class="syntax6">)</span><br /><span class="gutter">31:</span> <span class="syntax18">{</span><br /><span class="gutter">32:</span> dwr<span class="syntax18">.</span>util<span class="syntax18">.</span><span class="syntax6">removeAllOptions(</span><span class="syntax13">"</span><span class="syntax13">cbDisco</span><span class="syntax13">"</span><span class="syntax6">)</span><span class="syntax18">;</span><br /><span class="gutter">33:</span> dwr<span class="syntax18">.</span>util<span class="syntax18">.</span><span class="syntax6">addOptions(</span><span class="syntax13">"</span><span class="syntax13">cbDisco</span><span class="syntax13">"</span><span class="syntax18">,</span> data<span class="syntax6">)</span><span class="syntax18">;</span><br /><span class="gutter">34:</span> <span class="syntax18">}</span><span class="syntax6">)</span><span class="syntax18">;</span><br /><span class="gutterH">35:</span> <span class="syntax18">}</span><br /><span class="gutter">36:</span> <br /></span></pre><br />En esta función tomamos el valor que se encuentra seleccionado en el combo de artistas y lo asignamos a la variable <span style="font-weight: bold;">art</span>. Luego invocamos a la función <span style="font-weight: bold;">CatalogoCD.obtenerDiscos</span> pasándole <span style="font-weight: bold;">art</span> y una función callback dentro de la cual borramos los items del combo de discos y seteamos en dicho combo la colección que retorna el método Java.<br /><br />El resultado será:<br /><br /><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_X1IHMrfIpE8/RyJggCCjkaI/AAAAAAAABhU/XkzjRCIby1U/s1600-h/11.jpg"><img style="cursor: pointer;" src="http://4.bp.blogspot.com/_X1IHMrfIpE8/RyJggCCjkaI/AAAAAAAABhU/XkzjRCIby1U/s400/11.jpg" alt="" id="BLOGGER_PHOTO_ID_5125765429320716706" border="0" /></a><br /></div><br /><br /><br /><br /><br /><span style="color: rgb(255, 255, 255);">.</span><br /></div></div></div></div></div></div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34013116-3981273997526875419?l=holamundojava.blogspot.com'/></div>PabloSZnoreply@blogger.com3tag:blogger.com,1999:blog-34013116.post-15207742113690129102007-10-15T16:07:00.000-03:002007-10-20T15:08:41.423-03:00Web Services<span style="color: rgb(255, 255, 255);">.</span><br />Web Services es una tecnología middleware que permite exponer como servicio la funcionalidad de los componentes de nuestra aplicación de forma tal que dicha funcionalidad pueda ser accedida en forma remota.<br /><br />Con Web Services podemos brindar acceso a cierta funcionalidad de nuestros sistemas para mejorar el intercambio de información con nuestros clientes y proveedores, y (por otro lado) podemos incrementar la funcionalidad de nuestras aplicaciones mediante el uso de servicios web externos.<br /><br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Fundamentos de los Web Services</span></span><br /><br />Un web service es un servicio provisto por alguien al cual podemos acceder para utilizarlo. El servicio puede estar implementado con cualquier tecnología por lo tanto (el proveedor del servicio) debe ofrecer un archivo con extensión <span style="font-weight: bold;">wsdl</span> en el que describa los detalles del servicio que provee. Esto es: que mensajes se intercambian, que parámetros se deben pasar, que errores puede tirar, etc.<br /><br />En este capítulo veremos como utilizar Web Services provistos por terceras partes y (luego) como desarrollar y publicar nuestros propios servicios.<br /><br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Invocar Web Services provistos por Terceros</span></span><br /><br />Para poder invocar y utilizar un web service primero necesitaremos tener acceso a su <span style="font-weight: bold;">wsdl</span>. Luego tendremos que utilizar alguna API que nos permita (desde Java) invocarlo e interactuar con el servicio para lograr el intercambio de mensajes. Esta API (así como las herramientas necesarias) nos la proveerá <span style="font-weight: bold;">AXIS</span>, un producto open source de Apache.<br /><br />A continuación veremos paso a paso como instalar AXIS y luego como utilizarlo para poder invocar un servicio provisto por terceras partes.<br /><br /><br /><span style="font-weight: bold;"></span><span style="font-weight: bold;">Instalar AXIS</span><br /><br /><span style="font-weight: bold;">1</span> - Descargar <a href="http://ws.apache.org/axis/">AXIS</a> desde esta dirección: <a href="http://apache.patan.com.ar/ws/axis/1_4/axis-src-1_4.zip">http://apache.patan.com.ar/ws/axis/1_4/axis-src-1_4.zip</a> y descomprimirlo en algún directorio.<br /><br /><span style="font-weight: bold;">2</span> - Descargar los archivos <a href="http://www.pablosz.com/download/activation.jar">activation.jar</a> y <a href="http://www.pablosz.com/download/mail.jar">mail.jar</a> y copiarlos en el directorio <span style="font-weight: bold;">$AXIS_HOME/lib</span>.<br /><br /><br /><span style="font-weight: bold;">Configurar un Proyecto en Eclipse</span><br /><br /><span style="font-weight: bold;">3</span> - Antes de comenzar con nuestro proyecto lo mejor será crear una librería que agrupe todos los jar de AXIS. Para esto vamos al menú <span style="font-weight: bold;">Windows</span> -&gt; <span style="font-weight: bold;">Preferences</span> y seleccionamos la opción <span style="font-weight: bold;">Java</span> -&gt; <span style="font-weight: bold;">Build Path </span><span>-&gt;</span><span><span style="font-weight: bold;"> User Libraries</span> como vemos a continuación.<br /><br /></span><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_X1IHMrfIpE8/RxPFqVhKRyI/AAAAAAAABc4/ssBAuTZGfxo/s1600-h/a.jpg"><img style="cursor: pointer;" src="http://1.bp.blogspot.com/_X1IHMrfIpE8/RxPFqVhKRyI/AAAAAAAABc4/ssBAuTZGfxo/s400/a.jpg" alt="" id="BLOGGER_PHOTO_ID_5121654532371793698" border="0" /></a><br /><br /><div style="text-align: left;">Presionando el botón <span style="font-weight: bold;">New</span> podemos crear una nueva librería. En este caso vamos a llamarla <span style="font-weight: bold;">AXIS_1.4</span>.<br /><br /><span style="font-weight: bold;">4</span> - Presionando el botón <span style="font-weight: bold;">Add Jars...</span> (ubicado a la derecha de la ventana) tenemos que agregar todos los <span style="font-weight: bold;">jar</span> que se encuentran en el directorio $AXIS_HOME/lib, incluyedo el <span style="font-weight: bold;">mail.jar</span> y el <span style="font-weight: bold;">activation.jar</span> que descargamos por separado.<br /><br /><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_X1IHMrfIpE8/RxPG-1hKRzI/AAAAAAAABdA/x8kifPybl5M/s1600-h/b.jpg"><img style="cursor: pointer;" src="http://3.bp.blogspot.com/_X1IHMrfIpE8/RxPG-1hKRzI/AAAAAAAABdA/x8kifPybl5M/s400/b.jpg" alt="" id="BLOGGER_PHOTO_ID_5121655984070739762" border="0" /></a><br /></div></div></div><span><br /><span style="font-weight: bold;">5</span> - Ahora si, creamos un proyecto Java (común) y en las preferencias del proyecto le agregamos la librería <span style="font-weight: bold;">AXIS_1.4</span> </span><span>que creamos recién. Esto lo hacemos clikeando en el nombre del proyecto con el botón derecho, seleccionamos <span style="font-weight: bold;">Properties </span>- &gt; <span style="font-weight: bold;"> Java Buil Path</span> -&gt; <span style="font-weight: bold;">Libraries -</span> &gt; <span style="font-weight: bold;">User Libraries</span> -&gt; <span style="font-weight: bold;">Next</span><span>.<br /><br /></span></span><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_X1IHMrfIpE8/RxPJdVhKR0I/AAAAAAAABdI/vxQj8BUVxNc/s1600-h/d.jpg"><img style="cursor: pointer;" src="http://1.bp.blogspot.com/_X1IHMrfIpE8/RxPJdVhKR0I/AAAAAAAABdI/vxQj8BUVxNc/s400/d.jpg" alt="" id="BLOGGER_PHOTO_ID_5121658707080005442" border="0" /></a><br /></div><br /><br /><span style="font-weight: bold;">Crear un Cliente para un Web Service</span><br /><br />Ahora que tenemos creado un proyecto con los jars necesarios para trabajar con AXIS vamos a crear un cliente que nos permita invocar un servicio web.<br /><br />En esta página tenemos Web Services publicados que podemos utilizar para realizar pruebas: <a href="http://xmethods.com/">http://xmethods.com/</a><br /><br />Comenzaremos por probar un servicio que, dado un código postal de Estados Unidos retorna el nombre de la localidad. Su wsdl es el siguiente:<br />http://webservices.imacination.com/distance/Distance.jws?wsdl<br /><br />AXIS proporciona una herramienta que lee el wsdl y genera las clases Java necesarias para establecer la conexión con el servicio e invocarlo de forma simple y transparente. Esta herramienta es una clase llamada <span style="font-weight: bold;">WSDL2Java</span>. También está la herramienta inversa: <span style="font-weight: bold;">Java2WSDL</span> que permite generar el wsdl para una clase Java que querramos exponer como servicio web.<br /><br /><span style="font-weight: bold;">1</span> - Tenemos que generar las clases para interactuar con el web service. Para esto abrimos la librería AXIS_1.4 y buscamos la clase <span style="font-weight: bold;">WSDL2Java.class</span> dentro del paquete <span style="font-weight: bold;">org.apache.axis.wsdl</span> tal como vemos en la imagen.<br /><br /><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_X1IHMrfIpE8/RxPP71hKR1I/AAAAAAAABdQ/ZXEyU834y7A/s1600-h/e.jpg"><img style="cursor: pointer;" src="http://3.bp.blogspot.com/_X1IHMrfIpE8/RxPP71hKR1I/AAAAAAAABdQ/ZXEyU834y7A/s400/e.jpg" alt="" id="BLOGGER_PHOTO_ID_5121665828135782226" border="0" /></a><br /></div><br /><span style="font-weight: bold;">2</span> - La clase WSDL2Java recibe como argumento en línea de comandos la dirección del wsdl que debe mapear. Para pasarle este parámetro hacemos "click" con el botón derecho sobre la clase y seleccionamos <span style="font-weight: bold;">Run As</span> -&gt; <span style="font-weight: bold;">Run</span> -&gt; <span style="font-weight: bold;">Arguments</span> y en "<span style="font-weight: bold;">Program Arguments</span>" pegamos la dirección del wsdl:<br />http://webservices.imacination.com/distance/Distance.jws?wsdl<br /><br /><span style="font-weight: bold;">3</span> - Una vez que ejecutamos la clase, AXIS generará en el directorio del proyecto las clases necesarias para invocar e interactuar con el web service. Las podemos ver si hacemos "<span style="font-weight: bold;">Refresh</span>" sobre el proyecto.<br /><br /><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_X1IHMrfIpE8/RxPUnFhKR2I/AAAAAAAABdY/D2NaLutaGWA/s1600-h/f.jpg"><img style="cursor: pointer;" src="http://4.bp.blogspot.com/_X1IHMrfIpE8/RxPUnFhKR2I/AAAAAAAABdY/D2NaLutaGWA/s400/f.jpg" alt="" id="BLOGGER_PHOTO_ID_5121670969211635554" border="0" /></a><br /><div style="text-align: left;"><br /><span style="font-weight: bold;">4</span> - Para poder utilizar estas clases tenemos que copiar toda la rama (desde el directorio <span style="font-weight: bold;">com</span>) en nuestro directorio de clases. Simplemente lo hacemos copiando [<span style="font-weight: bold;">CTRL+C</span>] y pegando [<span style="font-weight: bold;">CTRL+V</span>] desde eclipse.<br /><br />Entre las clases que generó AXIS tenemos <span style="font-weight: bold;">Distance.java</span>. Esta es la interface que define todos los servicios expuestos detrás del web service.<br /><br /><span style="font-weight: bold;">Distance.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span><br /><span class="gutter"> 3:</span>com.imacination.webservices.distance.Distance_jws;<br /><span class="gutter"> 4:</span><br /><span class="gutterH"> 5:</span><span class="syntax9">import</span> java.rmi.RemoteException;<br /><span class="gutter"> 6:</span><span class="syntax8">public</span> <span class="syntax10">interface</span> Distance <span class="syntax8">extends</span> java.rmi.Remote<br /><span class="gutter"> 7:</span><span class="syntax18">{</span><br /><span class="gutter"> 8:</span> <span class="syntax8">public</span> String <span class="syntax6">getState</span><span class="syntax18">(</span>String zip<span class="syntax18">)</span><br /><span class="gutter"> 9:</span> <span class="syntax8">throws</span> RemoteException;<br /><span class="gutterH"> 10:</span> <br /><span class="gutter"> 11:</span> <span class="syntax8">public</span> String <span class="syntax6">getLocation</span><span class="syntax18">(</span>String zip<span class="syntax18">)</span><br /><span class="gutter"> 12:</span> <span class="syntax8">throws</span> RemoteException;<br /><span class="gutter"> 13:</span> <br /><span class="gutter"> 14:</span> <span class="syntax8">public</span> String <span class="syntax6">getCity</span><span class="syntax18">(</span>String zip<span class="syntax18">)</span><br /><span class="gutterH"> 15:</span> <span class="syntax8">throws</span> RemoteException;<br /><span class="gutter"> 16:</span> <br /><span class="gutter"> 17:</span> <span class="syntax8">public</span> <span class="syntax10">double</span> <span class="syntax6">getDistance</span><span class="syntax18">(</span>String from,String to<span class="syntax18">)</span><br /><span class="gutter"> 18:</span> <span class="syntax8">throws</span> RemoteException;<br /><span class="gutter"> 19:</span> <br /><span class="gutterH"> 20:</span> <span class="syntax8">public</span> <span class="syntax10">double</span> <span class="syntax6">getLatitude</span><span class="syntax18">(</span>String zip<span class="syntax18">)</span><br /><span class="gutter"> 21:</span> <span class="syntax8">throws</span> RemoteException;<br /><span class="gutter"> 22:</span> <br /><span class="gutter"> 23:</span> <span class="syntax8">public</span> <span class="syntax10">double</span> <span class="syntax6">getLongitude</span><span class="syntax18">(</span>String zip<span class="syntax18">)</span><br /><span class="gutter"> 24:</span> <span class="syntax8">throws</span> RemoteException;<br /><span class="gutterH"> 25:</span><span class="syntax18">}</span><br /><span class="gutter"> 26:</span><br /></span></pre><br />Veamos ahora nuestro cliente que utiliza estas clases para invocar los servicios expuestos detrás del web service:<br /><br /><span style="font-weight: bold;">Test1WS.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span> test;<br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax9">import</span> com.imacination<br /><span class="gutterH"> 5:</span> .webservices.distance.Distance_jws.*;<br /><span class="gutter"> 6:</span><br /><span class="gutter"> 7:</span><span class="syntax8">public</span> <span class="syntax10">class</span> TestWS1<br /><span class="gutter"> 8:</span><span class="syntax18">{</span><br /><span class="gutter"> 9:</span> <span class="syntax8">public</span> <span class="syntax8">static</span> <span class="syntax10">void</span> <span class="syntax6">main</span><span class="syntax18">(</span>String[] args<span class="syntax18">)</span><br /><span class="gutterH"> 10:</span> <span class="syntax8">throws</span> Exception<br /><span class="gutter"> 11:</span> <span class="syntax18">{</span><br /><span class="gutter"> 12:</span> DistanceService service <span class="syntax18">=</span><br /><span class="gutter"> 13:</span> <span class="syntax8">new</span> <span class="syntax6">DistanceServiceLocator</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 14:</span><br /><span class="gutterH"> 15:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">aqui</span><span class="syntax2"> </span><span class="syntax2">obtenemos</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">interface</span><span class="syntax2"> </span><span class="syntax2">a</span><span class="syntax2"> </span><span class="syntax2">traves</span><span class="syntax2"> </span><span class="syntax2">de</span><br /><span class="gutter"> 16:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">cual</span><span class="syntax2"> </span><span class="syntax2">podemos</span><span class="syntax2"> </span><span class="syntax2">invocar</span><span class="syntax2"> </span><span class="syntax2">los</span><span class="syntax2"> </span><span class="syntax2">metodos</span><span class="syntax2"> </span><span class="syntax2">del</span><br /><span class="gutter"> 17:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">web</span><span class="syntax2"> </span><span class="syntax2">service</span><br /><span class="gutter"> 18:</span> Distance distance<span class="syntax18">=</span>service.<span class="syntax6">getDistance</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 19:</span><br /><span class="gutterH"> 20:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">nombre</span><span class="syntax2"> </span><span class="syntax2">de</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">localidad</span><span class="syntax2"> </span><span class="syntax2">zip=90210</span><br /><span class="gutter"> 21:</span> String loc1<span class="syntax18">=</span>distance.<span class="syntax6">getLocation</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">90210</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 22:</span> System.out.<span class="syntax6">println</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">90210=</span><span class="syntax13">"</span><span class="syntax18">+</span>loc1<span class="syntax18">)</span>;<br /><span class="gutter"> 23:</span><br /><span class="gutter"> 24:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">nombre</span><span class="syntax2"> </span><span class="syntax2">de</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">localidad</span><span class="syntax2"> </span><span class="syntax2">zip=14280</span><br /><span class="gutterH"> 25:</span> String loc2<span class="syntax18">=</span>distance.<span class="syntax6">getLocation</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">14280</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 26:</span> System.out.<span class="syntax6">println</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">14280=</span><span class="syntax13">"</span><span class="syntax18">+</span>loc2<span class="syntax18">)</span>;<br /><span class="gutter"> 27:</span><br /><span class="gutter"> 28:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">calculo</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">distancia</span><span class="syntax2"> </span><span class="syntax2">entre</span><span class="syntax2"> </span><span class="syntax2">las</span><span class="syntax2"> </span><span class="syntax2">dos</span><br /><span class="gutter"> 29:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">localidades</span><br /><span class="gutterH"> 30:</span> <span class="syntax10">double</span> dist<span class="syntax18">=</span>distance.<span class="syntax6">getDistance</span><span class="syntax18">(</span><br /><span class="gutter"> 31:</span> <span class="syntax13">"</span><span class="syntax13">90210</span><span class="syntax13">"</span>,<span class="syntax13">"</span><span class="syntax13">14280</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 32:</span> System.out.<span class="syntax6">print</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">La</span><span class="syntax13"> </span><span class="syntax13">distancia</span><span class="syntax13"> </span><span class="syntax13">entre</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 33:</span> System.out.<span class="syntax6">print</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">[</span><span class="syntax13">"</span><span class="syntax18">+</span>loc1<span class="syntax18">+</span><span class="syntax13">"</span><span class="syntax13">]</span><span class="syntax13"> </span><span class="syntax13">y</span><span class="syntax13"> </span><span class="syntax13">[</span><span class="syntax13">"</span><span class="syntax18">+</span>loc2<span class="syntax18">+</span><span class="syntax13">"</span><span class="syntax13">]</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 34:</span> System.out.<span class="syntax6">println</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13"> </span><span class="syntax13">es:</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">+</span>dist<span class="syntax18">)</span>;<br /><span class="gutterH"> 35:</span> <span class="syntax18">}</span><br /><span class="gutter"> 36:</span><span class="syntax18">}</span><br /><span class="gutter"> 37:</span><br /></span></pre><br />Probemos ahora con otro web service, cuyo wdsl está publicado aquí:<br />http://demo.wsabi.org/axis/services/YahooUserPingService?wsdl<br /><br />Este servicio permite saber si un usuario de Yahoo está logueado o no.<br /><br />Debemos volver a correr WSDL2Java pasándole la dirección del wsdl del web service y luego copiar las clases generadas a la carpeta de código fuente del proyecto.<br /><br />Luego, un cliente que pruebe el servicio puede ser este:<br /><br /><span style="font-weight: bold;">Test2WS.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span> test;<br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax9">import</span> org.wsabi.demo.axis.services.<br /><span class="gutterH"> 5:</span> YahooUserPingService.*;<br /><span class="gutter"> 6:</span><br /><span class="gutter"> 7:</span><span class="syntax8">public</span> <span class="syntax10">class</span> TestWS2<br /><span class="gutter"> 8:</span><span class="syntax18">{</span><br /><span class="gutter"> 9:</span> <span class="syntax8">public</span> <span class="syntax8">static</span> <span class="syntax10">void</span> <span class="syntax6">main</span><span class="syntax18">(</span>String[] args<span class="syntax18">)</span><br /><span class="gutterH"> 10:</span> <span class="syntax8">throws</span> Exception<br /><span class="gutter"> 11:</span> <span class="syntax18">{</span><br /><span class="gutter"> 12:</span> YahooUserPingService service;<br /><span class="gutter"> 13:</span> YahooUserPing ping;<br /><span class="gutter"> 14:</span> <span class="syntax10">boolean</span> online;<br /><span class="gutterH"> 15:</span><br /><span class="gutter"> 16:</span> service <span class="syntax18">=</span> <span class="syntax8">new</span> <span class="syntax6">YahooUserPingServiceLocator</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 17:</span> ping <span class="syntax18">=</span> service.<span class="syntax6">getYahooUserPingService</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 18:</span><br /><span class="gutter"> 19:</span> onLine <span class="syntax18">=</span> ping.<span class="syntax6">isUserOnLine</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">pabloszn</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 20:</span> System.out.<span class="syntax6">println</span><span class="syntax18">(</span>onLine<span class="syntax18">)</span>;<br /><span class="gutter"> 21:</span> <span class="syntax18">}</span><br /><span class="gutter"> 22:</span><span class="syntax18">}</span><br /><span class="gutter"> 23:</span><br /></span></pre><br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Escribir Nuestros Propios Web Services</span></span><br /><br />La forma más rápida y simple de instalar un web service en AXIS es utilizando la característica provista por AXIS llamada <span style="font-weight: bold;">Instant Deployment</span>.<br /><br />Con Instant Deployment tan solo tenemos que escribir una clase Java con los métodos que queremos exponer y luego copiarla con extensión <span style="font-weight: bold;">jws</span> (Java Web Services) al directorio $AXIS_HOME/webapps/axis.<br /><br />Veamos entonces el código de nuestro HolaMundo web service.<br /><br /><span style="font-weight: bold;">HolaMundoWS.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax8">public</span> <span class="syntax10">class</span> HolaMundoWS<br /><span class="gutter"> 3:</span><span class="syntax18">{</span><br /><span class="gutter"> 4:</span> <span class="syntax8">public</span> String <span class="syntax6">saludo</span><span class="syntax18">(</span>String nom<span class="syntax18">)</span><br /><span class="gutterH"> 5:</span> <span class="syntax18">{</span><br /><span class="gutter"> 6:</span> <span class="syntax8">return</span> <span class="syntax8">new</span> <span class="syntax6">String</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Hola</span><span class="syntax13"> </span><span class="syntax13">Mundo,</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">+</span>nom<span class="syntax18">)</span>;<br /><span class="gutter"> 7:</span> <span class="syntax18">}</span><br /><span class="gutter"> 8:</span><span class="syntax18">}</span><br /><span class="gutter"> 9:</span><br /></span></pre><br />El próximo paso será copiar el archivo HolaMundoWS.java (el código fuente) en el directorio $AXIS_HOME/webapps/axis con el nombre <span style="font-weight: bold;">HolaMundoWS.jws</span>.<br /><br />Ahora vamos a codificar un cliente que invoque el servicio.<br /><br /><span style="font-weight: bold;">HolaMundoClienteWS.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">import</span> javax.xml.rpc.ParameterMode;<br /><span class="gutter"> 3:</span><span class="syntax9">import</span> org.apache.axis.client.Call;<br /><span class="gutter"> 4:</span><span class="syntax9">import</span> org.apache.axis.client.Service;<br /><span class="gutterH"> 5:</span><span class="syntax9">import</span> org.apache.axis.encoding.XMLType;<br /><span class="gutter"> 6:</span><br /><span class="gutter"> 7:</span><span class="syntax8">public</span> <span class="syntax10">class</span> HolaMundoClient<br /><span class="gutter"> 8:</span><span class="syntax18">{</span><br /><span class="gutter"> 9:</span> <span class="syntax8">public</span> <span class="syntax8">static</span> <span class="syntax10">void</span> <span class="syntax6">main</span><span class="syntax18">(</span>String[] args<span class="syntax18">)</span><br /><span class="gutterH"> 10:</span> <span class="syntax8">throws</span> Exception<br /><span class="gutter"> 11:</span> <span class="syntax18">{</span><br /><span class="gutter"> 12:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">url</span><span class="syntax2"> </span><span class="syntax2">del</span><span class="syntax2"> </span><span class="syntax2">servicio</span><span class="syntax2"> </span><span class="syntax2">que</span><span class="syntax2"> </span><span class="syntax2">vamos</span><span class="syntax2"> </span><span class="syntax2">a</span><span class="syntax2"> </span><span class="syntax2">invocar</span><br /><span class="gutter"> 13:</span> String endpointURL<span class="syntax18">=</span><span class="syntax13">"</span><span class="syntax13">http://localhost:8080</span><span class="syntax13">"</span><br /><span class="gutter"> 14:</span> <span class="syntax18">+</span><span class="syntax13">"</span><span class="syntax13">/axis/HolaMundoWS.jws</span><span class="syntax13">"</span>;<br /><span class="gutterH"> 15:</span><br /><span class="gutter"> 16:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">creamos</span><span class="syntax2"> </span><span class="syntax2">una</span><span class="syntax2"> </span><span class="syntax2">llamada</span><span class="syntax2"> </span><span class="syntax2">remota</span><br /><span class="gutter"> 17:</span> Service service <span class="syntax18">=</span> <span class="syntax8">new</span> <span class="syntax6">Service</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 18:</span> Call call <span class="syntax18">=</span> <span class="syntax18">(</span>Call<span class="syntax18">)</span> service.<span class="syntax6">createCall</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 19:</span><br /><span class="gutterH"> 20:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">seteamos</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">url</span><br /><span class="gutter"> 21:</span> call.<span class="syntax6">setTargetEndpointAddress</span><span class="syntax18">(</span>endpointURL<span class="syntax18">)</span>;<br /><span class="gutter"> 22:</span><br /><span class="gutter"> 23:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">nombre</span><span class="syntax2"> </span><span class="syntax2">del</span><span class="syntax2"> </span><span class="syntax2">metodo</span><span class="syntax2"> </span><span class="syntax2">a</span><span class="syntax2"> </span><span class="syntax2">invocar</span><br /><span class="gutter"> 24:</span> call.<span class="syntax6">setOperationName</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">saludo</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 25:</span><br /><span class="gutter"> 26:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">nombre</span><span class="syntax2"> </span><span class="syntax2">del</span><span class="syntax2"> </span><span class="syntax2">parametro,</span><span class="syntax2"> </span><span class="syntax2">tipo</span><span class="syntax2"> </span><span class="syntax2">de</span><span class="syntax2"> </span><span class="syntax2">dato</span><span class="syntax2"> </span><br /><span class="gutter"> 27:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">y</span><span class="syntax2"> </span><span class="syntax2">si</span><span class="syntax2"> </span><span class="syntax2">es</span><span class="syntax2"> </span><span class="syntax2">parametro</span><span class="syntax2"> </span><span class="syntax2">de</span><span class="syntax2"> </span><span class="syntax2">IN,OUT</span><span class="syntax2"> </span><span class="syntax2">o</span><span class="syntax2"> </span><span class="syntax2">INOUT</span><br /><span class="gutter"> 28:</span> call.<span class="syntax6">addParameter</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">nom</span><span class="syntax13">"</span><br /><span class="gutter"> 29:</span> , XMLType.XSD_STRING<br /><span class="gutterH"> 30:</span> , ParameterMode.IN<span class="syntax18">)</span>;<br /><span class="gutter"> 31:</span><br /><span class="gutter"> 32:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">tipo</span><span class="syntax2"> </span><span class="syntax2">de</span><span class="syntax2"> </span><span class="syntax2">dato</span><span class="syntax2"> </span><span class="syntax2">de</span><span class="syntax2"> </span><span class="syntax2">retorno</span><br /><span class="gutter"> 33:</span> call.<span class="syntax6">setReturnType</span><span class="syntax18">(</span>XMLType.XSD_STRING<span class="syntax18">)</span>;<br /><span class="gutter"> 34:</span><br /><span class="gutterH"> 35:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">argumentos</span><span class="syntax2"> </span><span class="syntax2">a</span><span class="syntax2"> </span><span class="syntax2">pasar</span><br /><span class="gutter"> 36:</span> Object params[]<span class="syntax18">=</span><span class="syntax18">{</span> <span class="syntax13">"</span><span class="syntax13">PabloSZ</span><span class="syntax13">"</span> <span class="syntax18">}</span>;<br /><span class="gutter"> 37:</span><br /><span class="gutter"> 38:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">invocamos</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">metodo</span><span class="syntax2"> </span><span class="syntax2">remoto</span><br /><span class="gutter"> 39:</span> String ret <span class="syntax18">=</span> <span class="syntax18">(</span>String<span class="syntax18">)</span> call.<span class="syntax6">invoke</span><span class="syntax18">(</span>params<span class="syntax18">)</span>;<br /><span class="gutterH"> 40:</span><br /><span class="gutter"> 41:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">--</span><span class="syntax2"> </span><span class="syntax2">:O)</span><span class="syntax2"> </span><span class="syntax2">--</span><br /><span class="gutter"> 42:</span> System.out.<span class="syntax6">println</span><span class="syntax18">(</span>ret<span class="syntax18">)</span>;<br /><span class="gutter"> 43:</span> <span class="syntax18">}</span><br /><span class="gutter"> 44:</span><span class="syntax18">}</span><br /><span class="gutterH"> 45:</span><br /></span></pre><br />El tema ahora será levantar el servidor AXIS. Tenemos dos opciones:<br /><br />1 - Levantar el server que trae axis. Para esto tenemos que correrlo en línea de comandos, posicionados en el directorio $AXIS_HOME/webapps y seteando en el CLASSPATH todos los jar que se encuentran en el directorio lib. Podríamos hacer un .bat que haga todo el trabajo por nosotros.<br /><br /><span style="font-weight: bold;">runServer.bat</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax10">@</span><span class="syntax8">echo</span> off<br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax1">rem</span><span class="syntax1"> </span><span class="syntax1">JH</span><span class="syntax1"> </span><span class="syntax1">-&gt;</span><span class="syntax1"> </span><span class="syntax1">JAVA_HOME</span><br /><span class="gutterH"> 5:</span><span class="syntax10">@</span><span class="syntax8">SET</span> JH=\java\jdk1.5.0<br /><span class="gutter"> 6:</span><br /><span class="gutter"> 7:</span><span class="syntax1">rem</span><span class="syntax1"> </span><span class="syntax1">AH</span><span class="syntax1"> </span><span class="syntax1">-&gt;</span><span class="syntax1"> </span><span class="syntax1">AXIS_HOME</span><br /><span class="gutter"> 8:</span><span class="syntax10">@</span><span class="syntax8">SET</span> AH=\JAVA\axis-1_4<br /><span class="gutter"> 9:</span><br /><span class="gutterH"> 10:</span><span class="syntax1">rem</span><span class="syntax1"> </span><span class="syntax1">ACS</span><span class="syntax1"> </span><span class="syntax1">-&gt;</span><span class="syntax1"> </span><span class="syntax1">AXIS</span><span class="syntax1"> </span><span class="syntax1">CLASS</span><span class="syntax1"> </span><span class="syntax1">SERVER</span><br /><span class="gutter"> 11:</span><span class="syntax10">@</span><span class="syntax8">SET</span> ACS=org.apache.axis.transport.http<br /><span class="gutter"> 12:</span><span class="syntax10">@</span><span class="syntax8">SET</span> ACS=<span class="syntax9">%</span><span class="syntax9">ACS</span><span class="syntax9">%</span>.SimpleAxisServer<br /><span class="gutter"> 13:</span><br /><span class="gutter"> 14:</span><span class="syntax1">rem</span><span class="syntax1"> </span><span class="syntax1">CP</span><span class="syntax1"> </span><span class="syntax1">-&gt;</span><span class="syntax1"> </span><span class="syntax1">CLASSPATH</span><br /><span class="gutterH"> 15:</span><span class="syntax10">@</span><span class="syntax8">SET</span> CP=<span class="syntax9">%</span><span class="syntax9">AH</span><span class="syntax9">%</span>\lib\activation.jar;<br /><span class="gutter"> 16:</span><span class="syntax10">@</span><span class="syntax8">SET</span> CP=<span class="syntax9">%</span><span class="syntax9">CP</span><span class="syntax9">%</span>;<span class="syntax9">%</span><span class="syntax9">AH</span><span class="syntax9">%</span>\lib\axis.jar;<br /><span class="gutter"> 17:</span><span class="syntax10">@</span><span class="syntax8">SET</span> CP=<span class="syntax9">%</span><span class="syntax9">CP</span><span class="syntax9">%</span>;<span class="syntax9">%</span><span class="syntax9">AH</span><span class="syntax9">%</span>\lib\axis-ant.jar;<br /><span class="gutter"> 18:</span><span class="syntax10">@</span><span class="syntax8">SET</span> CP=<span class="syntax9">%</span><span class="syntax9">CP</span><span class="syntax9">%</span>;<span class="syntax9">%</span><span class="syntax9">AH</span><span class="syntax9">%</span>\lib\commons-discovery-0.2.jar;<br /><span class="gutter"> 19:</span><span class="syntax10">@</span><span class="syntax8">SET</span> CP=<span class="syntax9">%</span><span class="syntax9">CP</span><span class="syntax9">%</span>;<span class="syntax9">%</span><span class="syntax9">AH</span><span class="syntax9">%</span>\lib\commons-logging-1.0.4.jar;<br /><span class="gutterH"> 20:</span><span class="syntax10">@</span><span class="syntax8">SET</span> CP=<span class="syntax9">%</span><span class="syntax9">CP</span><span class="syntax9">%</span>;<span class="syntax9">%</span><span class="syntax9">AH</span><span class="syntax9">%</span>\lib\jaxrpc.jar;<br /><span class="gutter"> 21:</span><span class="syntax10">@</span><span class="syntax8">SET</span> CP=<span class="syntax9">%</span><span class="syntax9">CP</span><span class="syntax9">%</span>;<span class="syntax9">%</span><span class="syntax9">AH</span><span class="syntax9">%</span>\lib\log4j-1.2.8.jar;<br /><span class="gutter"> 22:</span><span class="syntax10">@</span><span class="syntax8">SET</span> CP=<span class="syntax9">%</span><span class="syntax9">CP</span><span class="syntax9">%</span>;<span class="syntax9">%</span><span class="syntax9">AH</span><span class="syntax9">%</span>\lib\saaj.jar;<br /><span class="gutter"> 23:</span><span class="syntax10">@</span><span class="syntax8">SET</span> CP=<span class="syntax9">%</span><span class="syntax9">CP</span><span class="syntax9">%</span>;<span class="syntax9">%</span><span class="syntax9">AH</span><span class="syntax9">%</span>\lib\mail.jar;<br /><span class="gutter"> 24:</span><span class="syntax10">@</span><span class="syntax8">SET</span> CP=<span class="syntax9">%</span><span class="syntax9">CP</span><span class="syntax9">%</span>;<span class="syntax9">%</span><span class="syntax9">AH</span><span class="syntax9">%</span>\lib\wsdl4j-1.5.1.jar;<br /><span class="gutterH"> 25:</span><br /><span class="gutter"> 26:</span><span class="syntax9">%</span><span class="syntax9">JH</span><span class="syntax9">%</span>\bin\java -cp <span class="syntax9">%</span><span class="syntax9">CP</span><span class="syntax9">%</span> <span class="syntax9">%</span><span class="syntax9">ACS</span><span class="syntax9">%</span><br /><span class="gutter"> 27:</span><br /></span></pre><br />2 - La otro opción es copiar el directorio <span style="font-weight: bold;">axis</span> (ubicado en $AXIS_HOME/webapps) al $TOMCAT_HOME/webapps. Es decir: deployar AXIS como una aplicación web en tomcat. Luego (obviamente) correr Tomcat.<br /><br /><br />Lamentablemente, algo tan simple solo puede servir para muy poco... Con Instant Deployment solo podemos deployar servicios que manejen tipos básicos (no clases nuestras serializables). Tampoco podemos utilizar paquetes, etc.<br /><br />Para deployar web services un poco más complejos tendremos que deployarlos de otra forma, como veremos a continuación.<br /><br /><br /><span style="font-weight: bold;">Custom Deployment</span><br /><br />Para deployar un servicio con custom deployment será necesario escribir un archivo <span style="font-weight: bold;">wsdd </span>con código xml que describa el web service.<br /><br />Vamos a plantear un ejemplo. Se trata de un servicio <span style="font-weight: bold;">FacadeWS </span>que tiene dos métodos: <span style="font-weight: bold;">login </span>y <span style="font-weight: bold;">obtenerUsuarios</span>. El método <span style="font-weight: bold;">login </span>recibe usuario y password y retorna un <span style="font-weight: bold;">UsuarioDTO </span>si el login fue exitoso o <span style="font-weight: bold;">null </span>si no lo fue. El método <span style="font-weight: bold;">obtenerUsuarios </span>retorna una <span style="font-weight: bold;">Collection </span>de <span style="font-weight: bold;">UsuarioDTO </span>con todos los usuarios registrados en el sistema.<br /><br /><span style="font-weight: bold;">1</span> - Creamos las clases UsuarioDTO.java y FacadeWS.java<br /><br /><span style="font-weight: bold;">UsuarioDTO.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span> test.customdeploy;<br /><span class="gutter"> 3:</span><span class="syntax9">import</span> java.io.Serializable;<br /><span class="gutter"> 4:</span><br /><span class="gutterH"> 5:</span><span class="syntax8">public</span> <span class="syntax10">class</span> UsuarioDTO <span class="syntax8">implements</span> Serializable<br /><span class="gutter"> 6:</span><span class="syntax18">{</span><br /><span class="gutter"> 7:</span> <span class="syntax8">private</span> String username;<br /><span class="gutter"> 8:</span> <span class="syntax8">private</span> String password;<br /><span class="gutter"> 9:</span> <span class="syntax8">private</span> String email;<br /><span class="gutterH"> 10:</span><br /><span class="gutter"> 11:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">constructor</span><span class="syntax2"> </span><span class="syntax2">nulo</span><br /><span class="gutter"> 12:</span> <span class="syntax8">public</span> <span class="syntax6">UsuarioDTO</span><span class="syntax18">(</span><span class="syntax18">)</span><span class="syntax18">{</span> <span class="syntax18">}</span><br /><span class="gutter"> 13:</span><br /><span class="gutter"> 14:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">constructor</span><span class="syntax2"> </span><span class="syntax2">con</span><span class="syntax2"> </span><span class="syntax2">los</span><span class="syntax2"> </span><span class="syntax2">campos</span><br /><span class="gutterH"> 15:</span> <span class="syntax8">public</span> <span class="syntax6">UsuarioDTO</span><span class="syntax18">(</span>String username<br /><span class="gutter"> 16:</span> ,String password<br /><span class="gutter"> 17:</span> , String email<span class="syntax18">)</span><br /><span class="gutter"> 18:</span> <span class="syntax18">{</span><br /><span class="gutter"> 19:</span> <span class="syntax14">this</span>.username <span class="syntax18">=</span> username;<br /><span class="gutterH"> 20:</span> <span class="syntax14">this</span>.password <span class="syntax18">=</span> password;<br /><span class="gutter"> 21:</span> <span class="syntax14">this</span>.email <span class="syntax18">=</span> email;<br /><span class="gutter"> 22:</span> <span class="syntax18">}</span><br /><span class="gutter"> 23:</span><br /><span class="gutter"> 24:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">getters</span><br /><span class="gutterH"> 25:</span> <span class="syntax8">public</span> String <span class="syntax6">getUsername</span><span class="syntax18">(</span><span class="syntax18">)</span> <span class="syntax18">{</span> <span class="syntax8">return</span> username; <span class="syntax18">}</span><br /><span class="gutter"> 26:</span> <span class="syntax8">public</span> String <span class="syntax6">getPassword</span><span class="syntax18">(</span><span class="syntax18">)</span> <span class="syntax18">{</span> <span class="syntax8">return</span> password; <span class="syntax18">}</span><br /><span class="gutter"> 27:</span> <span class="syntax8">public</span> String <span class="syntax6">getEmail</span><span class="syntax18">(</span><span class="syntax18">) </span><span class="syntax18">{</span> <span class="syntax8">return</span> email; <span class="syntax18">}</span><br /><span class="gutter"> 28:</span><br /><span class="gutter"> 29:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">setters</span><br /><span class="gutterH"> 30:</span><br /><span class="gutter"> 31:</span> <span class="syntax8">public</span> <span class="syntax10">void</span> <span class="syntax6">setUsername</span><span class="syntax18">(</span>String username<span class="syntax18">)</span><br /><span class="gutter"> 32:</span> <span class="syntax18">{</span><br /><span class="gutter"> 33:</span> <span class="syntax14">this</span>.username <span class="syntax18">=</span> username;<br /><span class="gutter"> 34:</span> <span class="syntax18">}</span><br /><span class="gutterH"> 35:</span><br /><span class="gutter"> 36:</span> <span class="syntax8">public</span> <span class="syntax10">void</span> <span class="syntax6">setPassword</span><span class="syntax18">(</span>String password<span class="syntax18">)</span><br /><span class="gutter"> 37:</span> <span class="syntax18">{</span><br /><span class="gutter"> 38:</span> <span class="syntax14">this</span>.password <span class="syntax18">=</span> password;<br /><span class="gutter"> 39:</span> <span class="syntax18">}</span><br /><span class="gutterH"> 40:</span><br /><span class="gutter"> 41:</span> <span class="syntax8">public</span> <span class="syntax10">void</span> <span class="syntax6">setEmail</span><span class="syntax18">(</span>String email<span class="syntax18">)</span><br /><span class="gutter"> 42:</span> <span class="syntax18">{</span><br /><span class="gutter"> 43:</span> <span class="syntax14">this</span>.email <span class="syntax18">=</span> email;<br /><span class="gutter"> 44:</span> <span class="syntax18">}</span><br /><span class="gutterH"> 45:</span><br /><span class="gutter"> 46:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">toString</span><span class="syntax2"> </span><span class="syntax2">para</span><span class="syntax2"> </span><span class="syntax2">poder</span><span class="syntax2"> </span><span class="syntax2">imprimir</span><span class="syntax2"> </span><span class="syntax2">facilmente</span><span class="syntax2"> </span><span class="syntax2">un</span><span class="syntax2"> </span><span class="syntax2">dto</span><br /><span class="gutter"> 47:</span> <span class="syntax8">public</span> String <span class="syntax6">toString</span><span class="syntax18">(</span><span class="syntax18">)</span><br /><span class="gutter"> 48:</span> <span class="syntax18">{</span><br /><span class="gutter"> 49:</span> <span class="syntax8">return</span> username<span class="syntax18">+</span><span class="syntax13">"</span><span class="syntax13">,</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">+</span>password<span class="syntax18">+</span><span class="syntax13">"</span><span class="syntax13">,</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">+</span>email;<br /><span class="gutterH"> 50:</span> <span class="syntax18">}</span><br /><span class="gutter"> 51:</span><span class="syntax18">}</span><br /><span class="gutter"> 52:</span><br /></span></pre><br />Como vemos, UsuarioDTO simplemente es un bean con atributos, setters y getters, e implementa la interface <span style="font-weight: bold;">Serializable</span> ya que debe viajar entre el servidor y el cliente.<br /><br />Veamos ahora la clase FacadeWS.<br /><br /><span style="font-weight: bold;">FacadeWS.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span> test.customdeploy;<br /><span class="gutter"> 3:</span><span class="syntax9">import</span> java.util.*;<br /><span class="gutter"> 4:</span><br /><span class="gutterH"> 5:</span><span class="syntax8">public</span> <span class="syntax10">class</span> FacadeWS<br /><span class="gutter"> 6:</span><span class="syntax18">{</span><br /><span class="gutter"> 7:</span> <span class="syntax8">private</span> Hashtable usuarios;<br /><span class="gutter"> 8:</span><br /><span class="gutter"> 9:</span> <span class="syntax8">public</span> <span class="syntax6">FacadeWS</span><span class="syntax18">(</span><span class="syntax18">)</span><br /><span class="gutterH"> 10:</span> <span class="syntax18">{</span><br /><span class="gutter"> 11:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">tabla</span><span class="syntax2"> </span><span class="syntax2">de</span><span class="syntax2"> </span><span class="syntax2">usuarios</span><br /><span class="gutter"> 12:</span> usuarios <span class="syntax18">=</span> <span class="syntax8">new</span> <span class="syntax6">Hashtable</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 13:</span><br /><span class="gutter"> 14:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">harcodeamos</span><span class="syntax2"> </span><span class="syntax2">los</span><span class="syntax2"> </span><span class="syntax2">usuarios</span><br /><span class="gutterH"> 15:</span> usuarios.<span class="syntax6">put</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">juan</span><span class="syntax13">"</span><br /><span class="gutter"> 16:</span> ,<span class="syntax8">new</span> <span class="syntax6">UsuarioDTO</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">juan</span><span class="syntax13">"</span><br /><span class="gutter"> 17:</span> , <span class="syntax13">"</span><span class="syntax13">juan1</span><span class="syntax13">"</span><br /><span class="gutter"> 18:</span> , <span class="syntax13">"</span><span class="syntax13">juan@pp.com</span><span class="syntax13">"</span><span class="syntax18">)</span><span class="syntax18">)</span>;<br /><span class="gutter"> 19:</span> usuarios.<span class="syntax6">put</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">jose</span><span class="syntax13">"</span><br /><span class="gutterH"> 20:</span> ,<span class="syntax8">new</span> <span class="syntax6">UsuarioDTO</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">jose</span><span class="syntax13">"</span><br /><span class="gutter"> 21:</span> , <span class="syntax13">"</span><span class="syntax13">jose1</span><span class="syntax13">"</span><br /><span class="gutter"> 22:</span> , <span class="syntax13">"</span><span class="syntax13">jose@toto.net</span><span class="syntax13">"</span><span class="syntax18">)</span><span class="syntax18">)</span>;<br /><span class="gutter"> 23:</span> usuarios.<span class="syntax6">put</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">pedro</span><span class="syntax13">"</span><br /><span class="gutter"> 24:</span> ,<span class="syntax8">new</span> <span class="syntax6">UsuarioDTO</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">pedro</span><span class="syntax13">"</span><br /><span class="gutterH"> 25:</span> , <span class="syntax13">"</span><span class="syntax13">pedro1</span><span class="syntax13">"</span><br /><span class="gutter"> 26:</span> , <span class="syntax13">"</span><span class="syntax13">pedro@locomia.org</span><span class="syntax13">"</span><span class="syntax18">)</span><span class="syntax18">)</span>;<br /><span class="gutter"> 27:</span> <span class="syntax18">}</span><br /><span class="gutter"> 28:</span><br /><span class="gutter"> 29:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">si</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">login</span><span class="syntax2"> </span><span class="syntax2">es</span><span class="syntax2"> </span><span class="syntax2">correcto</span><span class="syntax2"> </span><span class="syntax2">retorna</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">UsuarioDTO</span><br /><span class="gutterH"> 30:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">si</span><span class="syntax2"> </span><span class="syntax2">no</span><span class="syntax2"> </span><span class="syntax2">es</span><span class="syntax2"> </span><span class="syntax2">correcto</span><span class="syntax2"> </span><span class="syntax2">retorna</span><span class="syntax2"> </span><span class="syntax2">null</span><br /><span class="gutter"> 31:</span> <span class="syntax8">public</span> UsuarioDTO <span class="syntax6">login</span><span class="syntax18">(</span>String usr, String pwd<span class="syntax18">)</span><br /><span class="gutter"> 32:</span> <span class="syntax18">{</span><br /><span class="gutter"> 33:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">busco</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">usr</span><span class="syntax2"> </span><span class="syntax2">en</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">tabla</span><br /><span class="gutter"> 34:</span> UsuarioDTO dto<span class="syntax18">=</span><span class="syntax18">(</span>UsuarioDTO<span class="syntax18">)</span>usuarios.<span class="syntax6">get</span><span class="syntax18">(</span>usr<span class="syntax18">)</span>;<br /><span class="gutterH"> 35:</span><br /><span class="gutter"> 36:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">si</span><span class="syntax2"> </span><span class="syntax2">existe...</span><br /><span class="gutter"> 37:</span> <span class="syntax8">if</span> <span class="syntax18">(</span> dto <span class="syntax18">!</span><span class="syntax18">=</span> <span class="syntax14">null</span> <span class="syntax18">)</span><br /><span class="gutter"> 38:</span> <span class="syntax18">{</span><br /><span class="gutter"> 39:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">si</span><span class="syntax2"> </span><span class="syntax2">coincide</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">password...</span><span class="syntax2"> </span><br /><span class="gutterH"> 40:</span> <span class="syntax8">if</span> <span class="syntax18">(</span> dto.<span class="syntax6">getPassword</span><span class="syntax18">(</span><span class="syntax18">)</span>.<span class="syntax6">equals</span><span class="syntax18">(</span>pwd<span class="syntax18">)</span> <span class="syntax18">)</span><br /><span class="gutter"> 41:</span> <span class="syntax18">{</span><br /><span class="gutter"> 42:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">retorno</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">dto</span><span class="syntax2"> </span><span class="syntax2">!</span><br /><span class="gutter"> 43:</span> <span class="syntax8">return</span> dto;<br /><span class="gutter"> 44:</span> <span class="syntax18">}</span><br /><span class="gutterH"> 45:</span> <span class="syntax8">else</span><br /><span class="gutter"> 46:</span> <span class="syntax18">{</span><br /><span class="gutter"> 47:</span> <span class="syntax8">return</span> <span class="syntax14">null</span>;<br /><span class="gutter"> 48:</span> <span class="syntax18">}</span><br /><span class="gutter"> 49:</span> <span class="syntax18">}</span><br /><span class="gutterH"> 50:</span> <span class="syntax8">return</span> <span class="syntax14">null</span>;<br /><span class="gutter"> 51:</span> <span class="syntax18">}</span><br /><span class="gutter"> 52:</span><br /><span class="gutter"> 53:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">retorna</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">coleccion</span><span class="syntax2"> </span><span class="syntax2">de</span><span class="syntax2"> </span><span class="syntax2">usuarios</span><br /><span class="gutter"> 54:</span> <span class="syntax8">public</span> Collection <span class="syntax6">obtenerUsuarios</span><span class="syntax18">(</span><span class="syntax18">)</span><br /><span class="gutterH"> 55:</span> <span class="syntax18">{</span><br /><span class="gutter"> 56:</span> Vector ret <span class="syntax18">=</span> <span class="syntax8">new</span> <span class="syntax6">Vector</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 57:</span> <span class="syntax8">for</span><span class="syntax18">(</span> Enumeration e <span class="syntax18">=</span> usuarios.<span class="syntax6">elements</span><span class="syntax18">(</span><span class="syntax18">)</span><br /><span class="gutter"> 58:</span> ; e.<span class="syntax6">hasMoreElements</span><span class="syntax18">(</span><span class="syntax18">)</span>; <span class="syntax18">)</span><br /><span class="gutter"> 59:</span> <span class="syntax18">{</span><br /><span class="gutterH"> 60:</span> ret.<span class="syntax6">add</span><span class="syntax18">(</span>e.<span class="syntax6">nextElement</span><span class="syntax18">(</span><span class="syntax18">)</span><span class="syntax18">)</span>;<br /><span class="gutter"> 61:</span> <span class="syntax18">}</span><br /><span class="gutter"> 62:</span> <span class="syntax8">return</span> ret;<br /><span class="gutter"> 63:</span> <span class="syntax18">}</span><br /><span class="gutter"> 64:</span><span class="syntax18">}</span><br /><span class="gutterH"> 65:</span><br /></span></pre><br /><span style="font-weight: bold;">2</span> - Creamos un <span style="font-weight: bold;">.jar</span> con el las clases que queremos deployar.<br /><br />Teniendo definidas todas las clases involucradas (<span style="font-weight: bold;">FacadeWS </span>y <span style="font-weight: bold;">UsuarioDTO</span>, ambas en el paquete <span style="font-weight: bold;">test.customdeploy</span>) podemos crear el jar desde Eclipse "clikeando" con el botón derecho sobre el paquete <span style="font-weight: bold;">test.customdeploy</span>, seleccionando <span style="font-weight: bold;">Export </span>-&gt; <span style="font-weight: bold;">JAR File</span>. o bien desde línea de comandos, parados en la carpeta <span style="font-weight: bold;">src </span>(padre de <span style="font-weight: bold;">test</span>) con el comando jar:<br /><br />jar cvf test.jar test<br /><br />El comando jar está ubicado en $JAVA_HOME/bin por lo tanto tenemos que asegurarnos que el PATH esté seteado correctamente.<br /><br /><span style="font-weight: bold;">3</span> - Copiamos el jar al directorio axis/WEB-INF/lib para que esté disponible en el CLASSPATH.<br /><br /><span style="font-weight: bold;">4</span> - Generamos el descriptor wsdd.<br /><br />Como dijimos, para deployar un servicio con custom deployment será necesario escribir un archivo <span style="font-weight: bold;">wsdd</span>. Veamos entonces el descriptor para nuestro FacadeWS.<br /><br /><span style="font-weight: bold;">facadeWS.wsdd</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax17">&lt;</span><span class="syntax17">deployment</span><span class="syntax17"> </span><span class="syntax17">xmlns</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">http://xml.apache.org/axis/wsdd/</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutter"> 3:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax12">xmlns</span><span class="syntax18">:</span><span class="syntax17">java</span><span class="syntax17">=</span><br /><span class="gutter"> 4:</span><span class="syntax17"> </span><span class="syntax13">"</span><span class="syntax13">http://xml.apache.org/axis/wsdd/providers/java</span><span class="syntax13">"</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 5:</span> <span class="syntax17">&lt;</span><span class="syntax17">service</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">FacadeWS</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">provider</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">java:RPC</span><span class="syntax13">"</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 6:</span> <span class="syntax17">&lt;</span><span class="syntax17">parameter</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">scope</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutter"> 7:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">value</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">application</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 8:</span> <span class="syntax17">&lt;</span><span class="syntax17">parameter</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">className</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutter"> 9:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">value</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">test.customdeploy.FacadeWS</span><span class="syntax13">"</span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 10:</span> <span class="syntax17">&lt;</span><span class="syntax17">parameter</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">allowedMethods</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutter"> 11:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">value</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">*</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 12:</span> <span class="syntax17">&lt;</span><span class="syntax17">beanMapping</span><span class="syntax17"> </span><span class="syntax17">qname</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">ns:UsuarioDTO</span><span class="syntax13">"</span><br /><span class="gutter"> 13:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax12">xmlns</span><span class="syntax18">:</span><span class="syntax17">ns</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">http://localhost:8080/WS/FacadeWS</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutter"> 14:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">languageSpecificType</span><span class="syntax17">=</span><br /><span class="gutterH"> 15:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax13">"</span><span class="syntax13">java:test.customdeploy.UsuarioDTO</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 16:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">service</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 17:</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">deployment</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 18:</span><br /></span></pre><br />En el wsdd estamos definiendo lo siguiente:<br /><ul><li><span style="font-weight: bold;">Nombre y Tipo de Servicio</span> - FacadeWS (RPC)</li><li><span style="font-weight: bold;">Scope </span>- aplication (que duración tendrá la instancia de FacadeWS). Puede ser request, session o application</li><li><span style="font-weight: bold;">Métodos Expuestos</span> - En nuestro caso serán todos (por eso el "*")<br /></li><li><span style="font-weight: bold;">Tipos de Dato Propietarios</span> - UsuarioDTO<br /></li></ul><br /><span style="font-weight: bold;">5</span> - Registrar el Servicio<br /><br />Tenemos que registrar el servicio. Para esto utilizaremos el comando (clase de AXIS) <span style="font-weight: bold;">AdminClient</span>. Lo vamos a invocar a través del siguiente batch.<br /><br /><span style="font-weight: bold;">adminClient.bat</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax10">@</span><span class="syntax8">echo</span> off<br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax1">rem</span><span class="syntax1"> </span><span class="syntax1">JH</span><span class="syntax1"> </span><span class="syntax1">-&gt;</span><span class="syntax1"> </span><span class="syntax1">JAVA_HOME</span><br /><span class="gutterH"> 5:</span><span class="syntax10">@</span><span class="syntax8">SET</span> JH=\java\jdk1.5.0<br /><span class="gutter"> 6:</span><br /><span class="gutter"> 7:</span><span class="syntax1">rem</span><span class="syntax1"> </span><span class="syntax1">AH</span><span class="syntax1"> </span><span class="syntax1">-&gt;</span><span class="syntax1"> </span><span class="syntax1">AXIS_HOME</span><br /><span class="gutter"> 8:</span><span class="syntax10">@</span><span class="syntax8">SET</span> AH=\JAVA\axis-1_4<br /><span class="gutter"> 9:</span><br /><span class="gutterH"> 10:</span><span class="syntax1">rem</span><span class="syntax1"> </span><span class="syntax1">AAC</span><span class="syntax1"> </span><span class="syntax1">-&gt;</span><span class="syntax1"> </span><span class="syntax1">AXIS</span><span class="syntax1"> </span><span class="syntax1">ADMIN</span><span class="syntax1"> </span><span class="syntax1">CLIENT</span><br /><span class="gutter"> 11:</span><span class="syntax10">@</span><span class="syntax8">SET</span> AAC=org.apache.axis.client<br /><span class="gutter"> 12:</span><span class="syntax10">@</span><span class="syntax8">SET</span> AAC=<span class="syntax9">%</span><span class="syntax9">AAC</span><span class="syntax9">%</span>.AdminClient<br /><span class="gutter"> 13:</span><br /><span class="gutter"> 14:</span><span class="syntax1">rem</span><span class="syntax1"> </span><span class="syntax1">CP</span><span class="syntax1"> </span><span class="syntax1">-&gt;</span><span class="syntax1"> </span><span class="syntax1">CLASSPATH</span><br /><span class="gutterH"> 15:</span><span class="syntax10">@</span><span class="syntax8">SET</span> CP=<span class="syntax9">%</span><span class="syntax9">AH</span><span class="syntax9">%</span>\lib\activation.jar;<br /><span class="gutter"> 16:</span><span class="syntax10">@</span><span class="syntax8">SET</span> CP=<span class="syntax9">%</span><span class="syntax9">CP</span><span class="syntax9">%</span>;<span class="syntax9">%</span><span class="syntax9">AH</span><span class="syntax9">%</span>\lib\axis.jar;<br /><span class="gutter"> 17:</span><span class="syntax10">@</span><span class="syntax8">SET</span> CP=<span class="syntax9">%</span><span class="syntax9">CP</span><span class="syntax9">%</span>;<span class="syntax9">%</span><span class="syntax9">AH</span><span class="syntax9">%</span>\lib\axis-ant.jar;<br /><span class="gutter"> 18:</span><span class="syntax10">@</span><span class="syntax8">SET</span> CP=<span class="syntax9">%</span><span class="syntax9">CP</span><span class="syntax9">%</span>;<span class="syntax9">%</span><span class="syntax9">AH</span><span class="syntax9">%</span>\lib\commons-discovery-0.2.jar;<br /><span class="gutter"> 19:</span><span class="syntax10">@</span><span class="syntax8">SET</span> CP=<span class="syntax9">%</span><span class="syntax9">CP</span><span class="syntax9">%</span>;<span class="syntax9">%</span><span class="syntax9">AH</span><span class="syntax9">%</span>\lib\commons-logging-1.0.4.jar;<br /><span class="gutterH"> 20:</span><span class="syntax10">@</span><span class="syntax8">SET</span> CP=<span class="syntax9">%</span><span class="syntax9">CP</span><span class="syntax9">%</span>;<span class="syntax9">%</span><span class="syntax9">AH</span><span class="syntax9">%</span>\lib\jaxrpc.jar;<br /><span class="gutter"> 21:</span><span class="syntax10">@</span><span class="syntax8">SET</span> CP=<span class="syntax9">%</span><span class="syntax9">CP</span><span class="syntax9">%</span>;<span class="syntax9">%</span><span class="syntax9">AH</span><span class="syntax9">%</span>\lib\log4j-1.2.8.jar;<br /><span class="gutter"> 22:</span><span class="syntax10">@</span><span class="syntax8">SET</span> CP=<span class="syntax9">%</span><span class="syntax9">CP</span><span class="syntax9">%</span>;<span class="syntax9">%</span><span class="syntax9">AH</span><span class="syntax9">%</span>\lib\saaj.jar;<br /><span class="gutter"> 23:</span><span class="syntax10">@</span><span class="syntax8">SET</span> CP=<span class="syntax9">%</span><span class="syntax9">CP</span><span class="syntax9">%</span>;<span class="syntax9">%</span><span class="syntax9">AH</span><span class="syntax9">%</span>\lib\mail.jar;<br /><span class="gutter"> 24:</span><span class="syntax10">@</span><span class="syntax8">SET</span> CP=<span class="syntax9">%</span><span class="syntax9">CP</span><span class="syntax9">%</span>;<span class="syntax9">%</span><span class="syntax9">AH</span><span class="syntax9">%</span>\lib\wsdl4j-1.5.1.jar;<br /><span class="gutterH"> 25:</span><br /><span class="gutter"> 26:</span><span class="syntax9">%</span><span class="syntax9">JH</span><span class="syntax9">%</span>\bin\java -cp <span class="syntax9">%</span><span class="syntax9">CP</span><span class="syntax9">%</span> <span class="syntax9">%</span><span class="syntax9">AAC</span><span class="syntax9">%</span> <span class="syntax9">%1</span><br /><span class="gutter"> 27:</span><br /></span></pre><br />Antes de ejecutar este comando debemos asegurarnos de que el server de AXIS esté levantado (ya sea detrás de Tomcat o en línea de comandos).<br /><br />Corremos el comando de la siguiente manera:<br /><br />adminClient facadeWS.wsdd<br /><br />Si todo está bien entonces veremos la siguiente salida:<br /><br />Processing file facadeWS.wsdd<br />&lt;Admin&gt;Done processing&lt;/Admin&gt;<br /><br /><span style="font-weight: bold;">6</span> - Ahora, accediendo a: <a href="http://localhost:8080/axis/services">http://localhost:8080/axis/services</a> veremos que entre los servicios deployados está nuestro FacadeWS, con sus métodos y con la opción de visualizar su <span style="font-weight: bold;">wsdl</span>.<br /><br /><span style="font-weight: bold;">7 </span>- Para crear el cliente podríamos usar el utilitario WSDL2Java como vimos al comienzo de este capítulo pero en este caso lo vamos a crear a mano.<br /><br /><span style="font-weight: bold;">FacadeWSClient.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span> test;<br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax9">import</span> java.util.Collection;<br /><span class="gutterH"> 5:</span><span class="syntax9">import</span> javax.xml.namespace.QName;<br /><span class="gutter"> 6:</span><span class="syntax9">import</span> javax.xml.rpc.ParameterMode;<br /><span class="gutter"> 7:</span><span class="syntax9">import</span> org.apache.axis.client.Call;<br /><span class="gutter"> 8:</span><span class="syntax9">import</span> org.apache.axis.client.Service;<br /><span class="gutter"> 9:</span><span class="syntax9">import</span> org.apache.axis.encoding.XMLType;<br /><span class="gutterH"> 10:</span><span class="syntax9">import</span> test.customdeploy.UsuarioDTO;<br /><span class="gutter"> 11:</span><br /><span class="gutter"> 12:</span><span class="syntax8">public</span> <span class="syntax10">class</span> FacadeWSClient<br /><span class="gutter"> 13:</span><span class="syntax18">{</span><br /><span class="gutter"> 14:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">direccion</span><span class="syntax2"> </span><span class="syntax2">del</span><span class="syntax2"> </span><span class="syntax2">servicio</span><br /><span class="gutterH"> 15:</span> <span class="syntax8">public</span> <span class="syntax8">static</span> String endpoint <span class="syntax18">=</span><br /><span class="gutter"> 16:</span> <span class="syntax13">"</span><span class="syntax13">http://localhost:8080/axis/services/FacadeWS</span><span class="syntax13">"</span>;<br /><span class="gutter"> 17:</span><br /><span class="gutter"> 18:</span> <span class="syntax8">public</span> <span class="syntax8">static</span> <span class="syntax10">void</span> <span class="syntax6">main</span><span class="syntax18">(</span>String[] args<span class="syntax18">)</span><br /><span class="gutter"> 19:</span> <span class="syntax8">throws</span> Exception<br /><span class="gutterH"> 20:</span> <span class="syntax18">{</span><br /><span class="gutter"> 21:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">harcodeo</span><span class="syntax2"> </span><span class="syntax2">usuario</span><span class="syntax2"> </span><span class="syntax2">y</span><span class="syntax2"> </span><span class="syntax2">password</span><br /><span class="gutter"> 22:</span> String usr<span class="syntax18">=</span><span class="syntax13">"</span><span class="syntax13">pedro</span><span class="syntax13">"</span>;<br /><span class="gutter"> 23:</span> String pwd<span class="syntax18">=</span><span class="syntax13">"</span><span class="syntax13">pedro1</span><span class="syntax13">"</span>;<br /><span class="gutter"> 24:</span> <br /><span class="gutterH"> 25:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">invoco</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">login</span><br /><span class="gutter"> 26:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">a</span><span class="syntax2"> </span><span class="syntax2">traves</span><span class="syntax2"> </span><span class="syntax2">de</span><span class="syntax2"> </span><span class="syntax2">un</span><span class="syntax2"> </span><span class="syntax2">metodo</span><span class="syntax2"> </span><span class="syntax2">privado</span><br /><span class="gutter"> 27:</span> UsuarioDTO dto<span class="syntax18">=</span><span class="syntax6">invocarLogin</span><span class="syntax18">(</span>usr,pwd<span class="syntax18">)</span>;<br /><span class="gutter"> 28:</span> System.out.<span class="syntax6">println</span><span class="syntax18">(</span>dto<span class="syntax18">)</span>;<br /><span class="gutter"> 29:</span> <br /><span class="gutterH"> 30:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">invoco</span><span class="syntax2"> </span><span class="syntax2">obtenerUsuarios</span><span class="syntax2"> </span><span class="syntax2">a</span><span class="syntax2"> </span><span class="syntax2">traves</span><br /><span class="gutter"> 31:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">de</span><span class="syntax2"> </span><span class="syntax2">un</span><span class="syntax2"> </span><span class="syntax2">metodo</span><span class="syntax2"> </span><span class="syntax2">privado</span><br /><span class="gutter"> 32:</span> Collection arr<span class="syntax18">=</span><span class="syntax6">invocarObtenerUsuarios</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 33:</span> System.out.<span class="syntax6">println</span><span class="syntax18">(</span>arr<span class="syntax18">)</span>;<br /><span class="gutter"> 34:</span> <span class="syntax18">}</span><br /><span class="gutterH"> 35:</span><br /><span class="gutter"> 36:</span> <span class="syntax8">private</span> <span class="syntax8">static</span> UsuarioDTO <span class="syntax6">invocarLogin</span><span class="syntax18">(</span><br /><span class="gutter"> 37:</span> String usr<br /><span class="gutter"> 38:</span> , String pwd<span class="syntax18">)</span><br /><span class="gutter"> 39:</span> <span class="syntax18">{</span><br /><span class="gutterH"> 40:</span> <span class="syntax8">try</span><br /><span class="gutter"> 41:</span> <span class="syntax18">{</span><br /><span class="gutter"> 42:</span><br /><span class="gutter"> 43:</span> Service service <span class="syntax18">=</span> <span class="syntax8">new</span> <span class="syntax6">Service</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 44:</span> Call call <span class="syntax18">=</span> <span class="syntax18">(</span>Call<span class="syntax18">)</span> service.<span class="syntax6">createCall</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 45:</span> <br /><span class="gutter"> 46:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">hay</span><span class="syntax2"> </span><span class="syntax2">que</span><span class="syntax2"> </span><span class="syntax2">definir</span><span class="syntax2"> </span><span class="syntax2">un</span><span class="syntax2"> </span><span class="syntax2">QName</span><span class="syntax2"> </span><span class="syntax2">por</span><span class="syntax2"> </span><span class="syntax2">cada</span><span class="syntax2"> </span><span class="syntax2">tipo</span><br /><span class="gutter"> 47:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">de</span><span class="syntax2"> </span><span class="syntax2">datos</span><span class="syntax2"> </span><span class="syntax2">custom</span><span class="syntax2"> </span><span class="syntax2">que</span><span class="syntax2"> </span><span class="syntax2">vayamos</span><span class="syntax2"> </span><span class="syntax2">a</span><span class="syntax2"> </span><span class="syntax2">utilizar</span><br /><span class="gutter"> 48:</span> QName qn <span class="syntax18">=</span> <span class="syntax8">new</span> <span class="syntax6">QName</span><span class="syntax18">(</span><br /><span class="gutter"> 49:</span> <span class="syntax13">"</span><span class="syntax13">http://localhost:8080/WS/FacadeWS</span><span class="syntax13">"</span><br /><span class="gutterH"> 50:</span> ,<span class="syntax13">"</span><span class="syntax13">UsuarioDTO</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 51:</span> <br /><span class="gutter"> 52:</span> <br /><span class="gutter"> 53:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">registramos</span><span class="syntax2"> </span><span class="syntax2">en</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">llamada</span><span class="syntax2"> </span><span class="syntax2">remota</span><br /><span class="gutter"> 54:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">tipo</span><span class="syntax2"> </span><span class="syntax2">de</span><span class="syntax2"> </span><span class="syntax2">dato</span><span class="syntax2"> </span><span class="syntax2">custom</span><br /><span class="gutterH"> 55:</span> call.<span class="syntax6">registerTypeMapping</span><span class="syntax18">(</span><br /><span class="gutter"> 56:</span> UsuarioDTO.<span class="syntax10">class</span><br /><span class="gutter"> 57:</span> ,qn<br /><span class="gutter"> 58:</span> ,<span class="syntax8">new</span> <span class="syntax6">BeanSerializerFactory</span><span class="syntax18">(</span><br /><span class="gutter"> 59:</span> UsuarioDTO.<span class="syntax10">class</span><br /><span class="gutterH"> 60:</span> ,qn<span class="syntax18">)</span><br /><span class="gutter"> 61:</span> ,<span class="syntax8">new</span> <span class="syntax6">BeanDeserializerFactory</span><span class="syntax18">(</span><br /><span class="gutter"> 62:</span> UsuarioDTO.<span class="syntax10">class</span><br /><span class="gutter"> 63:</span> ,qn<span class="syntax18">)</span><span class="syntax18">)</span>;<br /><span class="gutter"> 64:</span> call.<span class="syntax6">setTargetEndpointAddress</span><span class="syntax18">(</span>endpoint<span class="syntax18">)</span>;<br /><span class="gutterH"> 65:</span> call.<span class="syntax6">setOperationName</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">login</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 66:</span> call.<span class="syntax6">addParameter</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">usr</span><span class="syntax13">"</span><br /><span class="gutter"> 67:</span> ,XMLType.XSD_STRING<br /><span class="gutter"> 68:</span> ,ParameterMode.IN<span class="syntax18">)</span>;<br /><span class="gutter"> 69:</span> call.<span class="syntax6">addParameter</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">pwd</span><span class="syntax13">"</span><br /><span class="gutterH"> 70:</span> ,XMLType.XSD_STRING<br /><span class="gutter"> 71:</span> ,ParameterMode.IN<span class="syntax18">)</span>;<br /><span class="gutter"> 72:</span> call.<span class="syntax6">setReturnType</span><span class="syntax18">(</span>qn<span class="syntax18">)</span>;<br /><span class="gutter"> 73:</span> UsuarioDTO dto<span class="syntax18">=</span><span class="syntax18">(</span>UsuarioDTO<span class="syntax18">)</span><br /><span class="gutter"> 74:</span> call.<span class="syntax6">invoke</span><span class="syntax18">(</span><span class="syntax8">new</span> Object[]<span class="syntax18">{</span> usr,pwd <span class="syntax18">}</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 75:</span> <span class="syntax8">return</span> dto;<br /><span class="gutter"> 76:</span> <span class="syntax18">}</span><br /><span class="gutter"> 77:</span> <span class="syntax8">catch</span><span class="syntax18">(</span>Exception ex<span class="syntax18">)</span><br /><span class="gutter"> 78:</span> <span class="syntax18">{</span><br /><span class="gutter"> 79:</span> ex.<span class="syntax6">printStackTrace</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 80:</span> <span class="syntax8">throw</span> <span class="syntax8">new</span> <span class="syntax6">RuntimeException</span><span class="syntax18">(</span>ex<span class="syntax18">)</span>;<br /><span class="gutter"> 81:</span> <span class="syntax18">}</span><br /><span class="gutter"> 82:</span> <span class="syntax18">}</span><br /><span class="gutter"> 83:</span> <span class="syntax8">private</span> <span class="syntax8">static</span> Collection <span class="syntax6">invocarObtenerUsuarios</span><span class="syntax18">(</span><span class="syntax18">)</span><br /><span class="gutter"> 84:</span> <span class="syntax18">{</span><br /><span class="gutterH"> 85:</span> <span class="syntax8">try</span><br /><span class="gutter"> 86:</span> <span class="syntax18">{</span><br /><span class="gutter"> 87:</span> Service service <span class="syntax18">=</span> <span class="syntax8">new</span> <span class="syntax6">Service</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 88:</span> Call call <span class="syntax18">=</span> <span class="syntax18">(</span>Call<span class="syntax18">)</span> service.<span class="syntax6">createCall</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 89:</span> QName qn <span class="syntax18">=</span> <span class="syntax8">new</span> <span class="syntax6">QName</span><span class="syntax18">(</span><br /><span class="gutterH"> 90:</span> <span class="syntax13">"</span><span class="syntax13">http://localhost:8080/WS/FacadeWS</span><span class="syntax13">"</span><br /><span class="gutter"> 91:</span> ,<span class="syntax13">"</span><span class="syntax13">UsuarioDTO</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 92:</span> <br /><span class="gutter"> 93:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">registramos</span><span class="syntax2"> </span><span class="syntax2">en</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">llamada</span><span class="syntax2"> </span><span class="syntax2">remota</span><br /><span class="gutter"> 94:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">tipo</span><span class="syntax2"> </span><span class="syntax2">de</span><span class="syntax2"> </span><span class="syntax2">dato</span><span class="syntax2"> </span><span class="syntax2">custom</span><span class="syntax2"> </span><span class="syntax2">que</span><span class="syntax2"> </span><span class="syntax2">recibiremos</span><br /><span class="gutterH"> 95:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">dentro</span><span class="syntax2"> </span><span class="syntax2">de</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">coleccion</span><br /><span class="gutter"> 96:</span> call.<span class="syntax6">registerTypeMapping</span><span class="syntax18">(</span><br /><span class="gutter"> 97:</span> UsuarioDTO.<span class="syntax10">class</span><br /><span class="gutter"> 98:</span> ,qn<br /><span class="gutter"> 99:</span> ,<span class="syntax8">new</span> <span class="syntax6">BeanSerializerFactory</span><span class="syntax18">(</span><br /><span class="gutterH"> 100:</span> UsuarioDTO.<span class="syntax10">class</span><br /><span class="gutter"> 101:</span> ,qn<span class="syntax18">)</span><br /><span class="gutter"> 102:</span> ,<span class="syntax8">new</span> <span class="syntax6">BeanDeserializerFactory</span><span class="syntax18">(</span><br /><span class="gutter"> 103:</span> UsuarioDTO.<span class="syntax10">class</span><br /><span class="gutter"> 104:</span> ,qn<span class="syntax18">)</span><span class="syntax18">)</span>; <br /><span class="gutterH"> 105:</span> <br /><span class="gutter"> 106:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">direccion</span><span class="syntax2"> </span><span class="syntax2">del</span><span class="syntax2"> </span><span class="syntax2">servicio</span><br /><span class="gutter"> 107:</span> call.<span class="syntax6">setTargetEndpointAddress</span><span class="syntax18">(</span>endpoint<span class="syntax18">)</span>;<br /><span class="gutter"> 108:</span> <br /><span class="gutter"> 109:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">nombre</span><span class="syntax2"> </span><span class="syntax2">del</span><span class="syntax2"> </span><span class="syntax2">metodo</span><br /><span class="gutterH"> 110:</span> call.<span class="syntax6">setOperationName</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">obtenerUsuarios</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 111:</span> call.<span class="syntax6">setReturnType</span><span class="syntax18">(</span>XMLType.XSD_ANYTYPE<span class="syntax18">)</span>;<br /><span class="gutter"> 112:</span> <br /><span class="gutter"> 113:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">que</span><span class="syntax2"> </span><span class="syntax2">tipo</span><span class="syntax2"> </span><span class="syntax2">de</span><span class="syntax2"> </span><span class="syntax2">clase</span><span class="syntax2"> </span><span class="syntax2">esperamos</span><br /><span class="gutter"> 114:</span> call.<span class="syntax6">setReturnClass</span><span class="syntax18">(</span>Collection.<span class="syntax10">class</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 115:</span> Collection coll<span class="syntax18">=</span><span class="syntax18">(</span>Collection<span class="syntax18">)</span><br /><span class="gutter"> 116:</span> call.<span class="syntax6">invoke</span><span class="syntax18">(</span><span class="syntax18">(</span>Object[]<span class="syntax18">)</span><span class="syntax14">null</span><span class="syntax18">)</span>;<br /><span class="gutter"> 117:</span> <br /><span class="gutter"> 118:</span> <span class="syntax8">return</span> coll;<br /><span class="gutter"> 119:</span><br /><span class="gutterH"> 120:</span> <span class="syntax18">}</span><br /><span class="gutter"> 121:</span> <span class="syntax8">catch</span><span class="syntax18">(</span>Exception ex<span class="syntax18">)</span><br /><span class="gutter"> 122:</span> <span class="syntax18">{</span><br /><span class="gutter"> 123:</span> ex.<span class="syntax6">printStackTrace</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 124:</span> <span class="syntax8">throw</span> <span class="syntax8">new</span> <span class="syntax6">RuntimeException</span><span class="syntax18">(</span>ex<span class="syntax18">)</span>;<br /><span class="gutterH"> 125:</span> <span class="syntax18">}</span><br /><span class="gutter"> 126:</span> <span class="syntax18">}</span> <br /><span class="gutter"> 127:</span><span class="syntax18">}</span><br /><span class="gutter"> 128:</span><br /></span></pre><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><span style="color: rgb(255, 255, 255);">.</span><br /><br /><br /></div></div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34013116-1520774211369012910?l=holamundojava.blogspot.com'/></div>PabloSZnoreply@blogger.com9tag:blogger.com,1999:blog-34013116.post-89261036525901347852007-10-11T15:27:00.001-03:002008-07-29T12:47:54.387-03:00Connection Pooling<span style="color: rgb(255, 255, 255);">.</span><br />Las especificaciones de J2ee definen que los servers compatibles deben proveer una implementacion de <span style="font-weight: bold;">DataSource </span>(o "Pool de Conexiones") para que los programadores lo puedan utilizar dentro de sus aplicaciones.<br /><br />En este capítulo explicaremos los motivos por los cuales es necesario utilizar un DataSource y como configurarlo en <span style="font-weight: bold;">Tomcat </span>y <span style="font-weight: bold;">JBoss</span>.<br /><br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">El Pool de Conexiones</span></span><br /><br />Un Pool de Conexiones (jdbc) es un conjunto de conexiones pre-instanciadas que serán "prestadas" a los threads a medida que estos lo requieran para que la usen y luego la devuelvan al pool.<br /><br />Es como si se tratase de videos en un videoclub. El videoclub puede tener 500 socios, pero no por eso tiene que tener disponibles 500 copias de cada película. Sería muy costoso y ridículo ya que es muy improbable que los 500 socios requieran las misma película en el mismo momento. Por lo tanto (quizá) con 5 o 6 copias de la película pueda alcanzar para satisfacer la demanda.<br /><br />En el caso de las aplicaciones abiertas en Internet o con gran cantidad de usuarios potenciales el análisis es el mismo. Nuestro recurso es la conexión a la base de datos. Tendremos un conjunto de n conexiones para asignarlas (o prestarlas) a los hilos que lo requieran.<br /><br />Los ejemplos que veremos son para conectarnos con HSQL pero aplican (cambiando el driver y el url) a cualquier base de datos.<br /><br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Como Configurar un DataSource en Tomcat 5</span></span><br /><br /><span style="font-weight: bold;">1</span> - Copiar el driver jdbc (<span style="font-weight: bold;">hsqldb.jar</span>) en el directorio %CATALINA_HOME%<span style="font-weight: bold;">\common\lib. </span><br /><br /><span style="font-weight: bold;">2</span> - Tenemos que declarar el recurso que vamos a requerir en la aplicacion web. Para esto debemos agregar las siguientes líneas en el archivo <span style="font-weight: bold;">web.xml</span>, justo antes del cierre del tag <span style="font-weight: bold;">&lt;/web-app&gt;</span>.<br /><br /><span style="font-weight: bold;">web.xml</span> (agregar estas líneas)<br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span> <span class="syntax17">&lt;</span><span class="syntax17">resource-ref</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 3:</span> <span class="syntax17">&lt;</span><span class="syntax17">res-ref-name</span><span class="syntax17">&gt;</span>jdbc/HSqlDS<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">res-ref-name</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 4:</span> <span class="syntax17">&lt;</span><span class="syntax17">res-type</span><span class="syntax17">&gt;</span>javax.sql.DataSource<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">res-type</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 5:</span> <span class="syntax17">&lt;</span><span class="syntax17">res-auth</span><span class="syntax17">&gt;</span>Container<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">res-auth</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 6:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">resource-ref</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 7:</span><br /></span></pre><br /><span style="font-weight: bold;">3</span> - Crear el siguiente archivo entro del directorio <span style="font-weight: bold;">/</span><span style="font-weight: bold;">META-INF</span> de la aplicación web.<br /><br /><span style="font-weight: bold;">context.xml</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax17">&lt;</span><span class="syntax17">Context</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 3:</span> <span class="syntax17">&lt;</span><span class="syntax17">Resource</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">jdbc/HSqlDS</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutter"> 4:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">auth</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">Container</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutterH"> 5:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">type</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">javax.sql.DataSource</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutter"> 6:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">username</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">sa</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutter"> 7:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">password</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutter"> 8:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">url</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">jdbc:hsqldb:hsql://localhost/xdb</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutter"> 9:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">driver</span><span class="syntax17">ClassName=</span><span class="syntax13">"</span><span class="syntax13">org.hsqldb.jdbcDriver</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutterH"> 10:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">maxActive</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">8</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutter"> 11:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">maxIdle</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">4</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 12:</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">Context</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 13:</span><br /></span></pre><br /><span style="font-weight: bold;">4</span> - Para acceder al pool de conexiones (DataSource) para pedirle una conexión debemos utilizar algunas líneas de código de la API JNDI.<br /><br />En este ejemplo lo hacemos a través de una página JSP:<br /><br /><span style="font-weight: bold;">testDS.jsp</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax8">&lt;%@</span><span class="syntax17"> </span><span class="syntax8">page</span><span class="syntax17"> </span><span class="syntax9">import</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">java</span><span class="syntax13">.</span><span class="syntax13">sql</span><span class="syntax13">.</span><span class="syntax13">Connection</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax8">%&gt;</span><br /><span class="gutter"> 3:</span><span class="syntax8">&lt;%@</span><span class="syntax17"> </span><span class="syntax8">page</span><span class="syntax17"> </span><span class="syntax9">import</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">javax</span><span class="syntax13">.</span><span class="syntax13">naming</span><span class="syntax13">.</span><span class="syntax13">Context</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax8">%&gt;</span><br /><span class="gutter"> 4:</span><span class="syntax8">&lt;%@</span><span class="syntax17"> </span><span class="syntax8">page</span><span class="syntax17"> </span><span class="syntax9">import</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">javax</span><span class="syntax13">.</span><span class="syntax13">naming</span><span class="syntax13">.</span><span class="syntax13">InitialContext</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax8">%&gt;</span><br /><span class="gutterH"> 5:</span><span class="syntax8">&lt;%@</span><span class="syntax17"> </span><span class="syntax8">page</span><span class="syntax17"> </span><span class="syntax9">import</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">javax</span><span class="syntax13">.</span><span class="syntax13">sql</span><span class="syntax13">.</span><span class="syntax13">DataSource</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax8">%&gt;</span><br /><span class="gutter"> 6:</span><br /><span class="gutter"> 7:</span><span class="syntax8">&lt;%</span><br /><span class="gutter"> 8:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">obtengo</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">contexto</span><span class="syntax2"> </span><span class="syntax2">inicial</span><br /><span class="gutter"> 9:</span> Context ctx<span class="syntax18">=</span><span class="syntax8">new</span> <span class="syntax6">InitialContext</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 10:</span><br /><span class="gutter"> 11:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">lookapeo</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">DataSource</span><span class="syntax2"> </span><br /><span class="gutter"> 12:</span> DataSource ds<span class="syntax18">=</span><span class="syntax18">(</span>DataSource<span class="syntax18">)</span><br /><span class="gutter"> 13:</span> ctx.<span class="syntax6">lookup</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">java:comp/env/jdbc/HSqlDS</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 14:</span> <br /><span class="gutterH"> 15:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">Tengo</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">DataSource,</span><span class="syntax2"> </span><span class="syntax2">le</span><span class="syntax2"> </span><span class="syntax2">pido</span><span class="syntax2"> </span><span class="syntax2">una</span><span class="syntax2"> </span><span class="syntax2">conexion</span><br /><span class="gutter"> 16:</span> Connection con<span class="syntax18">=</span>ds.<span class="syntax6">getConnection</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 17:</span><br /><span class="gutter"> 18:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">uso...</span><br /><span class="gutter"> 19:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">en</span><span class="syntax2"> </span><span class="syntax2">este</span><span class="syntax2"> </span><span class="syntax2">caso</span><span class="syntax2"> </span><span class="syntax2">muestro</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">toString()</span><span class="syntax2"> </span><span class="syntax2">para</span><span class="syntax2"> </span><span class="syntax2">ver</span><span class="syntax2"> </span><span class="syntax2">si</span><br /><span class="gutterH"> 20:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">esta</span><span class="syntax2"> </span><span class="syntax2">instanciada</span><span class="syntax2"> </span><span class="syntax2">o</span><span class="syntax2"> </span><span class="syntax2">si</span><span class="syntax2"> </span><span class="syntax2">es</span><span class="syntax2"> </span><span class="syntax2">null</span><br /><span class="gutter"> 21:</span> out.<span class="syntax6">println</span><span class="syntax18">(</span>con<span class="syntax18">)</span>;<br /><span class="gutter"> 22:</span><br /><span class="gutter"> 23:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">al</span><span class="syntax2"> </span><span class="syntax2">cerrar</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">conexion</span><span class="syntax2"> </span><span class="syntax2">en</span><span class="syntax2"> </span><span class="syntax2">realidad</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">estoy</span><span class="syntax2"> </span><br /><span class="gutter"> 24:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">devolviendo</span><span class="syntax2"> </span><span class="syntax2">al</span><span class="syntax2"> </span><span class="syntax2">pool</span><br /><span class="gutterH"> 25:</span> con.<span class="syntax6">close</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 26:</span><span class="syntax8">%&gt;</span><br /><span class="gutter"> 27:</span><br /></span></pre><br />Si estuviéramos trabajando con Struts, dentro de un Action, la conexión la tenemos que devolver en un <span style="font-weight: bold;">finally</span> para asegurarnos de que, pase lo que pase, la devolvemos.<br /><br /><span style="font-weight: bold;">TestDSAction.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span> test.action;<br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax9">import</span> java.sql.Connection;<br /><span class="gutterH"> 5:</span><br /><span class="gutter"> 6:</span><span class="syntax9">import</span> javax.naming.*;<br /><span class="gutter"> 7:</span><span class="syntax9">import</span> javax.servlet.http.*;<br /><span class="gutter"> 8:</span><span class="syntax9">import</span> javax.sql.DataSource;<br /><span class="gutter"> 9:</span><span class="syntax9">import</span> org.apache.struts.action.*;<br /><span class="gutterH"> 10:</span><br /><span class="gutter"> 11:</span><span class="syntax8">public</span> <span class="syntax10">class</span> TestDSAction <span class="syntax8">extends</span> Action<br /><span class="gutter"> 12:</span><span class="syntax18">{</span><br /><span class="gutter"> 13:</span> <span class="syntax8">public</span> ActionForward <span class="syntax6">execute</span><span class="syntax18">(</span><br /><span class="gutter"> 14:</span> ActionMapping mapping<br /><span class="gutterH"> 15:</span> , ActionForm form<br /><span class="gutter"> 16:</span> , HttpServletRequest request<br /><span class="gutter"> 17:</span> , HttpServletResponse response<span class="syntax18">)</span><br /><span class="gutter"> 18:</span> <span class="syntax18">{</span><br /><span class="gutter"> 19:</span> Connection con<span class="syntax18">=</span><span class="syntax14">null</span>;<br /><span class="gutterH"> 20:</span> <span class="syntax8">try</span><br /><span class="gutter"> 21:</span> <span class="syntax18">{</span><br /><span class="gutter"> 22:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">hago</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">lookup</span><span class="syntax2"> </span><span class="syntax2">del</span><span class="syntax2"> </span><span class="syntax2">pool</span><span class="syntax2"> </span><span class="syntax2">de</span><span class="syntax2"> </span><span class="syntax2">conexiones</span><br /><span class="gutter"> 23:</span> Context ctx<span class="syntax18">=</span><span class="syntax8">new</span> <span class="syntax6">InitialContext</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 24:</span> DataSource ds<span class="syntax18">=</span><span class="syntax18">(</span>DataSource<span class="syntax18">)</span>ctx.<span class="syntax6">lookup</span><span class="syntax18">(</span><br /><span class="gutterH"> 25:</span> <span class="syntax13">"</span><span class="syntax13">java:comp/env/jdbc/HSqlDS</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 26:</span> <br /><span class="gutter"> 27:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">pido</span><span class="syntax2"> </span><span class="syntax2">una</span><span class="syntax2"> </span><span class="syntax2">conexion</span><br /><span class="gutter"> 28:</span> con<span class="syntax18">=</span>ds.<span class="syntax6">getConnection</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 29:</span> <br /><span class="gutterH"> 30:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">uso</span><br /><span class="gutter"> 31:</span> System.out.<span class="syntax6">println</span><span class="syntax18">(</span>con<span class="syntax18">)</span>;<br /><span class="gutter"> 32:</span> <br /><span class="gutter"> 33:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">devuelvo</span><span class="syntax2"> </span><span class="syntax2">en</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">finally</span><span class="syntax2"> </span><span class="syntax2">(OJO!)</span><br /><span class="gutter"> 34:</span> <span class="syntax8">return</span> mapping.<span class="syntax6">findForward</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">ok</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 35:</span> <span class="syntax18">}</span><br /><span class="gutter"> 36:</span> <span class="syntax8">catch</span><span class="syntax18">(</span>Exception ex<span class="syntax18">)</span><br /><span class="gutter"> 37:</span> <span class="syntax18">{</span><br /><span class="gutter"> 38:</span> ex.<span class="syntax6">printStackTrace</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 39:</span> <span class="syntax8">throw</span> <span class="syntax8">new</span> <span class="syntax6">RuntimeException</span><span class="syntax18">(</span>ex<span class="syntax18">)</span>;<br /><span class="gutterH"> 40:</span> <span class="syntax18">}</span><br /><span class="gutter"> 41:</span> <span class="syntax8">finally</span><br /><span class="gutter"> 42:</span> <span class="syntax18">{</span><br /><span class="gutter"> 43:</span> <span class="syntax8">try</span><br /><span class="gutter"> 44:</span> <span class="syntax18">{</span><br /><span class="gutterH"> 45:</span> <span class="syntax8">if</span><span class="syntax18">(</span> con<span class="syntax18">!</span><span class="syntax18">=</span><span class="syntax14">null</span> <span class="syntax18">)</span><br /><span class="gutter"> 46:</span> <span class="syntax18">{</span><br /><span class="gutter"> 47:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">devuelvo</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">conexion</span><span class="syntax2"> </span><span class="syntax2">al</span><span class="syntax2"> </span><span class="syntax2">pool</span><br /><span class="gutter"> 48:</span> con.<span class="syntax6">close</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 49:</span> <span class="syntax18">}</span><br /><span class="gutterH"> 50:</span> <span class="syntax18">}</span><br /><span class="gutter"> 51:</span> <span class="syntax8">catch</span><span class="syntax18">(</span>Exception ex<span class="syntax18">)</span><br /><span class="gutter"> 52:</span> <span class="syntax18">{</span><br /><span class="gutter"> 53:</span> ex.<span class="syntax6">printStackTrace</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 54:</span> <span class="syntax8">throw</span> <span class="syntax8">new</span> <span class="syntax6">RuntimeException</span><span class="syntax18">(</span>ex<span class="syntax18">)</span>;<br /><span class="gutterH"> 55:</span> <span class="syntax18">}</span><br /><span class="gutter"> 56:</span> <span class="syntax18">}</span><br /><span class="gutter"> 57:</span> <span class="syntax18">}</span><br /><span class="gutter"> 58:</span><span class="syntax18">}</span><br /><span class="gutter"> 59:</span><br /></span></pre><br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Como Configurar un DataSource en JBoss 3</span></span><br /><br />En JBoss el tema es mucho más simple.<br /><br /><span style="font-weight: bold;">1</span> - Creamos el siguiente archivo en el directorio %JBOSS_HOME%<span style="font-weight: bold;">/server/default/deploy</span><br /><br /><span style="font-weight: bold;">test-ds.xml</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><span class="syntax10">&lt;?</span><span class="syntax10">xml</span><span class="syntax10"> </span><span class="syntax10">version="1.0"</span><span class="syntax10"> </span><span class="syntax10">encoding="UTF-8"?</span><span class="syntax10">&gt;</span><br /><span class="gutter"> 2:</span><br /><span class="gutter"> 3:</span><span class="syntax17">&lt;</span><span class="syntax17">datasources</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 4:</span> <span class="syntax17">&lt;</span><span class="syntax17">local-tx-datasource</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 5:</span> <span class="syntax17">&lt;</span><span class="syntax17">jndi-name</span><span class="syntax17">&gt;</span>HSqlDS<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">jndi-name</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 6:</span> <span class="syntax17">&lt;</span><span class="syntax17">connection-url</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 7:</span> jdbc:hsqldb:hsql://localhost/xdb<br /><span class="gutter"> 8:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">connection-url</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 9:</span> <span class="syntax17">&lt;</span><span class="syntax17">driver-class</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 10:</span> org.hsqldb.jdbcDriver<br /><span class="gutter"> 11:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">driver-class</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 12:</span> <span class="syntax17">&lt;</span><span class="syntax17">user-name</span><span class="syntax17">&gt;</span>sa<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">user-name</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 13:</span> <span class="syntax17">&lt;</span><span class="syntax17">password</span><span class="syntax17">&gt;</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">password</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 14:</span> <span class="syntax17">&lt;</span><span class="syntax17">min-pool-size</span><span class="syntax17">&gt;</span>5<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">min-pool-size</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 15:</span> <span class="syntax17">&lt;</span><span class="syntax17">max-pool-size</span><span class="syntax17">&gt;</span>20<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">max-pool-size</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 16:</span> <span class="syntax17">&lt;</span><span class="syntax17">idle-timeout-minutes</span><span class="syntax17">&gt;</span>5<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">idle-timeout-minutes</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 17:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">local-tx-datasource</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 18:</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">datasources</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 19:</span><br /></span></pre><br /><span style="font-weight: bold;">2</span> - Luego, en nuestro código el lookup de la conexión lo hacemos de la siguiente manera:<br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span>DataSource ds<span class="syntax18">=</span><span class="syntax18">(</span>DataSource<span class="syntax18">)</span><br /><span class="gutter"> 3:</span> ctx.<span class="syntax6">lookup</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">java:/HSqlDS</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 4:</span><br /></span></pre><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><span style="color: rgb(255, 255, 255);">.</span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34013116-8926103652590134785?l=holamundojava.blogspot.com'/></div>PabloSZnoreply@blogger.com1tag:blogger.com,1999:blog-34013116.post-34492235737898363372007-10-10T18:17:00.003-03:002008-12-02T00:51:21.577-02:00JAFramework<span style="color: rgb(255, 255, 255);">.</span><br /><span style="font-size:130%;"><span style="font-weight: bold;">BeanFactory</span></span><br /><br />Podemos utilizar JAF para instanciar objetos definidos en el descriptor.<br /><br /><span style="font-weight: bold;">descriptor.xml</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax17">&lt;</span><span class="syntax17">jaframework</span><span class="syntax17"> </span><span class="syntax12">xmlns</span><span class="syntax18">:</span><span class="syntax17">xsi</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">http://www.w3.org/2001/XMLSchema-instance</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax12">xsi</span><span class="syntax18">:</span><span class="syntax17">noNamespaceSchemaLocation</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">jaframework.xsd</span><span class="syntax13">"</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span> <span class="syntax17">&lt;</span><span class="syntax17">bean-factory</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 5:</span> <span class="syntax17">&lt;</span><span class="syntax17">bean</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">FRAME</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">class</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">java.awt.Frame</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">singleton</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">false</span><span class="syntax13">"</span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 6:</span> <span class="syntax17">&lt;</span><span class="syntax17">bean</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">VECTOR</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">class</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">java.util.Vector</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">singleton</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">true</span><span class="syntax13">"</span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 7:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">bean-factory</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 8:</span> <br /><span class="gutter"> 9:</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">jaframework</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 10:</span><br /></span></pre><br />En la línea 5 definimos un objeto llamado FRAME de la clase <span style="font-weight: bold;">java.awt.Frame</span>. En la línea 6 definimos un objeto llamado VECTOR de la clase <span style="font-weight: bold;">java.util.Vector</span>. Los nombres FRAME y VECTOR son arbitrareos.<br /><br />a FRAME lo definimos con el atributo <span style="font-weight: bold;">singleton</span>="<span style="font-weight: bold;">false</span>" en cambio a VECTOR lo definimos con <span style="font-weight: bold;">singleton</span>="<span style="font-weight: bold;">true</span>". Esto significa que cada vez que le pidamos al framework un objeto FRAME obtendremos una nueva instancia de <span style="font-weight: bold;">java.awt.Frame</span> (singleton="false"). Y cada vez que le pidamos al framework un objeto VECTOR el framework nos dará la misma (y única) instancia (singleton="true").<br /><br />El tag &lt;<span style="font-weight: bold;">bean-factory</span>&gt; debe ir al final, justo antes del cierre &lt;/<span style="font-weight: bold;">framework</span>&gt;<br /><br /><br />El siguiente programa muestra como pedirle objetos al framework y prueba el funcionamiento del atributo <span style="font-weight: bold;">singleton</span>.<br /><br /><span style="font-weight: bold;">PruebaBeans.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span> demo;<br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax9">import</span> framework.JABeanFactory;<br /><span class="gutterH"> 5:</span><span class="syntax9">import</span> framework.JAFactory;<br /><span class="gutter"> 6:</span><br /><span class="gutter"> 7:</span><span class="syntax8">public</span> <span class="syntax10">class</span> PruebaBeans<br /><span class="gutter"> 8:</span><span class="syntax18">{</span><br /><span class="gutter"> 9:</span> <span class="syntax8">public</span> <span class="syntax8">static</span> <span class="syntax10">void</span> <span class="syntax6">main</span><span class="syntax18">(</span>String[] args<span class="syntax18">)</span><br /><span class="gutterH"> 10:</span> <span class="syntax18">{</span><br /><span class="gutter"> 11:</span> JABeanFactory factory <span class="syntax18">=</span> JAFactory<br /><span class="gutter"> 12:</span> .<span class="syntax6">getBeanFactory</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 13:</span><br /><span class="gutter"> 14:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">levanto</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">descriptor</span><br /><span class="gutterH"> 15:</span> factory.<span class="syntax6">load</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">descriptor.xml</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 16:</span> <br /><span class="gutter"> 17:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">pido</span><span class="syntax2"> </span><span class="syntax2">dos</span><span class="syntax2"> </span><span class="syntax2">objetos</span><span class="syntax2"> </span><span class="syntax2">FRAME</span><span class="syntax2"> </span><span class="syntax2">(singleton=false)</span><br /><span class="gutter"> 18:</span> Object f1 <span class="syntax18">=</span> factory.<span class="syntax6">getBean</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">FRAME</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 19:</span> Object f2 <span class="syntax18">=</span> factory.<span class="syntax6">getBean</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">FRAME</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 20:</span><br /><span class="gutter"> 21:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">verifico</span><span class="syntax2"> </span><span class="syntax2">si</span><span class="syntax2"> </span><span class="syntax2">son</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">misma</span><span class="syntax2"> </span><span class="syntax2">instancia</span><br /><span class="gutter"> 22:</span> System.out.<span class="syntax6">print</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Son</span><span class="syntax13"> </span><span class="syntax13">la</span><span class="syntax13"> </span><span class="syntax13">misma</span><span class="syntax13"> </span><span class="syntax13">instancia</span><span class="syntax13"> </span><span class="syntax13">?</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 23:</span> System.out.<span class="syntax6">println</span><span class="syntax18">(</span>f1 <span class="syntax18">=</span><span class="syntax18">=</span> f2<span class="syntax18">)</span>; <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">debe</span><span class="syntax2"> </span><span class="syntax2">dar</span><span class="syntax2"> </span><span class="syntax2">false</span><br /><span class="gutter"> 24:</span><br /><span class="gutterH"> 25:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">pido</span><span class="syntax2"> </span><span class="syntax2">dos</span><span class="syntax2"> </span><span class="syntax2">objetos</span><span class="syntax2"> </span><span class="syntax2">VECTOR</span><span class="syntax2"> </span><span class="syntax2">(singleton=true)</span><br /><span class="gutter"> 26:</span> Object v1 <span class="syntax18">=</span> factory.<span class="syntax6">getBean</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">VECTOR</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 27:</span> Object v2 <span class="syntax18">=</span> factory.<span class="syntax6">getBean</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">VECTOR</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 28:</span><br /><span class="gutter"> 29:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">verifico</span><span class="syntax2"> </span><span class="syntax2">si</span><span class="syntax2"> </span><span class="syntax2">son</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">misma</span><span class="syntax2"> </span><span class="syntax2">instancia</span><br /><span class="gutterH"> 30:</span> System.out.<span class="syntax6">print</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Son</span><span class="syntax13"> </span><span class="syntax13">la</span><span class="syntax13"> </span><span class="syntax13">misma</span><span class="syntax13"> </span><span class="syntax13">instancia</span><span class="syntax13"> </span><span class="syntax13">?</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 31:</span> System.out.<span class="syntax6">println</span><span class="syntax18">(</span>v1 <span class="syntax18">=</span><span class="syntax18">=</span> v2<span class="syntax18">)</span>; <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">debe</span><span class="syntax2"> </span><span class="syntax2">dar</span><span class="syntax2"> </span><span class="syntax2">true</span><br /><span class="gutter"> 32:</span> <span class="syntax18">}</span><br /><span class="gutter"> 33:</span><span class="syntax18">}</span><br /><span class="gutter"> 34:</span><br /></span></pre><br /><br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://jaframework.com/"><img style="cursor: pointer;" src="http://1.bp.blogspot.com/_X1IHMrfIpE8/SO_BugopLXI/AAAAAAAACp8/9j08vVWtcec/s400/volver.gif" alt="" id="BLOGGER_PHOTO_ID_5255632294943206770" border="0" /></a><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34013116-3449223573789836337?l=holamundojava.blogspot.com'/></div>PabloSZnoreply@blogger.com0tag:blogger.com,1999:blog-34013116.post-50715348393730821402007-10-10T08:15:00.004-03:002008-12-02T00:03:47.532-02:00JAFramework<span style="color: rgb(255, 255, 255);">.</span><br /><span style="font-weight: bold;font-size:130%;" >Manejo de Transacciones</span><br /><br />JAF también provee un pequeño manejador de trasacciones a través del cual podemos confirmar (<span style="font-weight: bold;">commit</span>) o revertir (<span style="font-weight: bold;">rollback</span>) las sentencias realizadas contra la base de datos.<br /><br />Veamos las tablas <span style="font-weight: bold;">DEPT</span> (departamento) y <span style="font-weight: bold;">EMP</span> (empleado) que tienen los campos que se detallan a continuación para luego analizar un ejemplo sobre como utilizar transacciones con JAF.<br /><br /><span style="font-weight: bold;">DEPT</span><br />- <span style="font-weight: bold;">deptno </span>(número de departamento, NUMERIC primay key)<br />- <span style="font-weight: bold;">dname </span>(nombre del departamento, VARCHAR)<br />- <span style="font-weight: bold;">loc </span>(localidad donde funciona el departamento, VARCHAR)<br /><br /><span style="font-weight: bold;">EMP</span><br />- <span style="font-weight: bold;">empno </span>(número de empleado, NUMERIC primary key)<br />- <span style="font-weight: bold;">ename </span>(nombre del empleado, VARCHAR)<br />- <span style="font-weight: bold;">deptno </span>(referencia al departament donde trabaja el empleado, NUMERIC foreign key)<br /><br /><br />En el siguiente ejemplo insertamos una fila en <span style="font-weight: bold;">DEPT</span> y varias filas en <span style="font-weight: bold;">EMP</span>. Queremos "todo o nada". Si todo salió bien entonces confirmamos la operación (<span style="font-weight: bold;">commit</span>). Si algo falla entonces no se llegará a ejecutar el <span style="font-weight: bold;">commit</span> y en el <span style="font-weight: bold;">finally</span> revertimos con <span style="font-weight: bold;">rollback</span>.<br /><br /><span style="font-weight: bold;">TestTransaccion.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span> demo;<br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax9">import</span> framework.JAConnectionFactory;<br /><span class="gutterH"> 5:</span><span class="syntax9">import</span> framework.JAFactory;<br /><span class="gutter"> 6:</span><span class="syntax9">import</span> framework.jdbc.JATransaction;<br /><span class="gutter"> 7:</span><br /><span class="gutter"> 8:</span><span class="syntax8">public</span> <span class="syntax10">class</span> TestTransaccion<br /><span class="gutter"> 9:</span><span class="syntax18">{</span><br /><span class="gutterH"> 10:</span> <span class="syntax8">public</span> <span class="syntax8">static</span> <span class="syntax10">void</span> <span class="syntax6">main</span><span class="syntax18">(</span>String[] args<span class="syntax18">)</span><br /><span class="gutter"> 11:</span> <span class="syntax18">{</span><br /><span class="gutter"> 12:</span> JAConnectionFactory factory <span class="syntax18">=</span> JAFactory<br /><span class="gutter"> 13:</span> .<span class="syntax6">getConnectionFactory</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 14:</span><br /><span class="gutterH"> 15:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">levanto</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">configuracion</span><span class="syntax2"> </span><span class="syntax2">del</span><span class="syntax2"> </span><span class="syntax2">data-source</span><br /><span class="gutter"> 16:</span> factory.<span class="syntax6">load</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">descriptor.xml</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 17:</span><br /><span class="gutter"> 18:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">defino</span><span class="syntax2"> </span><span class="syntax2">un</span><span class="syntax2"> </span><span class="syntax2">objetto</span><span class="syntax2"> </span><span class="syntax2">para</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">transaccion</span><br /><span class="gutter"> 19:</span> JATransaction trx <span class="syntax18">=</span> <span class="syntax14">null</span>;<br /><span class="gutterH"> 20:</span><br /><span class="gutter"> 21:</span> <span class="syntax8">try</span><br /><span class="gutter"> 22:</span> <span class="syntax18">{</span><br /><span class="gutter"> 23:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">inicializo</span><span class="syntax2"> </span><span class="syntax2">una</span><span class="syntax2"> </span><span class="syntax2">transaccion</span><br /><span class="gutter"> 24:</span> trx <span class="syntax18">=</span> factory.<span class="syntax6">beginTransaction</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 25:</span><br /><span class="gutter"> 26:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">inserto</span><span class="syntax2"> </span><span class="syntax2">un</span><span class="syntax2"> </span><span class="syntax2">departamento</span><span class="syntax2"> </span><span class="syntax2">(padre)</span><br /><span class="gutter"> 27:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">(departamento</span><span class="syntax2"> </span><span class="syntax2">numero</span><span class="syntax2"> </span><span class="syntax2">6)</span><br /><span class="gutter"> 28:</span> InsertaFilas.<span class="syntax6">insertaDept</span><span class="syntax18">(</span><span class="syntax5">6</span><span class="syntax18">)</span>;<br /><span class="gutter"> 29:</span><br /><span class="gutterH"> 30:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">inserto</span><span class="syntax2"> </span><span class="syntax2">varios</span><span class="syntax2"> </span><span class="syntax2">empleados</span><span class="syntax2"> </span><span class="syntax2">(hijos)</span><br /><span class="gutter"> 31:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">(inserto</span><span class="syntax2"> </span><span class="syntax2">5</span><span class="syntax2"> </span><span class="syntax2">empleados</span><span class="syntax2"> </span><span class="syntax2">numerados</span><span class="syntax2"> </span><span class="syntax2">desde</span><span class="syntax2"> </span><span class="syntax2">7,</span><br /><span class="gutter"> 32:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">todos</span><span class="syntax2"> </span><span class="syntax2">en</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">departamento</span><span class="syntax2"> </span><span class="syntax2">numero</span><span class="syntax2"> </span><span class="syntax2">6)</span><br /><span class="gutter"> 33:</span> InsertaFilas.<span class="syntax6">insertaEmp</span><span class="syntax18">(</span><span class="syntax5">6</span>, <span class="syntax5">7</span>, <span class="syntax5">5</span><span class="syntax18">)</span>;<br /><span class="gutter"> 34:</span><br /><span class="gutterH"> 35:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">si</span><span class="syntax2"> </span><span class="syntax2">todo</span><span class="syntax2"> </span><span class="syntax2">salio</span><span class="syntax2"> </span><span class="syntax2">bien</span><span class="syntax2"> </span><span class="syntax2">entonces</span><span class="syntax2"> </span><span class="syntax2">comiteo</span><br /><span class="gutter"> 36:</span> trx.<span class="syntax6">commit</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 37:</span> <span class="syntax18">}</span><br /><span class="gutter"> 38:</span> <span class="syntax8">catch</span><span class="syntax18">(</span> Exception ex <span class="syntax18">)</span><br /><span class="gutter"> 39:</span> <span class="syntax18">{</span><br /><span class="gutterH"> 40:</span> ex.<span class="syntax6">printStackTrace</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 41:</span> <span class="syntax8">throw</span> <span class="syntax8">new</span> <span class="syntax6">RuntimeException</span><span class="syntax18">(</span>ex<span class="syntax18">)</span>;<br /><span class="gutter"> 42:</span> <span class="syntax18">}</span><br /><span class="gutter"> 43:</span> <span class="syntax8">finally</span><br /><span class="gutter"> 44:</span> <span class="syntax18">{</span><br /><span class="gutterH"> 45:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">siempre</span><span class="syntax2"> </span><span class="syntax2">hago</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">rollback</span><br /><span class="gutter"> 46:</span> <span class="syntax8">if</span><span class="syntax18">(</span> trx <span class="syntax18">!</span><span class="syntax18">=</span> <span class="syntax14">null</span> <span class="syntax18">)</span> trx.<span class="syntax6">rollback</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 47:</span> <span class="syntax18">}</span><br /><span class="gutter"> 48:</span> <span class="syntax18">}</span><br /><span class="gutter"> 49:</span><span class="syntax18">}</span><br /><span class="gutterH"> 50:</span><br /></span></pre><br />Veamos la clase con la que insertamos las filas en las tablas.<br /><br /><span style="font-weight: bold;">InsertaFilas.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span> demo;<br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax9">import</span> java.sql.Connection;<br /><span class="gutterH"> 5:</span><span class="syntax9">import</span> java.sql.PreparedStatement;<br /><span class="gutter"> 6:</span><br /><span class="gutter"> 7:</span><span class="syntax9">import</span> javax.sql.DataSource;<br /><span class="gutter"> 8:</span><br /><span class="gutter"> 9:</span><span class="syntax9">import</span> framework.JAConnectionFactory;<br /><span class="gutterH"> 10:</span><span class="syntax9">import</span> framework.JAFactory;<br /><span class="gutter"> 11:</span><br /><span class="gutter"> 12:</span><span class="syntax8">public</span> <span class="syntax10">class</span> InsertaFilas<br /><span class="gutter"> 13:</span><span class="syntax18">{</span><br /><span class="gutter"> 14:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">inserta</span><span class="syntax2"> </span><span class="syntax2">una</span><span class="syntax2"> </span><span class="syntax2">fila</span><span class="syntax2"> </span><span class="syntax2">en</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">tabla</span><span class="syntax2"> </span><span class="syntax2">DEPT</span><br /><span class="gutterH"> 15:</span> <span class="syntax8">public</span> <span class="syntax8">static</span> <span class="syntax10">void</span> <span class="syntax6">insertaDept</span><span class="syntax18">(</span><span class="syntax10">int</span> deptno<span class="syntax18">)</span><br /><span class="gutter"> 16:</span> <span class="syntax18">{</span><br /><span class="gutter"> 17:</span> Connection con <span class="syntax18">=</span> <span class="syntax14">null</span>;<br /><span class="gutter"> 18:</span> PreparedStatement pstm <span class="syntax18">=</span> <span class="syntax14">null</span>;<br /><span class="gutter"> 19:</span><br /><span class="gutterH"> 20:</span> <span class="syntax8">try</span><br /><span class="gutter"> 21:</span> <span class="syntax18">{</span><br /><span class="gutter"> 22:</span> JAConnectionFactory factory <span class="syntax18">=</span> JAFactory<br /><span class="gutter"> 23:</span> .<span class="syntax6">getConnectionFactory</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 24:</span><br /><span class="gutterH"> 25:</span> String sql <span class="syntax18">=</span> <span class="syntax13">"</span><span class="syntax13">"</span>;<br /><span class="gutter"> 26:</span> sql <span class="syntax18">+</span><span class="syntax18">=</span> <span class="syntax13">"</span><span class="syntax13">INSERT</span><span class="syntax13"> </span><span class="syntax13">INTO</span><span class="syntax13"> </span><span class="syntax13">dept</span><span class="syntax13"> </span><span class="syntax13">(</span><span class="syntax13"> </span><span class="syntax13">"</span>;<br /><span class="gutter"> 27:</span> sql <span class="syntax18">+</span><span class="syntax18">=</span> <span class="syntax13">"</span><span class="syntax13">deptno,</span><span class="syntax13"> </span><span class="syntax13">dname,</span><span class="syntax13"> </span><span class="syntax13">loc)</span><span class="syntax13"> </span><span class="syntax13">VALUES(</span><span class="syntax13"> </span><span class="syntax13">"</span>;<br /><span class="gutter"> 28:</span> sql <span class="syntax18">+</span><span class="syntax18">=</span> <span class="syntax13">"</span><span class="syntax13">?,?,?)</span><span class="syntax13">"</span>;<br /><span class="gutter"> 29:</span><br /><span class="gutterH"> 30:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">Obtengo</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">data-source</span><span class="syntax2"> </span><span class="syntax2">por</span><span class="syntax2"> </span><span class="syntax2">default</span><br /><span class="gutter"> 31:</span> DataSource ds <span class="syntax18">=</span> factory.<span class="syntax6">getDataSource</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 32:</span><br /><span class="gutter"> 33:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">le</span><span class="syntax2"> </span><span class="syntax2">pido</span><span class="syntax2"> </span><span class="syntax2">una</span><span class="syntax2"> </span><span class="syntax2">conexion</span><br /><span class="gutter"> 34:</span> con <span class="syntax18">=</span> ds.<span class="syntax6">getConnection</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 35:</span> <br /><span class="gutter"> 36:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">utilizo</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">conexion</span><br /><span class="gutter"> 37:</span> pstm <span class="syntax18">=</span> con.<span class="syntax6">prepareStatement</span><span class="syntax18">(</span>sql<span class="syntax18">)</span>;<br /><span class="gutter"> 38:</span><br /><span class="gutter"> 39:</span> pstm.<span class="syntax6">setInt</span><span class="syntax18">(</span><span class="syntax5">1</span>, deptno<span class="syntax18">)</span>;<br /><span class="gutterH"> 40:</span> pstm.<span class="syntax6">setString</span><span class="syntax18">(</span><span class="syntax5">2</span>, <span class="syntax13">"</span><span class="syntax13">Dept(</span><span class="syntax13">"</span> <span class="syntax18">+</span> deptno <span class="syntax18">+</span> <span class="syntax13">"</span><span class="syntax13">)</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 41:</span> pstm.<span class="syntax6">setString</span><span class="syntax18">(</span><span class="syntax5">3</span>, <span class="syntax13">"</span><span class="syntax13">Loc(</span><span class="syntax13">"</span> <span class="syntax18">+</span> deptno <span class="syntax18">+</span> <span class="syntax13">"</span><span class="syntax13">)</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 42:</span> <span class="syntax8">if</span><span class="syntax18">(</span> pstm.<span class="syntax6">executeUpdate</span><span class="syntax18">(</span><span class="syntax18">)</span> <span class="syntax18">!</span><span class="syntax18">=</span> <span class="syntax5">1</span> <span class="syntax18">)</span><br /><span class="gutter"> 43:</span> <span class="syntax18">{</span><br /><span class="gutter"> 44:</span> <span class="syntax8">throw</span> <span class="syntax8">new</span> <span class="syntax6">RuntimeException</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Error</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 45:</span> <span class="syntax18">}</span><br /><span class="gutter"> 46:</span> <span class="syntax18">}</span><br /><span class="gutter"> 47:</span> <span class="syntax8">catch</span><span class="syntax18">(</span> Exception ex <span class="syntax18">)</span><br /><span class="gutter"> 48:</span> <span class="syntax18">{</span><br /><span class="gutter"> 49:</span> ex.<span class="syntax6">printStackTrace</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 50:</span> <span class="syntax8">throw</span> <span class="syntax8">new</span> <span class="syntax6">RuntimeException</span><span class="syntax18">(</span>ex<span class="syntax18">)</span>;<br /><span class="gutter"> 51:</span> <span class="syntax18">}</span><br /><span class="gutter"> 52:</span> <span class="syntax8">finally</span><br /><span class="gutter"> 53:</span> <span class="syntax18">{</span><br /><span class="gutter"> 54:</span> <span class="syntax8">try</span><br /><span class="gutterH"> 55:</span> <span class="syntax18">{</span><br /><span class="gutter"> 56:</span> <span class="syntax8">if</span><span class="syntax18">(</span> pstm <span class="syntax18">!</span><span class="syntax18">=</span> <span class="syntax14">null</span> <span class="syntax18">)</span> pstm.<span class="syntax6">close</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 57:</span> <br /><span class="gutter"> 58:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">retorno</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">conexion</span><span class="syntax2"> </span><span class="syntax2">al</span><span class="syntax2"> </span><span class="syntax2">data-source</span><br /><span class="gutter"> 59:</span> <span class="syntax8">if</span><span class="syntax18">(</span> con <span class="syntax18">!</span><span class="syntax18">=</span> <span class="syntax14">null</span> <span class="syntax18">)</span> con.<span class="syntax6">close</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 60:</span> <span class="syntax18">}</span><br /><span class="gutter"> 61:</span> <span class="syntax8">catch</span><span class="syntax18">(</span> Exception ex <span class="syntax18">)</span><br /><span class="gutter"> 62:</span> <span class="syntax18">{</span><br /><span class="gutter"> 63:</span> ex.<span class="syntax6">printStackTrace</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 64:</span> <span class="syntax8">throw</span> <span class="syntax8">new</span> <span class="syntax6">RuntimeException</span><span class="syntax18">(</span>ex<span class="syntax18">)</span>;<br /><span class="gutterH"> 65:</span> <span class="syntax18">}</span><br /><span class="gutter"> 66:</span> <span class="syntax18">}</span><br /><span class="gutter"> 67:</span> <span class="syntax18">}</span><br /><span class="gutter"> 68:</span><br /><span class="gutter"> 69:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">inserta</span><span class="syntax2"> </span><span class="syntax2">n</span><span class="syntax2"> </span><span class="syntax2">filas</span><span class="syntax2"> </span><span class="syntax2">en</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">tabla</span><span class="syntax2"> </span><span class="syntax2">EMP</span><br /><span class="gutterH"> 70:</span> <span class="syntax8">public</span> <span class="syntax8">static</span> <span class="syntax10">void</span> <span class="syntax6">insertaEmp</span><span class="syntax18">(</span><span class="syntax10">int</span> deptno<br /><span class="gutter"> 71:</span> , <span class="syntax10">int</span> empnoBase<br /><span class="gutter"> 72:</span> , <span class="syntax10">int</span> n<span class="syntax18">)</span><br /><span class="gutter"> 73:</span> <span class="syntax18">{</span><br /><span class="gutter"> 74:</span> Connection con <span class="syntax18">=</span> <span class="syntax14">null</span>;<br /><span class="gutterH"> 75:</span> PreparedStatement pstm <span class="syntax18">=</span> <span class="syntax14">null</span>;<br /><span class="gutter"> 76:</span><br /><span class="gutter"> 77:</span> <span class="syntax8">try</span><br /><span class="gutter"> 78:</span> <span class="syntax18">{</span><br /><span class="gutter"> 79:</span> JAConnectionFactory factory <span class="syntax18">=</span> JAFactory<br /><span class="gutterH"> 80:</span> .<span class="syntax6">getConnectionFactory</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 81:</span><br /><span class="gutter"> 82:</span> String sql <span class="syntax18">=</span> <span class="syntax13">"</span><span class="syntax13">"</span>;<br /><span class="gutter"> 83:</span> sql <span class="syntax18">+</span><span class="syntax18">=</span> <span class="syntax13">"</span><span class="syntax13">INSERT</span><span class="syntax13"> </span><span class="syntax13">INTO</span><span class="syntax13"> </span><span class="syntax13">emp</span><span class="syntax13"> </span><span class="syntax13">(</span><span class="syntax13"> </span><span class="syntax13">"</span>;<br /><span class="gutter"> 84:</span> sql <span class="syntax18">+</span><span class="syntax18">=</span> <span class="syntax13">"</span><span class="syntax13">empno,</span><span class="syntax13"> </span><span class="syntax13">ename,</span><span class="syntax13"> </span><span class="syntax13">deptno)</span><span class="syntax13"> </span><span class="syntax13">VALUES(</span><span class="syntax13"> </span><span class="syntax13">"</span>;<br /><span class="gutterH"> 85:</span> sql <span class="syntax18">+</span><span class="syntax18">=</span> <span class="syntax13">"</span><span class="syntax13">?,?,?)</span><span class="syntax13">"</span>;<br /><span class="gutter"> 86:</span><br /><span class="gutter"> 87:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">obtengo</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">data-source</span><span class="syntax2"> </span><span class="syntax2">por</span><span class="syntax2"> </span><span class="syntax2">default</span><br /><span class="gutter"> 88:</span> DataSource ds <span class="syntax18">=</span> factory.<span class="syntax6">getDataSource</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 89:</span> <br /><span class="gutterH"> 90:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">le</span><span class="syntax2"> </span><span class="syntax2">pido</span><span class="syntax2"> </span><span class="syntax2">una</span><span class="syntax2"> </span><span class="syntax2">conexion</span><br /><span class="gutter"> 91:</span> con <span class="syntax18">=</span> ds.<span class="syntax6">getConnection</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 92:</span> <br /><span class="gutter"> 93:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">utilizo</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">conexion</span><br /><span class="gutter"> 94:</span> pstm <span class="syntax18">=</span> con.<span class="syntax6">prepareStatement</span><span class="syntax18">(</span>sql<span class="syntax18">)</span>;<br /><span class="gutterH"> 95:</span><br /><span class="gutter"> 96:</span> <span class="syntax8">for</span><span class="syntax18">(</span> <span class="syntax10">int</span> i <span class="syntax18">=</span> <span class="syntax5">0</span>; i <span class="syntax18">&lt;</span> n; i<span class="syntax18">+</span><span class="syntax18">+</span> <span class="syntax18">)</span><br /><span class="gutter"> 97:</span> <span class="syntax18">{</span><br /><span class="gutter"> 98:</span> pstm.<span class="syntax6">setInt</span><span class="syntax18">(</span><span class="syntax5">1</span>, empnoBase <span class="syntax18">+</span> i<span class="syntax18">)</span>;<br /><span class="gutter"> 99:</span> pstm.<span class="syntax6">setString</span><span class="syntax18">(</span><span class="syntax5">2</span>, <span class="syntax13">"</span><span class="syntax13">Emp(</span><span class="syntax13">"</span> <span class="syntax18">+</span> i <span class="syntax18">+</span> <span class="syntax13">"</span><span class="syntax13">)</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 100:</span> pstm.<span class="syntax6">setInt</span><span class="syntax18">(</span><span class="syntax5">3</span>, deptno<span class="syntax18">)</span>;<br /><span class="gutter"> 101:</span> <span class="syntax8">if</span><span class="syntax18">(</span> pstm.<span class="syntax6">executeUpdate</span><span class="syntax18">(</span><span class="syntax18">)</span> <span class="syntax18">!</span><span class="syntax18">=</span> <span class="syntax5">1</span> <span class="syntax18">)</span><br /><span class="gutter"> 102:</span> <span class="syntax18">{</span><br /><span class="gutter"> 103:</span> <span class="syntax8">throw</span> <span class="syntax8">new</span> <span class="syntax6">RuntimeException</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Error</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 104:</span> <span class="syntax18">}</span><br /><span class="gutterH"> 105:</span> <span class="syntax18">}</span><br /><span class="gutter"> 106:</span> <span class="syntax18">}</span><br /><span class="gutter"> 107:</span> <span class="syntax8">catch</span><span class="syntax18">(</span> Exception ex <span class="syntax18">)</span><br /><span class="gutter"> 108:</span> <span class="syntax18">{</span><br /><span class="gutter"> 109:</span> ex.<span class="syntax6">printStackTrace</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 110:</span> <span class="syntax8">throw</span> <span class="syntax8">new</span> <span class="syntax6">RuntimeException</span><span class="syntax18">(</span>ex<span class="syntax18">)</span>;<br /><span class="gutter"> 111:</span> <span class="syntax18">}</span><br /><span class="gutter"> 112:</span> <span class="syntax8">finally</span><br /><span class="gutter"> 113:</span> <span class="syntax18">{</span><br /><span class="gutter"> 114:</span> <span class="syntax8">try</span><br /><span class="gutterH"> 115:</span> <span class="syntax18">{</span><br /><span class="gutter"> 116:</span> <span class="syntax8">if</span><span class="syntax18">(</span> pstm <span class="syntax18">!</span><span class="syntax18">=</span> <span class="syntax14">null</span> <span class="syntax18">)</span> pstm.<span class="syntax6">close</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 117:</span><br /><span class="gutter"> 118:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">devuelvo</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">conexion</span><span class="syntax2"> </span><span class="syntax2">al</span><span class="syntax2"> </span><span class="syntax2">data-source</span><br /><span class="gutter"> 119:</span> <span class="syntax8">if</span><span class="syntax18">(</span> con <span class="syntax18">!</span><span class="syntax18">=</span> <span class="syntax14">null</span> <span class="syntax18">)</span> con.<span class="syntax6">close</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 120:</span> <span class="syntax18">}</span><br /><span class="gutter"> 121:</span> <span class="syntax8">catch</span><span class="syntax18">(</span> Exception ex <span class="syntax18">)</span><br /><span class="gutter"> 122:</span> <span class="syntax18">{</span><br /><span class="gutter"> 123:</span> ex.<span class="syntax6">printStackTrace</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 124:</span> <span class="syntax8">throw</span> <span class="syntax8">new</span> <span class="syntax6">RuntimeException</span><span class="syntax18">(</span>ex<span class="syntax18">)</span>;<br /><span class="gutterH"> 125:</span> <span class="syntax18">}</span><br /><span class="gutter"> 126:</span> <span class="syntax18">}</span><br /><span class="gutter"> 127:</span> <span class="syntax18">}</span><br /><span class="gutter"> 128:</span><span class="syntax18">}</span><br /><span class="gutter"> 129:</span><br /></span></pre><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://holamundojava.blogspot.com/2008/10/jaframework.html"><img style="cursor: pointer;" src="http://1.bp.blogspot.com/_X1IHMrfIpE8/SO8zxxg8MdI/AAAAAAAACp0/sKb-ai-rRxE/s400/volver.gif" alt="" id="BLOGGER_PHOTO_ID_5255476220362764754" border="0" /></a><br /><br /><br /><br /><span style="color: rgb(255, 255, 255);">.</span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34013116-5071534839373082140?l=holamundojava.blogspot.com'/></div>PabloSZnoreply@blogger.com0tag:blogger.com,1999:blog-34013116.post-79413654605735180182007-10-08T09:09:00.013-03:002008-12-02T00:21:11.082-02:00JAFramework<span style="color: rgb(255, 255, 255);">.</span><br /><span style="font-weight: bold;font-size:130%;" >Acceso a Bases de Datos</span><br /><span style="font-weight: bold;"></span><br />JAF incluye una factory de DataSources JDBC a través de la cual podemos establecer conexiones contra una base de datos. Lo configuramos de la siguiente manera:<br /><br /><span style="font-weight: bold;">descriptor.xml</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax17">&lt;</span><span class="syntax17">jaframework</span><span class="syntax17"> </span><span class="syntax12">xmlns</span><span class="syntax18">:</span><span class="syntax17">xsi</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">http://www.w3.org/2001/XMLSchema-instance</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax12">xsi</span><span class="syntax18">:</span><span class="syntax17">noNamespaceSchemaLocation</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">jaframework.xsd</span><span class="syntax13">"</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span> <span class="syntax17">&lt;</span><span class="syntax17">jdbc</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 5:</span> <span class="syntax17">&lt;</span><span class="syntax17">data-source</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">HSQL</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutter"> 6:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">driver</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">org.hsqldb.jdbcDriver</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutter"> 7:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">url</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">jdbc:hsqldb:hsql://localhost/xdb</span><span class="syntax13">"</span><br /><span class="gutter"> 8:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">user</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">sa</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutter"> 9:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">password</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">"</span><span class="syntax17"> </span><br /><span class="gutterH"> 10:</span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17"> </span><span class="syntax17">pool-size</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">4</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 11:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">jdbc</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 12:</span><br /><span class="gutter"> 13:</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">jaframework</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 14:</span><br /></span></pre><br />Dentro del tag <span style="font-weight: bold;">jdbc</span> definimos uno o varios <span style="font-weight: bold;">data-source</span>. Un <span style="font-weight: bold;">data-source</span> especifica los parámetros para establecer la conexión JDBC con la base de datos. El parámetro <span style="font-weight: bold;">pool-size</span> indica la cantidad de conexiones que serán pre-instanciadas al momento de crear el <span style="font-weight: bold;">data-source</span>. Es el tamaño del <span style="font-weight: bold;">pool de conexiones.</span><br /><br />Si en el descriptor tuviésemos también tags &lt;<span style="font-weight: bold;">driver</span>&gt; entonces el tag &lt;<span style="font-weight: bold;">jdbc</span>&gt; debe ir a continuación de estos.<br /><br /><br />Para probar el data-source lo haremos con el siguiente programa.<br /><br /><span style="font-weight: bold;">TestConnection.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span> demo;<br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax9">import</span> java.sql.Connection;<br /><span class="gutterH"> 5:</span><span class="syntax9">import</span> java.sql.ResultSet;<br /><span class="gutter"> 6:</span><span class="syntax9">import</span> java.sql.Statement;<br /><span class="gutter"> 7:</span><br /><span class="gutter"> 8:</span><span class="syntax9">import</span> javax.sql.DataSource;<br /><span class="gutter"> 9:</span><br /><span class="gutterH"> 10:</span><span class="syntax9">import</span> framework.JAConnectionFactory;<br /><span class="gutter"> 11:</span><span class="syntax9">import</span> framework.JAFactory;<br /><span class="gutter"> 12:</span><br /><span class="gutter"> 13:</span><span class="syntax8">public</span> <span class="syntax10">class</span> TestConnection<br /><span class="gutter"> 14:</span><span class="syntax18">{</span><br /><span class="gutterH"> 15:</span> <span class="syntax8">public</span> <span class="syntax8">static</span> <span class="syntax10">void</span> <span class="syntax6">main</span><span class="syntax18">(</span>String[] args<span class="syntax18">)</span><br /><span class="gutter"> 16:</span> <span class="syntax18">{</span><br /><span class="gutter"> 17:</span> JAConnectionFactory factory <span class="syntax18">=</span> JAFactory.<span class="syntax6">getConnectionFactory</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 18:</span><br /><span class="gutter"> 19:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">levanto</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">descriptor</span><br /><span class="gutterH"> 20:</span> factory.<span class="syntax6">load</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">descriptor.xml</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 21:</span><br /><span class="gutter"> 22:</span> Connection con <span class="syntax18">=</span> <span class="syntax14">null</span>;<br /><span class="gutter"> 23:</span> Statement stm <span class="syntax18">=</span> <span class="syntax14">null</span>;<br /><span class="gutter"> 24:</span> ResultSet rs <span class="syntax18">=</span> <span class="syntax14">null</span>;<br /><span class="gutterH"> 25:</span><br /><span class="gutter"> 26:</span> <span class="syntax8">try</span><br /><span class="gutter"> 27:</span> <span class="syntax18">{</span><br /><span class="gutter"> 28:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">pido</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">data-source</span><br /><span class="gutter"> 29:</span> DataSource ds <span class="syntax18">=</span> factory.<span class="syntax6">getDataSource</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 30:</span><br /><span class="gutter"> 31:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">ahora</span><span class="syntax2"> </span><span class="syntax2">le</span><span class="syntax2"> </span><span class="syntax2">pido</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">conexion</span><br /><span class="gutter"> 32:</span> con <span class="syntax18">=</span> ds.<span class="syntax6">getConnection</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 33:</span><br /><span class="gutter"> 34:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">utilizo</span><br /><span class="gutterH"> 35:</span> String sql <span class="syntax18">=</span> <span class="syntax13">"</span><span class="syntax13">"</span>;<br /><span class="gutter"> 36:</span> sql<span class="syntax18">+</span><span class="syntax18">=</span><span class="syntax13">"</span><span class="syntax13">SELECT</span><span class="syntax13"> </span><span class="syntax13">deptno,dname,loc</span><span class="syntax13"> </span><span class="syntax13">"</span>;<br /><span class="gutter"> 37:</span> sql<span class="syntax18">+</span><span class="syntax18">=</span><span class="syntax13">"</span><span class="syntax13">FROM</span><span class="syntax13"> </span><span class="syntax13">dept</span><span class="syntax13"> </span><span class="syntax13">"</span>;<br /><span class="gutter"> 38:</span> <br /><span class="gutter"> 39:</span> stm <span class="syntax18">=</span> con.<span class="syntax6">createStatement</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 40:</span> rs <span class="syntax18">=</span> stm.<span class="syntax6">executeQuery</span><span class="syntax18">(</span>sql<span class="syntax18">)</span>;<br /><span class="gutter"> 41:</span><br /><span class="gutter"> 42:</span> <span class="syntax8">while</span><span class="syntax18">(</span> rs.<span class="syntax6">next</span><span class="syntax18">(</span><span class="syntax18">)</span> <span class="syntax18">)</span><br /><span class="gutter"> 43:</span> <span class="syntax18">{</span><br /><span class="gutter"> 44:</span> System.out.<span class="syntax6">print</span><span class="syntax18">(</span>rs.<span class="syntax6">getInt</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">deptno</span><span class="syntax13">"</span><span class="syntax18">)</span> <span class="syntax18">+</span> <span class="syntax13">"</span><span class="syntax13">,</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 45:</span> System.out.<span class="syntax6">print</span><span class="syntax18">(</span>rs.<span class="syntax6">getString</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">dname</span><span class="syntax13">"</span><span class="syntax18">)</span> <span class="syntax18">+</span> <span class="syntax13">"</span><span class="syntax13">,</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 46:</span> System.out.<span class="syntax6">println</span><span class="syntax18">(</span>rs.<span class="syntax6">getString</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">loc</span><span class="syntax13">"</span><span class="syntax18">)</span><span class="syntax18">)</span>;<br /><span class="gutter"> 47:</span> <span class="syntax18">}</span><br /><span class="gutter"> 48:</span> <span class="syntax18">}</span><br /><span class="gutter"> 49:</span> <span class="syntax8">catch</span><span class="syntax18">(</span> Exception ex <span class="syntax18">)</span><br /><span class="gutterH"> 50:</span> <span class="syntax18">{</span><br /><span class="gutter"> 51:</span> ex.<span class="syntax6">printStackTrace</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 52:</span> <span class="syntax8">throw</span> <span class="syntax8">new</span> <span class="syntax6">RuntimeException</span><span class="syntax18">(</span>ex<span class="syntax18">)</span>;<br /><span class="gutter"> 53:</span> <span class="syntax18">}</span><br /><span class="gutter"> 54:</span> <span class="syntax8">finally</span><br /><span class="gutterH"> 55:</span> <span class="syntax18">{</span><br /><span class="gutter"> 56:</span> <span class="syntax8">try</span><br /><span class="gutter"> 57:</span> <span class="syntax18">{</span><br /><span class="gutter"> 58:</span> <span class="syntax8">if</span><span class="syntax18">(</span> rs <span class="syntax18">!</span><span class="syntax18">=</span> <span class="syntax14">null</span> <span class="syntax18">)</span> rs.<span class="syntax6">close</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 59:</span> <span class="syntax8">if</span><span class="syntax18">(</span> stm <span class="syntax18">!</span><span class="syntax18">=</span> <span class="syntax14">null</span> <span class="syntax18">)</span> stm.<span class="syntax6">close</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 60:</span><br /><span class="gutter"> 61:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">debo</span><span class="syntax2"> </span><span class="syntax2">cerrar</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">conexion</span><span class="syntax2"> </span><span class="syntax2">ya</span><span class="syntax2"> </span><span class="syntax2">que</span><span class="syntax2"> </span><span class="syntax2">al</span><br /><span class="gutter"> 62:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">cerrarla</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">estoy</span><span class="syntax2"> </span><span class="syntax2">devolviendo</span><span class="syntax2"> </span><span class="syntax2">al</span><br /><span class="gutter"> 63:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">pool</span><span class="syntax2"> </span><span class="syntax2">de</span><span class="syntax2"> </span><span class="syntax2">conexiones</span><br /><span class="gutter"> 64:</span> <span class="syntax8">if</span><span class="syntax18">(</span> con <span class="syntax18">!</span><span class="syntax18">=</span> <span class="syntax14">null</span> <span class="syntax18">)</span> con.<span class="syntax6">close</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 65:</span> <span class="syntax18">}</span><br /><span class="gutter"> 66:</span> <span class="syntax8">catch</span><span class="syntax18">(</span> Exception ex <span class="syntax18">)</span><br /><span class="gutter"> 67:</span> <span class="syntax18">{</span><br /><span class="gutter"> 68:</span> ex.<span class="syntax6">printStackTrace</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 69:</span> <span class="syntax8">throw</span> <span class="syntax8">new</span> <span class="syntax6">RuntimeException</span><span class="syntax18">(</span>ex<span class="syntax18">)</span>;<br /><span class="gutterH"> 70:</span> <span class="syntax18">}</span><br /><span class="gutter"> 71:</span> <span class="syntax18">}</span><br /><span class="gutter"> 72:</span> <span class="syntax18">}</span><br /><span class="gutter"> 73:</span><span class="syntax18">}</span><br /><span class="gutter"> 74:</span><br /></span></pre><br /><br /><br /><div style="text-align: right;"><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://jaframework.com/"><img style="cursor: pointer;" src="http://1.bp.blogspot.com/_X1IHMrfIpE8/SO8p8QvGSfI/AAAAAAAACpk/PDtG3GaY-Io/s400/volver.gif" alt="" id="BLOGGER_PHOTO_ID_5255465405426059762" border="0" /></a><span style="color: rgb(255, 255, 255);">..............................................</span><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://holamundojava.blogspot.com/2008/10/jaframework_10.html"><img style="cursor: pointer;" src="http://1.bp.blogspot.com/_X1IHMrfIpE8/SOyZYO3WZnI/AAAAAAAACpc/775j7rYCX-I/s400/siguiente.gif" alt="" id="BLOGGER_PHOTO_ID_5254743506820687474" border="0" /></a><br /></div><br /><br /><br /><span style="color: rgb(255, 255, 255);">.</span><br /></div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34013116-7941365460573518018?l=holamundojava.blogspot.com'/></div>PabloSZnoreply@blogger.com0tag:blogger.com,1999:blog-34013116.post-19872393439925853232007-09-20T07:16:00.001-03:002008-09-20T07:29:18.249-03:00Programación Orientada a ObjetosEn POO la pila debe ser un objeto en si mismo, autosuficiente. Debe tener los datos y las funciones necesarias para manejar los datos.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34013116-1987239343992585323?l=holamundojava.blogspot.com'/></div>PabloSZnoreply@blogger.com0tag:blogger.com,1999:blog-34013116.post-82376285902857781702007-09-19T17:05:00.000-03:002007-09-21T08:39:04.761-03:00Custom TAGs<span style="color: rgb(255, 255, 255);">.</span><br />JSP permite definir TAGs. Si bien es una tarea un poco tediosa, en ciertos casos puede ser de gran ayuda para que nuestro código JSP sea más claro, legible y mantenible.<br /><br />En este capítulo analizaremos algunos ejemplos bien simples con los cuales intentaremos cubrir varios de los casos se pueden presentar al momento de diseñar nuestra librería de Custom TAGs<br /><br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Tipos de TAGs</span></span><br /><br />Podríamos clasificar los custom tags en diferentes casos: tags con o sin atributos, con o sin cuerpo, etc. El siguiente código JSP ejemplifica de estos diferentes casos..<br /><pre><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax1">&lt;!--</span><span class="syntax1"> </span><span class="syntax1">tag</span><span class="syntax1"> </span><span class="syntax1">sin</span><span class="syntax1"> </span><span class="syntax1">atributos</span><span class="syntax1"> </span><span class="syntax1">ni</span><span class="syntax1"> </span><span class="syntax1">cuerpo</span><span class="syntax1"> </span><span class="syntax1">--&gt;</span><br /><span class="gutter"> 3:</span><span class="syntax17">&lt;</span><span class="syntax17">mitag</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 4:</span><br /><span class="gutterH"> 5:</span><span class="syntax1">&lt;!--</span><span class="syntax1"> </span><span class="syntax1">tag</span><span class="syntax1"> </span><span class="syntax1">con</span><span class="syntax1"> </span><span class="syntax1">atributos</span><span class="syntax1">,</span><span class="syntax1"> </span><span class="syntax1">sin</span><span class="syntax1"> </span><span class="syntax1">cuerpo</span><span class="syntax1"> </span><span class="syntax1">--&gt;</span><br /><span class="gutter"> 6:</span><span class="syntax17">&lt;</span><span class="syntax17">mitag</span><span class="syntax17"> </span><span class="syntax17">nombre</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">Pablo</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 7:</span><br /><span class="gutter"> 8:</span><span class="syntax1">&lt;!--</span><span class="syntax1"> </span><span class="syntax1">tag</span><span class="syntax1"> </span><span class="syntax1">con</span><span class="syntax1"> </span><span class="syntax1">atributos</span><span class="syntax1"> </span><span class="syntax1">tomados</span><span class="syntax1"> </span><span class="syntax1">como</span><span class="syntax1"> </span><span class="syntax1">expresion</span><span class="syntax1"> </span><span class="syntax1">--&gt;</span><br /><span class="gutter"> 9:</span><span class="syntax8">&lt;%</span><br /><span class="gutterH"> 10:</span> java.util.Date fec<span class="syntax18">=</span><span class="syntax8">new</span> java.util.<span class="syntax6">Date</span>();<br /><span class="gutter"> 11:</span><span class="syntax8">%&gt;</span><br /><span class="gutter"> 12:</span><span class="syntax17">&lt;</span><span class="syntax17">mitag</span><span class="syntax17"> </span><span class="syntax17">fecha</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax8">&lt;%=</span>fec<span class="syntax8">%&gt;</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 13:</span><br /><span class="gutter"> 14:</span><span class="syntax1">&lt;!--</span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1">tag</span><span class="syntax1"> </span><span class="syntax1">con</span><span class="syntax1"> </span><span class="syntax1">cuerpo</span><span class="syntax1"> </span><span class="syntax1">--&gt;</span><br /><span class="gutterH"> 15:</span><span class="syntax17">&lt;</span><span class="syntax17">mitag</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 16:</span>Esto esta en el cuerpo de mi tag!<br /><span class="gutter"> 17:</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">mitag</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 18:</span><br /></pre><br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Comenzando</span></span><br /><br />Para programar un custom tag se necesitan dos partes: una <span style="font-weight: bold;">clase Java</span> que provee la implementación del tag en la que definimos lo que queremos que el tag haga y una entrada en un archivo <span style="font-weight: bold;">XML</span> (con extensión <span style="font-weight: bold;">.tld</span>) en donde <span style="font-weight: bold;">definimos la estructura</span> del tag.<br /><br />Veamos una página JSP que utilize un custom tag y luego veremos como lo programamos.<br /><br /><span style="font-weight: bold;">testTags.jsp</span><br /><pre><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax1">&lt;!--</span><span class="syntax1"> </span><span class="syntax1">tenemos</span><span class="syntax1"> </span><span class="syntax1">que</span><span class="syntax1"> </span><span class="syntax1">tener</span><span class="syntax1"> </span><span class="syntax1">el</span><span class="syntax1"> </span><span class="syntax1">archivo demo.tld </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1">--&gt;</span><br /><span class="gutter"> 3:</span><span class="syntax1">&lt;!--</span><span class="syntax1"> </span><span class="syntax1">en</span><span class="syntax1"> </span><span class="syntax1">el</span><span class="syntax1"> </span><span class="syntax1">directorio</span><span class="syntax1"> </span><span class="syntax1">/</span><span class="syntax1">WEB</span><span class="syntax1">-</span><span class="syntax1">INF</span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1">--&gt;</span><br /><span class="gutter"> 4:</span><span class="syntax8">&lt;%@</span><span class="syntax17"> </span><span class="syntax8">taglib</span><span class="syntax17"> </span><span class="syntax9">uri</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">/</span><span class="syntax13">WEB</span><span class="syntax13">-</span><span class="syntax13">INF</span><span class="syntax13">/demo</span><span class="syntax13">.</span><span class="syntax13">tld</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax9">prefix</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">sz</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax8">%&gt;</span><br /><span class="gutterH"> 5:</span><br /><span class="gutter"> 6:</span><span class="syntax17">&lt;</span><span class="syntax17">html</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 7:</span><span class="syntax17">&lt;</span><span class="syntax17">body</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 8:</span> <span class="syntax1">&lt;!--</span><span class="syntax1"> </span><span class="syntax1">aqui</span><span class="syntax1"> </span><span class="syntax1">llamanos</span><span class="syntax1"> </span><span class="syntax1">a</span><span class="syntax1"> </span><span class="syntax1">nuestro</span><span class="syntax1"> </span><span class="syntax1">custom</span><span class="syntax1"> </span><span class="syntax1">tag</span><span class="syntax1"> </span><span class="syntax1">--&gt;</span><br /><span class="gutter"> 9:</span> <span class="syntax17">&lt;</span><span class="syntax17">sz</span><span class="syntax17">:</span><span class="syntax6">holamundo</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 10:</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">body</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 11:</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">html</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 12:</span><br /></pre><br />Los tags se definen (y se declaran) en archivos XML con extensión <span style="font-weight: bold;">.tld</span> (tag library descriptor). Para indicarle a la página JSP que vamos a utilizar tags definidos en una TLD específica se utiliza una directiva <span style="font-weight: bold;">taglib</span> en la que se indica un prefijo que se deberá anteponer cada vez que invoquemos tags de esta librería. En este caso el prefijo será "<span style="font-weight: bold;">sz</span><span>"</span> (es una elección arbitraria).<br /><br />Ahra tenemos que generar un archivo <span style="font-weight: bold;">demo.tld</span> en el directorio /WEB-INF de nuestra aplicación web.<br /><br /><span style="font-weight: bold;">demo.tld</span><br /><pre><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax17">&lt;</span><span class="syntax17">taglib</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 3:</span> <span class="syntax17">&lt;</span><span class="syntax17">tlibversion</span><span class="syntax17">&gt;</span>1.0<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">tlibversion</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 4:</span> <span class="syntax17">&lt;</span><span class="syntax17">jspversion</span><span class="syntax17">&gt;</span>1.0<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">jspversion</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 5:</span> <span class="syntax17">&lt;</span><span class="syntax17">shortname</span><span class="syntax17">&gt;</span>Ejemplos de Custom Tags<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">shortname</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 6:</span><br /><span class="gutter"> 7:</span> <span class="syntax1">&lt;!--</span><span class="syntax1"> </span><span class="syntax1"> </span><span class="syntax1">definicion</span><span class="syntax1"> </span><span class="syntax1">del</span><span class="syntax1"> </span><span class="syntax1">TAG</span><span class="syntax1"> </span><span class="syntax1">holamundo</span><span class="syntax1"> </span><span class="syntax1">--&gt;</span><br /><span class="gutter"> 8:</span> <span class="syntax17">&lt;</span><span class="syntax17">tag</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 9:</span> <span class="syntax17">&lt;</span><span class="syntax17">name</span><span class="syntax17">&gt;</span>holamundo<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">name</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 10:</span> <span class="syntax17">&lt;</span><span class="syntax17">tagclass</span><span class="syntax17">&gt;</span>test.tags.HolaMundoTAG<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">tagclass</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 11:</span> <span class="syntax17">&lt;</span><span class="syntax17">bodycontent</span><span class="syntax17">&gt;</span>empty<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">bodycontent</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 12:</span> <span class="syntax17">&lt;</span><span class="syntax17">info</span><span class="syntax17">&gt;</span>Dice "Hola Mundo"<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">info</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 13:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">tag</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 14:</span><br /><span class="gutterH"> 15:</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">taglib</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 16:</span><br /></pre><br />En el TLD definimos la estructura del tag <span style="font-weight: bold;">holamundo</span>. En este caso, como es el caso más simple, los únicos parámetros que configuramos son el nombre del tag y la clase que lo procesa: test.tags.HolaMundoTAG. Este tag no recibe atributos.<br /><br />Veamos ahora la clase que procesa el tag.<br /><br /><span style="font-weight: bold;">HolaMundoTAG.java</span><br /><pre><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span> test.tags;<br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax9">import</span> java.io.*;<br /><span class="gutterH"> 5:</span><span class="syntax9">import</span> javax.servlet.jsp.*;<br /><span class="gutter"> 6:</span><span class="syntax9">import</span> javax.servlet.jsp.tagext.*;<br /><span class="gutter"> 7:</span><br /><span class="gutter"> 8:</span><span class="syntax8">public</span> <span class="syntax10">class</span> HolaMundoTAG <span class="syntax8">extends</span> TagSupport<br /><span class="gutter"> 9:</span><span class="syntax18">{</span><br /><span class="gutterH"> 10:</span> <span class="syntax8">public</span> <span class="syntax10">int</span> <span class="syntax6">doStartTag</span>() <span class="syntax8">throws</span> JspException<br /><span class="gutter"> 11:</span> <span class="syntax18">{</span><br /><span class="gutter"> 12:</span> <span class="syntax8">try</span><br /><span class="gutter"> 13:</span> <span class="syntax18">{</span><br /><span class="gutter"> 14:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">obtengo</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">stream</span><span class="syntax2"> </span><span class="syntax2">para</span><span class="syntax2"> </span><span class="syntax2">escribir</span><br /><span class="gutterH"> 15:</span> JspWriter out<span class="syntax18">=</span>pageContext.<span class="syntax6">getOut</span>();<br /><span class="gutter"> 16:</span><br /><span class="gutter"> 17:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">escribo</span><span class="syntax2"> </span><span class="syntax2">la</span><span class="syntax2"> </span><span class="syntax2">salida</span><span class="syntax2"> </span><span class="syntax2">del</span><span class="syntax2"> </span><span class="syntax2">tag</span><br /><span class="gutter"> 18:</span> out.<span class="syntax6">print</span>(<span class="syntax13">"</span><span class="syntax13">Hola</span><span class="syntax13"> </span><span class="syntax13">Mundo</span><span class="syntax13"> </span><span class="syntax13">!!!</span><span class="syntax13">"</span>);<br /><span class="gutter"> 19:</span><br /><span class="gutterH"> 20:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">este</span><span class="syntax2"> </span><span class="syntax2">tag</span><span class="syntax2"> </span><span class="syntax2">no</span><span class="syntax2"> </span><span class="syntax2">tiene</span><span class="syntax2"> </span><span class="syntax2">body...</span><br /><span class="gutter"> 21:</span> <span class="syntax8">return</span> SKIP_BODY;<br /><span class="gutter"> 22:</span> <span class="syntax18">}</span><br /><span class="gutter"> 23:</span> <span class="syntax8">catch</span>(IOException e)<br /><span class="gutter"> 24:</span> <span class="syntax18">{</span><br /><span class="gutterH"> 25:</span> e.<span class="syntax6">printStackTrace</span>();<br /><span class="gutter"> 26:</span> <span class="syntax8">throw</span> <span class="syntax8">new</span> <span class="syntax6">JspException</span>(e);<br /><span class="gutter"> 27:</span> <span class="syntax18">}</span><br /><span class="gutter"> 28:</span> <span class="syntax18">}</span><br /><span class="gutter"> 29:</span><br /><span class="gutterH"> 30:</span> <span class="syntax8">public</span> <span class="syntax10">int</span> <span class="syntax6">doEndTag</span>() <span class="syntax8">throws</span> JspException<br /><span class="gutter"> 31:</span> <span class="syntax18">{</span><br /><span class="gutter"> 32:</span> <span class="syntax8">return</span> EVAL_PAGE;<br /><span class="gutter"> 33:</span> <span class="syntax18">}</span><br /><span class="gutter"> 34:</span><span class="syntax18">}</span><br /><span class="gutterH"> 35:</span><br /></pre><br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Custom Tags con Atributos</span></span><br /><br />Ahora veremos como programar un tag <span style="font-weight: bold;">holamundopers</span> que recibe como parámetro (o atributo) un nombre y escribe en la página la cadena: "<span style="font-weight: bold;">Hola Mundo, </span><span style="font-style: italic; font-weight: bold;">nombre</span><span style="font-weight: bold;"></span>".<br /><br /><span style="font-weight: bold;">testTags.jsp</span> (invoca un tag con atributos)<br /><pre><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax8">&lt;%@</span><span class="syntax17"> </span><span class="syntax8">taglib</span><span class="syntax17"> </span><span class="syntax9">uri</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">/</span><span class="syntax13">WEB</span><span class="syntax13">-</span><span class="syntax13">INF</span><span class="syntax13">/demo</span><span class="syntax13"></span><span class="syntax13">.</span><span class="syntax13">tld</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax9">prefix</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">sz</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax8">%&gt;</span><br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax17">&lt;</span><span class="syntax17">html</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 5:</span><span class="syntax17">&lt;</span><span class="syntax17">body</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 6:</span><br /><span class="gutter"> 7:</span> <span class="syntax17">&lt;</span><span class="syntax17">sz</span><span class="syntax17">:</span><span class="syntax6">holamundopers</span><span class="syntax17"> </span><span class="syntax17">nombre</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">Pablo</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span> <span class="syntax17">&lt;</span><span class="syntax17">br</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 8:</span><br /><span class="gutter"> 9:</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">body</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 10:</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">html</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 11:</span><br /></pre><br />El siguiente paso será definir el tag <span style="font-weight: bold;">holamundopers</span> agregando la siguiente entrada en el archivo <span style="font-weight: bold;">demo.tld</span>.<br /><pre><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span> <span class="syntax17">&lt;</span><span class="syntax17">tag</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 3:</span> <span class="syntax17">&lt;</span><span class="syntax17">name</span><span class="syntax17">&gt;</span>holamundopers<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">name</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 4:</span> <span class="syntax17">&lt;</span><span class="syntax17">tagclass</span><span class="syntax17">&gt;</span>test.tags.HolaMundoPersTAG<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">tagclass</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 5:</span> <span class="syntax17">&lt;</span><span class="syntax17">bodycontent</span><span class="syntax17">&gt;</span>empty<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">bodycontent</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 6:</span> <span class="syntax17">&lt;</span><span class="syntax17">info</span><span class="syntax17">&gt;</span>Saludo con Nombre<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">info</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 7:</span> <span class="syntax17">&lt;</span><span class="syntax17">attribute</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 8:</span> <span class="syntax17">&lt;</span><span class="syntax17">name</span><span class="syntax17">&gt;</span>nombre<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">name</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 9:</span> <span class="syntax17">&lt;</span><span class="syntax17">required</span><span class="syntax17">&gt;</span>true<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">required</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 10:</span> <span class="syntax17">&lt;</span><span class="syntax17">rtexprvalue</span><span class="syntax17">&gt;</span>false<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">rtexprvalue</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 11:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">attribute</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 12:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">tag</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 13:</span><br /></pre><br />Ahora tenemos que programar la clase <span style="font-weight: bold;">HolaMundoPersTAG.java</span>. Es practicamente igual a la anterior solo que define un setter para cada atributo que el tag puede recibir.<br /><br /><span style="font-weight: bold;">HolaMundoPersTAG.java</span><br /><pre><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span> test.tags;<br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax9">import</span> java.io.*;<br /><span class="gutterH"> 5:</span><span class="syntax9">import</span> javax.servlet.jsp.*;<br /><span class="gutter"> 6:</span><span class="syntax9">import</span> javax.servlet.jsp.tagext.*;<br /><span class="gutter"> 7:</span><br /><span class="gutter"> 8:</span><span class="syntax8">public</span> <span class="syntax10">class</span> HolaMundoPersTAG <span class="syntax8">extends</span> TagSupport<br /><span class="gutter"> 9:</span><span class="syntax18">{</span><br /><span class="gutterH"> 10:</span> <span class="syntax2"> //</span><span class="syntax2"> </span><span class="syntax2">atributos</span><br /><span class="gutter"> 11:</span> <span class="syntax8">private</span> String nombre;<br /><span class="gutter"> 12:</span><br /><span class="gutter"> 13:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">setters</span><span class="syntax2"> </span><span class="syntax2">para</span><span class="syntax2"> </span><span class="syntax2">los</span><span class="syntax2"> </span><span class="syntax2">atributos</span><br /><span class="gutter"> 14:</span> <span class="syntax8">public</span> <span class="syntax10">void</span> <span class="syntax6">setNombre</span>(String n)<br /><span class="gutterH"> 15:</span> <span class="syntax18">{</span><br /><span class="gutter"> 16:</span> nombre<span class="syntax18">=</span>n;<br /><span class="gutter"> 17:</span> <span class="syntax18">}</span><br /><span class="gutter"> 18:</span><br /><span class="gutter"> 19:</span> <span class="syntax8">public</span> <span class="syntax10">int</span> <span class="syntax6">doStartTag</span>() <span class="syntax8">throws</span> JspException<br /><span class="gutterH"> 20:</span> <span class="syntax18">{</span><br /><span class="gutter"> 21:</span> <span class="syntax8">try</span><br /><span class="gutter"> 22:</span> <span class="syntax18">{</span><br /><span class="gutter"> 23:</span> JspWriter out<span class="syntax18">=</span>pageContext.<span class="syntax6">getOut</span>();<br /><span class="gutter"> 24:</span><br /><span class="gutterH"> 25:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">escribe</span><span class="syntax2"> </span><span class="syntax2">"Hola</span><span class="syntax2"> </span><span class="syntax2">Mundo"</span><span class="syntax2"> </span><span class="syntax2">seguido</span><span class="syntax2"> </span><span class="syntax2">del</span><span class="syntax2"> </span><span class="syntax2">valor</span><br /><span class="gutter"> 26:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">del</span><span class="syntax2"> </span><span class="syntax2">atributo</span><br /><span class="gutter"> 27:</span> out.<span class="syntax6">print</span>(<span class="syntax13">"</span><span class="syntax13">Hola</span><span class="syntax13"> </span><span class="syntax13">Mundo,</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">+</span>nombre);<br /><span class="gutter"> 28:</span> <span class="syntax8">return</span> SKIP_BODY;<br /><span class="gutter"> 29:</span> <span class="syntax18">}</span><br /><span class="gutterH"> 30:</span> <span class="syntax8">catch</span>(IOException e)<br /><span class="gutter"> 31:</span> <span class="syntax18">{</span><br /><span class="gutter"> 32:</span> e.<span class="syntax6">printStackTrace</span>();<br /><span class="gutter"> 33:</span> <span class="syntax8">throw</span> <span class="syntax8">new</span> <span class="syntax6">JspException</span>(e);<br /><span class="gutter"> 34:</span> <span class="syntax18">}</span><br /><span class="gutterH"> 35:</span> <span class="syntax18">}</span><br /><span class="gutter"> 36:</span><br /><span class="gutter"> 37:</span> <span class="syntax8">public</span> <span class="syntax10">int</span> <span class="syntax6">doEndTag</span>() <span class="syntax8">throws</span> JspException<br /><span class="gutter"> 38:</span> <span class="syntax18">{</span><br /><span class="gutter"> 39:</span> <span class="syntax8">return</span> EVAL_PAGE;<br /><span class="gutterH"> 40:</span> <span class="syntax18">}</span><br /><span class="gutter"> 41:</span><span class="syntax18">}</span><br /><span class="gutter"> 42:</span><br /></pre><br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Custom Tags con Cuerpo</span></span><br /><br />Analizaremos un tag <span style="font-weight: bold;">reversa</span> que encierra una cadena (en su cuerpo) y la imprime en orden inverso.<br /><br /><span style="font-weight: bold;">testTags.jsp</span> (invoca un custom tag con cuerpo)<br /><pre><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax8">&lt;%@</span><span class="syntax17"> </span><span class="syntax8">taglib</span><span class="syntax17"> </span><span class="syntax9">uri</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">/</span><span class="syntax13">WEB</span><span class="syntax13">-</span><span class="syntax13">INF</span><span class="syntax13">/</span><span class="syntax13">demo</span><span class="syntax13">.</span><span class="syntax13">tld</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax9">prefix</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">sz</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax8">%&gt;</span><br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax17">&lt;</span><span class="syntax17">html</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 5:</span><span class="syntax17">&lt;</span><span class="syntax17">body</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 6:</span><br /><span class="gutter"> 7:</span> <span class="syntax17">&lt;</span><span class="syntax17">sz</span><span class="syntax17">:</span><span class="syntax6">reversa</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 8:</span> Aprendiendo CUSTOM TAGs en HolaMundo.java :O)<br /><span class="gutter"> 9:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">sz</span><span class="syntax17">:</span><span class="syntax6">reversa</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 10:</span><br /><span class="gutter"> 11:</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">body</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 12:</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">html</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 13:</span><br /></pre><br />El tag <span style="font-weight: bold;">reversa</span> enciera una cadena la cual va a imprimir en orden inverso. Veamos ahora la definición de este tag que tenemos que agregar en <span style="font-weight: bold;">demo.tld</span>.<br /><pre><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span> <span class="syntax17">&lt;</span><span class="syntax17">tag</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 3:</span> <span class="syntax17">&lt;</span><span class="syntax17">name</span><span class="syntax17">&gt;</span>reversa<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">name</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 4:</span> <span class="syntax17">&lt;</span><span class="syntax17">tagclass</span><span class="syntax17">&gt;</span>test.tags.ReversaTAG<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">tagclass</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 5:</span> <span class="syntax17">&lt;</span><span class="syntax17">bodycontent</span><span class="syntax17">&gt;</span>JSP<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">bodycontent</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 6:</span> <span class="syntax17">&lt;</span><span class="syntax17">info</span><span class="syntax17">&gt;</span>imprime la inversa de la cadena<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">info</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 7:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">tag</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 8:</span><br /></pre><br />Y ahora veamos el código de la clase que lo implementa.<br /><br /><span style="font-weight: bold;">ReversaTAG.java</span><br /><pre><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span> test.tags;<br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax9">import</span> java.io.*;<br /><span class="gutterH"> 5:</span><span class="syntax9">import</span> javax.servlet.jsp.*;<br /><span class="gutter"> 6:</span><span class="syntax9">import</span> javax.servlet.jsp.tagext.*;<br /><span class="gutter"> 7:</span><br /><span class="gutter"> 8:</span><span class="syntax8">public</span> <span class="syntax10">class</span> ReversaTAG <span class="syntax8">extends</span> BodyTagSupport<br /><span class="gutter"> 9:</span><span class="syntax18">{</span><br /><span class="gutterH"> 10:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">este</span><span class="syntax2"> </span><span class="syntax2">metodo</span><span class="syntax2"> </span><span class="syntax2">procesa</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">body</span><br /><span class="gutter"> 11:</span> <span class="syntax8">public</span> <span class="syntax10">int</span> <span class="syntax6">doAfterBody</span>() <span class="syntax8">throws</span> JspException<br /><span class="gutter"> 12:</span> <span class="syntax18">{</span><br /><span class="gutter"> 13:</span> <span class="syntax8">try</span><br /><span class="gutter"> 14:</span> <span class="syntax18">{</span><br /><span class="gutterH"> 15:</span> BodyContent bc <span class="syntax18">=</span> <span class="syntax6">getBodyContent</span>();<br /><span class="gutter"> 16:</span><br /><span class="gutter"> 17:</span> String cuerpo <span class="syntax18">=</span> bc.<span class="syntax6">getString</span>();<br /><span class="gutter"> 18:</span> JspWriter out <span class="syntax18">=</span> bc.<span class="syntax6">getEnclosingWriter</span>();<br /><span class="gutter"> 19:</span> <span class="syntax8">if</span> ( cuerpo <span class="syntax18">!</span><span class="syntax18">=</span> <span class="syntax14">null</span> )<br /><span class="gutterH"> 20:</span> <span class="syntax18">{</span><br /><span class="gutter"> 21:</span> <span class="syntax8">for</span>(<span class="syntax10">int</span> i<span class="syntax18">=</span>cuerpo.<span class="syntax6">length</span>()<span class="syntax18">-</span><span class="syntax5">1</span>;i<span class="syntax18">&gt;=</span><span class="syntax5">0</span>;i<span class="syntax18">-</span><span class="syntax18">-</span>)<br /><span class="gutter"> 22:</span> <span class="syntax18">{</span><br /><span class="gutter"> 23:</span> out.<span class="syntax6">print</span>(cuerpo.<span class="syntax6">charAt</span>(i));<br /><span class="gutter"> 24:</span> <span class="syntax18">}</span><br /><span class="gutterH"> 25:</span> <span class="syntax18">}</span><br /><span class="gutter"> 26:</span> <span class="syntax18">}</span><br /><span class="gutter"> 27:</span> <span class="syntax8">catch</span>(IOException ex)<br /><span class="gutter"> 28:</span> <span class="syntax18">{</span><br /><span class="gutter"> 29:</span> ex.<span class="syntax6">printStackTrace</span>();<br /><span class="gutterH"> 30:</span> <span class="syntax8">throw</span> <span class="syntax8">new</span> <span class="syntax6">JspException</span>(ex);<br /><span class="gutter"> 31:</span> <span class="syntax18">}</span><br /><span class="gutter"> 32:</span> <span class="syntax8">return</span> SKIP_BODY;<br /><span class="gutter"> 33:</span> <span class="syntax18">}</span><br /><span class="gutter"> 34:</span><span class="syntax18">}</span><br /><span class="gutterH"> 35:</span><br /></pre><br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Custom Tags con Expresiones <%= %></span></span><br /><br />Por último veremos un tag que recibe un atributo a través de una expresión de JSP. El ejemplo que vamos a desarrollar consiste en un tag que recibe una <span style="font-weight: bold;">Collection</span> (de Java) y la muestra.<br /><br /><span style="font-weight: bold;">testTags.jsp</span> (define una Collection y se la pasa al custom tag)<br /><pre><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax8">&lt;%@</span><span class="syntax17"> </span><span class="syntax8">page</span><span class="syntax17"> </span><span class="syntax9">import</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">java</span><span class="syntax13">.</span><span class="syntax13">util</span><span class="syntax13">.</span><span class="syntax13">Collection</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax8">%&gt;</span><br /><span class="gutter"> 3:</span><span class="syntax8">&lt;%@</span><span class="syntax17"> </span><span class="syntax8">page</span><span class="syntax17"> </span><span class="syntax9">import</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">java</span><span class="syntax13">.</span><span class="syntax13">util</span><span class="syntax13">.</span><span class="syntax13">Vector</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax8">%&gt;</span><br /><span class="gutter"> 4:</span><br /><span class="gutterH"> 5:</span><span class="syntax8">&lt;%</span><br /><span class="gutter"> 6:</span> Collection coll<span class="syntax18">=</span><span class="syntax8">new</span> <span class="syntax6">Vector</span>();<br /><span class="gutter"> 7:</span> coll.<span class="syntax6">add</span>(<span class="syntax13">"</span><span class="syntax13">uno</span><span class="syntax13">"</span>);<br /><span class="gutter"> 8:</span> coll.<span class="syntax6">add</span>(<span class="syntax13">"</span><span class="syntax13">dos</span><span class="syntax13">"</span>);<br /><span class="gutter"> 9:</span> coll.<span class="syntax6">add</span>(<span class="syntax13">"</span><span class="syntax13">tres</span><span class="syntax13">"</span>);<br /><span class="gutterH"> 10:</span><span class="syntax8">%&gt;</span><br /><span class="gutter"> 11:</span><br /><span class="gutter"> 12:</span><br /><span class="gutter"> 13:</span><span class="syntax8">&lt;%@</span><span class="syntax17"> </span><span class="syntax8">taglib</span><span class="syntax17"> </span><span class="syntax9">uri</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">/</span><span class="syntax13">WEB</span><span class="syntax13">-</span><span class="syntax13">INF</span><span class="syntax13">/</span><span class="syntax13">demo</span><span class="syntax13">.</span><span class="syntax13">tld</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax9">prefix</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">sz</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax8">%&gt;</span><br /><span class="gutter"> 14:</span><br /><span class="gutterH"> 15:</span><span class="syntax17">&lt;</span><span class="syntax17">html</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 16:</span><span class="syntax17">&lt;</span><span class="syntax17">body</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 17:</span><br /><span class="gutter"> 18:</span> <span class="syntax17">&lt;</span><span class="syntax17">sz</span><span class="syntax17">:</span><span class="syntax6">mostrar</span><span class="syntax17"> </span><span class="syntax17">data</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax8">&lt;%=</span>coll<span class="syntax8">%&gt;</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 19:</span><br /><span class="gutterH"> 20:</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">body</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 21:</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">html</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 22:</span><br /></pre><br />Para definir este tag debemos agregar la siguiente entrada en <span style="font-weight: bold;">demo.tld</span>.<br /><pre><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span> <span class="syntax17">&lt;</span><span class="syntax17">tag</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 3:</span> <span class="syntax17">&lt;</span><span class="syntax17">name</span><span class="syntax17">&gt;</span>mostrar<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">name</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 4:</span> <span class="syntax17">&lt;</span><span class="syntax17">tagclass</span><span class="syntax17">&gt;</span>test.tags.MostrarTAG<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">tagclass</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 5:</span> <span class="syntax17">&lt;</span><span class="syntax17">bodycontent</span><span class="syntax17">&gt;</span>empty<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">bodycontent</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 6:</span> <span class="syntax17">&lt;</span><span class="syntax17">info</span><span class="syntax17">&gt;</span>Muestra una Collection<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">info</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 7:</span> <span class="syntax17">&lt;</span><span class="syntax17">attribute</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 8:</span> <span class="syntax17">&lt;</span><span class="syntax17">name</span><span class="syntax17">&gt;</span>data<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">name</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 9:</span> <span class="syntax17">&lt;</span><span class="syntax17">required</span><span class="syntax17">&gt;</span>true<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">required</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 10:</span> <span class="syntax17">&lt;</span><span class="syntax17">rtexprvalue</span><span class="syntax17">&gt;</span>true<span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">rtexprvalue</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 11:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">attribute</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 12:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">tag</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 13:</span><br /></pre><br />Para que el tag soporte expresiones JSP definimos <span style="font-weight: bold;">true</span> el parámetro <span style="font-weight: bold;">rtexprvalue</span>.<br /><br /><span style="font-weight: bold;">MostrarTAG.java</span><br /><pre><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span> test.tags;<br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax9">import</span> java.io.*;<br /><span class="gutterH"> 5:</span><span class="syntax9">import</span> java.util.*;<br /><span class="gutter"> 6:</span><span class="syntax9">import</span> javax.servlet.jsp.*;<br /><span class="gutter"> 7:</span><span class="syntax9">import</span> javax.servlet.jsp.tagext.*;<br /><span class="gutter"> 8:</span><br /><span class="gutter"> 9:</span><span class="syntax8">public</span> <span class="syntax10">class</span> MostrarTAG <span class="syntax8">extends</span> TagSupport<br /><span class="gutterH"> 10:</span><span class="syntax18">{</span><br /><span class="gutter"> 11:</span> <span class="syntax8">private</span> Collection data;<br /><span class="gutter"> 12:</span> <br /><span class="gutter"> 13:</span> <span class="syntax8">public</span> <span class="syntax10">void</span> <span class="syntax6">setData</span>(Collection c)<br /><span class="gutter"> 14:</span> <span class="syntax18">{</span><br /><span class="gutterH"> 15:</span> data<span class="syntax18">=</span>c;<br /><span class="gutter"> 16:</span> <span class="syntax18">}</span><br /><span class="gutter"> 17:</span> <br /><span class="gutter"> 18:</span> <span class="syntax8">public</span> <span class="syntax10">int</span> <span class="syntax6">doStartTag</span>() <span class="syntax8">throws</span> JspException<br /><span class="gutter"> 19:</span> <span class="syntax18">{</span><br /><span class="gutterH"> 20:</span> <span class="syntax8">try</span><br /><span class="gutter"> 21:</span> <span class="syntax18">{</span><br /><span class="gutter"> 22:</span> JspWriter out<span class="syntax18">=</span>pageContext.<span class="syntax6">getOut</span>();<br /><span class="gutter"> 23:</span> Iterator it;<br /><span class="gutter"> 24:</span> <span class="syntax8">for</span>( it<span class="syntax18">=</span>data.<span class="syntax6">iterator</span>(); it.<span class="syntax6">hasNext</span>(); )<br /><span class="gutterH"> 25:</span> <span class="syntax18">{</span><br /><span class="gutter"> 26:</span> out.<span class="syntax6">print</span>(<span class="syntax13">"</span><span class="syntax13">&lt;li&gt;</span><span class="syntax13">"</span><br /><span class="gutter"> 27:</span> <span class="syntax18">+</span>it.<span class="syntax6">next</span>().<span class="syntax6">toString</span>()<br /><span class="gutter"> 28:</span> <span class="syntax18">+</span><span class="syntax13">"</span><span class="syntax13">&lt;/li&gt;</span><span class="syntax13">"</span>);<br /><span class="gutter"> 29:</span> <span class="syntax18">}</span><br /><span class="gutterH"> 30:</span> <span class="syntax8">return</span> SKIP_BODY;<br /><span class="gutter"> 31:</span> <span class="syntax18">}</span><br /><span class="gutter"> 32:</span> <span class="syntax8">catch</span>(IOException e)<br /><span class="gutter"> 33:</span> <span class="syntax18">{</span><br /><span class="gutter"> 34:</span> e.<span class="syntax6">printStackTrace</span>();<br /><span class="gutterH"> 35:</span> <span class="syntax8">throw</span> <span class="syntax8">new</span> <span class="syntax6">JspException</span>(e);<br /><span class="gutter"> 36:</span> <span class="syntax18">}</span><br /><span class="gutter"> 37:</span> <span class="syntax18">}</span><br /><span class="gutter"> 38:</span><br /><span class="gutter"> 39:</span> <span class="syntax8">public</span> <span class="syntax10">int</span> <span class="syntax6">doEndTag</span>() <span class="syntax8">throws</span> JspException<br /><span class="gutterH"> 40:</span> <span class="syntax18">{</span><br /><span class="gutter"> 41:</span> <span class="syntax8">return</span> EVAL_PAGE;<br /><span class="gutter"> 42:</span> <span class="syntax18">}</span><br /><span class="gutter"> 43:</span><span class="syntax18">}</span><br /><span class="gutter"> 44:</span><br /></pre><br />Vemos que simplemente recibimos un atributo de tipo Collection y luego iteramos para mostrar sus elementos.<br /><br /><br /><br /><br /><br /><br /><br /><span style="color: rgb(255, 255, 255);">.</span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34013116-8237628590285778170?l=holamundojava.blogspot.com'/></div>PabloSZnoreply@blogger.com3tag:blogger.com,1999:blog-34013116.post-14261902681534220422007-09-10T07:48:00.002-03:002008-09-10T10:46:59.706-03:00JAFramework<span style="color: rgb(255, 255, 255);">.</span><br /><span style="font-size:130%;"><span style="font-weight: bold;">Entrada de Datos por Consola</span></span><br /><br />En Java no es tan simple leer datos por teclado (consola) como en Pascal o C. Por este motivo JAF provee una clase que soluciona el problema de manera muy simple.<br /><br />Veamos algunos ejemplos.<br /><br /><span style="font-weight: bold;">Demo1.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span> democonsole;<br /><span class="gutter"> 3:</span><span class="syntax9">import</span> framework.util.JAConsole;<br /><span class="gutter"> 4:</span><br /><span class="gutterH"> 5:</span><span class="syntax8">public</span> <span class="syntax10">class</span> Demo1<br /><span class="gutter"> 6:</span><span class="syntax18">{</span><br /><span class="gutter"> 7:</span> <span class="syntax8">public</span> <span class="syntax8">static</span> <span class="syntax10">void</span> <span class="syntax6">main</span><span class="syntax18">(</span>String[] args<span class="syntax18">)</span><br /><span class="gutter"> 8:</span> <span class="syntax18">{</span><br /><span class="gutter"> 9:</span> System.out.<span class="syntax6">print</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Ingrese</span><span class="syntax13"> </span><span class="syntax13">un</span><span class="syntax13"> </span><span class="syntax13">valor</span><span class="syntax13"> </span><span class="syntax13">entero:</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 10:</span> <span class="syntax10">int</span> i<span class="syntax18">=</span>JAConsole.<span class="syntax6">readInt</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 11:</span> System.out.<span class="syntax6">println</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Ud.</span><span class="syntax13"> </span><span class="syntax13">ingreso:</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">+</span>i<span class="syntax18">)</span>;<br /><span class="gutter"> 12:</span><br /><span class="gutter"> 13:</span> System.out.<span class="syntax6">print</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Ingrese</span><span class="syntax13"> </span><span class="syntax13">un</span><span class="syntax13"> </span><span class="syntax13">valor</span><span class="syntax13"> </span><span class="syntax13">real:</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 14:</span> <span class="syntax10">float</span> f<span class="syntax18">=</span>JAConsole.<span class="syntax6">readFloat</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 15:</span> System.out.<span class="syntax6">println</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Ud.</span><span class="syntax13"> </span><span class="syntax13">ingreso:</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">+</span>f<span class="syntax18">)</span>;<br /><span class="gutter"> 16:</span> <br /><span class="gutter"> 17:</span> System.out.<span class="syntax6">print</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Ingrese</span><span class="syntax13"> </span><span class="syntax13">un</span><span class="syntax13"> </span><span class="syntax13">String:</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">)</span>; <br /><span class="gutter"> 18:</span> String s<span class="syntax18">=</span>JAConsole.<span class="syntax6">readString</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 19:</span> System.out.<span class="syntax6">println</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Ud.</span><span class="syntax13"> </span><span class="syntax13">ingreso:</span><span class="syntax13"> </span><span class="syntax13">[</span><span class="syntax13">"</span><span class="syntax18">+</span>s<span class="syntax18">+</span><span class="syntax13">"</span><span class="syntax13">]</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 20:</span> <span class="syntax18">}</span><br /><span class="gutter"> 21:</span><span class="syntax18">}</span><br /><span class="gutter"> 22:</span><br /></span></pre><br />En este ejemplo se pide al usuario que ingrese un valor entero. Cuando el usuario ingresa el valor entonces se muestra el valor ingresado y luego se pide que ingrese un valor real. Luego de que lo ingresa se muestra el valor ingresado y, por último, se le pide que ingrese un String y tambén se muestra el valor ingresado.<br /><br />El resultado es:<br /><br /><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_X1IHMrfIpE8/SMemqTEPjpI/AAAAAAAACnQ/grsux9FvzAY/s1600-h/Demo1Console.jpg"><img style="cursor: pointer;" src="http://2.bp.blogspot.com/_X1IHMrfIpE8/SMemqTEPjpI/AAAAAAAACnQ/grsux9FvzAY/s400/Demo1Console.jpg" alt="" id="BLOGGER_PHOTO_ID_5244343536699018898" border="0" /></a><br /></div><br />El siguiente programa es similar al anterior. La diferencia es que se le pide al usuario que ingrese los tres valores a la vez, separados por un espacio en blanco.<br /><br /><span style="font-weight: bold;">Demo2.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span> democonsole;<br /><span class="gutter"> 3:</span><span class="syntax9">import</span> framework.util.JAConsole;<br /><span class="gutter"> 4:</span><br /><span class="gutterH"> 5:</span><span class="syntax8">public</span> <span class="syntax10">class</span> Demo2<br /><span class="gutter"> 6:</span><span class="syntax18">{</span><br /><span class="gutter"> 7:</span> <span class="syntax8">public</span> <span class="syntax8">static</span> <span class="syntax10">void</span> <span class="syntax6">main</span><span class="syntax18">(</span>String[] args<span class="syntax18">)</span><br /><span class="gutter"> 8:</span> <span class="syntax18">{</span><br /><span class="gutter"> 9:</span> System.out.<span class="syntax6">print</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Ingrese</span><span class="syntax13"> </span><span class="syntax13">entero,</span><span class="syntax13"> </span><span class="syntax13">un</span><span class="syntax13"> </span><span class="syntax13">real</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 10:</span> System.out.<span class="syntax6">print</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">y</span><span class="syntax13"> </span><span class="syntax13">un</span><span class="syntax13"> </span><span class="syntax13">String:</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 11:</span> <br /><span class="gutter"> 12:</span> <span class="syntax10">int</span> i<span class="syntax18">=</span>JAConsole.<span class="syntax6">readInt</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 13:</span> <span class="syntax10">float</span> f<span class="syntax18">=</span>JAConsole.<span class="syntax6">readFloat</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 14:</span> String s<span class="syntax18">=</span>JAConsole.<span class="syntax6">readString</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 15:</span><br /><span class="gutter"> 16:</span> System.out.<span class="syntax6">println</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Ud.</span><span class="syntax13"> </span><span class="syntax13">ingreso:</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">+</span>i<span class="syntax18">)</span>;<br /><span class="gutter"> 17:</span> System.out.<span class="syntax6">println</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Ud.</span><span class="syntax13"> </span><span class="syntax13">ingreso:</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">+</span>f<span class="syntax18">)</span>;<br /><span class="gutter"> 18:</span> System.out.<span class="syntax6">println</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Ud.</span><span class="syntax13"> </span><span class="syntax13">ingreso:</span><span class="syntax13"> </span><span class="syntax13">[</span><span class="syntax13">"</span><span class="syntax18">+</span>s<span class="syntax18">+</span><span class="syntax13">"</span><span class="syntax13">]</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 19:</span> <span class="syntax18">}</span><br /><span class="gutterH"> 20:</span><span class="syntax18">}</span><br /><span class="gutter"> 21:</span><br /></span></pre><br />El resultado es:<br /><br /><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_X1IHMrfIpE8/SMemqabxeoI/AAAAAAAACnY/x4H1-A70Yq0/s1600-h/Demo2Console.jpg"><img style="cursor: pointer;" src="http://4.bp.blogspot.com/_X1IHMrfIpE8/SMemqabxeoI/AAAAAAAACnY/x4H1-A70Yq0/s400/Demo2Console.jpg" alt="" id="BLOGGER_PHOTO_ID_5244343538676759170" border="0" /></a><br /></div><br />Los String deben ir entre comillas dobles si contien más de una palabra. Si el String contiene una única palabra entonces no es necesario el uso de las comillas.<br /><br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://holamundojava.blogspot.com/2008/09/jaframework_09.html"><img style="cursor: pointer;" src="http://4.bp.blogspot.com/_X1IHMrfIpE8/SMfPrfSNahI/AAAAAAAACoQ/g06PYlp06xE/s400/volver.gif" alt="" id="BLOGGER_PHOTO_ID_5244388637135432210" border="0" /></a><br /><br /><br /><br /><br /><br /><span style="color: rgb(255, 255, 255);">.<br /><br /><br /><br /><br />.<br /></span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34013116-1426190268153422042?l=holamundojava.blogspot.com'/></div>PabloSZnoreply@blogger.com0tag:blogger.com,1999:blog-34013116.post-83999251386769880722007-09-09T10:25:00.011-03:002008-12-01T09:09:56.952-02:00JAFramework<span style="color: rgb(255, 255, 255);">.</span><br /><span style="font-size:130%;"><span style="font-weight: bold;">Escribir Registros en un Archivo</span></span><br /><br />El siguiente programa graba un nuevo registro al final del archivo EMPLEADOS.txt.<br /><br /><span style="font-weight: bold;">GrabaAlFinal.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span> demo;<br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax9">import</span> framework.JAFactory;<br /><span class="gutterH"> 5:</span><span class="syntax9">import</span> framework.JAFile;<br /><span class="gutter"> 6:</span><span class="syntax9">import</span> framework.JAFileFactory;<br /><span class="gutter"> 7:</span><span class="syntax9">import</span> framework.util.JAConsole;<br /><span class="gutter"> 8:</span><br /><span class="gutter"> 9:</span><span class="syntax8">public</span> <span class="syntax10">class</span> GrabaAlFinal<br /><span class="gutterH"> 10:</span><span class="syntax18">{</span><br /><span class="gutter"> 11:</span> <span class="syntax8">public</span> <span class="syntax8">static</span> <span class="syntax10">void</span> <span class="syntax6">main</span><span class="syntax18">(</span>String[] args<span class="syntax18">)</span><br /><span class="gutter"> 12:</span> <span class="syntax18">{</span><br /><span class="gutter"> 13:</span> JAFileFactory factory<span class="syntax18">=</span>JAFactory.<span class="syntax6">getFileFactory</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 14:</span><br /><span class="gutterH"> 15:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">levanto</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">descriptor</span><span class="syntax2"> </span><span class="syntax2">a</span><span class="syntax2"> </span><span class="syntax2">memoria</span><br /><span class="gutter"> 16:</span> factory.<span class="syntax6">load</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">descriptor.xml</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 17:</span><br /><span class="gutter"> 18:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">obtengo</span><span class="syntax2"> </span><span class="syntax2">un</span><span class="syntax2"> </span><span class="syntax2">puntero</span><span class="syntax2"> </span><span class="syntax2">al</span><span class="syntax2"> </span><span class="syntax2">archivo</span><span class="syntax2"> </span><span class="syntax2">EMPLEADOS.txt</span><br /><span class="gutter"> 19:</span> JAFile a <span class="syntax18">=</span> factory.<span class="syntax6">getFile</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">EMPLEADOS.txt</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 20:</span><br /><span class="gutter"> 21:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">ingreso</span><span class="syntax2"> </span><span class="syntax2">x</span><span class="syntax2"> </span><span class="syntax2">consola</span><span class="syntax2"> </span><span class="syntax2">los</span><span class="syntax2"> </span><span class="syntax2">datos</span><span class="syntax2"> </span><span class="syntax2">del</span><span class="syntax2"> </span><span class="syntax2">empleado</span><br /><span class="gutter"> 22:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">para</span><span class="syntax2"> </span><span class="syntax2">grabarlos</span><span class="syntax2"> </span><span class="syntax2">al</span><span class="syntax2"> </span><span class="syntax2">final</span><span class="syntax2"> </span><span class="syntax2">del</span><span class="syntax2"> </span><span class="syntax2">archivo</span><br /><span class="gutter"> 23:</span><br /><span class="gutter"> 24:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">nombre</span><br /><span class="gutterH"> 25:</span> System.out.<span class="syntax6">print</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Nombre:</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 26:</span> String nom <span class="syntax18">=</span> JAConsole.<span class="syntax6">readString</span><span class="syntax18">(</span><span class="syntax5">10</span><span class="syntax18">)</span>;<br /><span class="gutter"> 27:</span><br /><span class="gutter"> 28:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">legajo</span><br /><span class="gutter"> 29:</span> System.out.<span class="syntax6">print</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Legajo:</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 30:</span> <span class="syntax10">int</span> leg <span class="syntax18">=</span> JAConsole.<span class="syntax6">readInt</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 31:</span><br /><span class="gutter"> 32:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">sueldo</span><br /><span class="gutter"> 33:</span> System.out.<span class="syntax6">print</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Sueldo:</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 34:</span> <span class="syntax10">float</span> sueldo <span class="syntax18">=</span> JAConsole.<span class="syntax6">readFloat</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutterH"> 35:</span><br /><span class="gutter"> 36:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">direccion</span><br /><span class="gutter"> 37:</span> System.out.<span class="syntax6">print</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Direccion:</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 38:</span> String dir <span class="syntax18">=</span> JAConsole.<span class="syntax6">readString</span><span class="syntax18">(</span><span class="syntax5">15</span><span class="syntax18">)</span>;<br /><span class="gutter"> 39:</span><br /><span class="gutterH"> 40:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">sector</span><br /><span class="gutter"> 41:</span> System.out.<span class="syntax6">print</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">Sector:</span><span class="syntax13"> </span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 42:</span> <span class="syntax10">int</span> sec <span class="syntax18">=</span> JAConsole.<span class="syntax6">readInt</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 43:</span><br /><span class="gutter"> 44:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">creo</span><span class="syntax2"> </span><span class="syntax2">un</span><span class="syntax2"> </span><span class="syntax2">registro</span><span class="syntax2"> </span><span class="syntax2">y</span><span class="syntax2"> </span><span class="syntax2">le</span><span class="syntax2"> </span><span class="syntax2">seteo</span><span class="syntax2"> </span><span class="syntax2">los</span><span class="syntax2"> </span><span class="syntax2">datos</span><br /><span class="gutterH"> 45:</span> REmpleado reg <span class="syntax18">=</span> <span class="syntax8">new</span> <span class="syntax6">REmpleado</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 46:</span> reg.<span class="syntax6">setNombre</span><span class="syntax18">(</span>nom<span class="syntax18">)</span>;<br /><span class="gutter"> 47:</span> reg.<span class="syntax6">setLegajo</span><span class="syntax18">(</span>leg<span class="syntax18">)</span>;<br /><span class="gutter"> 48:</span> reg.<span class="syntax6">setSueldo</span><span class="syntax18">(</span>sueldo<span class="syntax18">)</span>;<br /><span class="gutter"> 49:</span> reg.<span class="syntax6">setDireccion</span><span class="syntax18">(</span>dir<span class="syntax18">)</span>;<br /><span class="gutterH"> 50:</span> reg.<span class="syntax6">setSector</span><span class="syntax18">(</span>sec<span class="syntax18">)</span>;<br /><span class="gutter"> 51:</span><br /><span class="gutter"> 52:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">agrego</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">registro</span><span class="syntax2"> </span><span class="syntax2">al</span><span class="syntax2"> </span><span class="syntax2">final</span><span class="syntax2"> </span><span class="syntax2">del</span><span class="syntax2"> </span><span class="syntax2">archivo</span><br /><span class="gutter"> 53:</span> a.<span class="syntax6">writeAtEnd</span><span class="syntax18">(</span>reg<span class="syntax18">)</span>;<br /><span class="gutter"> 54:</span><br /><span class="gutterH"> 55:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">cierro</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">archivo</span><br /><span class="gutter"> 56:</span> a.<span class="syntax6">close</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 57:</span> <span class="syntax18">}</span><br /><span class="gutter"> 58:</span><span class="syntax18">}</span><br /><span class="gutter"> 59:</span><br /></span></pre><br />El método <span style="font-weight: bold;">writeAtEnd</span> graba el registro <span style="font-weight: bold;">reg</span> al final del archivo <span style="font-weight: bold;">a</span>. El uso de este método es equivalente al código que vemos a continuación.<br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">muevo</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">puntero</span><span class="syntax2"> </span><span class="syntax2">al</span><span class="syntax2"> </span><span class="syntax2">final</span><span class="syntax2"> </span><span class="syntax2">del</span><span class="syntax2"> </span><span class="syntax2">archivo</span><br /><span class="gutter"> 3:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">(recordemos</span><span class="syntax2"> </span><span class="syntax2">que</span><span class="syntax2"> </span><span class="syntax2">se</span><span class="syntax2"> </span><span class="syntax2">numeran</span><span class="syntax2"> </span><span class="syntax2">desde</span><span class="syntax2"> </span><span class="syntax2">cero)</span><br /><span class="gutter"> 4:</span> a.<span class="syntax6">seek</span><span class="syntax18">(</span>a.<span class="syntax6">filesize</span><span class="syntax18">(</span><span class="syntax18">)</span><span class="syntax18">)</span><br /><span class="gutterH"> 5:</span><br /><span class="gutter"> 6:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">grabo</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">registro</span><br /><span class="gutter"> 7:</span> a.<span class="syntax6">write</span><span class="syntax18">(</span>reg<span class="syntax18">)</span>;<br /><span class="gutter"> 8:</span><br /></span></pre><br /><br /><span style="font-weight: bold;">Modificar los datos de Registros Existentes</span><br /><br />El siguiente programa incrementa un 20% el sueldo de cada uno de los empleados del archivo EMPLEADOS.txt.<br /><br /><span style="font-weight: bold;">ModificaRegistros.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span> demo;<br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax9">import</span> framework.JAFactory;<br /><span class="gutterH"> 5:</span><span class="syntax9">import</span> framework.JAFile;<br /><span class="gutter"> 6:</span><span class="syntax9">import</span> framework.JAFileFactory;<br /><span class="gutter"> 7:</span><br /><span class="gutter"> 8:</span><span class="syntax8">public</span> <span class="syntax10">class</span> ModificaRegistros<br /><span class="gutter"> 9:</span><span class="syntax18">{</span><br /><span class="gutterH"> 10:</span> <span class="syntax8">public</span> <span class="syntax8">static</span> <span class="syntax10">void</span> <span class="syntax6">main</span><span class="syntax18">(</span>String[] args<span class="syntax18">)</span><br /><span class="gutter"> 11:</span> <span class="syntax18">{</span><br /><span class="gutter"> 12:</span> JAFileFactory factory<span class="syntax18">=</span>JAFactory.<span class="syntax6">getFileFactory</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 13:</span><br /><span class="gutter"> 14:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">levanto</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">descriptor</span><span class="syntax2"> </span><span class="syntax2">a</span><span class="syntax2"> </span><span class="syntax2">memoria</span><br /><span class="gutterH"> 15:</span> factory.<span class="syntax6">load</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">descriptor.xml</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 16:</span><br /><span class="gutter"> 17:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">obtengo</span><span class="syntax2"> </span><span class="syntax2">un</span><span class="syntax2"> </span><span class="syntax2">puntero</span><span class="syntax2"> </span><span class="syntax2">al</span><span class="syntax2"> </span><span class="syntax2">archivo</span><span class="syntax2"> </span><span class="syntax2">EMPLEADOS.txt</span><br /><span class="gutter"> 18:</span> JAFile a <span class="syntax18">=</span> factory.<span class="syntax6">getFile</span><span class="syntax18">(</span><span class="syntax13">"</span><span class="syntax13">EMPLEADOS.txt</span><span class="syntax13">"</span><span class="syntax18">)</span>;<br /><span class="gutter"> 19:</span><br /><span class="gutterH"> 20:</span> <span class="syntax10">double</span> nuevoSueldo;<br /><span class="gutter"> 21:</span> REmpleado reg <span class="syntax18">=</span> <span class="syntax8">new</span> <span class="syntax6">REmpleado</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 22:</span><br /><span class="gutter"> 23:</span> <span class="syntax10">boolean</span> eof <span class="syntax18">=</span> a.<span class="syntax6">read</span><span class="syntax18">(</span>reg<span class="syntax18">)</span>;<br /><span class="gutter"> 24:</span><br /><span class="gutterH"> 25:</span> <span class="syntax8">while</span><span class="syntax18">(</span> <span class="syntax18">!</span>eof <span class="syntax18">)</span><br /><span class="gutter"> 26:</span> <span class="syntax18">{</span><br /><span class="gutter"> 27:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">nuevo</span><span class="syntax2"> </span><span class="syntax2">sueldo</span><span class="syntax2"> </span><span class="syntax2">sera</span><span class="syntax2"> </span><span class="syntax2">un</span><span class="syntax2"> </span><span class="syntax2">20%</span><span class="syntax2"> </span><span class="syntax2">mas</span><br /><span class="gutter"> 28:</span> nuevoSueldo <span class="syntax18">=</span> reg.<span class="syntax6">getSueldo</span><span class="syntax18">(</span><span class="syntax18">)</span> <span class="syntax18">*</span> <span class="syntax5">1</span>.<span class="syntax5">20</span>;<br /><span class="gutter"> 29:</span> reg.<span class="syntax6">setSueldo</span><span class="syntax18">(</span>nuevoSueldo<span class="syntax18">)</span>;<br /><span class="gutterH"> 30:</span><br /><span class="gutter"> 31:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">retrocedo</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">puntero</span><br /><span class="gutter"> 32:</span> a.<span class="syntax6">seek</span><span class="syntax18">(</span>a.<span class="syntax6">recno</span><span class="syntax18">(</span><span class="syntax18">)</span> <span class="syntax18">-</span> <span class="syntax5">1</span><span class="syntax18">)</span>;<br /><span class="gutter"> 33:</span><br /><span class="gutter"> 34:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">grabo</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">registro</span><span class="syntax2"> </span><span class="syntax2">con</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">valor</span><br /><span class="gutterH"> 35:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">del</span><span class="syntax2"> </span><span class="syntax2">sueldo</span><span class="syntax2"> </span><span class="syntax2">incrementado</span><br /><span class="gutter"> 36:</span> a.<span class="syntax6">write</span><span class="syntax18">(</span>reg<span class="syntax18">)</span>;<br /><span class="gutter"> 37:</span><br /><span class="gutter"> 38:</span> eof <span class="syntax18">=</span> a.<span class="syntax6">read</span><span class="syntax18">(</span>reg<span class="syntax18">)</span>;<br /><span class="gutter"> 39:</span> <span class="syntax18">}</span><br /><span class="gutterH"> 40:</span><br /><span class="gutter"> 41:</span> <span class="syntax2">//</span><span class="syntax2"> </span><span class="syntax2">cierro</span><span class="syntax2"> </span><span class="syntax2">el</span><span class="syntax2"> </span><span class="syntax2">archivo</span><br /><span class="gutter"> 42:</span> a.<span class="syntax6">close</span><span class="syntax18">(</span><span class="syntax18">)</span>;<br /><span class="gutter"> 43:</span> <span class="syntax18">}</span><br /><span class="gutter"> 44:</span><span class="syntax18">}</span><br /><span class="gutterH"> 45:</span><br /></span></pre><br />En la línea 23 (y luego en la 38 leemos el registro y en la línea 28 incrementamos el valor del atributo <span style="font-weight: bold;">sueldo</span>.<br /><br />Cuando leemos un registro el putero del archivo avanza al registro siguiente por lo tanto, para grabar las modificaciones tenemos que hacer que el puntero vuelva a apuntar al mismo registro. Esto lo hacemos con el método <span style="font-weight: bold;">seek </span>pasándole el valor del método <span style="font-weight: bold;">recno-1</span> como vemos en la línea 32 (es decir, el número de registro actual menos 1).<br /><br /><br /><span style="font-weight: bold;">Grabar Nuevos Archivos</span><br /><br />El programa que veremos a continuación recorre el archivo EMPLEADOS.txt y genera dos archivos llamados SALIDA1.txt y SALIDA2.txt, ambos con el formato de registro que se detalla en el descriptor (modificado).<br /><br /><span style="font-weight: bold;">descriptor.xml</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax17">&lt;</span><span class="syntax17">jaframework</span><span class="syntax17"> </span><span class="syntax12">xmlns</span><span class="syntax18">:</span><span class="syntax17">xsi</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">http://www.w3.org/2001/XMLSchema-instance</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax12">xsi</span><span class="syntax18">:</span><span class="syntax17">noNamespaceSchemaLocation</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">jaframework.xsd</span><span class="syntax13">"</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span> <span class="syntax17">&lt;</span><span class="syntax17">driver</span><span class="syntax17"> </span><span class="syntax17">class</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">driver.textfile.DOSTextFileDriver</span><span class="syntax13">"</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 5:</span><br /><span class="gutter"> 6:</span> <span class="syntax17">&lt;</span><span class="syntax17">record</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">REmpleado</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">class</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">demo.REmpleado</span><span class="syntax13">"</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 7:</span> <span class="syntax17">&lt;</span><span class="syntax17">field</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">nombre</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">att</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">nombre</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">class</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">STRING</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">size</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">10</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">type</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">String</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 8:</span> <span class="syntax17">&lt;</span><span class="syntax17">field</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">legajo</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">att</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">legajo</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">class</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">INTEGER</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">type</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">int</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 9:</span> <span class="syntax17">&lt;</span><span class="syntax17">field</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">sueldo</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">att</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">sueldo</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">class</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">REAL</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">type</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">double</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 10:</span> <span class="syntax17">&lt;</span><span class="syntax17">field</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">direccion</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">att</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">direccion</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">class</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">STRING</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">size</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">15</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">type</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">String</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 11:</span> <span class="syntax17">&lt;</span><span class="syntax17">field</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">sector</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">att</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">sector</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">class</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">INTEGER</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">type</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">int</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 12:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">record</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 13:</span><br /><span class="gutter"> 14:</span> <span class="syntax17">&lt;</span><span class="syntax17">record</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">RSalida</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">class</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">demo.RSalida</span><span class="syntax13">"</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 15:</span> <span class="syntax17">&lt;</span><span class="syntax17">field</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">nombre</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">att</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">nombre</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">class</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">STRING</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">size</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">10</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">type</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">String</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 16:</span> <span class="syntax17">&lt;</span><span class="syntax17">field</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">sueldo</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">att</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">sueldo</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">class</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">REAL</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">type</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">double</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 17:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">record</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 18:</span><br /><span class="gutter"> 19:</span> <span class="syntax17">&lt;</span><span class="syntax17">file</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">EMPLEADOS.txt</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">record</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">REmpleado</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 20:</span> <span class="syntax17">&lt;</span><span class="syntax17">file</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">SALIDA1.txt</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">record</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">RSalida</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 21:</span> <span class="syntax17">&lt;</span><span class="syntax17">file</span><span class="syntax17"> </span><span class="syntax17">name</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">SALIDA2.txt</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">record</span><span class="syntax17">=</span><span class="syntax13">"</span><span class="syntax13">RSalida</span><span class="syntax13">"</span><span class="syntax17"> </span><span class="syntax17">/</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 22:</span> <br /><span class="gutter"> 23:</span> <span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">driver</span><span class="syntax17">&gt;</span><br /><span class="gutter"> 24:</span><span class="syntax17">&lt;</span><span class="syntax17">/</span><span class="syntax17">jaframework</span><span class="syntax17">&gt;</span><br /><span class="gutterH"> 25:</span><br /></span></pre><br />En la línea 14 definimos el registro <span style="font-weight: bold;">RSalida</span> para los archivos de salida. Ambos archivos tendrán el mismo formato de registro. En las líneas 20 y 21 definimos los archivos SALIDA1.txt y SALIDA2.txt como archivos de registros <span style="font-weight: bold;">RSalida</span>.<br /><br />Ahora tenemos que crear el bean (clase, POJO o registro) para mapear los registros de los archivos de salida. Debe tener un atributo por cada campo del registro del archivo.<br /><br /><span style="font-weight: bold;">RSalida.java</span><br /><pre><span class="syntax0"><span class="gutter"> 1:</span><br /><span class="gutter"> 2:</span><span class="syntax9">package</span> demo;<br /><span class="gutter"> 3:</span><br /><span class="gutter"> 4:</span><span class="syntax9">import</span> framework.JARecord;<br /><span class="gutterH"> 5:</span><br /><span class="gutter"> 6:</span><span class="syntax8">public</span> <span class="syntax10">class</span> RSalida <span class="syntax8">extends</span> JARecord<br /><span class="gutter"> 7:</span><span class="syntax18">{</span><br /><span class="gutter"> 8:</span> <span class="syntax8">private</span> String nombre;<br /><span class="gutter"> 9:</span> <span class="syntax8">private</span> <span class="syntax10">double</span> sueldo;<br /><span class="gutterH"> 10:</span><br /><span class="gutter"> 11:</span> <span class="syntax8">public</span> <span class="syntax10">double</span> <span class="syntax6">getSueldo</span><