<?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>Programacion en JAVA &#187; Artículos</title>
	<atom:link href="http://www.programacionenjava.com/blog/categorias/articulos/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.programacionenjava.com</link>
	<description></description>
	<lastBuildDate>Thu, 29 Apr 2010 10:46:38 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Tutorial para exportar librerias GWT a javascript</title>
		<link>http://www.programacionenjava.com/blog/2009/12/29/articulos/tutorial-para-exportar-librerias-gwt-a-javascript/</link>
		<comments>http://www.programacionenjava.com/blog/2009/12/29/articulos/tutorial-para-exportar-librerias-gwt-a-javascript/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 15:23:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[google web toolkit]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.programacionenjava.com/?p=92</guid>
		<description><![CDATA[Las ventajas de utilizar GWT para desarrollar código javascript de calidad es que el programador no tiene por qué ser experto en javascript, conocer particularidades de cada navegador, empaquetamiento de javascript, ofuscación, dependencias entre librerías, etc.
Aquí os dejamos un tutorial para exportar librerías GWT a javascript
]]></description>
			<content:encoded><![CDATA[<p>Las ventajas de utilizar GWT para desarrollar código javascript de calidad es que el programador no tiene por qué ser experto en javascript, conocer particularidades de cada navegador, empaquetamiento de javascript, ofuscación, dependencias entre librerías, etc.</p>
<p>Aquí os dejamos un <a href="http://code.google.com/p/gwtchismes/wiki/Tutorial_ExportingGwtLibrariesToJavascript_es">tutorial para exportar librerías GWT a javascript</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.programacionenjava.com/blog/2009/12/29/articulos/tutorial-para-exportar-librerias-gwt-a-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enviar sms desde una aplicación Java</title>
		<link>http://www.programacionenjava.com/blog/2009/03/03/articulos/enviar-sms-desde-una-aplicacion-java/</link>
		<comments>http://www.programacionenjava.com/blog/2009/03/03/articulos/enviar-sms-desde-una-aplicacion-java/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 08:50:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[envio de sms]]></category>
		<category><![CDATA[sms]]></category>

		<guid isPermaLink="false">http://www.programacionenjava.com/?p=56</guid>
		<description><![CDATA[En esta entrada os mostraremos cómo enviar sms desde una aplicación Java. Seguro que esta funcionalidad os la ha pedido algún cliente que quería integrar directamente en vuestra aplicación la posibilidad de enviar un sms en alguna situación como comunicarse con sus propios clientes, enviar una alerta en determinadas ocasiones, etc&#8230;
Lo primero es encontrar un [...]]]></description>
			<content:encoded><![CDATA[<p>En esta entrada os mostraremos cómo <strong>enviar sms desde una aplicación Java</strong>. Seguro que esta funcionalidad os la ha pedido algún cliente que quería <strong>integrar</strong> directamente en vuestra aplicación la posibilidad de enviar un sms en alguna situación como comunicarse con sus propios clientes, enviar una alerta en determinadas ocasiones, etc&#8230;</p>
<p>Lo primero es encontrar un proveedor que permita el envío de sms mediante una conexión a su servidor. Puede que existan aún aquellas páginas donde era gratuito enviar un sms. Sin embargo la fiabilidad de entrega de estos proveedores, unido a que sólo permiten enviar a través de una página web y no desde un programa java y que suelen estár asociados al envío de publicidad no hacen de esta solución una solución aceptable.</p>
<p>Un <strong>proveedor</strong> de sms sirve de intermediario entre nuestra aplicación Java y los operadores de telefonía móvil. La misión del programa Java será por tanto conectarse de algún modo al proveedor elegido (HTTP, SMTP&#8230;) y pasarle los datos del sms en algún formato (con los propios parámetros de HTTP, con un xml&#8230;).</p>
<p>Después de buscar entre varios proveedores, nos hemos quedado con la pasarela de <a title="Envio de sms" href="http://www.altiria.com/web/sms_mms/enviar_SMS" target="_blank">envío de sms</a> de <a title="Altiria" href="http://www.altiria.com" target="_blank">Altiria</a>. El envío de sms se realiza con este proveedor mediante una petición POST a su servidor con los datos del sms que se quiere enviar como parámetros de la propia petición, siendo los más importantes el contenido del sms y los destinatarios. Se puede encontrar el documento de especificaciones de la conexión también en su web (<a title="Documento de especificaciones de envío de sms de Altiria" href="http://www.altiria.com/web/sms_mms/tecnicos" target="_blank">Documento de especificaciones</a>).</p>
<p>Queremos resaltar que el para que el ejemplo que ponemos a continuación funcione y envíe un sms, es necesario ponerse en <strong>contacto con Altiria</strong> y <strong>contratar un bono de envío de sms</strong> que permita la conexión a su pasarela de envío. El ejemplo sirve para ilustrar lo fácil que sería el envío del sms una vez contratado el bono.</p>
<p>Ya tenemos el proveedor y el mecanismo de envío (HTTP). Ya sólo queda <strong>implementar esta conexión HTTP</strong> en nuestro programa Java. Para ello necesitamos un <strong>cliente HTTP</strong> para realizar la conexión. Hemos elegido la <strong>librería HTTP de Jakarta</strong>, (<a title="Http Client" href="http://hc.apache.org/httpclient-3.x/" target="_blank">HttpClient</a>) que debe estar presente en el classpath de nuestra aplicación. El siguiente código realiza la conexión enviando los parámetros del sms.</p>

<div class="wp_codebox"><table width="100%" ><tr><td colspan="2" class="msgheader"><div class="codebox_right"><a href="###" onclick="copycode($('56code2'));">[Copiar]</a><a href="###" onclick="toggle_collapse('562');">[<span id="562_symbol">-</span>]</a></div><div class="codebox_left"><span id="l56code2"><a href="#" onclick="javascript:showCodeTxt('56code2'); return false;"> Codigo</a></span></div></td></tr><tr id="562"><td class="code" id="56code2"><pre class="java"><span style="color: #808080; font-style: italic;">//Se inicia el objeto HTTP</span>
HttpClient client = <span style="color: #000000; font-weight: bold;">new</span> HttpClient<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
client.<span style="color: #006600;">setStrictMode</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">//Se fija el tiempo máximo de espera de la respuesta del servidor</span>
client.<span style="color: #006600;">setTimeout</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">60000</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">//Se fija el tiempo máximo de espera para conectar con el servidor</span>
client.<span style="color: #006600;">setConnectionTimeout</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5000</span><span style="color: #66cc66;">&#41;</span>;
PostMethod post = <span style="color: #000000; font-weight: bold;">null</span>;
<span style="color: #808080; font-style: italic;">//Se fija la URL sobre la que enviar la petición POST</span>
&nbsp;
<span style="color: #808080; font-style: italic;">//Como ejemplo se supone www.pasarela_push_altiria.com/post/sms</span>
post = <span style="color: #000000; font-weight: bold;">new</span> PostMethod<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;http://www.pasarela_push_altiria.com/post/sms&quot;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">//Se fija la codificación de caracteres en la cabecera de la petición</span>
post.<span style="color: #006600;">setRequestHeader</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Content-type&quot;</span>, <span style="color: #ff0000;">&quot;application/x-www-form-urlencoded; charset=UTF-8&quot;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">//Se crea la lista de parámetros a enviar en la petición POST</span>
<span style="color: #aaaadd; font-weight: bold;">NameValuePair</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> parametersList = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #aaaadd; font-weight: bold;">NameValuePair</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#93;</span>;
parametersList<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #aaaadd; font-weight: bold;">NameValuePair</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;dest&quot;</span>, <span style="color: #ff0000;">&quot;34600111222&quot;</span><span style="color: #66cc66;">&#41;</span>;
parametersList<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #aaaadd; font-weight: bold;">NameValuePair</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;dest&quot;</span>, <span style="color: #ff0000;">&quot;34600111333&quot;</span><span style="color: #66cc66;">&#41;</span>;
parametersList<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #aaaadd; font-weight: bold;">NameValuePair</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;msg&quot;</span>, <span style="color: #ff0000;">&quot;Mensaje de prueba&quot;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">//Se rellena el cuerpo de la petición POST con los parámetros</span>
post.<span style="color: #006600;">setRequestBody</span><span style="color: #66cc66;">&#40;</span>parametersList<span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333;">int</span> httpstatus = <span style="color: #cc66cc;">0</span>;
<span style="color: #aaaadd; font-weight: bold;">String</span> response = <span style="color: #000000; font-weight: bold;">null</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #66cc66;">&#123;</span>
<span style="color: #808080; font-style: italic;">//Se envía la petición</span>
httpstatus = client.<span style="color: #006600;">executeMethod</span><span style="color: #66cc66;">&#40;</span>post<span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">//Se consigue la respuesta</span>
response = post.<span style="color: #006600;">getResponseBodyAsString</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #66cc66;">&#40;</span><span style="color: #aaaadd; font-weight: bold;">Exception</span> e<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
<span style="color: #808080; font-style: italic;">//Habrá que prever la captura de excepciones</span>
<span style="color: #000000; font-weight: bold;">return</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #000000; font-weight: bold;">finally</span> <span style="color: #66cc66;">&#123;</span>
<span style="color: #808080; font-style: italic;">//En cualquier caso se cierra la conexión</span>
post.<span style="color: #006600;">releaseConnection</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">//Habrá que prever posibles errores en la respuesta del servidor</span>
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>httpStatus!=<span style="color: #cc66cc;">200</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
<span style="color: #000000; font-weight: bold;">return</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
<span style="color: #808080; font-style: italic;">//Se procesa la respuesta capturada en la cadena ‘‘response’’</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>Este código se traduce en el envío de un sms con el texto &#8220;Mensaje de Prueba&#8221; a los móviles 34600111222 y 34600111333.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programacionenjava.com/blog/2009/03/03/articulos/enviar-sms-desde-una-aplicacion-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Aumentar el tamaño de memoria de la máquina virtual en Java</title>
		<link>http://www.programacionenjava.com/blog/2008/06/24/problemas-frecuentes/aumentar-el-tamano-de-memoria-de-la-maquina-virtual-en-java/</link>
		<comments>http://www.programacionenjava.com/blog/2008/06/24/problemas-frecuentes/aumentar-el-tamano-de-memoria-de-la-maquina-virtual-en-java/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 15:05:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Problemas Frecuentes]]></category>
		<category><![CDATA[Heap]]></category>
		<category><![CDATA[Memoria]]></category>
		<category><![CDATA[OutOfMemory]]></category>

		<guid isPermaLink="false">http://www.programacionenjava.com/?p=34</guid>
		<description><![CDATA[En Java, hay varios parámetros para controlar el tamaño inicial y el tamaño máximo que puede tomar la máquina virtual.
Además, hay que tener en cuenta el tipo de memoria sobre el que se quiere actuar: heap, non-heap (PermGen). Los valores por defecto que se dan corresponden a máquina virtuales de Sun, y son orientativos, porque [...]]]></description>
			<content:encoded><![CDATA[<p>En Java, hay varios parámetros para controlar el <strong>tamaño inicial</strong> y el <strong>tamaño máximo</strong> que puede tomar la máquina virtual.</p>
<p>Además, hay que tener en cuenta el tipo de memoria sobre el que se quiere actuar: <strong>heap</strong>, <strong>non-heap</strong> (<strong>PermGen</strong>). Los valores por defecto que se dan corresponden a máquina virtuales de Sun, y son orientativos, porque pueden cambiar entre versiones de la máquina virtual. Los parámetros son los siguientes, fijándose a 128Mb.</p>
<ul>
<li><strong>-Xms128m</strong>: <strong>Tamaño de inicio</strong> de la máquina virtual de Java a 128Mb. El valor por defecto son 64Mb. Si se aumenta este valor, se elimina el tiempo que se tardaría en aumentar el tamaño en memoria de la máquina virtual si se llegara el caso de que se necesitara más memoria, por lo que aumentaría el rendimiento en los casos que la aplicación haga uso intensivo de la memoria.</li>
<li><strong>-Xmx128m</strong>: <strong>Tamaño máximo</strong> de la máquina virtual de Java a 128Mb.  El valor por defecto son 128Mb. Si la aplicación supera el tamaño máximo de memoria que marca este parámetro, se lanza la excepción <strong>java.lang.OutOfMemoryError</strong>.  No conviene asignar a este parámetro el máximo de la memoria de la máquina porque si ya no queda memoria física disponible (por la que usa el sistema operativo u otras aplicaciones) se pueden producir escrituras en memoria asignada a otros programas y provocar un auténtico lío.</li>
<li><strong>-XX:PermSize=128m</strong>: <strong>Tamaño de inicio</strong> de la memoria de tipo <strong>PermGen</strong> a 128Mb. Arrancar la máquina virtual con un valor superior al por defecto agiliza la carga de aplicaciones, sobre todo en el caso de aplicaciones que hagan uso intensivo de este tipo de memoria (Spring, Hibernate&#8230;)</li>
<li><strong>-XX:MaxPermSize=128m</strong>: <strong>Tamaño máximo</strong> de la memoria de tipo <strong>PermGen</strong> a 128Mb. El valor por defecto son 64Mb. Si la aplicación supera el tamaño máximo de memoria para este tipo que marca este parámetro, se lanza la excepción <strong>java.lang.OutOfMemoryError: PermGen space</strong>. El valor necesario para este parámetro siempre suele ser menor que el de la memoria de tipo heap.</li>
</ul>
<p>Si se quiere especificar un valor distinto de 128Mb, que se utiliza para todos los parámetros como ejemplo para simplificar, bastaría con sustituir el valor 128 del parámetro con el que se desee, siempre que sean múltiplos de 2 (64, 128, 256, 512, 768, 1024, 2048&#8230;)</p>
<p>Conocidos los tipos de memoria y los parámetros que los controlan, ahora viene la pregunta, <strong>¿cómo especifico estos valores para mi aplicación? </strong>La respuesta es la misma para todos los casos: Los valores <strong>se especifican como parámetros en el arranque de la máquina virtual que ejecutará la aplicación</strong>. La diferencia estribará en cómo se arranca la aplicación: con un script, desde línea de comandos, mediante ant&#8230;</p>
<p>A continuación se dan distintos ejemplos de modificación de la memoria de distinta forma. No es necesario especificar todos los parámetros, se pueden especificar todos o ninguno (y se tomarían los valores por defecto)</p>
<p><strong>Línea de comandos</strong></p>
<ul>
<li><strong>Ejecución de un jar</strong>: java -Xms128m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=256m  -jar example.jar</li>
<li><strong>Ejecución de una clase</strong>: java -Xms128m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=256m  com.programacionenjava.examples.MemoryExample</li>
</ul>
<p><strong>Ant</strong></p>
<p>&lt;java classname=&#8221;com.programacionenjava.examples.MemoryExample&#8221; fork=&#8221;yes&#8221; spawn=&#8221;true&#8221;&gt;<br />
&lt;jvmarg value=&#8221;-Xms128m&#8221;/&gt;<br />
&lt;jvmarg value=&#8221;-Xmx512m&#8221;/&gt;<br />
&lt;jvmarg value=&#8221;-XX:PermSize=128m&#8221;/&gt;<br />
&lt;jvmarg value=&#8221;-XX:MaxPermSize=128m&#8221;/&gt;<br />
&lt;classpath refid=&#8221;execution.classpath&#8221;/&gt;<br />
&lt;/java&gt;</p>
<p><strong>Script</strong></p>
<p>Si el arranque de la máquina virtual se produce en un script, hay que editar el script y añadir estos parámetros en la sentencia de arranque. El siguiente ejemplo muestra cómo añadir estos parámetros en el <strong>script de arranque de un Tomcat</strong>.</p>
<ul>
<li>En <strong>Windows</strong>: set JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=256m</li>
<li>En <strong>Linux</strong>: JAVA_OPTS=&#8221;$JAVA_OPTS -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=256m&#8221;</li>
</ul>
<p>Por último, recordamos que resolver el problema de una excepción de tipo java.lang.OutOfMemoryError simplemente aumentando el tamaño de la memoria virtual puede retrasar el problema pero no evitarlo si el problema es una fuga de memoria. Puedes encontrar más información <a href="http://www.programacionenjava.com/blog/2008/03/28/j2ee/causas-y-solucion-de-javalangoutofmemoryerror-permgen-space-failure/" target="_self">aquí</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programacionenjava.com/blog/2008/06/24/problemas-frecuentes/aumentar-el-tamano-de-memoria-de-la-maquina-virtual-en-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Configuración del juego de caracteres (charset) en una aplicación web en Tomcat</title>
		<link>http://www.programacionenjava.com/blog/2008/04/01/j2ee/configuracion-del-juego-de-caracteres-charset-en-una-aplicacion-web-en-tomcat/</link>
		<comments>http://www.programacionenjava.com/blog/2008/04/01/j2ee/configuracion-del-juego-de-caracteres-charset-en-una-aplicacion-web-en-tomcat/#comments</comments>
		<pubDate>Tue, 01 Apr 2008 17:29:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Codificacion caracteres]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://www.programacionenjava.com/?p=14</guid>
		<description><![CDATA[En este artículo se describen los pasos necesarios para la correcta configuración en UTF-8 de los juegos de caracteres una aplicación y los distintos componentes que intervienen en una arquitectura cliente/servidor de un servidor web. El procedimiento sería similar en el caso de que el juego de caracteres elegido fuera el ISO8859-1. Para la configuración [...]]]></description>
			<content:encoded><![CDATA[<p>En este artículo se describen los pasos necesarios para la correcta <strong>configuración en UTF-8 de los juegos de caracteres una aplicación</strong> y los distintos componentes que intervienen en una arquitectura cliente/servidor de un servidor web. El procedimiento sería similar en el caso de que el juego de caracteres elegido fuera el ISO8859-1. Para la configuración de este artículo se ha utilizado el servidor web <strong>Tomcat versión 6.0.16</strong> y Postgresql como motor de base de datos.</p>
<p>A continuación se muestra la figura con un esquema de todos los componentes. En esta figura se marcan los distintos componentes con números (en rojo) para poder referenciarlos en las descripciones que siguen.</p>
<p><a title="Codificacion de Caracteres" href="http://www.programacionenjava.com/wp-content/uploads/codficacioncaracteres.JPG"></a></p>
<p style="text-align: center"><a title="Codificacion de Caracteres" href="http://www.programacionenjava.com/wp-content/uploads/codficacioncaracteres.JPG"><img src="http://www.programacionenjava.com/wp-content/uploads/codficacioncaracteres.JPG" alt="Codificacion de Caracteres" /></a></p>
<h4><strong>Configuración del Servidor Web (Tomcat)</strong></h4>
<p>Se puede modificar el charset de la máquina virtual donde se ejecute el servidor, añadiendo como opción de ejecución en <em><strong>JAVA_OPTS</strong></em> el parámetro <em><strong>-Djava.file.encoding=UTF-8</strong></em> <strong>(0)</strong>. Si se trata del Tomcat, se debe añadir al fichero <em>catalina.sh</em> o <em>catalina.bat</em> según el sistema operativo.</p>
<p>Este valor no se tiene en cuenta en la máquina virtual de Sun 1.4.x, porque al parecer se trata de una propiedad de solo lectura en numerosas máquinas virtuales (leido en los foros del Tomcat). Sí parece activarse en la máquina virtual de Sun 1.5.x.</p>
<p>En principio no parece necesario modificar el charset de la máquina virtual, porque ninguna prueba realizada demuestra que se tenga en cuenta para las operaciones de codificación de caracteres en un intercambio cliente/servidor. En cambio, sí que afecta a otros aspectos de las aplicaciones, como la codificación de caracteres utilizada para escribir en el log por la librería log4j.</p>
<p>Si por alguna razón se produjera algún problema en la codificación de caracteres, se puede intentar modificar este parámetro para encontrar la solución. Si se hace, puede que sea necesario modificar la codificación de caracteres del elemento appender del log4j.</p>
<p>Para fijar este parámetro:</p>
<ul>
<li>En Windows: Edita el fichero %CATALINA_HOME%\bin\catalina.bat y añade la siguiente línea:</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr><td colspan="2" class="msgheader"><div class="codebox_right"><a href="###" onclick="copycode($('14code15'));">[Copiar]</a><a href="###" onclick="toggle_collapse('1415');">[<span id="1415_symbol">-</span>]</a></div><div class="codebox_left"><span id="l14code15"><a href="#" onclick="javascript:showCodeTxt('14code15'); return false;"> Codigo</a></span></div></td></tr><tr id="1415"><td class="code" id="14code15"><pre class="java">rem ----- Execute The Requested Command -----
echo...
<span style="color: #006600;">echo</span>...
<span style="color: #006600;">set</span>...
<span style="color: #006600;">set</span> JAVA_OPTS=%JAVA_OPTS% -Djava.<span style="color: #006600;">file</span>.<span style="color: #006600;">encoding</span>=UTF<span style="color: #cc66cc;">-8</span></pre></td></tr></table></div>

<ul>
<li>En Linux: Edita el fichero $CATALINA_HOME/bin/catalina.sh y añade al principio la siguiente línea.</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr><td colspan="2" class="msgheader"><div class="codebox_right"><a href="###" onclick="copycode($('14code16'));">[Copiar]</a><a href="###" onclick="toggle_collapse('1416');">[<span id="1416_symbol">-</span>]</a></div><div class="codebox_left"><span id="l14code16"><a href="#" onclick="javascript:showCodeTxt('14code16'); return false;"> Codigo</a></span></div></td></tr><tr id="1416"><td class="code" id="14code16"><pre class="java">JAVA_OPTS=<span style="color: #ff0000;">&quot;$JAVA_OPTS -Djava.file.encoding=UTF-8</span></pre></td></tr></table></div>

<p>Para modificar la configuración del log4j: Añadir el atributo  <strong><em>encoding</em></strong> del elemento appender utilizado, asignándole el valor ISO8859-1, en el fichero de configuración:</p>
<ul>
<li>En xml, añadir dentro del elemento appender:</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr><td colspan="2" class="msgheader"><div class="codebox_right"><a href="###" onclick="copycode($('14code17'));">[Copiar]</a><a href="###" onclick="toggle_collapse('1417');">[<span id="1417_symbol">-</span>]</a></div><div class="codebox_left"><span id="l14code17"><a href="#" onclick="javascript:showCodeTxt('14code17'); return false;"> Codigo</a></span></div></td></tr><tr id="1417"><td class="code" id="14code17"><pre class="java">&nbsp;</pre></td></tr></table></div>

<ul>
<li>En properties:</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr><td colspan="2" class="msgheader"><div class="codebox_right"><a href="###" onclick="copycode($('14code18'));">[Copiar]</a><a href="###" onclick="toggle_collapse('1418');">[<span id="1418_symbol">-</span>]</a></div><div class="codebox_left"><span id="l14code18"><a href="#" onclick="javascript:showCodeTxt('14code18'); return false;"> Codigo</a></span></div></td></tr><tr id="1418"><td class="code" id="14code18"><pre class="java">log4j.<span style="color: #006600;">appender</span>.<span style="color: #006600;">file</span>.<span style="color: #006600;">encoding</span>=ISO8859<span style="color: #cc66cc;">-1</span></pre></td></tr></table></div>

<h4>El navegador efectúa un GET sobre el servidor.</h4>
<p>En un petición de tipo GET, los parámetros se encuentran en la URL (query string). Para que se ejecute correctamente, los parámetros hay que codificarlos correctamente al construir la url del GET y luego que el servidor los decodifique correctamente antes de pasárselos al correspondiente Servlet.</p>
<ul>
<li><strong>(1)</strong> La codificación de los parámetros en la url se debe realizar al construir el html de cada página. Para ello se pueden utilizar el método <strong>encode</strong> de la clase <strong>java.net.URLEncoder</strong> al que se le suministra como parámetro el juego de caracteres (UTF-8)</li>
<li><strong>(2)</strong> La decodificación de los parámetros de la URL se realiza en el conector de Tomcat, tanto el 8080 como el de ssh 443, configurado en el archivo server.xml mediante</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr><td colspan="2" class="msgheader"><div class="codebox_right"><a href="###" onclick="copycode($('14code19'));">[Copiar]</a><a href="###" onclick="toggle_collapse('1419');">[<span id="1419_symbol">-</span>]</a></div><div class="codebox_left"><span id="l14code19"><a href="#" onclick="javascript:showCodeTxt('14code19'); return false;"> Codigo</a></span></div></td></tr><tr id="1419"><td class="code" id="14code19"><pre class="java">&nbsp;</pre></td></tr></table></div>

<h4>El navegador efectúa un POST sobre el servidor.</h4>
<p>La codificación de los parámetros se realiza en el navegador. Para que el navegador sepa en qué juego de caracteres tiene que codificar los parámetros del POST que envía, el html tiene que tener la siguiente cabecera <strong>(3)</strong>, que se tiene que incluir en el jsp de incluya las cabeceras <strong>(4)</strong></p>

<div class="wp_codebox"><table width="100%" ><tr><td colspan="2" class="msgheader"><div class="codebox_right"><a href="###" onclick="copycode($('14code20'));">[Copiar]</a><a href="###" onclick="toggle_collapse('1420');">[<span id="1420_symbol">-</span>]</a></div><div class="codebox_left"><span id="l14code20"><a href="#" onclick="javascript:showCodeTxt('14code20'); return false;"> Codigo</a></span></div></td></tr><tr id="1420"><td class="code" id="14code20"><pre class="java">&nbsp;</pre></td></tr></table></div>

<p>Al recibir los parámetros de un POST, el servlet que se encarga de recibir la petición tiene que fijar el juego de caracteres en el que llega la petición. En el caso de una aplicación que usa Struts o cualquier aplicación web que utilice el modelo <strong>MVC</strong> en el que todas las peticiones pasan por el elemento <strong>Controller</strong>, esta operación se debe realizar en dicho elemento, en el caso de Struts el servlet que extienda al ActionServlet <strong>(5)</strong>.</p>

<div class="wp_codebox"><table width="100%" ><tr><td colspan="2" class="msgheader"><div class="codebox_right"><a href="###" onclick="copycode($('14code21'));">[Copiar]</a><a href="###" onclick="toggle_collapse('1421');">[<span id="1421_symbol">-</span>]</a></div><div class="codebox_left"><span id="l14code21"><a href="#" onclick="javascript:showCodeTxt('14code21'); return false;"> Codigo</a></span></div></td></tr><tr id="1421"><td class="code" id="14code21"><pre class="java">request.<span style="color: #006600;">setCharacterEncoding</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;UTF-8&quot;</span><span style="color: #66cc66;">&#41;</span>;</pre></td></tr></table></div>

<h4>Precompilación de los JSP</h4>
<p>Los Jsp se pueden precompilar opcionalmente para convertirlos en servlets. En este caso, es necesario precompilarlos utilizando el juego de caracteres que se utiliza en la máquina donde se están editando, que no suele ser UTF-8, sino ISO8859-1. Esto se hace para que los archivos precompilados mantengan el juego de caracteres en el que fueron escritos a la hora de convertirse en servlets. Este juego de caracteres no es que utiliza por defecto la precompilación (UTF-8). Por lo tanto es necesario especificarlo <strong>(9)</strong>:</p>
<ul>
<li>En el caso de que los compile el servidor web, Tomcat, según vaya necesitando estos jsp, se utiliza el parámetro javaEncoding que se le debe suministrar al servlet encargado de la precompilación, JspC o Jikes en archivo <em>web.xml</em> general de Tomcat, servlet org.apache.jasper.servlet.JspServlet.</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr><td colspan="2" class="msgheader"><div class="codebox_right"><a href="###" onclick="copycode($('14code22'));">[Copiar]</a><a href="###" onclick="toggle_collapse('1422');">[<span id="1422_symbol">-</span>]</a></div><div class="codebox_left"><span id="l14code22"><a href="#" onclick="javascript:showCodeTxt('14code22'); return false;"> Codigo</a></span></div></td></tr><tr id="1422"><td class="code" id="14code22"><pre class="java">javaEncoding
ISO<span style="color: #cc66cc;">-8859</span><span style="color: #cc66cc;">-1</span></pre></td></tr></table></div>

<ul>
<li> En el caso de que los jsp se precompilen mediante la <strong>tarea de ant</strong> jasper2, es necesario suministrarle a esta tarea el parámetro javaEncoding:</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr><td colspan="2" class="msgheader"><div class="codebox_right"><a href="###" onclick="copycode($('14code23'));">[Copiar]</a><a href="###" onclick="toggle_collapse('1423');">[<span id="1423_symbol">-</span>]</a></div><div class="codebox_left"><span id="l14code23"><a href="#" onclick="javascript:showCodeTxt('14code23'); return false;"> Codigo</a></span></div></td></tr><tr id="1423"><td class="code" id="14code23"><pre class="java">&nbsp;</pre></td></tr></table></div>

<h4>Acceso a los datos</h4>
<p>Los datos deben estar guardados en una base de datos acorde con el juego de caracteres que se pretenda usar <strong>(6)</strong>. UNICODE en el caso de UTF-8 para <strong>Postgresql</strong>. Este juego de caracteres se especifica al crear la base de datos.</p>
<p>Además, para el acceso a la base de datos, se debe configurar el <strong>driver</strong> para que utilice el juego de caracteres correctos en el intercambio de datos <strong>(7)</strong>. Esta configuración se realiza en el archivo context.xml. Para el caso de PostgreSQL parece que no es necesario especificar el juego de caracteres para una base de datos UNICODE.</p>
<h4>Visión correcta en el navegador de la respuesta</h4>
<p>Para que el navegador muestre correctamente el contenido del html generado <strong>(8.1)</strong>, necesita saber el juego de caracteres del html. Este proceso se realiza al decodificar la respuesta del servidor de acuerdo a la cabeceras HTTP de respuesta de tipo de contenido, <em><strong>Content-Type</strong></em> <strong>(8.2)</strong> según se puede ver en el siguiente ejemplo de cabecera HTTP de respuesta:</p>

<div class="wp_codebox"><table width="100%" ><tr><td colspan="2" class="msgheader"><div class="codebox_right"><a href="###" onclick="copycode($('14code24'));">[Copiar]</a><a href="###" onclick="toggle_collapse('1424');">[<span id="1424_symbol">-</span>]</a></div><div class="codebox_left"><span id="l14code24"><a href="#" onclick="javascript:showCodeTxt('14code24'); return false;"> Codigo</a></span></div></td></tr><tr id="1424"><td class="code" id="14code24"><pre class="java">HTTP/<span style="color: #cc66cc;">1</span>.<span style="color: #006600;">x</span> <span style="color: #cc66cc;">200</span> OK
Server: Apache-Coyote/<span style="color: #cc66cc;">1.1</span>
Content-Type: text/html;charset=UTF<span style="color: #cc66cc;">-8</span>
Content-Length: <span style="color: #cc66cc;">2540</span>
<span style="color: #aaaadd; font-weight: bold;">Date</span>: Wed, <span style="color: #cc66cc;">30</span> Mar <span style="color: #cc66cc;">2008</span> <span style="color: #cc66cc;">19</span>:<span style="color: #cc66cc;">53</span>:<span style="color: #cc66cc;">00</span> GMT</pre></td></tr></table></div>

<p>Para que esta cabecera HTTP se incluya en la respuesta, se debe incluir en el código lo siguiente, dependiendo de si se trata de un servlet o un jsp:</p>
<ul>
<li><strong>(8.3)</strong> <strong>JSP</strong>. En un jsp que se incluya en todos los html de respuesta, hay que incluir</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr><td colspan="2" class="msgheader"><div class="codebox_right"><a href="###" onclick="copycode($('14code25'));">[Copiar]</a><a href="###" onclick="toggle_collapse('1425');">[<span id="1425_symbol">-</span>]</a></div><div class="codebox_left"><span id="l14code25"><a href="#" onclick="javascript:showCodeTxt('14code25'); return false;"> Codigo</a></span></div></td></tr><tr id="1425"><td class="code" id="14code25"><pre class="java">&amp;lt;%@ contentType=<span style="color: #ff0000;">&quot;text/html&quot;</span>; charset=<span style="color: #ff0000;">&quot;UTF-8&quot;</span> %&amp;gt;</pre></td></tr></table></div>

<ul>
<li><strong>(8.4)</strong> <strong>Servlet</strong>. Al enviar la respuesta:</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr><td colspan="2" class="msgheader"><div class="codebox_right"><a href="###" onclick="copycode($('14code26'));">[Copiar]</a><a href="###" onclick="toggle_collapse('1426');">[<span id="1426_symbol">-</span>]</a></div><div class="codebox_left"><span id="l14code26"><a href="#" onclick="javascript:showCodeTxt('14code26'); return false;"> Codigo</a></span></div></td></tr><tr id="1426"><td class="code" id="14code26"><pre class="java">response.<span style="color: #006600;">setContentType</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;text/plain; charset=UTF-8&quot;</span><span style="color: #66cc66;">&#41;</span>;
java.<span style="color: #006600;">io</span>.<span style="color: #aaaadd; font-weight: bold;">PrintWriter</span> out = response.<span style="color: #006600;">getWriter</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
out.<span style="color: #006600;">print</span><span style="color: #66cc66;">&#40;</span>responseStr<span style="color: #66cc66;">&#41;</span>;
response.<span style="color: #006600;">flushBuffer</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
out.<span style="color: #006600;">close</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.programacionenjava.com/blog/2008/04/01/j2ee/configuracion-del-juego-de-caracteres-charset-en-una-aplicacion-web-en-tomcat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Causas y solución de java.lang.OutOfMemoryError: PermGen space failure</title>
		<link>http://www.programacionenjava.com/blog/2008/03/28/j2ee/causas-y-solucion-de-javalangoutofmemoryerror-permgen-space-failure/</link>
		<comments>http://www.programacionenjava.com/blog/2008/03/28/j2ee/causas-y-solucion-de-javalangoutofmemoryerror-permgen-space-failure/#comments</comments>
		<pubDate>Fri, 28 Mar 2008 13:21:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Problemas Frecuentes]]></category>
		<category><![CDATA[Memoria]]></category>
		<category><![CDATA[OutOfMemory]]></category>
		<category><![CDATA[PermGen]]></category>

		<guid isPermaLink="false">http://www.programacionenjava.com/blog/2008/03/28/j2ee/causas-y-solucion-de-javalangoutofmemoryerror-permgen-space-failure/</guid>
		<description><![CDATA[La memoria de la Máquina Virtual se divide en varias regiones. Una de estas regiones es el PermGen, el área de memoria utilizada para, entre otras cosas, guardar el metadata de las clases como los atributos y sus tipos de datos, métodos etc. Esta memoria es de tipo non-heap. Las instancias de las clases se [...]]]></description>
			<content:encoded><![CDATA[<p>La memoria de la Máquina Virtual se divide en varias regiones. Una de estas regiones es el <strong>PermGen</strong>, el área de memoria utilizada para, entre otras cosas, guardar el metadata de las clases como los atributos y sus tipos de datos, métodos etc. Esta memoria es de tipo non-heap. Las instancias de las clases se cargan en la memoria de tipo heap, a la que se van añadiendo y eliminando las instancias de las clases según se van utilizando y eliminándose por el recolector de basura (Garbage Collector, en adelante GC).</p>
<p>No vamos a entrar en el mecanismo de la carga y eliminación de clases en java porque excede este artículo, pero sí lo comentaremos brevemente para poder entender el porqué de la excepción OutOfMemoryException: para que una clase pueda ser eliminada por el recolector de basura (GC), es necesario que no esté referenciada por ninguna otra clase. Para que se pueda eliminar la memoria ocupada por una clase en el espacio PermGen, es necesario además que se elimine el classloader que cargó la clase.</p>
<p>El <strong>valor por defecto del espacio PermGen es de 64 Mb</strong> en la máquina virtual (VM) de Sun. Este valor es suficiente normalmente para las aplicaciones que corren de forma independiente. En el caso de una aplicación que corra en un servidor web tipo Tomcat o un servidor de aplicaciones, hay casos en los que este valor no es suficiente.</p>
<p>En primer lugar, es posible que la aplicación necesite más espacio por su propia arquitectura. Las librerías Spring e Hibernate son librerías grandes, que cargan muchas clases y además hacen uso de proxies y carga dinámica de clases que hacen uso del espacio PermGen por lo que puede que los 64Mb no sean suficientes. Este caso se da cuando la excepción con el error se produce nada mas arrancar el servidor web o de aplicaciones o al acceder a la aplicación. Para solventar este problema bastará con aumentar el tamaño máximo de la memoria de tipo PermGen según veremos más adelante.</p>
<p>En segundo lugar, la <strong>causa más probable</strong> de una excepción <strong>java.lang.OutOfMemoryError: PermGen space failure</strong> se produce cuando la aplicación se reinstala en el servidor sin reiniciar el servidor. La forma de reinstalar las aplicaciones es eliminando el classloader que cargó la aplicación por primera vez y creando un nuevo classloader para la nueva instancia de la aplicación. En teoría, esto proporciona una forma limpia de reinstalar aplicaciones, pero si el servidor web o de aplicaciones guarda una referencia al classloader antiguo, se produce una <strong>fuga de memoria (memory leak)</strong> y el resultado es que tendremos las clases de la aplicación cargadas dos veces en memoria. Es cuestión del número de recargas y de la memoria gastada por la aplicación el que se produzca la excepción  java.lang.OutOfMemoryError: PermGen space failure. En este caso no basta con aumentar el tamaño máximo de la memoria, ya que esto sólo retrasaría el problema a unas cuantas reinstalaciones más. En este caso la única solución consiste en averiguar la causa de la fuga de memoria. Esto también excede el contenido de este artículo, aunque lo intentarmos tratar con profundidad en otra ocasión. Por el momento sólo proporcionamos un enlace muy interesante, aunque en inglés, acerca de posibles causas de fugas de memoria en java: <a href="http://opensource.atlassian.com/confluence/spring/pages/viewpage.action?pageId=2669" target="_blank">http://opensource.atlassian.com/confluence/spring/pages/viewpage.action?pageId=2669</a></p>
<p>Por último, a continuación incluimos el argumento que es necesario incluir al arrancar la máquina virtual para especificar el tamaño de esta región PermGen en Mb, <strong>XX:MaxPermSize=128m</strong> para el tamaño máximo y <strong>XX:PermSize=128m</strong> para que la máquina virtual ya arranque con este tamaño y no tenga que reservar más espacio en tiempo de ejecución.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programacionenjava.com/blog/2008/03/28/j2ee/causas-y-solucion-de-javalangoutofmemoryerror-permgen-space-failure/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
