<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>El blog de Miguel Ángel Guillén</title>
	
	<link>http://miguelangelguillen.es</link>
	<description>Algo más que TICs</description>
	<lastBuildDate>Mon, 10 May 2010 20:51:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/maguillen" /><feedburner:info uri="maguillen" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Interfaz gráfica de usuario con Java</title>
		<link>http://feedproxy.google.com/~r/maguillen/~3/vP9ZazWrcik/</link>
		<comments>http://miguelangelguillen.es/2010/03/21/interfaz-grafica-de-usuario-con-java/#comments</comments>
		<pubDate>Sat, 20 Mar 2010 23:24:41 +0000</pubDate>
		<dc:creator>Miguel Angel</dc:creator>
				<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 &#8220;Abstract Window Toolkit&#8221; (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 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://miguelangelguillen.es/wp-content/uploads/2010/03/duke1.gif"><img 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 &#8220;Abstract Window Toolkit&#8221; (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 &#8220;creaciones&#8221; se &#8220;vean&#8221; igual en cualquier plataforma, esto con AWT no es posible <img src='http://miguelangelguillen.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>En estas apareció Swing para solucionar estos &#8220;problemas&#8221;. ¿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 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" /></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 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/2010/03/21/interfaz-grafica-de-usuario-con-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://miguelangelguillen.es/2010/03/21/interfaz-grafica-de-usuario-con-java/</feedburner:origLink></item>
		<item>
		<title>Eclipse: instalación y primera clase</title>
		<link>http://feedproxy.google.com/~r/maguillen/~3/4sQ0wzgSLsQ/</link>
		<comments>http://miguelangelguillen.es/2010/03/06/eclipse-instalacion-y-primera-clase/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 12:27:24 +0000</pubDate>
		<dc:creator>Miguel Angel</dc:creator>
				<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 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://miguelangelguillen.es/wp-content/uploads/2010/03/eclipse-galileo.png"><img 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" /></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 <img src='http://miguelangelguillen.es/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> , 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/2010/03/06/eclipse-instalacion-y-primera-clase/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://miguelangelguillen.es/2010/03/06/eclipse-instalacion-y-primera-clase/</feedburner:origLink></item>
		<item>
		<title>Rellenar una tabla en Java</title>
		<link>http://feedproxy.google.com/~r/maguillen/~3/dUPFqiyYG5o/</link>
		<comments>http://miguelangelguillen.es/2010/01/12/rellenar-una-tabla-en-java/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 13:09:56 +0000</pubDate>
		<dc:creator>Miguel Angel</dc:creator>
				<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, en [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://miguelangelguillen.es/wp-content/uploads/2010/01/java_logo.gif"><img 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 &#8220;rellenarla&#8221; 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 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" /></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 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 &#8220;interesante&#8221; 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 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" /></a></p>
<p style="text-align: justify;">He utilizado la versión 1.6 de Java.</p>
]]></content:encoded>
			<wfw:commentRss>http://miguelangelguillen.es/2010/01/12/rellenar-una-tabla-en-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://miguelangelguillen.es/2010/01/12/rellenar-una-tabla-en-java/</feedburner:origLink></item>
		<item>
		<title>Elementos en un JComboBox</title>
		<link>http://feedproxy.google.com/~r/maguillen/~3/Lu7TE7-ZqgE/</link>
		<comments>http://miguelangelguillen.es/2009/12/15/elementos-en-un-jcombobox/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 23:58:14 +0000</pubDate>
		<dc:creator>Miguel Angel</dc:creator>
				<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 &#8220;rellenar&#8221; 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 [...]]]></description>
			<content:encoded><![CDATA[<p>Una pregunta muy común en los alumnos cuando se inician en la secta Java es cómo &#8220;rellenar&#8221; 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 &#8220;nuevo texto&#8221;;</p>
<p>}</p>
]]></content:encoded>
			<wfw:commentRss>http://miguelangelguillen.es/2009/12/15/elementos-en-un-jcombobox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://miguelangelguillen.es/2009/12/15/elementos-en-un-jcombobox/</feedburner:origLink></item>
		<item>
		<title>Fichero de propiedades en Java</title>
		<link>http://feedproxy.google.com/~r/maguillen/~3/_Ug9M5R3a74/</link>
		<comments>http://miguelangelguillen.es/2009/12/15/fichero-de-propiedades-en-java/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 22:32:52 +0000</pubDate>
		<dc:creator>Miguel Angel</dc:creator>
				<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.

