<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>El blog de Miguel Ángel Guillén</title>
	<atom:link href="http://miguelangelguillen.es/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://miguelangelguillen.es</link>
	<description>Algo más que TICs</description>
	<lastBuildDate>Thu, 14 Apr 2016 16:54:00 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.3</generator>
	<item>
		<title>J2EE: estructura de una aplicación</title>
		<link>http://miguelangelguillen.es/?p=646</link>
					<comments>http://miguelangelguillen.es/?p=646#respond</comments>
		
		<dc:creator><![CDATA[Miguel Angel]]></dc:creator>
		<pubDate>Thu, 14 Apr 2016 16:54:00 +0000</pubDate>
				<category><![CDATA[DAD II]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Programación]]></category>
		<guid isPermaLink="false">http://miguelangelguillen.es/?p=646</guid>

					<description><![CDATA[En esta entrada quiero describir una propuesta de estructura de una aplicación MVC que toma como base la que implementa Struts. Evidentemente esta solución no aporta nada si ya tienes decidido utilizar Spring o el propio Struts; pero si se desea realizar una aplicación sencilla si hacer uso de ellas, la propuesta que se describe [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img fetchpriority="high" decoding="async" class=" wp-image-647 alignleft" src="http://miguelangelguillen.es/wp-content/uploads/2016/04/Estructura-MVC-300x172.jpg" alt="Estructura MVC" width="355" height="203" srcset="http://miguelangelguillen.es/wp-content/uploads/2016/04/Estructura-MVC-300x172.jpg 300w, http://miguelangelguillen.es/wp-content/uploads/2016/04/Estructura-MVC-768x440.jpg 768w, http://miguelangelguillen.es/wp-content/uploads/2016/04/Estructura-MVC.jpg 778w" sizes="(max-width: 355px) 100vw, 355px" /></p>
<p>En esta entrada quiero describir una propuesta de estructura de una aplicación MVC que toma como base la que implementa Struts. Evidentemente esta solución no aporta nada si ya tienes decidido utilizar Spring o el propio Struts; pero si se desea realizar una aplicación sencilla si hacer uso de ellas, la propuesta que se describe permite tener una solución bien estructura y sencilla.</p>
<p>¿Qué debes saber antes de continuar? Al menos los conceptos de servlet y JSP deberías tenerlos claros; y todo lo ello conlleva: paso de parámetros, redijir a una JSP desde el servlet, paso de atributos, sesiones, etc.</p>
<p>Como siempre utilizaremos Apache Tomcat como contenedor J2EE y Eclipse como entorno de desarrollo.</p>
<p>La entrada la he dividido en tres bloques: idea general de la estructura, elementos que se necesitan y organización de los mismos.</p>
<p><span id="more-646"></span></p>
<p><strong>Ideal general</strong></p>
<p>La estructura que se presenta pretende separar el control de acceso a la aplicación, la lógica de negocio y la lógica de presentación. Es decir, que haya un único punto de entrada a la funcionalidad, que cada función sea independiente y se puede añadir nueva de forma dinámica y que la presentación sólo se dedique a «pintar» datos y no realice ninguna funcionalidad propia de la lógica de negocio.</p>
<p>&nbsp;</p>
<p><strong>Elementos de la estructura<br />
</strong></p>
<p>Para lo cual vamos a utilizar tres elementos principales, acción/modelo, vista y controlador, y dos secundarios, beans (o también POJOs) y la lógica de negocio o servicios.</p>
<p><img decoding="async" class="aligncenter wp-image-653 " src="http://miguelangelguillen.es/wp-content/uploads/2016/04/Presentación1-300x225.jpg" width="389" height="292" srcset="http://miguelangelguillen.es/wp-content/uploads/2016/04/Presentación1-300x225.jpg 300w, http://miguelangelguillen.es/wp-content/uploads/2016/04/Presentación1-768x576.jpg 768w, http://miguelangelguillen.es/wp-content/uploads/2016/04/Presentación1-900x675.jpg 900w, http://miguelangelguillen.es/wp-content/uploads/2016/04/Presentación1.jpg 960w" sizes="(max-width: 389px) 100vw, 389px" /></p>
<p style="padding-left: 30px;"><em>Controlador</em>: esta parte será implementada por un servlet; el cual recibe todas las peticiones y las procesa para verificar que el usuario tiene permiso de acceso y puede ejecutar la acción solicitada.</p>
<p style="padding-left: 30px;">Para independizar el servlet de la acción concreta a ejecutar todas las clases que implementan la funcionalidad de la aplicación deberán heredar de una clase padre Accion. De esta forma se puede declarar una variable de dicho tipo y asignarle el tiempo de ejecución el objeto correspondiente a la clase de la acción a realizar.</p>
<p style="padding-left: 90px; text-align: left;">Accion accion = new AccionListarArticulos();<br />
accion.ejecutar();</p>
<p style="padding-left: 30px;">El listado de acciones (en realidad objetos de subclases de la clase Accion, como hemos visto) se instanciará cuando el servlet se cargue en memoria; de esta forma estará disponible para todas las peticiones que se realicen al controlador. Es decir, no creamos un objeto de la acción cada vez que el servlet recibe una petición sino que utilizamos una tabla para guardar, debidamente referenciado, un objeto de cada una de las acciones.</p>
<p style="padding-left: 30px;">Al finalizar la ejecución de la acción el controlador redije la petición a la vista para que genere la página que se envía al navegador.</p>
<p style="padding-left: 30px;"><em>Acción</em>: es la encargada de realizar la funcionalidad deseada para lo cual hará uso de la lógica de negocio o servicios que estime oportunos. En el caso de que se trate de operaciones de búsqueda creará un array con los objetos a enviar a la vista; y en general toda la información que ésta necesite.</p>
<p style="padding-left: 30px;"><em>Vista</em>: es la encargada de generar la página HTML que se envía al navegador del cliente. Recibe la información de la acción y procede a mostrarla en la página. En ningún caso accede a la lógica de negocio o realizar alguna acción que no sea, por así decirlo, «pintar» datos. Esta parte se implementa con una JSP.</p>
<p>&nbsp;</p>
<p><strong>Organización y flujo de ejecución<br />
</strong></p>
<p>Una vez que se han descrito los elementos de la estructura vamos a colocar cada uno de ellos y a establecer el flujo de ejecución; lo que también servirá para conocerlos.</p>
<p>Partamos, por ejemplo, de una página web que tiene un enlace para mostrar el listado de artículos de una tienda:</p>
<p style="text-align: center;">http://localhost:8080/aplicacion/ServletControl?ID_ACCION=LISTAR_ARTICULOS</p>
<p>Como se puede observar en dicho enlace aparecen dos elementos fundamentales, el servlet (<em>ServletControl</em>) y el parámetro que identifica la acción a ejecutar (<em>ID_ACCION</em>).</p>
<p>Cuando dicha petición llega al servlet este debe recuperar el objeto que se corresponde con la acción solicitada, ejecutarla y redijir a la JSP que generará la web a enviar al navegador.</p>
<p style="text-align: left; padding-left: 60px;">Accion accion = (Accion) this.tablaAcciones.get(request.getParameter(«ID_ACCION»));</p>
<p style="text-align: left; padding-left: 60px;">String jsp = accion.ejecutar(request, response);</p>
<p style="text-align: left; padding-left: 60px;">this.getServletContext().getRequestDispatcher(jsp).forward(request,response);</p>
<p>Una vez que la petición llega a la JSP, ésta recupera los atributos que le pudieran haber pasado desde la acción y procede a generar la página HTML que se envía al navegador.</p>
<p style="padding-left: 30px;">ArrayList&lt;Item&gt; items = (ArrayList&lt;Item&gt;) request.getAttribute(«LISTADO_ITEMS»);</p>
]]></content:encoded>
					
					<wfw:commentRss>http://miguelangelguillen.es/?feed=rss2&#038;p=646</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Creación de un servicio web: Axis2 y Eclipse</title>
		<link>http://miguelangelguillen.es/?p=617</link>
					<comments>http://miguelangelguillen.es/?p=617#comments</comments>
		
		<dc:creator><![CDATA[Miguel Angel]]></dc:creator>
		<pubDate>Mon, 27 May 2013 18:00:16 +0000</pubDate>
				<category><![CDATA[DAD]]></category>
		<category><![CDATA[DAD II]]></category>
		<category><![CDATA[General]]></category>
		<guid isPermaLink="false">http://miguelangelguillen.es/?p=617</guid>

					<description><![CDATA[&#160; En esta entrada voy a explicar los pasos a seguir para crear un servicio web con Apache Axis2 y un cliente que lo utilice. La idea es implementar el típico HolaMundo pero a través de un servicio web. El cliente invocará el método que está en el servidor, el cual le devolverá el tan [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>&nbsp;</p>
<div id="attachment_618" style="width: 160px" class="wp-caption alignleft"><a href="http://miguelangelguillen.es/wp-content/uploads/2013/05/axis.jpg"><img decoding="async" aria-describedby="caption-attachment-618" class="size-thumbnail wp-image-618 " alt="Logotipo de Apache Axis 2" src="http://miguelangelguillen.es/wp-content/uploads/2013/05/axis-150x96.jpg" width="150" height="96" /></a><p id="caption-attachment-618" class="wp-caption-text">Logotipo de Apache Axis 2</p></div>
<p>En esta entrada voy a explicar los pasos a seguir para crear un servicio web con Apache Axis2 y un cliente que lo utilice. La idea es implementar el típico HolaMundo pero a través de un servicio web. El cliente invocará el método que está en el servidor, el cual le devolverá el tan famoso «Hola Mundo!!».</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span id="more-617"></span>Lo primero de todo es descargarse la versión de Axis2 adecuada (recomiendo los binarios). Esta es <a href="http://axis.apache.org/axis2/java/core/download.cgi">la página del proyecto</a>.</p>
<p><a href="http://miguelangelguillen.es/wp-content/uploads/2013/05/enlacesDescarga.jpg"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-623" alt="enlacesDescarga" src="http://miguelangelguillen.es/wp-content/uploads/2013/05/enlacesDescarga-300x153.jpg" width="300" height="153" srcset="http://miguelangelguillen.es/wp-content/uploads/2013/05/enlacesDescarga-300x153.jpg 300w, http://miguelangelguillen.es/wp-content/uploads/2013/05/enlacesDescarga.jpg 813w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Una vez que lo hemos descargado e instalado (en mi caso descomprimir) abrimos eclipse y configuramos Axis2. En Window-&gt;Preferences-&gt;Web Services-&gt;Axis2 Preferences ponemos la ruta hasta la instalación de Axis2, en mi caso C:\Archivos de programa\Axis\axis2-1.6.2</p>
<p><a href="http://miguelangelguillen.es/wp-content/uploads/2013/05/configuracion.jpg"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-629" alt="configuracion" src="http://miguelangelguillen.es/wp-content/uploads/2013/05/configuracion-280x300.jpg" width="280" height="300" srcset="http://miguelangelguillen.es/wp-content/uploads/2013/05/configuracion-280x300.jpg 280w, http://miguelangelguillen.es/wp-content/uploads/2013/05/configuracion.jpg 674w" sizes="(max-width: 280px) 100vw, 280px" /></a></p>
<p>y en la misma ventana de preferencias seleccionamos «Server and Runtime» y en el campo «Web Service Runtime» seleccionamos el valor «Apache Axis2».</p>
<p><a href="http://miguelangelguillen.es/wp-content/uploads/2013/05/configuracion2.jpg"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-633" alt="configuracion2" src="http://miguelangelguillen.es/wp-content/uploads/2013/05/configuracion2-280x300.jpg" width="280" height="300" srcset="http://miguelangelguillen.es/wp-content/uploads/2013/05/configuracion2-280x300.jpg 280w, http://miguelangelguillen.es/wp-content/uploads/2013/05/configuracion2.jpg 674w" sizes="(max-width: 280px) 100vw, 280px" /></a></p>
<p>A continuación creamos un proyecto web (Dynamic Web Project), un paquete (edu.ucam.webservices) y una clase, HolaMundo, que hará de servicio. Dicha clase tendrá el método a invocar y cuyo código es:</p>
<pre style="padding-left: 60px;">public String diHola(){
 System.out.println("Voy a decir hola");
 return "Hola Mundo!!";
 }</pre>
<p>El siguiente paso es crear y registrar el servicio. Para ello sobre la clase recién creada pulsamos botón derecho New -&gt; Other -&gt; Web Service</p>
<p><a href="http://miguelangelguillen.es/wp-content/uploads/2013/05/newServicioWeb.jpg"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-632" alt="newServicioWeb" src="http://miguelangelguillen.es/wp-content/uploads/2013/05/newServicioWeb-237x300.jpg" width="237" height="300" srcset="http://miguelangelguillen.es/wp-content/uploads/2013/05/newServicioWeb-237x300.jpg 237w, http://miguelangelguillen.es/wp-content/uploads/2013/05/newServicioWeb.jpg 533w" sizes="(max-width: 237px) 100vw, 237px" /></a></p>
<p>La primera pantalla debe quedar como la imagen anterior. Lo correcto sería selecciona «Top down» es decir crear la descripción del servicio (WSDL) y a partir de ella la clase, pero para facilitar el desarrollo lo hacemos al revés «Bottom up» (primero la clase y luego la descripción).</p>
<p><a href="http://miguelangelguillen.es/wp-content/uploads/2013/05/newServicioWeb2.jpg"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-631" alt="newServicioWeb2" src="http://miguelangelguillen.es/wp-content/uploads/2013/05/newServicioWeb2-237x300.jpg" width="237" height="300" srcset="http://miguelangelguillen.es/wp-content/uploads/2013/05/newServicioWeb2-237x300.jpg 237w, http://miguelangelguillen.es/wp-content/uploads/2013/05/newServicioWeb2.jpg 533w" sizes="(max-width: 237px) 100vw, 237px" /></a></p>
<p>Seguimos todos los pasos del wizard. En uno de ellos nos pedirá arrancar el servidor (si no lo está).</p>
<p>A continuación abrimos un navegador y vamos a la dirección «http://localhost:8080/<span style="text-decoration: underline;">ServicioWebHolaMundo</span>/axis2-web/» (sólo hay que cambiar la parte subrayada por el contexto que tengáis en vuestra aplicación)</p>
<p>Os aparece una página de inicio de Axis2 con un enlace que pone Services. Al navegar hacia el, aparece el listado de servicios web desplegados, debe aparecer HolaMundo. La ruta de ese enlace se corresponde con el wsdl del servicio web creado (lo copiamos en el porta papeles).</p>
<p>El penúltimo paso es generar el cliente (stub) del servicio web. El fichero que se genera contiene todos los elementos (clases) necesarios para invocar el servicio web desde la aplicación cliente; hace las veces de proxy. Botón derecho sobre la clase New -&gt; Other -&gt; Web Service Client.</p>
<p>En «Service definition» ponemos la url hacia el wsdl que hemos copiado del paso anterior: http://localhost:8080/ServicioWebHolaMundo/services/HolaMundo?wsdl</p>
<p><a href="http://miguelangelguillen.es/wp-content/uploads/2013/05/newClienteServicioWeb.jpg"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-630" alt="newClienteServicioWeb" src="http://miguelangelguillen.es/wp-content/uploads/2013/05/newClienteServicioWeb-295x300.jpg" width="295" height="300" srcset="http://miguelangelguillen.es/wp-content/uploads/2013/05/newClienteServicioWeb-295x300.jpg 295w, http://miguelangelguillen.es/wp-content/uploads/2013/05/newClienteServicioWeb.jpg 604w" sizes="(max-width: 295px) 100vw, 295px" /></a></p>
<p>&nbsp;</p>
<p>Sólo queda crear una clase cliente con el método main y el siguiente código para invocar el servicio web:</p>
<pre style="padding-left: 30px;">public static void main(String[] args) {
 try {
    //Se crea un objeto del proxy hacia el servicio web
    HolaMundoStub holaMundo = new HolaMundoStub();

    //Este objeto representa al parámetro.
    DiHola diHola = new DiHola();

    //Se invoca el método del servicio web y se obtiene la respuesta.
    DiHolaResponse respuesta = holaMundo.diHola(diHola);

    //Se muestra la respuesta.
    System.out.println(respuesta.get_return());
 } catch (AxisFault e) {
    e.printStackTrace(); 
 } catch (RemoteException e) {
    e.printStackTrace();
 }
 }</pre>
<p>En ningún momento se crea un objeto de la clase HolaMundo, se instancia la clase que hace de proxy hacia el servicio web HolaMundoStub. Además se utilizan las clases que representan el método a invocar (DiHola) y la respuesta al mismo (DiHolaResponse).</p>
]]></content:encoded>
					
					<wfw:commentRss>http://miguelangelguillen.es/?feed=rss2&#038;p=617</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Aplicación web con Eclipse: primer servlet</title>
		<link>http://miguelangelguillen.es/?p=600</link>
					<comments>http://miguelangelguillen.es/?p=600#respond</comments>
		
		<dc:creator><![CDATA[Miguel Angel]]></dc:creator>
		<pubDate>Tue, 20 Mar 2012 23:05:09 +0000</pubDate>
				<category><![CDATA[DAD]]></category>
		<category><![CDATA[Programación]]></category>
		<guid isPermaLink="false">http://miguelangelguillen.es/?p=600</guid>

					<description><![CDATA[&#160; En esta entrada, que es continuación de esta otra, vamos a crear un servlet utilizando una de las  herramientas que proporciona Eclipse. Evidentemente es importante conocer el concepto de Servlet antes de leerla. &#160; Antes de implementar la clase que implementa el servlet vamos a crear un paquete que la contenga. Para ello&#8230; &#160; Botón [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>&nbsp;</p>
<p>En esta entrada, que es continuación de esta <a href="http://miguelangelguillen.es/?p=575">otra</a>, vamos a crear un servlet utilizando una de las  herramientas que proporciona Eclipse. Evidentemente es importante conocer el <a href="http://es.wikipedia.org/wiki/Java_Servlet">concepto de Servlet</a> antes de leerla.</p>
<p>&nbsp;</p>
<p>Antes de implementar la clase que implementa el servlet vamos a crear un paquete que la contenga. Para ello&#8230;</p>
<p>&nbsp;</p>
<p>Botón derecho sobre la carpeta src, New -&gt; Package, introducimos el nombre «edu.ucam.servlets» y pulsamos «Finish». Ya tenemos el paquete que contendrá todos los servlets de nuestra aplicación. «Sólo» queda crear el servlet&#8230;</p>
<p><span id="more-600"></span></p>
<ul>
<li>Sobre el paquete que acabamos de crear, botón derecho, New -&gt; Servlet</li>
</ul>
<div><a href="http://miguelangelguillen.es/wp-content/uploads/2012/03/CrearServlet.png"><img loading="lazy" decoding="async" class="aligncenter size-thumbnail wp-image-601" title="CrearServlet" src="http://miguelangelguillen.es/wp-content/uploads/2012/03/CrearServlet-150x150.png" alt="" width="150" height="150" /></a></div>
<ul>
<li>Aparece la primera ventana del proceso de creación del servlet. Ponemos el nombre de la clase -MiPrimerServlet- y pulsamos «Next».</li>
</ul>
<div><a href="http://miguelangelguillen.es/wp-content/uploads/2012/03/CrearServletPaso1.png"><img loading="lazy" decoding="async" class="aligncenter size-thumbnail wp-image-602" title="CrearServletPaso1" src="http://miguelangelguillen.es/wp-content/uploads/2012/03/CrearServletPaso1-150x150.png" alt="" width="150" height="150" /></a></div>
<ul>
<li>Aparece una segunda ventana donde se introduce el mapeo de URL y servlet; es decir, desde que URLs se va a ejecutar. Por defecto en la sección «URL mappings» aparece «/MiPrimerServlet», que es el nombre de la clase. Nosotros pulsaremos en «Add&#8230;» para añadir el mapping «/MiServlet». Pulsamos en «Next».</li>
</ul>
<div><a href="http://miguelangelguillen.es/wp-content/uploads/2012/03/CrearServletPaso2.png"><img loading="lazy" decoding="async" class="aligncenter size-thumbnail wp-image-603" title="CrearServletPaso2" src="http://miguelangelguillen.es/wp-content/uploads/2012/03/CrearServletPaso2-150x150.png" alt="" width="150" height="150" srcset="http://miguelangelguillen.es/wp-content/uploads/2012/03/CrearServletPaso2-150x150.png 150w, http://miguelangelguillen.es/wp-content/uploads/2012/03/CrearServletPaso2-300x300.png 300w, http://miguelangelguillen.es/wp-content/uploads/2012/03/CrearServletPaso2.png 529w" sizes="(max-width: 150px) 100vw, 150px" /></a></div>
<ul>
<li>Llegamos a la última ventana del proceso de creación del servlet, donde se le indica a Eclipse los métodos que queremos sobreescribir (doPost, doGet, init, etc.). Dejamos marcado doGet y pulsamos en «Finish».</li>
</ul>
<div>Ya tenemos la estructura del servlet.  Ahora añadimos este código al método doGet:</div>
<div>
<pre style="padding-left: 60px;">response.setContentType("text/html");</pre>
<pre style="padding-left: 60px;">ServletOutputStream out = response.getOutputStream();</pre>
<pre style="padding-left: 60px;">out.println("&lt;html&gt;");</pre>
<pre style="padding-left: 60px;">out.println("&lt;head&gt;&lt;title&gt;Hola Mundo&lt;/title&gt;&lt;/head&gt;");</pre>
<pre style="padding-left: 60px;">out.println("&lt;body&gt;");</pre>
<pre style="padding-left: 60px;">out.println("&lt;h1&gt;Hola mundo!!!&lt;/h1&gt;");</pre>
<pre style="padding-left: 60px;">out.println("&lt;/body&gt;&lt;/html&gt;");</pre>
</div>
<p>&nbsp;</p>
<p>Arrancamos el servidor (botón derecho sobre el proyecto, run as, run on server) y pegamos esta URL en el navegador: http://localhost:8080/miaplicacion/MiServlet. Si todo ha ido bien debe aparece un precioso «Hola mundo!!!» :-).</p>
]]></content:encoded>
					
					<wfw:commentRss>http://miguelangelguillen.es/?feed=rss2&#038;p=600</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Aplicación web con Eclipse: primeros pasos</title>
		<link>http://miguelangelguillen.es/?p=575</link>
					<comments>http://miguelangelguillen.es/?p=575#comments</comments>
		
		<dc:creator><![CDATA[Miguel Angel]]></dc:creator>
		<pubDate>Tue, 20 Mar 2012 13:06:10 +0000</pubDate>
				<category><![CDATA[DAD]]></category>
		<category><![CDATA[Programación]]></category>
		<guid isPermaLink="false">http://miguelangelguillen.es/?p=575</guid>

					<description><![CDATA[Hace ya un par de años escribí una entrada explicando como crear un aplicación web haciendo uso de un plugin (http://miguelangelguillen.es/?p=157). Aunque la herramienta que voy a explicar en esta entrada ya existía, entendía que era (y es) una buena forma de aprender la estructura de una aplicación web J2EE. Por eso remito a ella. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="http://miguelangelguillen.es/wp-content/uploads/2012/03/CambioPerspectiva.jpg"><img loading="lazy" decoding="async" class="alignleft size-thumbnail wp-image-576" title="CambioPerspectiva" src="http://miguelangelguillen.es/wp-content/uploads/2012/03/CambioPerspectiva-150x150.jpg" alt="" width="150" height="150" /></a>Hace ya un par de años escribí una entrada explicando como crear un aplicación web haciendo uso de un plugin (http://miguelangelguillen.es/?p=157). Aunque la herramienta que voy a explicar en esta entrada ya existía, entendía que era (y es) una buena forma de aprender la estructura de una aplicación web J2EE. Por eso remito a ella. Pero actualmente hay dos motivos de más peso que me han hecho cambiar. Primero, en la asignatura me centro más en el desarrollo, no en la administración, por lo que me parece más interesante trabajar en este aspecto.  Y segundo, la tecnología ha ido evolucionando y a día de hoy se suelen utilizar las herramientas que proporciona el eclipse, los alumnos deben conocer lo que se utiliza fuera. Eclipse y netbeans son los más usados (hay que apostar por uno).</p>
<p><span id="more-575"></span>Para poder seguir esta entrada se necesita eclipse en su empaquetado IDE for Java EE Developers (<a href="http://www.eclipse.org/downloads/">http://www.eclipse.org/downloads/</a>)</p>
<ul>
<li>Una vez descargado y desplegado arrancamos eclipse y si no lo está seleccionamos la vista J2EE.</li>
</ul>
<p><a href="http://miguelangelguillen.es/wp-content/uploads/2012/03/CambioPerspectiva.jpg"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-576" title="CambioPerspectiva" src="http://miguelangelguillen.es/wp-content/uploads/2012/03/CambioPerspectiva-300x234.jpg" alt="" width="300" height="234" srcset="http://miguelangelguillen.es/wp-content/uploads/2012/03/CambioPerspectiva-300x234.jpg 300w, http://miguelangelguillen.es/wp-content/uploads/2012/03/CambioPerspectiva.jpg 343w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<ul>
<li>En el menú seleccionamos: File -&gt; New -&gt; Dynamic Web Project</li>
</ul>
<p><a href="http://miguelangelguillen.es/wp-content/uploads/2012/03/CrearNuevoProyecto.jpg"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-578" title="CrearNuevoProyecto" src="http://miguelangelguillen.es/wp-content/uploads/2012/03/CrearNuevoProyecto-300x284.jpg" alt="" width="300" height="284" srcset="http://miguelangelguillen.es/wp-content/uploads/2012/03/CrearNuevoProyecto-300x284.jpg 300w, http://miguelangelguillen.es/wp-content/uploads/2012/03/CrearNuevoProyecto.jpg 499w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<ul>
<li>Aparece una primera ventana donde vamos a configurar dos parámetros: nombre del proyecto y el entorno de ejecución (es decir, Tomcat). Se resaltan los campos.</li>
</ul>
<p><a href="http://miguelangelguillen.es/wp-content/uploads/2012/03/VentanaNuevoProyecto.jpg"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-580" title="VentanaNuevoProyecto" src="http://miguelangelguillen.es/wp-content/uploads/2012/03/VentanaNuevoProyecto-247x300.jpg" alt="" width="247" height="300" srcset="http://miguelangelguillen.es/wp-content/uploads/2012/03/VentanaNuevoProyecto-247x300.jpg 247w, http://miguelangelguillen.es/wp-content/uploads/2012/03/VentanaNuevoProyecto.jpg 554w" sizes="(max-width: 247px) 100vw, 247px" /></a></p>
<ul>
<ul>
<li>El nombre del proyecto es evidente :-), le voy a poner «miaplicacion». Sólo hay que tener cuidado en una cosa. Si en el futuro no se cambia el nombre del contexto será el mismo que el del proyecto; por tanto, para acceder a la aplicación pondremos en el navegador http://localhost:8080/miaplicacion.</li>
<li>Para configurar el entorno de ejecución hay que pulsar en «New Runtime&#8230;». Y aparece esta ventana</li>
</ul>
</ul>
<p><a href="http://miguelangelguillen.es/wp-content/uploads/2012/03/ServerRuntimeEnvironmentPaso1.jpg"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-583" title="ServerRuntimeEnvironmentPaso1" src="http://miguelangelguillen.es/wp-content/uploads/2012/03/ServerRuntimeEnvironmentPaso1-243x300.jpg" alt="" width="243" height="300" srcset="http://miguelangelguillen.es/wp-content/uploads/2012/03/ServerRuntimeEnvironmentPaso1-243x300.jpg 243w, http://miguelangelguillen.es/wp-content/uploads/2012/03/ServerRuntimeEnvironmentPaso1.jpg 438w" sizes="(max-width: 243px) 100vw, 243px" /></a></p>
<p>&nbsp;</p>
<ul>
<ul>
<li>Seleccionamos «Apache Tomcat v6.0» y pulsamos en «Next &gt;»</li>
</ul>
</ul>
<p><a href="http://miguelangelguillen.es/wp-content/uploads/2012/03/ServerRuntimeEnvironmentPaso2.jpg"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-584" title="ServerRuntimeEnvironmentPaso2" src="http://miguelangelguillen.es/wp-content/uploads/2012/03/ServerRuntimeEnvironmentPaso2-243x300.jpg" alt="" width="243" height="300" srcset="http://miguelangelguillen.es/wp-content/uploads/2012/03/ServerRuntimeEnvironmentPaso2-243x300.jpg 243w, http://miguelangelguillen.es/wp-content/uploads/2012/03/ServerRuntimeEnvironmentPaso2.jpg 438w" sizes="(max-width: 243px) 100vw, 243px" /></a></p>
<ul>
<ul>
<li>En la ventana que aparece (ver imagen superior) pulsamos en «Browse&#8230;», seleccionamos el directorio donde se encuentra desplegado Tomcat y pulsamos «Finish&#8230;».</li>
<li>Volvemos a la pantanlla inicial donde pulsamos en «Finish&#8230;»</li>
</ul>
</ul>
<p>&nbsp;</p>
<ul>
<li>El proyecto ya está creado. Aparece una pantalla como esta:</li>
</ul>
<p>&nbsp;</p>
<p><a href="http://miguelangelguillen.es/wp-content/uploads/2012/03/ProyectoCreado.jpg"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-586" title="ProyectoCreado" src="http://miguelangelguillen.es/wp-content/uploads/2012/03/ProyectoCreado-300x77.jpg" alt="" width="300" height="77" srcset="http://miguelangelguillen.es/wp-content/uploads/2012/03/ProyectoCreado-300x77.jpg 300w, http://miguelangelguillen.es/wp-content/uploads/2012/03/ProyectoCreado.jpg 839w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>&nbsp;</p>
<p>Desde este momento ya tenemos creado el proyecto y configurado un entorno de ejecución J2EE para que eclipse pueda levantar el servicio. ¿Qué nos falta? Darle al play <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<ul>
<li>Botón derecho sobre el proyecto, Run as -&gt; Run on Server.  Aparece la siguente pantalla</li>
</ul>
<p><a href="http://miguelangelguillen.es/wp-content/uploads/2012/03/NuevoServidor.jpg"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-588" title="NuevoServidor" src="http://miguelangelguillen.es/wp-content/uploads/2012/03/NuevoServidor-260x300.jpg" alt="" width="260" height="300" srcset="http://miguelangelguillen.es/wp-content/uploads/2012/03/NuevoServidor-260x300.jpg 260w, http://miguelangelguillen.es/wp-content/uploads/2012/03/NuevoServidor.jpg 500w" sizes="(max-width: 260px) 100vw, 260px" /></a></p>
<ul>
<li>Si no lo está seleccionamos el entorno de ejecución creado anteriormente (Apache Tomcat v6.0)</li>
<li>Pulsamos en «Finish»</li>
</ul>
<p>&nbsp;</p>
<p>Si todo ha ido correctamente el servidor arranca, se puede comprobar ya que aparece en la consola el texto «INFO: Server startup in X ms», pero en la página que se muestra en el navegador hay un error «Estado HTTP 404 &#8211; /miaplicacion/». Esto se debe a que no hay ninguna página HTML en el raíz del servidor. Vamos a crear un hola mundo web <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>&nbsp;</p>
<p>Sobre la carpeta WebContent, botón derecho, New -&gt; HTML file. Aparece una ventana donde se pide el nombre del fichero, ponemos «index» (la extensión la pone automáticamente eclipse). Pulsamos en «Finish».</p>
<p>&nbsp;</p>
<p>Aparece el código de la página. Dentro de las etiquetas body ponemos el texot «Hola Mundo!!!». Guardamos el fichero.</p>
<p>&nbsp;</p>
<p>Volvemos a la pestaña donde antes teníamos el error (se trata de un navegador integrado con eclipse) y pulsamos F5.</p>
<p>&nbsp;</p>
<p><a href="http://miguelangelguillen.es/wp-content/uploads/2012/03/HolaMundoWeb.jpg"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-589" title="HolaMundoWeb" src="http://miguelangelguillen.es/wp-content/uploads/2012/03/HolaMundoWeb-300x120.jpg" alt="" width="300" height="120" srcset="http://miguelangelguillen.es/wp-content/uploads/2012/03/HolaMundoWeb-300x120.jpg 300w, http://miguelangelguillen.es/wp-content/uploads/2012/03/HolaMundoWeb.jpg 421w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
]]></content:encoded>
					
					<wfw:commentRss>http://miguelangelguillen.es/?feed=rss2&#038;p=575</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Interfaz gráfica de usuario con Java</title>
		<link>http://miguelangelguillen.es/?p=550</link>
					<comments>http://miguelangelguillen.es/?p=550#respond</comments>
		
		<dc:creator><![CDATA[Miguel Angel]]></dc:creator>
		<pubDate>Sat, 20 Mar 2010 23:24:41 +0000</pubDate>
				<category><![CDATA[POO]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[swing]]></category>
		<guid isPermaLink="false">http://miguelangelguillen.es/?p=550</guid>

					<description><![CDATA[Inicialmente Java tenía una kit de herramientas para crear interfaces gráficas denominada «Abstract Window Toolkit» (AWT).  Simplificando, el funcionamiento de la misma consiste en llamadas a subrutinas del sistema operativo. Por ejemplo, al crear un botón o un cuadro de comprobación se llama a la subrutina correspondiente del S.O. Pero esto puede ser una ventaja [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="http://miguelangelguillen.es/wp-content/uploads/2010/03/duke1.gif"><img loading="lazy" decoding="async" class="alignleft size-full wp-image-551" title="duke1" src="http://miguelangelguillen.es/wp-content/uploads/2010/03/duke1-e1269122877592.gif" alt="" width="200" height="241" /></a>Inicialmente Java tenía una kit de herramientas para crear interfaces gráficas denominada «Abstract Window Toolkit» (AWT).  Simplificando, el funcionamiento de la misma consiste en llamadas a subrutinas del sistema operativo. Por ejemplo, al crear un botón o un cuadro de comprobación se llama a la subrutina correspondiente del S.O. Pero esto puede ser una ventaja o desventaja según se mire, ya que un cuadro de comprobación es distinto en cada sistema operativo. En el fondo, cada elemento tienes sus peculiaridades en cada sistema operativo y, por tanto, AWT sólo contiene los aspectos comunes que pueden ser invocados en cualquier sistema. Otra desventaja no menos importante es que hay desarrolladores a los que les gusta que sus «creaciones» se «vean» igual en cualquier plataforma, esto con AWT no es posible :).</p>
<p>En estas apareció Swing para solucionar estos «problemas». ¿La clave? Utiliza Java 2D para invocar subrutinas de bajo nivel en vez de utilizar el módulo de interfaz de usuario de alto nivel del S.O. Es decir, el elemento es el mismo en cualquier plataforma.</p>
<p>Entrar en todos los detalles de una interfaz gráfica nos daría para escribir un libro. Es por eso que sólo quiero hacer una pequeña introducción a los aspectos básicos de la misma.</p>
<p><span id="more-550"></span>Tres elementos son los que podemos considerar como fundamentales:</p>
<ul>
<li>Componentes: elementos gráficos tales como botones, cuadros desplegables, cuadros de texto, etc.</li>
<li>Contenedores: elementos que contienen otros componentes o contenedores, por ejemplo JPanel o JFrame.</li>
<li>Layouts: diseño aplicable a los contenedores, es la forma de distribuir los componentes dentro del contenedor.</li>
</ul>
<p>La diferencia entre contenedores y componentes es clara, unos contienen a otros. Pero&#8230; ¿que es eso del layout? Como su propio nombre indica es un diseño que se aplica a los contenedores. Es decir, nos echa una mano a la hora de colocar los componentes en los contenedores. Por ejemplo, si tenemos el diseño BorderLayout el contenedor se divide en cinco zonas (como se puede ver en la siguiente imagen):</p>
<p><a href="http://miguelangelguillen.es/wp-content/uploads/2010/03/Imagen-11.png"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-563" title="BorderLayout" src="http://miguelangelguillen.es/wp-content/uploads/2010/03/Imagen-11-300x226.png" alt="" width="300" height="226" srcset="http://miguelangelguillen.es/wp-content/uploads/2010/03/Imagen-11-300x226.png 300w, http://miguelangelguillen.es/wp-content/uploads/2010/03/Imagen-11.png 399w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>De esta forma podemos indicar fácilmente que un botón u otro contenedor se incluya en la parte sur del contenedor principal. Existen varios <a href="http://tinyurl.com/yg52zdk" target="_blank">tipos de layouts</a>, y también existe la posibilidad de establecer a null el layout de un contenedor e indicar la posición donde colocar el componente.</p>
<p>Una implementación básica de una ventana podría ser un JFrame, que tiene un JPanel con un BorderLayout y este un JButton en el sur.</p>
<pre>//Creamos el marco
 JFrame jFrame = new JFrame();

 //Creamos el panel principal
 JPanel jPanel = new JPanel();

 //Establecemos el layout del panel
 jPanel.setLayout(new BorderLayout());

 //Creamos un botón y lo añadimos al panel en el sur
 JButton jButton = new JButton("Aceptar");        
 jPanel.add(jButton,BorderLayout.SOUTH);

 //Establecemos el panel principal del marco
 jFrame.setContentPane(jPanel);

 //Cambiamos el tamaño y lo hacemos visible
 jFrame.setSize(200, 200);
 jFrame.setVisible(true);</pre>
<p>Si se ejecuta el código anterior se obtiene el siguiente resultado:</p>
<p><a href="http://miguelangelguillen.es/wp-content/uploads/2010/03/Imagen-1.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-557" title="Ventana simple" src="http://miguelangelguillen.es/wp-content/uploads/2010/03/Imagen-1.png" alt="" width="228" height="242" /></a></p>
<p>Podemos encontrar una similitud entre los elementos que componen la ventana y un cuadro. El JFrame sería el marco, el JPanel sería el lienzo y el layout, con el resto de componentes, sería el dibujo en sí.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://miguelangelguillen.es/?feed=rss2&#038;p=550</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Eclipse: instalación y primera clase</title>
		<link>http://miguelangelguillen.es/?p=540</link>
					<comments>http://miguelangelguillen.es/?p=540#comments</comments>
		
		<dc:creator><![CDATA[Miguel Angel]]></dc:creator>
		<pubDate>Sat, 06 Mar 2010 12:27:24 +0000</pubDate>
				<category><![CDATA[DDAW]]></category>
		<category><![CDATA[Programación]]></category>
		<guid isPermaLink="false">http://miguelangelguillen.es/?p=540</guid>

					<description><![CDATA[Con motivo de la asignatura Diseño y Desarrollo de Arquitecturas Web que este cuatrimestre voy a impartir en modalidad presencial y online he pensado que puede ser interesante hacer una serie de screencast explicando ciertos conceptos o tecnologías incluidos en el temario. Aquí dejo la primera creación :-), tiene dos partes por la limitación de [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="http://miguelangelguillen.es/wp-content/uploads/2010/03/eclipse-galileo.png"><img loading="lazy" decoding="async" class="alignleft size-thumbnail wp-image-544" title="eclipse-galileo" src="http://miguelangelguillen.es/wp-content/uploads/2010/03/eclipse-galileo-150x150.png" alt="Eclipse Galileo" width="150" height="150" srcset="http://miguelangelguillen.es/wp-content/uploads/2010/03/eclipse-galileo-150x150.png 150w, http://miguelangelguillen.es/wp-content/uploads/2010/03/eclipse-galileo.png 250w" sizes="(max-width: 150px) 100vw, 150px" /></a>Con motivo de la asignatura Diseño y Desarrollo de Arquitecturas Web que este cuatrimestre voy a impartir en modalidad presencial y online he pensado que puede ser interesante hacer una serie de screencast explicando ciertos conceptos o tecnologías incluidos en el temario.</p>
<p>Aquí dejo la primera creación :-), tiene dos partes por la limitación de espacio en YouTube. ¿Críticas? Todas,  pero sobretodo la falta de calidad en la imagen. No me preocupa mucho en estos dos vídeos ya que están muy comentados y no es muy difícil seguirlos pero&#8230; no hay excusa. El próximo irá mejor.</p>
<p>Parte 1: <a href="http://www.youtube.com/watch?v=qMvALOI6G7Y" target="_blank">http://www.youtube.com/watch?v=qMvALOI6G7Y</a></p>
<p>Parte 2: <a href="http://www.youtube.com/watch?v=Kwh_VpNZ2-E" target="_blank">http://www.youtube.com/watch?v=Kwh_VpNZ2-E</a></p>
<p>También dejo el código fuente de la clase creada. De esta forma podéis verlo ya que en el vídeo queda borroso.  <a href="http://miguelangelguillen.es/wp-content/uploads/2010/03/HolaMundo.zip">HolaMundo</a></p>
]]></content:encoded>
					
					<wfw:commentRss>http://miguelangelguillen.es/?feed=rss2&#038;p=540</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Rellenar una tabla en Java</title>
		<link>http://miguelangelguillen.es/?p=519</link>
					<comments>http://miguelangelguillen.es/?p=519#respond</comments>
		
		<dc:creator><![CDATA[Miguel Angel]]></dc:creator>
		<pubDate>Tue, 12 Jan 2010 13:09:56 +0000</pubDate>
				<category><![CDATA[POO]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[tablas]]></category>
		<guid isPermaLink="false">http://miguelangelguillen.es/?p=519</guid>

					<description><![CDATA[Una funcionalidad muy utilizada cuando se desarrollan aplicaciones de gestión es la de formulario maestro-detalle. Un formulario de este tipo realmente está compuesto por dos: maestro y detalle. De tal forma que al introducir los datos de búsqueda en el formulario principal aparecen en el formulario detalle los datos asociados a los primeros. Por ejemplo, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://miguelangelguillen.es/wp-content/uploads/2010/01/java_logo.gif"><img loading="lazy" decoding="async" class="alignleft size-medium wp-image-520" title="java_logo" src="http://miguelangelguillen.es/wp-content/uploads/2010/01/java_logo-188x300.gif" alt="" width="188" height="300" /></a>Una funcionalidad muy utilizada cuando se desarrollan aplicaciones de gestión es la de formulario maestro-detalle. Un formulario de este tipo realmente está compuesto por dos: maestro y detalle. De tal forma que al introducir los datos de búsqueda en el formulario principal aparecen en el formulario detalle los datos asociados a los primeros.</p>
<p style="text-align: justify;">Por ejemplo, en el formulario principal podemos tener un campo de texto para introducir el DNI y mostrar en el formulario detalle el listado de productos comprados por esa persona.</p>
<p style="text-align: justify;">¿Y como se hace esto en Java? Muy sencillo. Creamos una serie de elementos gráficos que harán las veces de formulario principal (JTextField, JComboBox, etc.) e incluimos debajo de este una tabla donde aparecerán los distintos registros asociados a la búsqueda.</p>
<p style="text-align: justify;">Como no podía ser de otro modo la clase que implementa en Java la tabla es <a href="http://java.sun.com/javase/6/docs/api/javax/swing/JTable.html" target="_blank">JTable</a>. Mucho hay escrito sobre el manejo de la misma (por ejemplo, <a href="http://java.sun.com/docs/books/tutorial/uiswing/components/table.html" target="_blank">aquí</a>, <a href="http://www.javahispano.org/contenidos/es/jtable_con_ejemplos_parte_1/" target="_blank">aquí</a> o <a href="http://www.chuidiang.com/java/tablas/tablamodelo/tablamodelo.php" target="_blank">aquí</a>) por lo que sólo me voy a centrar en cómo «rellenarla» con datos.</p>
<p><span id="more-519"></span></p>
<p style="text-align: justify;">Si le has echado un vistazo a los enlaces anteriores habrás visto que asociado al concepto de Tabla está el de Modelo de tabla (del inglés Table Model). Resumiendo, un modelo no es más que una manera de simplificar el acceso a contenido tabular (la típica tabla de datos). De esta manera la tabla queda independiente de la forma en la que se guardan los datos. Como se puede observar en la siguiente imagen JTable no tiene ni idea de la clase que implementa la interfaz TableModel. Lo único que le interesa es que alguien le proporcione los datos, y para ello invoca los métodos de la interfaz que estarán implementados en alguna de las subclases.</p>
<p><a href="http://miguelangelguillen.es/wp-content/uploads/2010/01/Diagrama-de-Clases11.jpg"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-529" title="JTable y TableModel" src="http://miguelangelguillen.es/wp-content/uploads/2010/01/Diagrama-de-Clases11-300x228.jpg" alt="Estructura de clases para una JTable y su TableModel" width="300" height="228" srcset="http://miguelangelguillen.es/wp-content/uploads/2010/01/Diagrama-de-Clases11-300x228.jpg 300w, http://miguelangelguillen.es/wp-content/uploads/2010/01/Diagrama-de-Clases11.jpg 303w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p style="text-align: center;">
<p style="text-align: justify;">¿Qué vamos a hacer nosotros? Pues muy fácil, crear una subclase de DefaultTableModel y sobreescribir los métodos necesarios para que devuelva los datos que nosotros tenemos guardados en un ArrayList. La JTable invocará los métodos que necesite para mostrar los datos pero no se ejecutará la implementación de DefaultTableModel si no el código que nosotros hemos realizado. La estructura de clases quedará de la siguiente forma:</p>
<p style="text-align: justify;"><a href="http://miguelangelguillen.es/wp-content/uploads/2010/01/Diagrama-de-Clases-2.jpg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-530" title="Clase MiTableModel que hereda de DefaultTableModel" src="http://miguelangelguillen.es/wp-content/uploads/2010/01/Diagrama-de-Clases-2.jpg" alt="Estructura de clases para MiTableModel" width="129" height="149" /></a></p>
<p style="text-align: justify;">Para que el ejemplo quede un poco más «interesante» he creado una interfaz gráfica donde se muestra un JComboBox con un listado de clientes; de tal forma que al seleccionar uno de ellos se muestren las ventas realizadas por él. Para guardar el listado de ventas de cada cliente se ha utilizado una tabla hash donde cada entrada (identificada por el DNI) contiene un ArrayList con objetos de la clase Venta.</p>
<p style="text-align: justify;">Una vez que sabemos donde guardar el listado de ventas de un cliente ya sólo nos queda mostrarlo en la tabla. Como se ha comentado anteriormente lo único que tenemos que hacer es sobreescribir una serie de métodos de DefaultTableModel en MiTableModel. Veamos cuales:</p>
<p style="text-align: justify; padding-left: 30px;"><em>getColumnCount</em>: nos devuelve el número de columnas del modelo. Ya que el listado de columnas está definido en el array <em>nombreColumnas</em> en la <em>VentanaPrincipal</em>, sólo tendremos que obtener el tamaño de este.</p>
<p style="text-align: justify; padding-left: 30px;"><em>getColumnName(int column)</em>: nos devuelve el nombre de una columna. Para obtenerlo sólo tenemos que recuperar del array <em>nombreColumnas</em> el valor de la posición indicada por parámetro &#8216;column&#8217;.</p>
<p style="text-align: justify; padding-left: 30px;"><em>getRowCount</em>: devuelve el número de filas del modelo,  que en este caso se corresponden con el listado de ventas del cliente. Dicho listado se encuentra en la tabla hash <em>listadoVentasCliente</em> en la <em>VentanaPrincipal</em>.</p>
<p style="text-align: justify; padding-left: 30px;"><em>getValueAt(int row, int column)</em>: devuelve el valor para una celda en concreto identificada por su fila y columna. La primera es la posición row dentro del listado de ventas del cliente y la segunda es el valor de uno de los atributos del objeto Venta.</p>
<p style="text-align: justify; padding-left: 30px;"><em>isCellEditable</em>: devuelve false siempre. Esto hace que la celda no sea editable.</p>
<p style="text-align: justify;">El código comentado de la clase MiTableModel se encuentra dentro del proyecto Eclipse que os dejo en <a href="http://miguelangelguillen.es/wp-content/uploads/2010/01/RellenarTabla.zip">Rellenar Tabla</a>.</p>
<p style="text-align: justify;">La estructura de clases ha quedado de la siguiente forma.</p>
<p style="text-align: justify;"><a href="http://miguelangelguillen.es/wp-content/uploads/2010/01/Diagrama-de-Clases-Aplicacion.jpg"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-533" title="Diagrama de Clases Aplicacion" src="http://miguelangelguillen.es/wp-content/uploads/2010/01/Diagrama-de-Clases-Aplicacion-300x173.jpg" alt="Estructura de clases de la aplicación" width="300" height="173" srcset="http://miguelangelguillen.es/wp-content/uploads/2010/01/Diagrama-de-Clases-Aplicacion-300x173.jpg 300w, http://miguelangelguillen.es/wp-content/uploads/2010/01/Diagrama-de-Clases-Aplicacion.jpg 517w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p style="text-align: justify;">He utilizado la versión 1.6 de Java.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://miguelangelguillen.es/?feed=rss2&#038;p=519</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Elementos en un JComboBox</title>
		<link>http://miguelangelguillen.es/?p=500</link>
					<comments>http://miguelangelguillen.es/?p=500#comments</comments>
		
		<dc:creator><![CDATA[Miguel Angel]]></dc:creator>
		<pubDate>Mon, 14 Dec 2009 23:58:14 +0000</pubDate>
				<category><![CDATA[POO]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[JComboBox]]></category>
		<category><![CDATA[JFrame]]></category>
		<guid isPermaLink="false">http://miguelangelguillen.es/?p=500</guid>

					<description><![CDATA[Una pregunta muy común en los alumnos cuando se inician en la secta Java es cómo «rellenar» de elementos un JComboBox. Si visitamos el API de Java vemos que el método necesario para añadirlos es &#8216;addItem&#8216;. Siendo la primera tentación pasarle como parámetro un String con el titulo a mostrar. Esto es correcto ya que [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Una pregunta muy común en los alumnos cuando se inician en la secta Java es cómo «rellenar» de elementos un <em><a href="http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JComboBox.html" target="_blank">JComboBox</a></em>. Si visitamos el API de Java vemos que el método necesario para añadirlos es &#8216;<a href="http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JComboBox.html#addItem(java.lang.Object)" target="_blank">addItem</a>&#8216;. Siendo la primera tentación pasarle como parámetro un <em>String</em> con el titulo a mostrar. Esto es correcto ya que <em>String</em>, como cualquier clase en Java, hereda de <em>Object</em> y, por tanto, es un parámetro válido.</p>
<p>Pero&#8230; si <a href="http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JComboBox.html#addItem(java.lang.Object)" target="_blank">la declaración del método <em>addItem</em></a> nos indica que podemos pasar por parámetro un objeto de la clase <em>Object</em> (o una subclase de esta, como <em>String</em>), ¿por qué no pasar un objeto de una clase creada por nosotros y, de esta forma, utilizar un <em>JComboBox</em> de forma similar a un <em>Vector</em>, como una colección de objetos?</p>
<p>Por ejemplo, pensemos que tenemos una aplicación que gestiona productos de cualquier tipo y queremos que al seleccionar un producto obtengamos los datos de dicho producto para mostrarlos por pantalla. Lo interesante sería guardar los objetos de la clase <em>Producto</em> dentro de combo y seleccionar el deseado.</p>
<p>La forma de actuar es sencilla&#8230; añadir los objetos de <em>Producto</em> en el combo.</p>
<p><span id="more-500"></span>Producto producto = new Producto(parámetros);</p>
<p>JComboBox jcb = new JComboBox();</p>
<p>jcb.addItem(producto);</p>
<p>y, cuando lo necesitemos, recuperar el producto seleccionado</p>
<p>Producto productoSeleccionado = (Producto) jcb.getSelectedItem();</p>
<p>Hasta aquí todo correcto pero&#8230; al cargar el listado de objetos en el combo vemos que el titulo mostrado es similar a este: &#8216;paquete1.paquete2.Producto@idDelObjeto&#8217;. Y surge la duda: ¿podemos cambiar el texto mostrado? Evidentemente la respuesta es sí. Lo único que hay que hacer es sobreescribir en la clase <em>Producto</em> el método <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#toString%28%29" target="_blank"><em>toString</em></a> de <em>Object</em>. Recordemos que esta clase es de la que heredan de manera implícita todas las clases en Java. Por tanto, sólo tendremos que añadir este método en <em>Producto</em>:</p>
<p>public String toString(){</p>
<p style="padding-left: 30px;">return «nuevo texto»;</p>
<p>}</p>
]]></content:encoded>
					
					<wfw:commentRss>http://miguelangelguillen.es/?feed=rss2&#038;p=500</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Fichero de propiedades en Java</title>
		<link>http://miguelangelguillen.es/?p=490</link>
					<comments>http://miguelangelguillen.es/?p=490#respond</comments>
		
		<dc:creator><![CDATA[Miguel Angel]]></dc:creator>
		<pubDate>Mon, 14 Dec 2009 22:32:52 +0000</pubDate>
				<category><![CDATA[POO]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Properties]]></category>
		<guid isPermaLink="false">http://miguelangelguillen.es/?p=490</guid>

					<description><![CDATA[Una de las funcionalidades más solicitadas en Java es la utilización de un fichero de propiedades. Este tipo de ficheros se suele utilizar para guardar parámetros de configuración del sistema. Por ejemplo, rutas, nombres de ficheros, mensajes, &#8230; Su estructura es: clave1 = valor1 clave2 = valor2 &#8230;. Veámos como podemos acceder fácilmente a cada uno de esos valores. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Una de las funcionalidades más solicitadas en Java es la utilización de un fichero de propiedades. Este tipo de ficheros se suele utilizar para guardar parámetros de configuración del sistema. Por ejemplo, rutas, nombres de ficheros, mensajes, &#8230; Su estructura es:</p>
<p>clave1 = valor1</p>
<p>clave2 = valor2</p>
<p>&#8230;.</p>
<p>Veámos como podemos acceder fácilmente a cada uno de esos valores.</p>
<p><span id="more-490"></span></p>
<p>(Supongo que ya tenemos creado en Eclipse un proyecto Java)</p>
<ol>
<li>Creamos en la raíz del proyecto el fichero de propiedades «ficheroPropiedades.properties».</li>
<li>Rellenamos este con los valores que se desee, por ejemplo nombre=Miguel Ángel Guillén.</li>
<li>Creamos una nueva clase FicheroPropiedades dentro del paquete ucam.clase4</li>
<li>Dentro del método «main» destacamos el siguiente código</li>
</ol>
<p>//Nombre del fichero que contiene las propiedades.</p>
<p>String nombreFichero = «ficheroPropiedades.properties»;</p>
<p>//Objeto de la clase Properties donde se carga el listado de propiedades que hay en el fichero de propiedades.</p>
<p>Properties prop = new Properties();</p>
<p>//Se cargan las propiedades en el objeto &#8216;prop&#8217;. Como el método &#8216;load&#8217; espera un objeto de una clase que herede de  <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/Properties.html" target="_blank">InputStream</a> utilizamos <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/io/FileInputStream.html" target="_blank">FileInputStream</a>. De esta forma se puede leer del fichero ya que FileInputStream se encarga de ello.</p>
<p>prop.load(new FileInputStream(nombreFichero));</p>
<p>//Recuperamos el valor de la propiedad &#8216;nombre&#8217; y lo mostramos por la salida estándar.</p>
<p>System.out.println(«Propiedad: «+prop.getProperty(«nombre»));</p>
<p>Al ejecutar este código se mostrará por pantalla el texto «Miguel Ángel Guillén», que es el valor de propiedad «nombre».</p>
<p>Adjunto un zip que incluye el proyecto Eclipse con el código de esta entrada (<a href="../wp-content/uploads/2009/12/inicioWorkspace.zip">Workspace Properties</a>).<a href="http://miguelangelguillen.es/wp-content/uploads/2009/12/inicioWorkspace.zip"></a></p>
]]></content:encoded>
					
					<wfw:commentRss>http://miguelangelguillen.es/?feed=rss2&#038;p=490</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>No al recorte del presupuesto de I+D</title>
		<link>http://miguelangelguillen.es/?p=478</link>
					<comments>http://miguelangelguillen.es/?p=478#comments</comments>
		
		<dc:creator><![CDATA[Miguel Angel]]></dc:creator>
		<pubDate>Wed, 07 Oct 2009 06:00:07 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[I+D]]></category>
		<guid isPermaLink="false">http://miguelangelguillen.es/?p=478</guid>

					<description><![CDATA[Esta mañana mi compañero de departamento Jesús Soto me ha hablado sobre una iniciativa para protestar por el recorte previsto por el Gobierno en la inversión en I+D. La idea me ha parecido muy buena y por eso incluyo esta entrada pero me gustaría lanzar una pregunta al respecto: ¿Es lógica la propuesta de mantener [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="http://miguelangelguillen.es/wp-content/uploads/2009/10/cienciaRecortes.jpg"><img loading="lazy" decoding="async" class="alignleft size-medium wp-image-479" title="cienciaRecortes" src="http://miguelangelguillen.es/wp-content/uploads/2009/10/cienciaRecortes-300x300.jpg" alt="cienciaRecortes" width="228" height="228" srcset="http://miguelangelguillen.es/wp-content/uploads/2009/10/cienciaRecortes-300x300.jpg 300w, http://miguelangelguillen.es/wp-content/uploads/2009/10/cienciaRecortes-150x150.jpg 150w, http://miguelangelguillen.es/wp-content/uploads/2009/10/cienciaRecortes.jpg 567w" sizes="(max-width: 228px) 100vw, 228px" /></a> Esta mañana mi compañero de departamento <a href="http://jesussoto.es/" target="_blank">Jesús Soto</a> me ha hablado sobre <a href="http://aldea-irreductible.blogspot.com/2009/10/la-ciencia-en-espana-no-necesita.html" target="_self">una iniciativa</a> para protestar por el recorte previsto por el Gobierno en la inversión en I+D. La idea me ha parecido muy buena y por eso incluyo esta entrada pero me gustaría lanzar una pregunta al respecto: ¿Es lógica la propuesta de mantener el gasto en I+D en tiempos de crisis cuando, a medio plazo, falte dinero para pagar servicios sociales como el subsidio por desempleo o la sanidad?</p>
<p>La respuesta sería no siempre y cuando se hiciera lo propio con otros servicios, por ejemplo los seiscientos y pico consejeros del presidente, los ministerios de desigualdad y política territorial, el sueldo de sus señorías, &#8230; y un largo etcétera al que todos podríamos añadir algo.</p>
<p>Desde otro punto de vista, se puede argumentar que el gasto en I+D hay que mantenerlo en tiempos de crisis como caldo de cultivo para salir de ella. Yo me inclino más hacia esta postura, aunque tendría que haber un listado de proyectos subvencionados en el que se incluya el gasto y los resultados obtenidos; así como una dirección de correo electrónico para poder pedirles explicaciones si se han gastado mi dinero en algo ridículo. No está la cosa para ir tirando el dinero.</p>
<p>En fin&#8230; que si ZP no se recorta el sueldo y tampoco se quita consejeros lo menos que podría hacer es mantener el gasto en I+D para intentar salir de la crisis con nuevas iniciativas y no sólo pagando<a href="https://ssweb.map.es/infofondolocal/info_ciudadanos/listado_detalles_ciudadanos.php" target="_blank"> reformas de parques y jardines</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://miguelangelguillen.es/?feed=rss2&#038;p=478</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