(Supongo que ya tenemos creado [...]]]></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 &#8220;ficheroPropiedades.properties&#8221;.</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 &#8220;main&#8221; destacamos el siguiente código</li>
</ol>
<p>//Nombre del fichero que contiene las propiedades.</p>
<p>String nombreFichero = &#8220;ficheroPropiedades.properties&#8221;;</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(&#8220;Propiedad: &#8220;+prop.getProperty(&#8220;nombre&#8221;));</p>
<p>Al ejecutar este código se mostrará por pantalla el texto &#8220;Miguel Ángel Guillén&#8221;, que es el valor de propiedad &#8220;nombre&#8221;.</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/2009/12/15/fichero-de-propiedades-en-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://miguelangelguillen.es/2009/12/15/fichero-de-propiedades-en-java/</feedburner:origLink></item>
		<item>
		<title>No al recorte del presupuesto de I+D</title>
		<link>http://feedproxy.google.com/~r/maguillen/~3/Krp_cq2zBHg/</link>
		<comments>http://miguelangelguillen.es/2009/10/07/no-al-recorte-del-presupuesto-de-id/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 06:00:07 +0000</pubDate>
		<dc:creator>Miguel Angel</dc:creator>
				<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 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://miguelangelguillen.es/wp-content/uploads/2009/10/cienciaRecortes.jpg"><img 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" /></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/2009/10/07/no-al-recorte-del-presupuesto-de-id/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://miguelangelguillen.es/2009/10/07/no-al-recorte-del-presupuesto-de-id/</feedburner:origLink></item>
		<item>
		<title>Prácticas de la programación extrema</title>
		<link>http://feedproxy.google.com/~r/maguillen/~3/KneW_awLWxw/</link>
		<comments>http://miguelangelguillen.es/2009/09/23/practicas-de-la-programacion-extrema/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 18:56:48 +0000</pubDate>
		<dc:creator>Miguel Angel</dc:creator>
				<category><![CDATA[Asignaturas]]></category>
		<category><![CDATA[ISW II]]></category>
		<category><![CDATA["programación extrema"]]></category>

		<guid isPermaLink="false">http://miguelangelguillen.es/?p=466</guid>
		<description><![CDATA[

El otro día en clase estuvimos hablando sobre los métodos ágiles y, entre ellos, de la programación extrema. Quedó pendiente que los alumnos buscaran información sobre las 12 prácticas que este proceso de desarrollo establece. A petición de ellos pongo el listado pero con la condición de crear otra entrada con las conclusiones obtenidas  [...]]]></description>
			<content:encoded><![CDATA[<div>
<div><!--  --></div>
<div>El otro día en clase estuvimos hablando sobre los <a href="http://es.wikipedia.org/wiki/Desarrollo_%C3%A1gil_de_software" target="_blank">métodos ágiles</a> y, entre ellos, de la <a href="http://www.extremeprogramming.org/" target="_blank">programación extrema</a>. Quedó pendiente que los alumnos buscaran información sobre las 12 prácticas que este proceso de desarrollo establece. A petición de ellos pongo el listado pero con la condición de crear otra entrada con las conclusiones obtenidas <img src='http://miguelangelguillen.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </div>
<div><span id="more-466"></span></div>
<p><br/><br />
Retroalimentación a escala fina</p>
<ul>
<li>Desarrollo guiado por pruebas</li>
<li>Juego Planificación</li>
<li>On site Customer</li>
<li>Programación en parejas.</li>
</ul>
<p>Proceso continuo en lugar de por lotes</p>
<ul>
<li>Integración continúa</li>
<li>Recodificación</li>
<li>Pequeñas versiones</li>
</ul>
<ul>
<li>Diseño simple</li>
<li>Metáfora del sistema</li>
<li>Propiedad colectiva código</li>
<li>Estándares de codificación</li>
</ul>
<p>Bienestar del programador</p>
<ul>
<li>Semana de 40 horas</li>
</ul>
</div>
<p><br/></p>
]]></content:encoded>
			<wfw:commentRss>http://miguelangelguillen.es/2009/09/23/practicas-de-la-programacion-extrema/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://miguelangelguillen.es/2009/09/23/practicas-de-la-programacion-extrema/</feedburner:origLink></item>
		<item>
		<title>Conectarse a MySQL en Tomcat</title>
		<link>http://feedproxy.google.com/~r/maguillen/~3/-tqJHmjIuPg/</link>
		<comments>http://miguelangelguillen.es/2009/05/08/conectarse-a-mysql-en-tomcat/#comments</comments>
		<pubDate>Fri, 08 May 2009 14:37:24 +0000</pubDate>
		<dc:creator>Miguel Angel</dc:creator>
				<category><![CDATA[DAD]]></category>
		<category><![CDATA[Informática]]></category>
		<category><![CDATA[Tecnología]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[conexión]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://miguelangelguillen.es/?p=433</guid>
		<description><![CDATA[Existen varias opciones a la hora de conectarse desde una aplicación Tomcat a una base de datos .
Nosotros lo haremos contra una base de datos MySQL. Y para ello necesitaremos el driver que descargaremos de la web de MySQL. Sólo hay que copiar el fichero mysql-connector-java*.jar en el directorio WEB-INF/lib/.
Veamos dos formas diferentes de realizar [...]]]></description>
			<content:encoded><![CDATA[<p>Existen varias opciones a la hora de conectarse desde una aplicación Tomcat a una base de datos .</p>
<p>Nosotros lo haremos contra una base de datos MySQL. Y para ello necesitaremos el driver que descargaremos de <a href="http://dev.mysql.com/downloads/connector/j/5.1.html" target="_blank">la web de MySQL</a>. Sólo hay que copiar el fichero mysql-connector-java*.jar en el directorio WEB-INF/lib/.</p>
<p>Veamos dos formas diferentes de realizar una conexión. Aunque nos quedaremos con la segunda siempre es bueno conocer otras opciones menos válidas y saber los motivos.</p>
<p><strong>Opción 1: En el servlet Control</strong></p>
<ol>
<li>Creamos un atributo para la conexión
<ul>
<li>private Connection Conexion = null;</li>
</ul>
</li>
<li>Creamos un método estático getConexion que devuelva una conexión con la base de datos, creándola si no existe.</li>
<li>Sobreescribimos el método destroy para asegurarnos que se cierra la conexión con la base de datos una vez que se destruye el servlet.</li>
</ol>
<p><span id="more-433"></span></p>
<p>Esta opción tiene algunos inconvenientes:</p>
<ul>
<li>La conexión puede quedarse abierta hasta que se destruye el servlet. La solución sería cerrarla cada vez que terminamos de hacer una transacción pero esto conlleva abrir y cerrar varias veces en una misma petición si se realizan varias consultas.</li>
<li>No tenemos control sobre la conexión si se produce una excepción.</li>
<li>Son las clases que hacen uso de la conexión las encargadas de abrir y cerrar. Esto no es del todo correcto.</li>
<li>Y el más importante. Estamos utilizando un atributo y un método estáticos y, por tanto, la conexión es compartida por peticiones.</li>
</ul>
<p><strong>Opción 2: Utilizando un hilo local</strong></p>
<p>Si queremos solucionar el último inconveniente debemos utilizar hilos locales. ¿Como se hace eso? Muy fácil. (<a href="http://www.ibm.com/developerworks/java/library/j-threads3.html" target="_blank">Esta página</a> lo explica).</p>
<p>Como en otras ocasiones, os dejo el fichero de la clase (<a href="http://miguelangelguillen.es/wp-content/uploads/2009/05/singleton.java">ucam.servlets.Singleton</a>) que hace uso de esta funcionalidad y hago unos comentarios sobre el código.</p>
<p>Lo primero que cabe destacar es que dentro de la propia clase <em>Singleton</em> se ha declarado otra,  <em>ThreadLocalConnection</em>, que hereda de <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ThreadLocal.html" target="_blank"><em>ThreadLocal</em></a>. ¿Que se consigue con esto? Encapsular un Object (o cualquier subclase de esta) y devolver una instancia distinta dependiendo del <em>ObjectId</em> del objeto que la solicita. Es decir, si la clase <em>ThreadLocalConnection</em> guarda un objeto de la clase <em>Connection</em>, dependiendo del objeto que invoque el método <em>get</em> de la primera, esta devolverá una instancia u otra de la segunda. Y, por tanto, dos conexiones diferentes.</p>
<p>Esto es válido para Tomcat ya que el objeto <em>HttpServletRequest</em> que representa la petición es distinto para cada una de ellas. Así, al hacer <em>get</em> sobre <em>ThreadLocalConnection</em> obtendremos un objeto conexión diferente para cada petición.</p>
<p>Bueno&#8230; eso no es del todo cierto ya que Tomcat reutiliza los objetos que representan las peticiones. Es decir, el servidor tiene varias instancias de la clase <a href="http://tomcat.apache.org/tomcat-4.0-doc/catalina/docs/api/org/apache/catalina/connector/HttpRequestFacade.html" target="_blank"><em>RequestFacade</em></a> (que encapsula el objeto <a href="http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpServletRequest.html" target="_blank"><em>HttpServletRequest</em></a> implementación de <a href="ServletRequest" target="_blank"><em>ServletRequest</em></a>) y cuando le llega una petición coge una y la pasa como parámetro al servlet. Nuestro esquema sigue funcionando ya que a Tomcat nunca se le ocurre utilizar el mismo objeto petición para dos peticiones concurrentes. Por lo que al hacer <em>Singleton.getConexion()</em> lo estamos haciendo desde objetos diferentes y <em>ThreadLocal </em>devolverá conexiones distintas.</p>
<p>Es importante utilizar un filtro y así hacer commit o rollback al terminar la petición. Como se reutiliza el objeto petición y, por tanto el objeto conexión, todas las operaciones de peticiones anteriores habrán sido confirmadas o eliminadas. Esto lo mejoraremos más adelante utilizando un pool de conexiones. Este es el código para la clase <a href="http://miguelangelguillen.es/wp-content/uploads/2009/05/filtroconexion.java">ucam.filtros.FiltroConexion</a>. Como se puede observar se cierra la conexión si esta fue abierta haciendo previamente commit o rollback.</p>
<p>El segundo punto a destacar es que se ha creado un atributo de la clase <em>ThreadLocalConnection</em> que será utilizado en el método <em>getConexion</em> para recuperar el objeto <em>Connection</em> que encapsula.</p>
<p>El método <em>getConexion</em> devuelve una conexión a la base de datos. Primero comprueba que existe una instancia de <em>ThreadLocalConnection</em> y si no la crea. Una vez que ya disponemos de la instancia lo que hacemos es solicitar, mediante el método <em>get</em>, el objeto de <em>Connection</em>. Que, como ya hemos comentado, será diferente para cada objeto petición. Por ejemplo, al hacer <em>Singleton.getConexion()</em> en un modelo que se está ejecutando desde una petición con id 45 el <em>ThreadLocalConnection</em> devolverá una instancia de <em>Connection</em>. Mientras que para un modelo sobre la instancia con id 12 devolverá otra.</p>
<p>Un punto importante dentro de <em>getConexion</em> es que se comprueba que la conexión no esté cerrada o sea null. Es decir, peticiones anteriores la cerraron. En cuyo caso se guarda la conexión mediante el método <em>set</em>. Al cual se le pasa como parámetro la instancia que devuelve el método <em>initialValue</em>. Este es invocado cada vez que se inicia una nueva instancia del objeto contenido en <em>ThreadLocal</em>.</p>
<p><strong>Utilizar un pool de conexiones</strong></p>
<p>Junto con las dos opciones anteriores se puede utilizar un sistema que gestione las conexiones en vez de crear una nueva cada vez. De tal forma que nuestra aplicación vaya a él, pida una conexión y, si hay alguna disponible, se la sirva.</p>
<p>Con esto se mejora el rendimiento ya que la conexión está disponible y no hay que estar abriendo y cerrándola. Es importante destacar que cuando desde la aplicación invocamos el método <em>close</em> realmente no se cierra si no que vuelve al pool y pasa a estar disponible para otra petición.</p>
<p>¿Como lo vamos a hacer? En Tomcat se utiliza un recurso de tipo fuente de datos (<em>DataSource</em>).</p>
<p><span style="text-decoration: underline;">Utilizar un recurso</span></p>
<p>El código necesario para declarar un recurso es:</p>
<p style="padding-left: 30px;"><span class="m">&lt;</span><span class="t">Resource</span> <span class="t">name</span><span class="m">=&#8221;</span>jdbc/miServidor<span class="m">&#8220;</span><span class="t"> auth</span><span class="m">=&#8221;</span>Container<span class="m">&#8220;</span><span class="t"> type</span><span class="m">=&#8221;</span>javax.sql.DataSource<span class="m">&#8220;</span><span class="t"> driverClassName</span><span class="m">=&#8221;</span>org.gjt.mm.mysql.Driver<span class="m">&#8220;</span><span class="t"> url</span><span class="m">=&#8221;</span>jdbc:mysql://localhost:3306/sia<span class="m">&#8220;</span><span class="t"> username</span><span class="m">=&#8221;</span><span class="m">&#8220;</span><span class="t"> password</span><span class="m">=&#8221;</span><span class="m">&#8220;</span><span class="t"> maxActive</span><span class="m">=&#8221;</span>20<span class="m">&#8220;</span><span class="t"> maxIdle</span><span class="m">=&#8221;</span>10<span class="m">&#8220;</span><span class="t"> maxWait</span><span class="m">=&#8221;</span>-1<span class="m">&#8220;</span><span class="t"> defaultAutoCommit</span><span class="m">=&#8221;</span>false<span class="m">&#8221;  removeAbandoned=&#8221;true&#8221; removeAbandonedTimeout=&#8221;20&#8243; </span><span class="m">/&gt;</span></p>
<p>NOTA: cuidado al copiar y pegar. La codificación de las comillas no es correcta y puede producirse un error al arrancar Tomcat. Si esto sucede borrar y volver a poner todas las comillas dobles.</p>
<p>De entre todos los parámetros caben destacar:</p>
<ul>
<li><strong>maxActive</strong>: El número máximo de conexiones activas que puede haber en el pool. Si se supera no se sirven más peticiones hasta que se libere alguna de las ocupadas.</li>
<li><strong>maxIdle:</strong> El número máximo de conexiones  que estarán esperando a ser asignadas. Deberá de ser menor que el anterior.</li>
<li><strong>maxWait</strong>: El número de milisegundos que se esperará a que la aplicación devuelva la conexión antes de lanzar una excepción.</li>
<li><span class="m"><strong>removeAbandoned:</strong> Activar/Desactivar la funcionalidad para que Tomcat considere automaticamente que una conexión ha sido abandonada.</span></li>
<li><span class="m"><strong>removeAbandonedTimeout:</strong> El número de segundos que espera el pool para considerar una conexión como abandonada.<br />
</span></li>
</ul>
<p>Y tenemos diferentes sitios donde incluirlo:</p>
<ul>
<li>En el <em>server.xml</em> del servidor (no de la aplicación, está en la carpeta /tomcat/conf/) buscar la etiqueta (&#8220;context&#8221;) donde se declara el contexto de nuestra aplicación  e incluirla como una subetiqueta.</li>
<li>Si está, en el fichero nombreAplicacion.xml que hay en /tomcat/conf/Catalina/localhost/.</li>
</ul>
<p>Para el primer caso se puede hacer directamente en Eclipse:</p>
<ol>
<li>Botón derecho sobre el nombre del proyecto, Propiedades -&gt; Tomcat</li>
<li>En la pestaña General dentro del área de texto &#8220;Información Extra&#8221; incluimos el texto donde se declara el recurso.</li>
<li>Botón Aplicar y OK.</li>
<li>Nuevamente botón derecho sobre el nombre del proyecto, Tomcat project -&gt; Update context definition.</li>
<li>Copiamos el .jar con el driver de MySQL en el directorio TOMCAT_HOME/lib.</li>
</ol>
<p><span class="m">Por eso en la clase <em>Singleton</em> aparece este código:<br />
</span></p>
<p style="padding-left: 30px;"><span class="m">Context context = new InitialContext();</span></p>
<p style="padding-left: 30px;"><span class="m">DataSource dataSource = (DataSource) context.lookup(&#8220;java:comp/env/jdbc/miServidor&#8221;);</span></p>
<p style="padding-left: 30px;"><span class="m">connection = dataSource.getConnection();</span></p>
<p>siendo &#8220;jdbc/miServidor&#8221; el texto que hemos puesto al declarar el recurso.</p>
<p><span class="m">Cuando desde el modelo o en nuestro caso desde el Singleton se haga <em>connection.close()</em> la conexión quedará disponible para futuras peticiones.<br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://miguelangelguillen.es/2009/05/08/conectarse-a-mysql-en-tomcat/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://miguelangelguillen.es/2009/05/08/conectarse-a-mysql-en-tomcat/</feedburner:origLink></item>
		<item>
		<title>Filtrar peticiones en Tomcat</title>
		<link>http://feedproxy.google.com/~r/maguillen/~3/buF3hhT9FWY/</link>
		<comments>http://miguelangelguillen.es/2009/05/07/filtrar-peticiones-en-tomcat/#comments</comments>
		<pubDate>Thu, 07 May 2009 15:37:59 +0000</pubDate>
		<dc:creator>Miguel Angel</dc:creator>
				<category><![CDATA[DAD]]></category>
		<category><![CDATA[Informática]]></category>
		<category><![CDATA[filtro]]></category>
		<category><![CDATA[petición]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://miguelangelguillen.es/?p=422</guid>
		<description><![CDATA[Muchas veces puede ser necesario filtrar todas las peticiones que se hacen a un servlet para realizar operaciones de control antes y después de la misma. Por ejemplo, controlar la conexión con la base de datos.
¿Y como se hace esto en Tomcat? Pues lo de siempre, una clase que implementa una interfaz y un cambio [...]]]></description>
			<content:encoded><![CDATA[<p>Muchas veces puede ser necesario filtrar todas las peticiones que se hacen a un servlet para realizar operaciones de control antes y después de la misma. Por ejemplo, controlar la conexión con la base de datos.<br />
¿Y como se hace esto en Tomcat? Pues lo de siempre, una clase que implementa una interfaz y un cambio en la configuración del <em>web.xml</em> para que filtre las peticiones a un servlet. Vamos por partes&#8230;</p>
<p><span id="more-422"></span></p>
<p><strong>Crear el filtro</strong></p>
<p>Para crear un filtro debemos implementar la interfaz <em>javax.servlet.Filter</em>.</p>
<ol>
<li>Creamos el paquete ucam.filtros</li>
<li>Añadimos una nueva clase FiltroConexion que implemente la interfaz Filter
<ol>
<li>Si estamos utilizando Eclipse automáticamente aparecen los métodos init, destroy y doFilter. En <a href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/Filter.html" target="_blank">el API</a> está toda la información sobre cuando se ejecuta cada uno de ellos.</li>
</ol>
</li>
<li>En el método doFilter ponemos:</li>
</ol>
<p style="text-align: justify; padding-left: 60px;">System.out.println(&#8220;Filtrando conexion&#8221;);</p>
<p style="text-align: justify; padding-left: 60px;">arg2.doFilter(arg0, arg1);</p>
<p style="text-align: justify; padding-left: 60px;">System.out.println(&#8220;Final de la petición&#8221;);</p>
<p style="text-align: justify;">La segunda sentencia se pone para que siga la ejecución de la petición. En teoría puedes encadenar distintos filtros.</p>
<p><strong>Configurar web.xml</strong></p>
<p>Ahora hay que &#8220;decirle&#8221; a nuestra aplicación que filtre todas las peticiones que vayan al servlet Control. Para lo cual añadimos el siguiente código en el web.xml:</p>
<p style="padding-left: 60px;">&lt;filter&gt;<br />
&lt;filter-name&gt;Filtro&lt;/filter-name&gt;<br />
&lt;filter-class&gt;ucam.filtros.FiltroConexion&lt;/filter-class&gt;<br />
&lt;/filter&gt;</p>
<p style="padding-left: 60px;">&lt;filter-mapping&gt;<br />
&lt;filter-name&gt;Filtro&lt;/filter-name&gt;<br />
&lt;servlet-name&gt;Control&lt;/servlet-name&gt;<br />
&lt;/filter-mapping&gt;</p>
<p>Ya sólo queda modificar el código del filtro para que realice la funcionalidad deseada.</p>
]]></content:encoded>
			<wfw:commentRss>http://miguelangelguillen.es/2009/05/07/filtrar-peticiones-en-tomcat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://miguelangelguillen.es/2009/05/07/filtrar-peticiones-en-tomcat/</feedburner:origLink></item>
		<item>
		<title>Tomcat (VIII): patrón Modelo – Vista – Control</title>
		<link>http://feedproxy.google.com/~r/maguillen/~3/SVp_vg0Qffo/</link>
		<comments>http://miguelangelguillen.es/2009/04/30/tomcat-viii-patron-modelo-vista-control/#comments</comments>
		<pubDate>Thu, 30 Apr 2009 17:26:52 +0000</pubDate>
		<dc:creator>Miguel Angel</dc:creator>
				<category><![CDATA[DAD]]></category>
		<category><![CDATA[Informática]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://miguelangelguillen.es/?p=175</guid>
		<description><![CDATA[Ya llevamos con esta 8 entradas sobre Tomcat donde se han explicado diferentes funcionalidades. Pero tal vez nos falta una visión global de como implementar una aplicación web.
Existen muchas opciones pero tal vez la más recomendable sea aplicar el patrón Modelo-Vista-Control. ¿Y en que consiste? Pues muy fácil, que todas las peticiones pasen por un [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://miguelangelguillen.es/wp-content/uploads/2009/03/tomcat.gif"><img class="alignleft size-full wp-image-158" title="Tomcat" src="http://miguelangelguillen.es/wp-content/uploads/2009/03/tomcat.gif" alt="Tomcat" width="130" height="92" /></a>Ya llevamos con esta 8 entradas sobre Tomcat donde se han explicado diferentes funcionalidades. Pero tal vez nos falta una visión global de como implementar una aplicación web.</p>
<p>Existen muchas opciones pero tal vez la más recomendable sea aplicar el patrón Modelo-Vista-Control. ¿Y en que consiste? Pues muy fácil, que todas las peticiones pasen por un único punto, Control, que dependiendo de la acción a realizar ejecutará un modelo u otro. Este modelo redirige la petición hacia la vista (una JSP) correspondiente.</p>
<p><span id="more-175"></span></p>
<p>El siguiente diagrama de secuencia representa este escenario.</p>
<p><a href="http://miguelangelguillen.es/wp-content/uploads/2009/04/modelo_vista_control.jpg"></a><a href="http://miguelangelguillen.es/wp-content/uploads/2009/04/modelo_vista_control1.jpg"><img class="aligncenter size-full wp-image-411" title="modelo_vista_control1" src="http://miguelangelguillen.es/wp-content/uploads/2009/04/modelo_vista_control1.jpg" alt="modelo_vista_control1" width="391" height="294" /></a></p>
<p>El navegador hace una petición al Control indicándole por parámetro que acción quiere ejecutar. En el ejemplo es aquella que está identificada con el 43. Con ese identificador el servlet deberá obtener la clase que implementa la acción, crear una instancia y ejecutar el método correspondiente.</p>
<p><a href="http://miguelangelguillen.es/wp-content/uploads/2009/04/clases-modelo_vista_control.jpg"><img class="aligncenter size-full wp-image-415" title="clases-modelo_vista_control" src="http://miguelangelguillen.es/wp-content/uploads/2009/04/clases-modelo_vista_control.jpg" alt="clases-modelo_vista_control" width="437" height="299" /></a></p>
<p>Por ejemplo, si nosotros tenemos establecido en la base de datos o en un fichero de propiedades que la acción 43 está implementada por la clase ModeloMostrarClientes. El servlet mediante reflexión creará una instancia de dicho objeto e invocará el método <em>ejecutar</em>:</p>
<pre>String clase = (bbdd o fichero propiedades).getClaseParaEsteId(idAccion);
Modelo m = (Modelo) Class.forName(clase).newInstance();
m.ejecutar();</pre>
<p>En la primera linea se recupera el nombre de la clase para ese id (<em>ucam.modelos.ModeloMostrarClientes</em>). En la segunda  se crea una instancia de la clase que por polimorfismo puede estar ligada a una variable de la clase padre, <em>Modelo</em>. En la última lo que hacemos es invocar el método ejecutar de la clase Modelo pero realmente se está ejecutando en la instancia de la subclase (<em>ModeloMostrarClientes</em>).</p>
<p>¿Que hemos ganado con esto? Independizar el servlet <em>Control</em> de la acción que se ejecuta en cada momento. Si nosotros establecemos que el id 29 se corresponde con <em>ModeloInsertarCliente</em> sólo tendremos que llamar al servlet pero con el parámetro <em>idAccion</em> con dicho valor. Además, si queremos añadir nueva funcionalidad sólo tendremos que heredar de <em>Modelo</em> e implementar el método ejecutar con la funcionalidad deseada.</p>
<p>Ya sólo queda redirigir a la JSP que genera la página. Existen dos opciones: que el método ejecutar reciba como parámetro la petición (<em>HttpServletRequest</em>) para hacer el forward o que devuelva una cadena con la página y que sea el servlet el que haga el forward.</p>
]]></content:encoded>
			<wfw:commentRss>http://miguelangelguillen.es/2009/04/30/tomcat-viii-patron-modelo-vista-control/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://miguelangelguillen.es/2009/04/30/tomcat-viii-patron-modelo-vista-control/</feedburner:origLink></item>
	</channel>
</rss>
