<?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>Blog de JAVA - FinderIT</title>
	<atom:link href="http://blog.finderit.com/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.finderit.com/java</link>
	<description>Programación JAVA</description>
	<lastBuildDate>Sun, 22 Mar 2009 14:02:32 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Evitar algunos errores</title>
		<link>http://blog.finderit.com/java/2009/03/22/evitar-algunos-errores/</link>
		<comments>http://blog.finderit.com/java/2009/03/22/evitar-algunos-errores/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 14:02:32 +0000</pubDate>
		<dc:creator>moyano</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.finderit.com/java/?p=103</guid>
		<description><![CDATA[Algunos errores ocurren en ciertos casos que no hemos creidoque pudieran llegar a pasar. Por eso he decidido poner algunos truquillos que ayuden a detectarlos y pido a los lectores que amplien este artículo con más trucos y consejos. 
1º- Evitar asignaciones en los bloques if, while, &#8230; 
Ejemplo: 
if(opcion=5){ 
&#8230; 
} 

El problema aquí es que opcion toma el valor [...]]]></description>
			<content:encoded><![CDATA[<p>Algunos errores ocurren en ciertos casos que no hemos creidoque pudieran llegar a pasar. Por eso he decidido poner algunos truquillos que ayuden a detectarlos y pido a los lectores que amplien este artículo con más trucos y consejos. </p>
<p><strong>1º- Evitar asignaciones en los bloques if, while, &#8230;</strong> </p>
<p>Ejemplo: </p>
<p><em>if(opcion=5){ <br />
&#8230; <br />
} <br />
</em></p>
<p>El problema aquí es que opcion toma el valor cinco y entra en el bloque de la condición siempre, independientemente de lo que valiera antes. </p>
<p>La solución es tan simple como que el orden de los factores no altera el resultado a la hora de comparar: </p>
<p><em>if(5=opcion){ <br />
&#8230; <br />
} <br />
</em></p>
<p>En este caso el compilador se quejaría al querer asignar un valor a una constante. </p>
<p><strong>2º- Comparación de cadenas de caracteres:</strong> </p>
<p><em>if( str.equals(&#8220;Hola&#8221;) ){ <br />
&#8230; <br />
}</em> </p>
<p>A simple vista parece que no puede haber problema alguno, pero ¿que pasatia si la cadena str apuntara a null? Pues que se lanzaría una excepcion por la llamada a un metodo de un objeto sin inicializar y rompería con la ejecucion del proceso. </p>
<p>¿Como solucionarlo? Usando el otro objeto a comparar, es decir, &#8220;Hola&#8221;; puesto que es un objeto que siempre va a estar declarado e inicializado, y cuyo metodo equals no falla por pasarle un parametro nulo. </p>
<p><em>if( &#8220;Hola&#8221;.equals(str) ){ <br />
&#8230; <br />
}</em> </p>
<p><strong>3º- Sembrado de sentencias</strong> </p>
<p>Este es el sistema por excelencia. Consiste en hacer que imprima mensajes para conocer que instrucciones se está ejecutando. </p>
<p>Lo óptimo sería que en cada mensaje se especifique cual ha sido la instrucción siguiente a ejecutar y además se impriman los datos de las variables afectadas. </p>
<p>En proyectos grandes esto podría llegar a resultar un caos, así que se puede hacer una variante que consiste en imprimir todos esos mensajes a un fichero de texto. </p>
<p>Tambien sería ideal que en vez de usar el mítico System.out.println() se use una función tal que: </p>
<p><em>/* &#8230; */ <br />
public static final boolean DEBUG_ON=true; </p>
<p>public void debug(String s){ <br />
if(DEBUG_ON) <br />
System.out.println(s); // O la insercion de dicho mensaje a un fichero. <br />
} <br />
</em></p>
<p>De esta forma con cambiar el valor de true a false, ya conseguiríamos que se muestren o no dichos mensajes. </p>
<p>Insisto que en cada mensaje debe ser descriptivo de la situación. </p>
<p>Ejemplo: </p>
<p><em>public float test(){ <br />
debug(&#8220;Funcion test()&#8221;); <br />
int a,b,c; <br />
a=1; <br />
b=2; <br />
c=0; <br />
debug(&#8220;return (a+b)/c; a=&#8221;+a+&#8221;; b=&#8221;+b+&#8221;; c=&#8221;+c+&#8221;;&#8221;); <br />
return (a+b)/c; <br />
}</em> </p>
<p><strong>4º- Manejo de excepciones</strong> </p>
<p>Toda funcion debería lanzar o manejar las posibles excepciones que pudiera ocurrir, evitando dejar a su libre albedrío los diversos problemas que pudieran ocurrir. Como este es un tema bastante amplio, me limitaré a un caso general de manejo de las excepciones que consiste en el uso de un bloque try{&#8230;}catch(){} que se puede usar casi siempre. </p>
<p>Lo más indicado para meter en el bloque catch seria esto: <br />
<em>try{ <br />
&#8230; <br />
}catch(Exception e){ <br />
e.printStackTrace(); <br />
}</em> </p>
<p>Esto lo que hace es que a la hora de que salte una excepcion, imprima un informe indicando que excepcion se ha lanzado, un mensaje explicativo (a veces no muy explicativo) y la representación de la pila de funciones, esto es saber que linea estaba ejecutando cierta funcion, la clase a la que pertenece esa funcion, el fichero de esa clase, etc. ¿Y por qué salen varias funciones? Facil, porque una funcion habrá llamado a otra y esa a otra etc&#8230; <br />
De todas esas lineas solo nos interesarán las que esten asociadas a clases nuestras. De esta forma sabremos que linea ha producido el fallo, porque se ha producido, quien llamo a ese metodo, etc&#8230;, información más que útil para poder solucionar los errores que puedan ocurrir.</p>
<p>Fuente: <a href="http://www.mygnet.net/articulos/java/evitar_algunos_errores.1114">http://www.mygnet.net/articulos/java/evitar_algunos_errores.1114</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.finderit.com/java/2009/03/22/evitar-algunos-errores/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Servlets y jdbc</title>
		<link>http://blog.finderit.com/java/2009/03/22/servlets-y-jdbc/</link>
		<comments>http://blog.finderit.com/java/2009/03/22/servlets-y-jdbc/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 14:01:18 +0000</pubDate>
		<dc:creator>moyano</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.finderit.com/java/?p=102</guid>
		<description><![CDATA[La API Servlets 
En este capitulo aprenderemos como se realiza la programación del lado del servidor 
usando la API Servlets 2.1.Como primer punto importante señalaremos que este paquete 
se trata de una extensión del API Core del JDK y por tanto ha de ser descargado de 
forma independiente de aquel.La URL para la descarga es 
java.sun.com/products/servlet/index.html, donde podremos encontrar el [...]]]></description>
			<content:encoded><![CDATA[<p><strong>La API Servlets</strong><strong> </strong></p>
<p>En este capitulo aprenderemos como se realiza la programación del lado del servidor </p>
<p>usando la API Servlets 2.1.Como primer punto importante señalaremos que este paquete </p>
<p>se trata de una extensión del API Core del JDK y por tanto ha de ser descargado de </p>
<p>forma independiente de aquel.La URL para la descarga es </p>
<p><code><a href="http://java.sun.com/products/servlet/index.html" target="_blanck">java.sun.com/products/servlet/index.html</a></code>, donde podremos encontrar el JSDK 2.1 </p>
<p>(Java Servlets Development Kit 2.1). </p>
<p>Debido también a que se trata de una extensión el paquete debe ser indicado en el </p>
<p>CLASSPATH de la máquina a ejecutar, concretamente los archivos <em>server.jar </em>y </p>
<p><em>servlet.jar.</em> </p>
<p><em></em></p>
<p><em>¿Qué es un servlet?</em> </p>
<p>Un servlet de forma intuitiva se puede definir como un programa independiente de<br />
plataforma que aporta la misma funcionalidad a la programación en el lado del servidor<br />
que tradicionalmente han realizado la interfaz CGI.Con respecto a esta tecnología aportanumerosas ventajas que citaremos a continuación: </p>
<p>· Independencia de la plataforma.(La tan anelada premisa del “write once run<br />
everywhere” aun no totalmente conseguida).Esto proporciona un menor esfuerzo<br />
de codificación con respecto a soluciones dependientes del servidor web y de la<br />
plataforma como ISAPI o NSAPI. </p>
<p>· Ejecución en paralelo de multiples peticiones por una sola instancia del<br />
servlet.Tradicionalmente en los programas CGI se ejecuta un proceso distinto<br />
para cada petición lo que conlleva una gradual degradación del rendimiento y una<br />
necesidad de recursos muy elevada.En un servlet todas las peticiones se atienden<br />
en el mismo proceso por distintos hilos y una vez que se ha cargado el servlet<br />
este permanece en memoria hasta que se reinicie el servidor o hasta que se le<br />
diga lo contrario con lo cual las subsiguientes peticiones son mas rapidas al<br />
encontrarse el programa ya cargado en memoria. </p>
<p>· Un servlet puede ejecutarse(incido en esto <em>puede </em>no es necesario) en una<br />
<em>sandbox </em>o recinto de seguridad parecido al modelo que se se sigue con los<br />
applets.Debido a esto pueden colocarse servlets en servidores dedicados a hosting<br />
sin que la empresa tema por la integridad del servidor y la seguridad de las<br />
aplicaciones. Historicamente el rechazo al uso de los servlets se ha debido a la injustificada leyenda de la falta de velocidad de ejecución del lenguaje Java.Sin embargo si observamos las lenguajes de script que tradicionalmente se han usado para escribir aplicaciones CGI´s (Perl,PHP..) nos encontramos con que tambien son interpretados lo que unido a la necesidad de lanzar un proceso por petición provocan un rendimiento considerablemente menor. Esto no pasa si el lenguaje de implementación del CGI es uno compilado como puede ser C pero la obligatoriedad de cumplir la ecuación 1 peticion = 1 proceso situan el rendimiento en niveles parecidos con un menor consumo de recursos del servlet. </p>
<p>¿Dónde puedo ejecutar Servlets y qué necesito? </p>
<p>En la actualidad la mayoria de servidores web tanto comerciales como de licencia libre<br />
tienen la capacidad de ejecutar servlets a traves de plug-ins o modulos.Señalaremos<br />
unos cuantos: </p>
<p>· Apache 1.1.3 </p>
<p>· Nestcape FastTrack 2.0,Enterprise 2.0,Enterprise 3.0 </p>
<p>· Microsoft IIS </p>
<p>· WebLogic Tengah </p>
<p>· Lotus Domino Go Web Server </p>
<p>· IBM Interner Conecction Server </p>
<p>· Java Web Server </p>
<p>Con respecto a este ultimo cabe destacar que ejecuta servlets de forma nativa sin<br />
necesidad de modulos adicionales.Señalaremos dos modulos de ejecución de servlets<br />
Allaire´s JRun y Yakarta´s Tomcat ambos gratuitos y descargables desde su pagina web si no es para usos comerciales.<br />
Como dato adicional el JSDK 2.1 incluye una herramienta llamada <em>servletrunner</em>análoga a <em>appletviewer </em>para la ejecución y depuración de servlet con unas capacidades muy limitadas por lo que solo se debe usar para comprobar la exactitud del servlet. </p>
<p>Estructura de un servlet </p>
<p>El API Servlet consiste básicamente en dos paquetes: </p>
<p>· <strong>javax.servlet </strong>En este paquete se definen 6 interfaces y 3 clases para la<br />
implementación de servlets genericos,sin especificación de protocolo.Hoy en dia<br />
no tienen utilidad practica mas que para servir de base en la jerarquia de clases<br />
de los servlets.Conforme pase el tiempo se supone que constituiran la base para<br />
la implementacion de otros protocolos distintos de http.</p>
<p>· <strong>javax.servlet.http </strong>Ofrece la implementación especifica de servlets para el<br />
protocolo http. En estos paquetes se definen todas las clases e interfaces necesarias para la escritura de applets.De hecho cuando se usen los servlets(y hoy en dia no hay otra utilidad) para gestionat conexiones http usaremos las clases del paquete<strong>javax.servlet.http</strong>.<br />
El ciclo de ejecución de un servlet es análogo al de un applet con ligeras<br />
diferencias.Inicialmente el servlet debe extender a la clase <strong>HttpServlet</strong>: </p>
<p>import javax.servlet;<br />
import javax.servlet.*;<br />
import javax.servlet.http.*; </p>
<p>public class MiServlet extends HttpServlet{ </p>
<p>&#8230;. </p>
<p>} </p>
<p>Para dotar de funcionalidad a un servlet se han de redefinir una seria de metodos que </p>
<p>guardan una analogía con los metodos de funcionamiento de un </p>
<p>applet(<strong>init(),start(),stop(),destroy()</strong>). </p>
<p>· <strong>public void init(ServletConfig config)</strong> </p>
<p>Cada vez que se inicia el servlet el servidor web llama a este metodo pasando un </p>
<p>parámetro de la clase <strong>ServletConfig </strong>que guarda información de la configuración del </p>
<p>servlet y del contexto del servidor web en el que se ejecuta. A traves de <strong>ServletConfig</strong>se accede a los parámetros de inicialización del servlet que se establecieron al configurar el servlet y a traves de la interfaz <strong>ServletContext </strong>(obtenido a partir del metodo <strong>getServletContext() </strong>de <strong>ServletConfig</strong>)se accede a la información del servidor web. </p>
<p>A modo de ejemplo desarrollaremos un ejemplo simple de un servlet que escribe </p>
<p>información en un fichero de registro(el formato,ubicación y nombre de este es </p>
<p>dependiente del servidor web): </p>
<p>import javax.servlet.*; </p>
<p>import javax.servlet.http.*; </p>
<p>import java.util.*; </p>
<p>public class MiServlet extends HttpServlet{ </p>
<p>public void init(ServletConfig config){ </p>
<p>config.getServletContext().log(“Iniciado MiServlet a las” +new Date()); </p>
<p>} </p>
<p>} </p>
<p>En este metodo se han de realizar todas las operaciones unicas en el ciclo de vida del </p>
<p>servlet tal como conexion a BD de forma persistente y otras tareas de inicialización.Dado que el servlet se carga en memoria al iniciar el sevidor web o al recibir la primera petición(dependiendo de la configuración) el metodo init() es llamado <em>solo </em>una vez,no cada vez que se realice una petición. </p>
<p><strong></strong></p>
<p><strong>public void destroy()</strong> </p>
<p>Este metodo es analogo al metodo <strong>init() </strong>solo que sera llamado por el servidor web </p>
<p>cuando el servlet esta a punto de ser descargado de memoria(repito e insisto: no cuando termina una petición).En este metodo se han de realizar las tareas necesarias para conseguir una finalizacion apropiada como cerrar archivos y flujos de entrada de salida externos a la petición,cerrar conexiones persistentes a bases de datos&#8230;etc etc.. </p>
<p>Un punto importante es que se puede llamar a este método cuando todavía esta </p>
<p>ejecutándose alguna petición por lo que podría producirse un fallo del sistema y una </p>
<p>inconsistencia de datos tanto en archivos como en BD. Por eso debe retrasarse la </p>
<p>desaparición del servlet hasta que todas las peticiones hayan sido concluidas(con </p>
<p>respecto a la peticiones que lleguen en ese intervalo el servidor web sencillamente las </p>
<p>desestimará). </p>
<p><strong></strong></p>
<p><strong>public void service(HttpServletRequest request,</strong> </p>
<p><strong>HttpServletResponse response) throws ServletException, IOException.</strong> </p>
<p>En este metodo se encuentra la mayor parte de la funcionalidad del servlet.Cada vez que se realice una petición se llamará a este metodo pasándole dos parámetros que nos permite obtener información de la petición y un flujo de salida para escribir la </p>
<p>respuesta.Análogamente tenemos otra serie de metodos que realizan la implementación de respuesta a metodos de comunicación del protocolo http 1.1 como son GET y POST.Estos son respectivamente: </p>
<p><strong></strong></p>
<p><strong>public void doGet(HttpServletRequest request,HttpServletResponse</strong> </p>
<p><strong>response)</strong> </p>
<p><strong></strong></p>
<p><strong>public void doPost(HttpServletRequest request,HttpServletResponse</strong> </p>
<p><strong>response)</strong> </p>
<p>Los dos parámetros que recibe <strong>service() </strong>son esenciales para el funcionamiento del </p>
<p>servlet por lo que pasaremos a verlos con mas profundidad: </p>
<p>Los dos parámetros que recibe <strong>service() </strong>son <strong>HttpservletRequest </strong>y </p>
<p><strong>HttpServletResponse HttpServletRequest</strong> </p>
<p>Esta interfaz derivada de <strong>ServletRequest </strong>proporciona los metodos para recuperar la </p>
<p>informacion de la petición del usuario asi como del propio usuario.Señalaremos los mas </p>
<p>importantes: </p>
<p><strong></strong></p>
<p><strong>public abstract String getRemoteHost()</strong> </p>
<p>Devuelve el nombre del ordenador que realizó la petición </p>
<p><strong></strong></p>
<p><strong>public abstract String getParameter(String parameter)</strong> </p>
<p>Devuelve el valor del parámetro <em>parameter </em>o null si dicho parámetro no existe. </p>
<p><strong></strong></p>
<p><strong>public abstract String[] getParameterValues(String parameter)</strong> </p>
<p>Devuelve un array con los valores del parametro especificado por parameter o null si </p>
<p>dicho parametro no existe. </p>
<p><strong></strong></p>
<p><strong>public abstract Enumeration getParameterNames()</strong> </p>
<p>Devuelve una Enumeration de los nombre de los parametros empleados en la petición. </p>
<p><strong>HttpServletResponse</strong> </p>
<p>Se trata de un interfaz derivada de ServletResponse que proporciona los metodos para </p>
<p>realizar la respuesta al cliente que originó la petición.Señalaremos los mas importantes: </p>
<p><strong></strong></p>
<p><strong>public abstract PrintWriter getWriter()</strong> </p>
<p>Permite obtener un objeto <strong>PrintWriter </strong>para escribir la respuesta. </p>
<p><strong></strong></p>
<p><strong>public abstract setContentType(String)</strong> </p>
<p>Permite establecer el tipo MIME de la respuesta </p>
<p><strong></strong></p>
<p><strong>public abstract setContentLenght(int)</strong> </p>
<p>Permite especificar la longitud de la respuesta.Si no se indica el propio motor de servlets calculará la longitud de la respuesta.A efectos practicos el autor de este tutorial no encuentra otra utilidad a este metodo mas que permitir al navegador mostrar una barra de progreso que muestre el estado de descarga de la solicitud. </p>
<p><strong></strong></p>
<p><strong></strong></p>
<p><strong>Ejemplo de servlet</strong> </p>
<p>A continuación realizaremos un sencillo de ejemplo de un servlet que recibirá como </p>
<p>parámetro un nombre y saludará al cliente que realizo la petición. Para ello </p>
<p>construiremos una pagina web con un formulario que nos servirá para enviar la petición </p>
<p>al servlet. </p>
<p>Ejemplo de servlet </p>
<p>Introduzca su nombre y pulse el boton de enviar </p>
<p>Nombre: </p>
<p>A continuación se muestra el codigo del servlet profusamente comentado.Este codigo </p>
<p>fuente se compilaría y se situaría en el directorio configurado en el servido web para la </p>
<p>ejecución de servlets(en nuestro caso sera /servlet): </p>
<p>import java.io.*; </p>
<p>import javax.servlets.*; </p>
<p>import javax.servlets.http.*; </p>
<p>public class HolaServlet extends HttpServlet { </p>
<p>/* </p>
<p>* Redefinición del metodo init y configuración de los parámetros de </p>
<p>inicio </p>
<p>*/ </p>
<p>public void init(ServletConfig config) throws ServletException { </p>
<p>/* </p>
<p>* Llamada la metodo init() de la superclase.Esto es imprescindible </p>
<p>* para la correcta inicialización del servlet y debe realizarse </p>
<p>* antes que cualquier otra acción </p>
<p>*/ </p>
<p>super.init(config); </p>
<p>System.out.println(&#8220;HolaServlet arrancado a las &#8221; + new Date()); </p>
<p>} </p>
<p>/* </p>
<p>* Redefinición del metodo destroy sin tareas a realizar en este caso </p>
<p>*/ </p>
<p>public void destroy() { </p>
<p>System.out.println(&#8220;HolaServlet detenido a las &#8221; + new Date()); </p>
<p>} </p>
<p>/* </p>
<p>* En este caso se ha optado por redefinir el metodo doPost(), </p>
<p>pudiendose </p>
<p>* igualmente haberse optado por redefinir service().Lo que seria </p>
<p>incorrecto </p>
<p>* es redefinir doGet() ya que la peticion se realizará por el método </p>
<p>post </p>
<p>*/ </p>
<p>public void doPost(HttpServletRequest request, </p>
<p>HttpServletResponse response) throws ServletException { </p>
<p>/* </p>
<p>* Se obtiene el valor del parametro enviado </p>
<p>*/ </p>
<p>String name = request.getParameter(&#8220;nombre&#8221;); </p>
<p>/* </p>
<p>* Se establece el contenido MIME de la respuesta </p>
<p>*/ </p>
<p>response.setContentType(&#8220;text/html&#8221;); </p>
<p>/* </p>
<p>* Se obtiene un flujo de salida para la respuesta </p>
<p>*/ </p>
<p>PrintWriter out; </p>
<p>try { </p>
<p>out = response.getWriter(); </p>
<p>}catch (IOException e){ </p>
<p>System.out.println(&#8220;Error en el canal de salida: &#8220;+e.toString()); </p>
<p>} </p>
<p>/* </p>
<p>*Se escribe la respuesta en HTML estandar </p>
<p>*/ </p>
<p>out.println(&#8220;&#8221;); </p>
<p>out.println(&#8220;&#8221;); </p>
<p>out.println(&#8221; Respuesta de HolaServlet&#8221;); </p>
<p>out.println(&#8220;&#8221;); </p>
<p>out.println(&#8220;&#8221;); </p>
<p>out.println(&#8220;¡Funcionó!:El servlet ha generado la pagina&#8221;); </p>
<p>out.println(&#8220;&#8221;); </p>
<p>out.println(&#8220;&#8221;); </p>
<p>out.println(&#8220;Hola &#8221; + name + &#8220;&#8221;); </p>
<p>out.println(&#8220;&#8221;); </p>
<p>out.println(&#8220;&#8221;); </p>
<p>out.println(&#8220;&#8221;); </p>
<p>/* </p>
<p>* Se fuerza del volcado del buffer de la salida y se cierra el canal </p>
<p>*/ </p>
<p>out.flush(); </p>
<p>out.close(); </p>
<p>} //fin doPost() </p>
<p>}//fin clase </p>
<p><strong>La API JDBC</strong><strong> 1.2</strong> </p>
<p>La API JBDC es una interfaz de acceso a RDBMS(Relational Database Management </p>
<p>System) independiente de la plataforma y del gestor de bases de datos utilizado.Se </p>
<p>relaciona muy a menudo con el acronimo ODBC por lo que se suele expresar como <em>Java Database Connectivity </em>pero oficialmente,según Javasoft,JDBC no significa nada ni es acronimo de nada. </p>
<p>El API consiste en una serie de interfaces Java implementadas por un controlador.Este</p>
<p>programa de gestión se encarga de la traducción a las llamadas estandar que requiere la base de datos compatible con el.De esta manera el programador puede abstraerse de la programación especifica de la base de datos creando codigo que funcionará para todas los RDBMS que cuenten con un driver JDBC con solo cambiar tal driver. </p>
<p>En la actualidad se encuentran drivers JDBC para todos los sistemas de gestión de bases de datos mas populares(e incluso podriamos decir existentes) como Informix,Oracle,SQLServer, </p>
<p>DB2,InterBase, SyBase&#8230; y otros productos de indole no comercial como </p>
<p>mSql,mySql y PostGress,etc,&#8230; </p>
<p>Aun asi existe un tipo especial de drivers denominados puentes JDBC-ODBC que traducen las llamadas en JDBC a llamadas en el estandar de comunicación con bases de datos desarrollado por Microsoft ODBC por lo que en ultimo termino siempre se podrá utilizar uno de estos drivers ya que la totalidad de los sistemas de gestión de bases de datos cuentan con un driver de este ultimo tipo.Esto nos lleva a la clasificación de los distintos drivers que cumplen la especificación JDBC 1.2. </p>
<p><strong></strong></p>
<p><strong>Tipos de drivers JDBC</strong> </p>
<p>A continuación se señalan y describen los cuatro tipos distintos de drivers JDBC </p>
<p>existentes: </p>
<p>· <strong>Nivel 1: Puente JDBC:ODBC.</strong> </p>
<p>Esta categoría de controladores se remite al controlador de puente JDBC-ODBC </p>
<p>original.Este ultimo utiliza el controlador ODBC de Microsoft para comunicarse con </p>
<p>los servidores de base de datos.Se implementa tanto en codigo binario como en </p>
<p>Java y debe ser instalado previamente en la computadora cliente antes de poder </p>
<p>usarlo. </p>
<p>· <strong>Nivel 2: Controlador JDBC de protocolo nativo en Java y binario.</strong> </p>
<p>Esta categoría esta compuesta por controladores que hablan con los servidores de </p>
<p>bases de datos en el protocolo nativo de la base de datos.Se implementan como </p>
<p>una combinación de codigo binario y Java y deben ser instalados en el cliente </p>
<p>antes de poder ser usados. </p>
<p>· <strong>Nivel 3:Controlador JDBC de protocolo no nativo en Java puro.</strong> </p>
<p>Esta categoría esta formada por controladores de Java puro( no hay codigo </p>
<p>binario) que hablan un protocolo de red estandar(como http) con un servidor de </p>
<p>acceso a bases de datos.Este servidor traduce el protocolo de red a uno de base </p>
<p>de datos específicos de la marca.No necesita instalación en cliente. </p>
<p>· <strong>Nivel 4:Controlador JDBC de protocolo nativo en Java puro</strong> </p>
<p>Está formada por controladores de Java puro que hablan el protocolo de la base </p>
<p>de datos especifico de la marca edl servidor de bases de datos que se haya </p>
<p>designado para servir de interfaz.No necesita instalción en cliente. </p>
<p>Como se observa la clasificación de los niveles de controladores JDBC se hace en funcion de que hablen el protocolo nativo de la base de datos y de que se encuentren </p>
<p>implementados en Java puro o parcialmente esten escritos en codigo binario dependiente de la plataforma.Con respecto a lo primero la eliminación de las capas de traducción en el caso de que la llamada del driver no sea nativa pueden degradar el rendimiento pero hay ocasiones en que no hay otra opcion.Por otra parte el hecho de que el driver esté escrito en Java puro consigue,aparte de independencia de la plataforma de ejecución, que no sea necesaria instalación ni configuración(como el caso del DSN del ODBC) en el cliente lo que facilita la gestión y siendo la unica solución en casos en que el cliente sea </p>
<p>un applet. Si encontramos los 4 niveles de drivers el mas adecuado en el 95% de las </p>
<p>ocasiones será el de nivel 4. </p>
<p><strong></strong></p>
<p><strong>El paquete java.sql </strong>Consta de una seria de clases e interfaces de las cuales </p>
<p>pasaremos a discutir las mas importantes: </p>
<p>· <strong>Driver</strong> </p>
<p>Se trata de una clase que implementa el controlador JDBC especifico de la base de </p>
<p>datos y es suministrado por el proveedor de bases de datos.Junto a la clase </p>
<p><em>DriverManager </em>permite cargar y descargar los controladores de forma dinamica.El </p>
<p>controlador de sirve de una cadena para localizar y acceder a recursos dentro la </p>
<p>base de datos con una sintaxis muy parecida a una URL.En todo caso esta cadena </p>
<p>será de la forma: </p>
<p>Jdbc:://:/ </p>
<p>Antes de realizar la conexión con la base de datos se debe haber cargado en </p>
<p>memoria el controlador para lo que se usa el metodo estatico de la clase Class </p>
<p><em>forName(String).</em> </p>
<p>· <em>Connection</em> </p>
<p><em>Esta interfaz representa una sesión persistente con la base de datos que es</em> </p>
<p><em>devuelta por el Driver. Nos permite utilizar transacciones(si el DBMS lo admite)</em> </p>
<p><em>asi como obtener una interfaz para la ejecución de instrucciones SQL.</em> </p>
<p>· <em>Statement</em> </p>
<p><em>Esta interfaz se trata de un vehículo para la ejecución de sentencias SQL a la base</em> </p>
<p><em>de datos y la extracción de resultados.A este respecto hay que señalar que JDBC</em> </p>
<p><em>acepta el estandar SQL-92 como minimo exigible por lo que implementaciones</em> </p>
<p><em>nuevas y/o dependientes del DBMS pueden no estar admitidas.</em> </p>
<p>· <em>ResultSet</em> </p>
<p><em>Representa un conjunto de resultados de forma abstracta(esto es una</em> </p>
<p><em>“tabla”).Dependiendo de su creación permite acceso secuencial o aleatorio y</em> </p>
<p><em>presenta una serie de metodos para obtener información de los resultados y para</em> </p>
<p><em>movernos por el conjunto.</em> </p>
<p><em>Una vez vistas las clases e interfaces para la gestion de consultas JDBC veremos los</em> </p>
<p><em>pasos a seguir para realizar una consulta a la base de datos.</em> </p>
<p><em>Inicialmente se debe cargar en memoria el controlador JDBC que vayamos a usar:</em> </p>
<p><em>Class.forName(&#8220;sun.jdbc.odbc.JdbcOdbcDriver&#8221;);</em> </p>
<p><em></em></p>
<p><em>Esta sentencia hace que la JVM busque en todas las rutas especificadas por el CLASPATH la clase correspondiente al driver y la cargue en memoria de tal manera que este lista para posteriores usos. Seguidamente se debe realizar la conexión con la base de datos:</em> </p>
<p><em>/*</em> </p>
<p><em>* Se usa ahora un driver Oracle para acceder a la maquina local y a la</em> </p>
<p><em>tabla Ejemplo:</em> </p>
<p><em>*/</em> </p>
<p><em>String Url = &#8220;jdbc:oracle://localhost:8080/Ejemplo&#8221;;</em> </p>
<p><em>Connection conn = DriverManager.getConnection(url);</em> </p>
<p><em>Tambien existen versiones de este ultimo metodo que permiten realizar la conexion con la BD especificando un nombre de usuario y una contraseña.</em> </p>
<p><em>Creamos una sentencia para poder interactuar con la BD mediante el uso de SQL:</em> </p>
<p><em>Statement stm = conn.createStatement();</em> </p>
<p><em></em></p>
<p><em>Ahora se deberian usar algunos metodos de la interfaz Statement dependientes del tipo de sentencia SQL que queramos realizar,si devuelve datos o no,o si no sabemos si</em> </p>
<p><em>devuelve datos.</em> </p>
<p><em>/*</em> </p>
<p><em>* La ejecución de la instrucción SQL devuelve resultados</em> </p>
<p><em>*/</em> </p>
<p><em>ResultSet rs = stm.executeQuery(&#8220;SELECT * FROM Ejemplo&#8221;);</em> </p>
<p><em>int numRowsUpdated = stm.executeUpdate(&#8220;INSERT INTO Ejemplo VALUES</em> </p>
<p><em>(`Juan`,`Perez`,`45598652`)&#8221;);</em> </p>
<p><em>/*</em> </p>
<p><em>* No se sabe si devuelve resultados.Util cuando no se sabe que tipo</em> </p>
<p><em>* de instruccion SQL se esta ejecutando como cuando el usuario introduce</em> </p>
<p><em>directamente</em> </p>
<p><em>* el SQL. Posteriormente si devuelve resultados se recupera con el metodo</em> </p>
<p><em>getResultSet()</em> </p>
<p><em>*/</em> </p>
<p><em>Boolean hasResults = stm.execute(&#8220;SELECT * FROM Ejemplo&#8221;);</em> </p>
<p><em>if(hasResults) {</em> </p>
<p><em>ResultSet rs = stm.getResultSet();</em> </p>
<p><em>}</em> </p>
<p><em></em></p>
<p><em>La interfaz ResultSet presenta metodos para obtener un tipo SQL convertido a un tipo</em> </p>
<p><em>Java a partir del nombre de la columna de la forma </em><strong><em>getXXX(String nombreColumna) </em></strong><em>y se desplaza a traves de las filas usando el metodo bolean next() que desplaza el</em> </p>
<p><em>indicador de posición del ResultSet a la siguiente columna y devuelve un booleano</em> </p>
<p><em>indicando si hay mas filas(inicialmente se encuentra en la primer fila).Las XXX</em> </p>
<p><em>representan algun tipo Java como int,String,flota,double&#8230;obteniéndose metodos como</em> </p>
<p><em>getInt(string),getString(String),&#8230;</em> </p>
<p><em>Ahora si disponemos de un objeto Resulset podemos usar sus metodos para desplazarnos por el de la siguiente manera:</em> </p>
<p><em></em></p>
<p><em>while(rs.next()) {</em> </p>
<p><em>System.out.print(rs.getString(&#8220;Nombre&#8221;)+ &#8220;-&#8221;);</em> </p>
<p><em>System.out.print(rs.getString(&#8220;Apellidos&#8221;)+ &#8220;-&#8221;);</em> </p>
<p><em>System.out.println(rs.getInt(&#8220;DNI&#8221;));</em> </p>
<p><em>}</em> </p>
<p><strong><em></em></strong></p>
<p><strong><em>Un ejemplo COMPLETO</em></strong> </p>
<p><strong><em></em></strong></p>
<p><em>A continuación desarrollaremos un programa que mediante la utilización de Servlets</em> </p>
<p><em>permita actualizar y consultar los registros de una base de datos de ejemplo.El ejemplo constará de dos paginas,una que dará acceso a un servlet que permitirá introducir datos en una tabla y otra que permitirá consultar todos los registros introducidos hasta la fecha.La estructura de la tabla será la siguiente:</em> </p>
<p>Nombre Apellidos <strong>Mygnet</strong> </p>
<p><strong></strong></p>
<p><em>El driver utilizado será el puente JDBC:ODBC dado su amplia difusión y el carácter</em> </p>
<p><em>introductorio de este tutorial y se supondrá que la maquina que ejecuta las peticiones esla misma que corre el servidor web y el servidor de bases de datos.Dada la utilización del ODBC debe configurarse el DSN(de usuario o de sistema indistintamente) previamente a la utilización de servlets.A continuación se presentan las paginas HTML usadas y un captura de su apariencia:</em> </p>
<p><em>Pagina de introducción de datos:</em> </p>
<p><em></em></p>
<p><em></em></p>
<p><em></em></p>
<p><em>Pagina de introducción de datos</em> </p>
<p><em></em></p>
<p><em></em></p>
<p><em>INTRODUZCA SUS DATOS</em> </p>
<p><em></em></p>
<p><em>NOMBRE:</em> </p>
<p><em></em></p>
<p><em>APELLIDOS:</em> </p>
<p><em></em></p>
<p><em>DNI: </em></p>
<p><em></em></p>
<p><em></em></p>
<p><em></em></p>
<p><em></em></p>
<p><em></em></p>
<p><em></em></p>
<p><em></em></p>
<p><strong><em>Página de consulta de resultados</em></strong> </p>
<p><em></em></p>
<p><em></em></p>
<p><em></em></p>
<p><em>Pagina de recuperación de datos</em> </p>
<p><em></em></p>
<p><em></em></p>
<p><em>INTRODUZCA EL DNI DE LA PERSONA A BUSCAR</em> </p>
<p><em></em></p>
<p><em>DNI:</em> </p>
<p><em></em></p>
<p><em></em></p>
<p><em></em></p>
<p><em></em></p>
<p><em></em></p>
<p><em></em></p>
<p><em></em></p>
<p><em></em></p>
<p><em>Como se puede observar la aplicación consta de dos servlets que operarán sobre la</em> </p>
<p><em>misma base de datos Ejemplo.El primero InServlet permitirá introducir datos en la BD</em> </p>
<p><em>mientras que el segundo OutServlet permitirá realizar consultas basándose en el DNI de la persona.A continuación se presenta el codigo del primer servlet:</em> </p>
<p><em></em></p>
<p><em>/*</em> </p>
<p><em>*InServlet.java</em> </p>
<p><em>*/</em> </p>
<p><em>import java.io.*;</em> </p>
<p><em>import javax.servlet.*;</em> </p>
<p><em>import javax.servlet.http.*;</em> </p>
<p><em>import java.sql.*;</em> </p>
<p><em>public class InServlet extends HttpServlet {</em> </p>
<p><em>Connection conn;</em> </p>
<p><em>/*</em> </p>
<p><em>* En el metodo Init se realizará la conexión a la BD</em> </p>
<p><em>* por lo que las peticiones no producirán ningun retardo de conexión</em> </p>
<p><em>*/</em> </p>
<p><em>public void init(ServletConfig cf) throws ServletException {</em> </p>
<p><em>super.init(cf);</em> </p>
<p><em>// Se carga el driver a continuación</em> </p>
<p><em>try {</em> </p>
<p><em>Class.forName(&#8220;sun.jdbc.odbc.JdbcOdbcDriver&#8221;);</em> </p>
<p><em>}catch (ClassNotFoundException e) {</em> </p>
<p><em>System.out.println(&#8220;Imposible encontrar el driver:&#8221; +</em> </p>
<p><em>e.getMessage());</em> </p>
<p><em>}</em> </p>
<p><em>//Se intenta realizar la conexión a la base de datos ejemplo</em> </p>
<p><em>try {</em> </p>
<p><em>conn = DriverManager.getConnection(&#8220;jdbc:odbc://localhost/Ejemplo&#8221;);</em> </p>
<p><em>}catch (SQLException e) {</em> </p>
<p><em>Systen.out.println(&#8220;Imposible crear conexion:&#8221; + e.getMessage());</em> </p>
<p><em>}</em> </p>
<p><em>}// fin init</em> </p>
<p><em>/*</em> </p>
<p><em>* En el metodo destroy() una vez que el servlet se esta apagando,</em> </p>
<p><em>desconectaremos</em> </p>
<p><em>* de la base de datos</em> </p>
<p><em>*/</em> </p>
<p><em>public void destroy() {</em> </p>
<p><em>super.destroy();</em> </p>
<p><em>//Llamada al destroy de la superclase</em> </p>
<p><em>try {</em> </p>
<p><em>conn.close();</em> </p>
<p><em>}catch (SQLException e){</em> </p>
<p><em>Systen.out.println(&#8220;Imposible cerrar conexion:&#8221; + e.getMessage());</em> </p>
<p><em>}</em> </p>
<p><em>} //fin destroy()</em> </p>
<p><em>/*</em> </p>
<p><em>*Redefinimos el metodo doPost ya que las peticiones se realizaran por</em> </p>
<p><em>ese metodo</em> </p>
<p><em>*/</em> </p>
<p><em>public void doPost(HttpServletRequest request,</em> </p>
<p><em>HttpServletResponse response) throws</em> </p>
<p><em>ServletException {</em> </p>
<p><em>String nombre;</em> </p>
<p><em>String apellidos;</em> </p>
<p><em>int dni;</em> </p>
<p><em>//Obtenemos los valores de los parámetros</em> </p>
<p><em>nombre = request.getParameter(&#8220;Nombre&#8221;);</em> </p>
<p><em>apellidos = request.getParameter(&#8220;Apellidos&#8221;);</em> </p>
<p><em>dni = request.getParameter(&#8220;Dni&#8221;);</em> </p>
<p><em>//Comprobamos que no hay ninguno vacio</em> </p>
<p><em>//Si es asi enviamos una pagina informando del error y si no</em> </p>
<p><em>//actualizamos la BD e informamos del éxito de la operación</em> </p>
<p><em>if (nombre==null || apellidos == null || dni == null ) {</em> </p>
<p><em>PrintWriter out = response.getWriter();</em> </p>
<p><em>//Devolvemos una pagina de error</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;Error en la actualización de datos&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;¡¡Esto no rula si no pones todos los parametros</em> </p>
<p><em>chaval!!&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.flush();</em> </p>
<p><em>out.close();</em> </p>
<p><em>}else {// no hay errores</em> </p>
<p><em>try {</em> </p>
<p><em>//Creamos una sentencia para la introducción de valores</em> </p>
<p><em>Statement stm = conn.createStatement();</em> </p>
<p><em>int nunRowsUpdated = stm.executeUpdate(&#8220;INSERT INTO Ejemplo</em> </p>
<p><em>VALUES&#8221;+&#8221;(`&#8221;+nombre+&#8221;`,`&#8221;+apellidos+&#8221;`,`&#8221;+dni+&#8221;`)&#8221;);</em> </p>
<p><em>PrintWriter out = response.getWriter();</em> </p>
<p><em>//Devolvemos una pagina de exito de operación</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;Registro actualizado&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;Operación realizada con exito&#8221;);</em> </p>
<p><em>out.println(&#8220;Actualizadas”+numRowsUpdated + “filas&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.flush();</em> </p>
<p><em>out.close();</em> </p>
<p><em>}catch(Exception e){</em> </p>
<p><em>System.out.println(&#8220;Error en la actualización&#8221; + e.getMessage());</em> </p>
<p><em>}finally{</em> </p>
<p><em>try{</em> </p>
<p><em>stm.close();</em> </p>
<p><em>}catch(SQLException e){}</em> </p>
<p><em>}//fin finally</em> </p>
<p><em>}//fin else</em> </p>
<p><em>}//fin doPOst()</em> </p>
<p><em>}//fin servlet</em> </p>
<p><em>A continuación OutServlet.java</em> </p>
<p><em>/*</em> </p>
<p><em>*OutServlet.java</em> </p>
<p><em>*/</em> </p>
<p><em>import java.io.*;</em> </p>
<p><em>import javax.servlet.*;</em> </p>
<p><em>import javax.servlet.http.*;</em> </p>
<p><em>import java.sql.*;</em> </p>
<p><em>public class OutServlet extends HttpServlet {</em> </p>
<p><em>Connection conn; //Objeto de la conexion</em> </p>
<p><em>//En el metodo Init se realizará la conexión a la BD</em> </p>
<p><em>//por lo que las peticiones no producirán ningun retardo de conexión</em> </p>
<p><em>public void init(ServletConfig cf) throws ServletException {</em> </p>
<p><em>super.init(cf);</em> </p>
<p><em>//Se intenta cargar el driver de puente JDBC-ODBC</em> </p>
<p><em>try {</em> </p>
<p><em>Class.forName(&#8220;sun.jdbc.odbc.JdbcOdbcDriver&#8221;);</em> </p>
<p><em>} catch (ClassNotFoundException e) {</em> </p>
<p><em>System.out.println(&#8220;Imposible encontrar el driver:&#8221; +</em> </p>
<p><em>e.getMessage());</em> </p>
<p><em>}</em> </p>
<p><em>//Se intenta realizar la conexión a la base de datos ejemplo</em> </p>
<p><em>try {</em> </p>
<p><em>conn = DriverManager.getConnection(&#8220;jdbc:odbc://localhost/Ejemplo&#8221;);</em> </p>
<p><em>}catch (SQLException e) {</em> </p>
<p><em>Systen.out.println(&#8220;Imposible crear conexion:&#8221; + e.getMessage());</em> </p>
<p><em>}</em> </p>
<p><em>//En el metodo destroy() una vez que el servlet se esta apagando,</em> </p>
<p><em>//desconectaremos de la base de datos</em> </p>
<p><em>}// fin init()</em> </p>
<p><em>public void destroy() {</em> </p>
<p><em>super.destroy();</em> </p>
<p><em>try {</em> </p>
<p><em>conn.close();</em> </p>
<p><em>} catch (SQLException e) {</em> </p>
<p><em>Systen.out.println(&#8220;Imposible cerrar conexion:&#8221; +e.getMessage());</em> </p>
<p><em>}</em> </p>
<p><em>}//fin destroy()</em> </p>
<p><em>//Redefinimos el metodo doPost ya que las peticiones se realizaran por</em> </p>
<p><em>ese metodo</em> </p>
<p><em>public void doPost(HttpServletRequest request,</em> </p>
<p><em>HttpServletResponse response) throws ServletException {</em> </p>
<p><em>int dni;</em> </p>
<p><em>//Obtenemos los valores de los parámetros</em> </p>
<p><em>dni = request.getParameter(&#8220;Dni&#8221;);</em> </p>
<p><em>//Comprobamos si esta vacio</em> </p>
<p><em>//Si es asi enviamos una pagina informando del error y si no</em> </p>
<p><em>//consultamos la BD e informamos de los resultados</em> </p>
<p><em>if (dni == null ) {</em> </p>
<p><em>PrintWriter out = response.getWriter();</em> </p>
<p><em>//Devolvemos una pagina de error</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;Error en la actualización de datos&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;¡¡Va a ser difícil si no pones un DNI</em> </p>
<p><em>chaval!!&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.flush();</em> </p>
<p><em>out.close();</em> </p>
<p><em>} else { // no hay errores</em> </p>
<p><em>try {</em> </p>
<p><em>//Creamos una sentencia para la recuperación de valores</em> </p>
<p><em>Statement stm = conn.createStatement();</em> </p>
<p><em>ResultSet rs = stm.executeQuery(&#8220;SELECT * FROM Ejemplos WHERE Dni</em> </p>
<p><em>=&#8221;+ dni);</em> </p>
<p><em>PrintWriter out = response.getWriter();</em> </p>
<p><em>//Devolvemos una pagina de exito de operación</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;Datos de la persona solicitada&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;Nombre</em> </p>
<p><em>&#8220;);</em> </p>
<p><em>out.println(&#8220;Apellidos</em> </p>
<p><em>&#8220;);</em> </p>
<p><em>out.println(&#8220;Dni</em> </p>
<p><em>&#8220;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>while(rs.next()) {</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;+ rs.getString(&#8220;Nombre&#8221;)+</em> </p>
<p><em>&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;+ rs.getString(&#8220;Apellidos&#8221;)+&#8221;</em> </p>
<p><em>&#8220;);</em> </p>
<p><em>out.println(&#8220;&#8221;+ rs.getInt(&#8220;Dni&#8221;)+&#8221;");</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>}</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.println(&#8220;&#8221;);</em> </p>
<p><em>out.flush();</em> </p>
<p><em>out.close();</em> </p>
<p><em>}catch (Exception e) {</em> </p>
<p><em>System.out.println(&#8220;Error en la actualización&#8221; + e.getMessage());</em> </p>
<p><em>}finally {</em> </p>
<p><em>try {</em> </p>
<p><em>stm.close();</em> </p>
<p><em>}catch(SQLException e){ }</em> </p>
<p><em>}//fin finally</em> </p>
<p><em>}//fin else</em> </p>
<p><em>}//fin doPost()</em> </p>
<p><em>}//fin servlet</em></p>
<p>Fuente: <a href="http://www.mygnet.net/articulos/j2ee/servlets_y_jdbc.303">http://www.mygnet.net/articulos/j2ee/servlets_y_jdbc.303</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.finderit.com/java/2009/03/22/servlets-y-jdbc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comenzar con J2ME</title>
		<link>http://blog.finderit.com/java/2009/03/22/comenzar-con-j2me/</link>
		<comments>http://blog.finderit.com/java/2009/03/22/comenzar-con-j2me/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 14:00:20 +0000</pubDate>
		<dc:creator>moyano</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.finderit.com/java/?p=101</guid>
		<description><![CDATA[La version Micro de Java 
palabras clave:
* Conceptos generales sobre lo que puedo aportar pa
wireless tool kit
Sun creo la versión micro de JAVA que comunmente se usa sobre telefonos moviles, celulares y PDA&#8217;s
Consideraciones que hay que tener en cuenta 

no existe función Main
Cada equipo tiene sus propias API&#8217;s las mejores de Nokia y Motorola 
en la versión del [...]]]></description>
			<content:encoded><![CDATA[<p>La version Micro de Java </p>
<p>palabras clave:</p>
<p>* Conceptos generales sobre lo que puedo aportar pa</p>
<p><code><a href="http://java.sun.com/products/sjwtoolkit/" target="_blanck">wireless tool kit</a></code></p>
<p>Sun creo la versión micro de JAVA que comunmente se usa sobre telefonos moviles, celulares y PDA&#8217;s<br />
Consideraciones que hay que tener en cuenta </p>
<ul>
<li>no existe función Main</li>
<li>Cada equipo tiene sus propias API&#8217;s las mejores de Nokia y Motorola </li>
<li>en la versión del CLDC 1.0 no soporta flotantes</li>
<li>Muchas limitaciones <img src="http://www.mygnet.com/img/272/flecha.jpg" border="0" alt="http://www.mygnet.com/img/272/flecha.jpg" /> son dispositivos limitados</li>
<li>no solo se pueden programar video juegos&#8230;</li>
</ul>
<p><img src="http://www.mygnet.com/img/272/patitas.jpg" border="0" alt="http://www.mygnet.com/img/272/patitas.jpg" /></p>
<p>Empezando&#8230;</p>
<p>necesitamos un ambiente de desarrollo la mejor opción y las tandart sería usar el wireless tool kit de SUN lo puedes descargar de su pagina en la zona de downloads.</p>
<p>esta herramienta no es un IDE ya que solo compila y crea administra los proyectos.<br />
asi que tambien requeriremos un IDE para JAVA, cualquiera ya que solo sera un editor de texto <br />
desde note pad Jcreator , eclipse este puede integrarse con el WTK (Wireless Tool Kit)<br />
Es mejor que el editor reconozca las palabras reservadas y la vista de datos del documeto.</p>
<p>WTK 2.2<code><a href="http://java.sun.com/products/sjwtoolkit/download-2_2.html" target="_blanck">download</a></code><br />
requerimientos minimos del sistema:</p>
<ul>
<li>50 MB hard disk space</li>
<li>128 MB system RAM</li>
<li>800 MHz Pentium III CPU</li>
</ul>
<p>para su insatalación requiere J2SDK 1.42. or later</p>
<p>en la carpeta WTK22apps <img src="http://www.mygnet.com/img/272/flecha.jpg" border="0" alt="http://www.mygnet.com/img/272/flecha.jpg" /> estan aplicaciones ejemplo de cualquier tipo. conexiones, juegos, audio, 3D, imagenes, etc.</p>
<p>No hay un Hello World así que con eso comenzaremos &#8230;</p>
<p>Hello World</p>
<p>Primero tenemos que crear un nuevo projecto<br />
Ejecutamos nuestra palicación kToolbar </p>
<p>Nombre del proyecto &#8230;. hello<br />
MIDlet Class Name <img src="http://www.mygnet.com/img/272/flecha.jpg" border="0" alt="http://www.mygnet.com/img/272/flecha.jpg" /> hello<br />
se abre la ventana de settings <br />
<img src="http://www.mygnet.com/img/272/wtk.jpg" border="0" alt="http://www.mygnet.com/img/272/wtk.jpg" /></p>
<p>en esta ventana puedes seleccionar el profile de CLDC y MIDP y agregar API&#8217;s</p>
<p>al terminar crea el proyecto con la siguiente estructura</p>
<p>WTK22appshello<br />
<img src="http://www.mygnet.com/img/272/flecha.jpg" border="0" alt="http://www.mygnet.com/img/272/flecha.jpg" />bin <br />
<img src="http://www.mygnet.com/img/272/flecha.jpg" border="0" alt="http://www.mygnet.com/img/272/flecha.jpg" /> lib<br />
<img src="http://www.mygnet.com/img/272/flecha.jpg" border="0" alt="http://www.mygnet.com/img/272/flecha.jpg" /> res<br />
<img src="http://www.mygnet.com/img/272/flecha.jpg" border="0" alt="http://www.mygnet.com/img/272/flecha.jpg" /> src</p>
<p>en bin <br />
<img src="http://www.mygnet.com/img/272/flecha.jpg" border="0" alt="http://www.mygnet.com/img/272/flecha.jpg" /> hello.jad</p>
<p>Fuente: <a href="http://www.mygnet.net/articulos/j2me/comenzar_con_j2me.97">http://www.mygnet.net/articulos/j2me/comenzar_con_j2me.97</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.finderit.com/java/2009/03/22/comenzar-con-j2me/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trabajando con AJAX, JSON y Mootools</title>
		<link>http://blog.finderit.com/java/2009/03/22/trabajando-con-ajax-json-y-mootools/</link>
		<comments>http://blog.finderit.com/java/2009/03/22/trabajando-con-ajax-json-y-mootools/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 13:58:55 +0000</pubDate>
		<dc:creator>moyano</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.finderit.com/java/?p=100</guid>
		<description><![CDATA[Mootools trae una serie de herramientas que nos facilitan el uso de JSON, éstas herramientas son JSON.js y JSON.Remote.js, las cuales veremos a continuación. Si no sabes que es JSON, podés consultarlo en la Wikipedia.

JSON, acrónimo de “JavaScript Object Notation”, es un formato ligero para el intercambio de datos. JSON es un subconjunto de la notación literal de objetos de Javascript [...]]]></description>
			<content:encoded><![CDATA[<p>Mootools trae una serie de herramientas que nos facilitan el uso de <em>JSON</em>, éstas herramientas son <em>JSON.js</em> y <em>JSON.Remote.js</em>, las cuales veremos a continuación. Si no sabes que es <em>JSON</em>, podés consultarlo en la <a href="http://es.wikipedia.org/wiki/JSON">Wikipedia</a>.</p>
<p><ins><ins></ins></ins></p>
<blockquote><p><em>JSON, acrónimo de “JavaScript Object Notation”, es un formato ligero para el intercambio de datos. JSON es un subconjunto de la notación literal de objetos de Javascript pero no requiere el uso de XML.</em></p>
<p><em>(…)</p>
<p></em><em>JSON se emplea habitualmente en entornos donde el tamaño del flujo de datos entre cliente y servidor es de vital importancia (de aquí su uso por Yahoo, Google, etc, que atienden a millones de usuarios) cuando la fuente de datos es explícitamente de fiar(…)</em></p></blockquote>
<h4>Json.js</h4>
<p><em>Json.js</em> nos facilita la tarea de pasar de un <em>string Json</em> a un <em>Objeto Javascript</em> y viceversa.</p>
<p><strong>Json.toString(objeto)</strong><br />
Nos permite pasar un <em>Objeto Javascript</em> a un simple <em>String</em>.</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1
2
3
4
5
6
7</pre>
</td>
<td class="code">
<pre><span>var</span> objeto <span>=</span>
<span>{</span>
	nombre<span>:</span> <span>'Mootools'</span><span>,</span>
	descripcion<span>:</span> <span>'Framework'</span>
<span>}</span>
<span>var</span> str <span>=</span> Json.<span>toString</span><span>(</span>objeto<span>)</span><span>;</span>
<span>//{"nombre":"Mootools","descripcion":"Framework"}</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<p><strong>Json.evaluate(string, secure)</strong><br />
Nos permite pasar de un <em>String Json</em> a un <em>Objeto Javascript</em>.</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1
2
3
4</pre>
</td>
<td class="code">
<pre><span>var</span> str <span>=</span> <span>'{"nombre":"Mootools","descripcion":"Framework"}'</span><span>;</span>
<span>var</span> objeto <span>=</span> Json.<span>evaluate</span><span>(</span>str<span>)</span><span>;</span>
<span>alert</span><span>(</span>objeto.<span>nombre</span><span>)</span><span>;</span> <span>//Mootools</span>
<span>alert</span><span>(</span>objeto.<span>descripcion</span><span>)</span><span>;</span> <span>//Framework</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<p><em>secure</em> es un parámetro opcional que por <em>default</em> es <em>false</em>, pero si lo cambiamos a <em>true</em>, se chequeará la sintaxis del <em>string Json</em>. En caso de que el <em>string</em> sea incorrecto,<em>Json.evaluate</em> devolverá <em>null</em>.</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1
2
3
4
5
6
7
8</pre>
</td>
<td class="code">
<pre><span>var</span> str <span>=</span> <span>'{"nombre":"Mootools","descripcion":"Framework}'</span><span>;</span>
<span>//Faltan " para Framework</span>
<span>var</span> objeto <span>=</span> Json.<span>evaluate</span><span>(</span>str<span>,</span> <span>true</span><span>)</span><span>;</span>
<span>if</span><span>(</span>objeto <span>!=</span> <span>null</span><span>)</span>
	<span>alert</span><span>(</span>objeto.<span>nombre</span><span>)</span><span>;</span>
<span>else</span>
	<span>alert</span><span>(</span><span>'El string JSON es incorrecto.'</span><span>)</span><span>;</span>
<span>//El string JSON es incorrecto.</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<p> </p>
<h4>Json.Remote.js</h4>
<p><em>Json.Remote</em> nos permite enviar y recibir objetos <em>JSON</em> mediante <em>AJAX</em> de manera muy simple. Hereda de <a href="http://www.jourmoly.com.ar/mootools-xmlhttprequest-xhrjs/">xhr.js</a> por lo cual se pueden usar todos sus métodos, opciones y eventos.</p>
<p><strong>Recibiendo un objeto</strong></p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1
2
3
4
5
6
7
8
9</pre>
</td>
<td class="code">
<pre><span>var</span> miJSON <span>=</span> <span>new</span> Json.<span>Remote</span><span>(</span><span>"recibe.php"</span><span>,</span>
<span>{</span>
	onComplete<span>:</span> <span>function</span><span>(</span>objeto<span>)</span>
	<span>{</span>
		<span>alert</span><span>(</span>objeto.<span>nombre</span><span>)</span><span>;</span> <span>//Mootools</span>
		<span>alert</span><span>(</span>objeto.<span>descripcion</span><span>)</span><span>;</span> <span>//Framework</span>
	<span>}</span>
<span>}</span><span>)</span><span>;</span>
miJSON.<span>send</span><span>(</span><span>)</span><span>;</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>El código de <em>recibe.php</em> es:</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1
2
3</pre>
</td>
<td class="code">
<pre><span>&lt;</span> ?php
<span>echo</span> <span>"{'nombre': 'Mootools', 'descripcion': 'Framework'}"</span><span>;</span>
<span>?&gt;</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>Como se puede apreciar en el ejemplo, la manera de enviar la petición es muy similar a lo que <a href="http://www.jourmoly.com.ar/ajax-facil-con-mootools-ajaxjs/">ya veníamos viendo</a>. Indicamos la <em>url</em> de nuestro script, en este caso<em>recibe.php</em>, y luego recibimos el objeto que nos devuelve <em>recibe.php</em> que es el que viene como parámetro en la función del evento <em>onComplete</em>.</p>
<p>Supongamos que tenemos una base de datos de productos y queremos, mediante PHP y AJAX, mostrar todos esos productos. Con <em>Json.Remote</em> enviaríamos la petición a PHP, éste buscaría todos los productos y los devolvería en formato JSON. Una vez que tenemos los datos en dicho formato, solo debemos mostrarlos con<em>javascript</em>.</p>
<p>Ahora, si no queremos mostrar todos los productos o si deseamos realizar una búsqueda debemos indicarle a PHP cual es el filtro que debe aplicar, y <em>Json.Remote</em>nos permite enviárselo.</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1
2
3
4
5
6
7
8
9
10
11
12</pre>
</td>
<td class="code">
<pre><span>var</span> miJSON <span>=</span> <span>new</span> Json.<span>Remote</span><span>(</span><span>"recibe.php"</span><span>,</span>
<span>{</span>
	onComplete<span>:</span> <span>function</span><span>(</span>objeto<span>)</span>
	<span>{</span>
		<span>alert</span><span>(</span>objeto.<span>nombre</span><span>)</span><span>;</span> <span>//Mootools2</span>
		<span>alert</span><span>(</span>objeto.<span>descripcion</span><span>)</span><span>;</span> <span>//Framework</span>
	<span>}</span>
<span>}</span><span>)</span><span>;</span>
miJSON.<span>send</span><span>(</span>
<span>{</span>
	nombre<span>:</span><span>"Mootools2"</span>
<span>}</span><span>)</span><span>;</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>Ahora con el método <em>send</em> estamos enviando un objeto, el cual puede ser un filtro o un parámetro de búsqueda.</p>
<p>El código de <em>recibe.php</em> es:</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1
2
3
4
5
6
7</pre>
</td>
<td class="code">
<pre><span>&lt;</span> ?php
<span>$request</span> <span>=</span> <span>file_get_contents</span><span>(</span><span>'php://input'</span><span>)</span><span>;</span> <span>// json={nombre:"Mootools2"}</span>
<span>$data</span> <span>=</span> <span>str_replace</span><span>(</span><span>'json='</span><span>,</span> <span>''</span><span>,</span> <span>$request</span><span>)</span><span>;</span>
 
<span>$json</span> <span>=</span> json_decode<span>(</span><span>$data</span><span>)</span><span>;</span>
<span>echo</span> <span>"{'nombre': '"</span> <span>.</span> <span>$json</span><span>-&gt;</span><span>nombre</span> <span>.</span> <span>"', 'descripcion': 'Framework'}"</span><span>;</span>
<span>?&gt;</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>En este caso PHP recibe los parámetros de una manera muy distinta a como ya habíamos visto. Incluso, a la hora de hacer los ejemplos me perdí un buen rato con este asunto, pero luego <a href="http://dev.mootools.net/ticket/74">googleando</a> un poco pude hacerlo funcionar.</p>
<p>Como complemento a este artículo, preparé una serie de <a href="http://www.jourmoly.com.ar/ejemplos/mootools/remote/json/ejemplos.html">ejemplos sobre Json y Json.remote</a>. Asimismo, próximamente habrá un segundo artículo sobre éste tema en el cual mostraré un ejemplo un poco mas práctico.</p>
<p>Fuente: <a href="http://www.jourmoly.com.ar/trabajando-con-ajax-json-y-mootools/">http://www.jourmoly.com.ar/trabajando-con-ajax-json-y-mootools/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.finderit.com/java/2009/03/22/trabajando-con-ajax-json-y-mootools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Primera Aplicacion Grails</title>
		<link>http://blog.finderit.com/java/2009/03/22/primera-aplicacion-grails/</link>
		<comments>http://blog.finderit.com/java/2009/03/22/primera-aplicacion-grails/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 13:57:52 +0000</pubDate>
		<dc:creator>moyano</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.finderit.com/java/?p=99</guid>
		<description><![CDATA[Lo primero fue descargar el grails desde la página oficial pero el instalador para windows no estaba, asi que lo descargue de esta pagina .
Despues de instalar Grails 1.0.3 en mi disco c:\ y hacer correr la consola de grails me decia que el JAVA_HOME no estaba definido. Asi que tube que agregarlo a las variables de Windows.
Para setear [...]]]></description>
			<content:encoded><![CDATA[<p>Lo primero fue <a title="(14 hits)" href="http://estebanfuentealba.com/blog/wordpress/go.php?http://grails.org/Download" target="_blank">descargar el grails desde la página oficial</a> pero el instalador para windows no estaba, asi que lo descargue de <a title="(8 hits)" href="http://estebanfuentealba.com/blog/wordpress/go.php?http://72.249.85.178/files/grails-1.0.3-win_setup.exe" target="_blank">esta pagina</a> .</p>
<p>Despues de instalar Grails 1.0.3 en mi disco c:\ y hacer correr la consola de grails me decia que el JAVA_HOME no estaba definido. Asi que tube que agregarlo a las variables de Windows.</p>
<p>Para setear el <span>JAVA_HOME</span> se van a <strong>Inicio</strong> / Click Derecho en <strong>My Computer</strong> y se van a<strong>Properties</strong></p>
<p><a title="(5 hits)" rel="lytebox[primera-aplicacion-grails]" href="http://estebanfuentealba.com/blog/wordpress/go.php?http://img524.imageshack.us/img524/959/01mo9.png"><img class="aligncenter" src="http://img524.imageshack.us/img524/959/01mo9.png" alt="" width="158" height="160" /></a></p>
<p>Luego se van a la pestaña <strong>Advanced </strong>y clickean el boton <strong>Enviroment Variables</strong></p>
<p><a rel="lytebox[primera-aplicacion-grails]" href="http://img207.imageshack.us/img207/5099/02ub6.png"><img class="aligncenter" src="http://img207.imageshack.us/img207/5099/02ub6.png" alt="" width="142" height="156" /><br />
</a></p>
<p>Ahí agregan en <strong>System Variables</strong> una <strong>New</strong> variable. En Variable Name escriben <span><strong>JAVA_HOME</strong></span> y en Variable Value inserta la ubicacion del JDK en mi caso es <span><strong>C:\Program Files\Java\jdk1.6.0_05</strong></span></p>
<p>Ya teniendo eso ya podemos ocupar Grails.</p>
<p>Primero abran la consola de Grails y tecleen <strong>grails</strong>.</p>
<p>debe aparecer algo parecido a esto:</p>
<p><em><code>Welcome to Grails 1.0 - http://grails.org/</code></em></p>
<p><em>Licensed under Apache Standard License 2.0</em></p>
<p><em>Grails home is set to: /Developer/grails-1.0</em></p>
<p><em>No script name specified. Use ‘grails help’ for more info</em></p>
<p>Luego crean su Aplicacion tecleando <strong>grails create-app &lt;nombre&gt;</strong></p>
<p>Ejemplo:<strong></strong></p>
<p><em>grails:\&gt;</em><strong> grails create-app holaMundo</strong></p>
<p>luego de teclear eso se empiezan a crear las carpetas y archivos necesarios. Una vez terminado eso entramos a la carpeta que creo grails en la carpeta donde esta ubicado grails tecleando <strong>cd &lt;nombre&gt; </strong>en mi caso  es<strong></strong></p>
<p><em>grails:\&gt;</em><strong> </strong><strong>cd holaMundo</strong></p>
<p>y para hacer correr nuestra aplicacion tecleamos <strong>grails run-app</strong></p>
<p><em>grails:\&gt; </em><strong>grails run-app</strong><strong></strong></p>
<p>y se empezará a compilar nuestro proyecto , una vez que termine nos entregara un link para poder ver nuestra apliacion</p>
<p><a title="(18 hits)" rel="lytebox[primera-aplicacion-grails]" href="http://estebanfuentealba.com/blog/wordpress/go.php?http://img413.imageshack.us/img413/6274/grailsfinishxj1.png"><img class="aligncenter" src="http://img413.imageshack.us/img413/6274/grailsfinishxj1.png" alt="" width="283" height="140" /></a></p>
<p>entramos al link que nos entrega con algun navegador web y Taran, ya esta corriendo nuestra web.</p>
<p><a title="(22 hits)" rel="lytebox[primera-aplicacion-grails]" href="http://estebanfuentealba.com/blog/wordpress/go.php?http://img186.imageshack.us/img186/3852/grailsweb01ln7.png"><img class="aligncenter" src="http://img186.imageshack.us/img186/3852/grailsweb01ln7.png" alt="" width="286" height="211" /></a></p>
<p>Ahora paremos nuestra aplicacion tecleando en la consola <strong>CTRL+C</strong> y crearemos un domain-class que tendra todos los datos del supermercado. Tecleamos <strong>grails create-domain-class &lt;nombreDeLaClase&gt;</strong></p>
<p><em>grails:\&gt; </em><strong>grails create-domain-class Articulos</strong></p>
<p>y nos crea en nuestra carpeta  “C:\grails-1.0.3\holaMundo\grails-app\domain” una clase llamada Articulo, la abrimos con algun editor de texto y veremos que esta vacia.</p>
<p>class Articulo {</p>
<p>}</p>
<p>A esa clase le agregamos algunos atributos, como nombre,precio,marca,unidades y codigo</p>
<p>class Articulo {</p>
<p>String nombre;</p>
<p>String marca;</p>
<p>String codigo;</p>
<p>int unidades;</p>
<p>double precio</p>
<p>}</p>
<p>guardamos el archivo y tecleamos en la consola <strong>grails generate-all Articulo</strong> para que nos genere el bytecode de la clase</p>
<p><em>grails:\&gt; </em><strong>grails generate-all Articulo</strong></p>
<p>Grails se encargará de generar todo el codigo de Mutadores , accesadores, codigo Sql, codigo html, diseño , etc. solo con poner esos 5 atributos</p>
<p>Ahora hacemos correr nuevamente nuestra aplicacion</p>
<p><em>grails:\&gt; </em><strong>grails run-app</strong></p>
<p>Esperamos unos segundos para que compile, copie y todo lo que tenga que hacer y abrimos nuevamente el link que nos entrega.</p>
<p>y como arte de magia …</p>
<p><a title="(22 hits)" rel="lytebox[primera-aplicacion-grails]" href="http://estebanfuentealba.com/blog/wordpress/go.php?http://img375.imageshack.us/img375/1694/grailsweb02qj8.png"><img class="aligncenter" src="http://img375.imageshack.us/img375/1694/grailsweb02qj8.png" alt="" width="279" height="208" /></a></p>
<p>nos crea un <strong>ArticuloController</strong>, si entramos a ese link viene lo genial…</p>
<p><a title="(17 hits)" rel="lytebox[primera-aplicacion-grails]" href="http://estebanfuentealba.com/blog/wordpress/go.php?http://img207.imageshack.us/img207/1669/grailsweb03xh7.png"><img class="aligncenter" src="http://img207.imageshack.us/img207/1669/grailsweb03xh7.png" alt="" width="282" height="210" /></a></p>
<p>Con los atributos que definimos en la clase Articulo groovy nos creo una lista , donde podemos ingresar, eliminar y editar esos datos usando sql, cuanto tiempo y lineas de codigo nos ha ahorrado groovy xD</p>
<p>Agregaremos un articulo:</p>
<p><a title="(16 hits)" rel="lytebox[primera-aplicacion-grails]" href="http://estebanfuentealba.com/blog/wordpress/go.php?http://img403.imageshack.us/img403/3142/grailsweb04xz9.png"><img class="aligncenter" src="http://img403.imageshack.us/img403/3142/grailsweb04xz9.png" alt="" width="283" height="212" /></a></p>
<p>y wow se nos agrego a la lista de articulos</p>
<div>Fuente: <a href="http://estebanfuentealba.com/blog/wordpress/2008/10/09/primera-aplicacion-grails/">http://estebanfuentealba.com/blog/wordpress/2008/10/09/primera-aplicacion-grails/</a></div>
<p><a title="(10 hits)" rel="lytebox[primera-aplicacion-grails]" href="http://estebanfuentealba.com/blog/wordpress/go.php?http://img225.imageshack.us/img225/9674/grailsweb05vc8.png"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.finderit.com/java/2009/03/22/primera-aplicacion-grails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>actualización 1.4.1 de OpenSwing, framework libre para el desarrollo de aplicaciones Swing</title>
		<link>http://blog.finderit.com/java/2009/03/22/actualizacion-141-de-openswing-framework-libre-para-el-desarrollo-de-aplicaciones-swing/</link>
		<comments>http://blog.finderit.com/java/2009/03/22/actualizacion-141-de-openswing-framework-libre-para-el-desarrollo-de-aplicaciones-swing/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 13:56:28 +0000</pubDate>
		<dc:creator>moyano</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.finderit.com/java/?p=98</guid>
		<description><![CDATA[OpenSwing es un framework para el desarrollo de aplicaciones swing, tanto para aquellas que no se comunican con una base de datos como para aquellas aplicaciones de dos o tres capas cuyo front end es una aplicación de escritorio. El framework incluye un conjunto de componentes gráficos implementados en Swing orientados a la visualización de datos [...]]]></description>
			<content:encoded><![CDATA[<p><a class="external-link" href="http://oswing.sourceforge.net/" target="_blank">OpenSwing</a> es un framework para el desarrollo de aplicaciones swing, tanto para aquellas que no se comunican con una base de datos como para aquellas aplicaciones de dos o tres capas cuyo front end es una aplicación de escritorio. El framework incluye un conjunto de componentes gráficos implementados en Swing orientados a la visualización de datos entre los cuales hay componentes para mostrar cantidades de dinero, grids, un componente híbrido entre un árbol y un grid, calendarios, diagramas de Gantt y un largo etcétera.</p>
<p>OpenSwing también cuenta con una librería para el desarrollo de la capa de acceso a datos y (para las aplicaciones de tres capas) la lógica de negocio, así como una librería que se encarga de simplificar la comunicación con el servidor. También cuenta con componentes para visualizar documentos PDF y Excel. El framework se distribuye bajo licencia LGPL y cuenta con abundante documentación entre la cual se incluyen varias aplicaciones de demostración.</p>
<p>Algunos acoplamientos:</p>
<p>Home page: <a class="external-link" href="http://oswing.sourceforge.net/" target="_blank">http://oswing.sourceforge.net</a></p>
<p>Demo: <a class="external-link" href="http://oswing.sourceforge.net/demo10/demo10.jnlp" target="_blank">http://oswing.sourceforge.net/demo10/demo10.jnlp</a> </p>
<p>JAllInOne demo: <a class="external-link" href="http://www.hostingjava.it/-carniel/jAllInOne.jnlp" target="_blank">http://www.hostingjava.it/-carniel/jAllInOne.jnlp</a> </p>
<p> Fuente: <a href="http://www.softwarelibre.net/actualizaci%C3%B3n_141_de_openswing_framework_libre_para_el_desarrollo_de_aplicaciones_swing">http://www.softwarelibre.net/actualización_141_de_openswing_framework_libre_para_el_desarrollo_de_aplicaciones_swing</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.finderit.com/java/2009/03/22/actualizacion-141-de-openswing-framework-libre-para-el-desarrollo-de-aplicaciones-swing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Webminar sobre Glassfish</title>
		<link>http://blog.finderit.com/java/2009/03/22/webminar-sobre-glassfish/</link>
		<comments>http://blog.finderit.com/java/2009/03/22/webminar-sobre-glassfish/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 13:55:26 +0000</pubDate>
		<dc:creator>moyano</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.finderit.com/java/?p=97</guid>
		<description><![CDATA[Quizás ya sabéis que GlassFish v3 Prelude va a salir a finales de mes. Con ese motivo quiero organizar un Webinar en español la semana que viene.  Daré un resúmen de v3 Prelude, de GlassFish v2.1, v3, y del resto de los componentes que van directamente encima de GlassFish.
Será un Webinar de una hora, e [...]]]></description>
			<content:encoded><![CDATA[<p>Quizás ya sabéis que GlassFish v3 Prelude va a salir a finales de mes. Con ese motivo quiero organizar un Webinar en español la semana que viene.  Daré un resúmen de v3 Prelude, de GlassFish v2.1, v3, y del resto de los componentes que van directamente encima de GlassFish.</p>
<p>Será un Webinar de una hora, e incluirá preguntas y respuestas.</p>
<p>Utilizaré TheAquarium TV en uStream.TV.  Es muy fácil de usar a través de un browser con Flash.</p>
<p>El Webinar será abierto pero quiero facilitar la participación así que voy a tratar de escoger una hora que funcione para la mayoria de los paises.  Tenemos gente de LatinAmerica y de España, así que hay varias husos horarios para considerar.</p>
<p>Para facilitar el proceso, voy a usar Doodle.CH, pero voy a separar el escojer la hora del escojer el dia.</p>
<p>PRIMER PASO &#8211; <br />
* Vayan a <a class="external-link" href="http://doodle.ch/kt45kspibkyv2ayh" target="_blank">http://doodle.ch/kt45kspibkyv2ayh</a> <br />
* Marquen las horas que les funcionan (Horas estan basadas en US-Pacific, California)</p>
<p>Cuantas más horas marquen más fácil nos será a todos.</p>
<p>Para marcar sus preferencias tendrán que darse una identificación. Cualquier cosa funciona, desde su nombre, a su localidad, a un alias. Voten una sóla vez.</p>
<p>Quiero ofrecer el Webinar la semana que viene así que tenemos que concretar la fecha y hora esta semana.</p>
<p>Noticia publicada en <a class="external-link" href="http://www.javahispano.org/" target="_blank">www.javahispano.org</a>. Accede a la página web y participa</p>
<p><a class="external-link" href="http://feeds.feedburner.com/~a/javahispano_noticias?a=AAArGj" target="_blank"><img src="http://feeds.feedburner.com/~a/javahispano_noticias?i=AAArGj" border="0" alt="" /></a></p>
<p><img src="http://feeds.feedburner.com/~r/javahispano_noticias/~4/416651235" alt="" width="1" height="1" /></p>
<p> </p>
<p>You have already tagged this post. Your tags</p>
<p>Fuente: <a href="http://www.softwarelibre.net/webminar_sobre_glassfish">http://www.softwarelibre.net/webminar_sobre_glassfish</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.finderit.com/java/2009/03/22/webminar-sobre-glassfish/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cuál es un paquete de Java</title>
		<link>http://blog.finderit.com/java/2009/03/22/cual-es-un-paquete-de-java/</link>
		<comments>http://blog.finderit.com/java/2009/03/22/cual-es-un-paquete-de-java/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 13:52:55 +0000</pubDate>
		<dc:creator>moyano</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.finderit.com/java/?p=96</guid>
		<description><![CDATA[Un paquete de Java es una colección de las clases relacionadas que se pueden importar en su programa para apoyar su software. También proporcionan la gerencia del namespace, así como la protección del acceso.



 
Nota
el namespace de:A es el alcance del nombre de una variable.



La tabla siguiente demuestra algunos de los paquetes principales que se incluyen en el [...]]]></description>
			<content:encoded><![CDATA[<p><em>Un paquete <em></em></em>de Java es una colección de las clases relacionadas que se pueden importar en su programa para apoyar su software. También proporcionan la gerencia del namespace, así como la protección del acceso.</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top"> </td>
<td valign="top">Nota</td>
<td valign="top">el namespace de:A es el alcance del nombre de una variable.</td>
</tr>
</tbody>
</table>
<p>La tabla siguiente demuestra algunos de los paquetes principales que se incluyen en el lanzamiento reciente de Java 1.4 SDK (kit del desarrollo del software) junto con una breve descripción de lo que él incluye.</p>
<table border="1" width="100%">
<thead>
<tr valign="top">
<th width="29%" align="left" scope="col">Paquete</th>
<th width="71%" align="left" scope="col">Descripción</th>
</tr>
</thead>
<tbody>
<tr valign="top">
<td width="29%" align="left">java.lang</td>
<td width="71%" align="left">Éste es el paquete fundamental de Java que contiene las clases esenciales para la lengua de Java. Este paquete es incluido en su programa por el defecto y contiene muchas clases útiles, tales como secuencia, rosca, y el tipo de datos primitivo clases de la ayuda.</td>
</tr>
<tr valign="top">
<td width="29%" align="left">java.io</td>
<td width="71%" align="left">El paquete de I/O contiene las clases para las cuales permita que la ayuda entre y que operación de salida.</td>
</tr>
<tr valign="top">
<td width="29%" align="left">java.awt</td>
<td width="71%" align="left">Éste es el paquete abstracto de la caja de herramientas de la ventana y contiene todas las clases necesarias para crear un GUI dentro de sus usos y applet de Java.</td>
</tr>
<tr valign="top">
<td width="29%" align="left">java.awt.event</td>
<td width="71%" align="left">Este paquete es utilizado para apoyar la caja de herramientas abstracta de la ventana conteniendo las clases para la dirección del acontecimiento.</td>
</tr>
<tr valign="top">
<td width="29%" align="left">java.awt.image</td>
<td width="71%" align="left">Este paquete proporciona las clases importantes para que almacenan y de manipulaciones las imágenes, lo más notablemente posible las clases de BufferedImage y de VolatileImage</td>
</tr>
<tr valign="top">
<td width="29%" align="left">javax.swing</td>
<td width="71%" align="left">El paquete del oscilación, como con el paquete de AWT, se utiliza crear un GUI. Sin embargo, el oscilación es el más nuevo de los dos y, en nuestra opinión, mejor a utilizar</td>
</tr>
<tr valign="top">
<td width="29%" align="left">javax.swing.event</td>
<td width="71%" align="left">Como con el paquete de java.awt.event, esto incluye el acontecimiento adicional que maneja funcionalidad para apoyar el paquete de javax.swing.</td>
</tr>
<tr valign="top">
<td width="29%" align="left">java.util</td>
<td width="71%" align="left">El paquete para uso general contiene muchas clases útiles, incluyendo clases del almacenaje tales como ArrayList y LinkedList.</td>
</tr>
<tr valign="top">
<td width="29%" align="left">java.net</td>
<td width="71%" align="left">Este paquete contiene todo que usted necesita manejar establecimiento de una red básico en Java.</td>
</tr>
<tr valign="top">
<td width="29%" align="left">java.nio</td>
<td width="71%" align="left">Esto es un nuevo paquete al lanzamiento 1.4 y contiene las clases usadas para poner NIO en ejecucio&#8217;n (I/O nuevo).</td>
</tr>
<tr valign="top">
<td width="29%" align="left">java.sql</td>
<td width="71%" align="left">Finalmente, tenemos el paquete del SQL, que nos da la ayuda de la base de datos dentro de Java.</td>
</tr>
</tbody>
</table>
<p>Aunque hay muchos otros paquetes dentro de la lengua de Java, la lista antedicha es probablemente la más común a través de las cuales usted vendrá. Ahora hechemos una ojeada cómo podemos utilizar e importar estos paquetes de estándar en nuestros usos y applet de Java.</p>
<div>Fuente: <a href="http://e-articles.info/t/i/3486/l/es/">http://e-articles.info/t/i/3486/l/es/</a></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.finderit.com/java/2009/03/22/cual-es-un-paquete-de-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ocultar la barra de título de un JFrame</title>
		<link>http://blog.finderit.com/java/2009/03/22/ocultar-la-barra-de-titulo-de-un-jframe/</link>
		<comments>http://blog.finderit.com/java/2009/03/22/ocultar-la-barra-de-titulo-de-un-jframe/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 13:51:09 +0000</pubDate>
		<dc:creator>moyano</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.finderit.com/java/?p=95</guid>
		<description><![CDATA[Para ocultar la barra de título a un JFrame simplemente le asignamos al JFrame true al método setUndecorated:
jFrame.setUndecorated(true);
Por ejemplo:


view plaincopy to clipboardprint?


package ar.lefunes;  
  
import javax.swing.JFrame;  
import javax.swing.JLabel;  
  
public class Inicio {  
  
    public static void main(String[] args) {  
        JFrame sinBarraTitulo = new JFrame();  
        sinBarraTitulo.setUndecorated(true);  
        sinBarraTitulo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  
        sinBarraTitulo.add(new JLabel(&#8220;Frame sin Barra de Titulo&#8221;));  
        sinBarraTitulo.setSize(250, 250);  
  
        sinBarraTitulo.setLocationRelativeTo(null);  
        sinBarraTitulo.setVisible(true);  
    }  
}  


Obtendremos un JFrame sin la barra de título:

Ejecutando el ejemplo desde el IDE
Fuente: http://lefunes.wordpress.com/2008/11/22/ocultar-la-barra-de-titulo-de-un-jframe/

]]></description>
			<content:encoded><![CDATA[<p>Para ocultar la barra de título a un JFrame simplemente le asignamos al JFrame true al método setUndecorated:</p>
<blockquote><p><strong><span>jFrame.setUndecorated(true);</span></strong></p></blockquote>
<p>Por ejemplo:</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a href="http://lefunes.wordpress.com/2008/11/22/ocultar-la-barra-de-titulo-de-un-jframe/#">view plain</a><a href="http://lefunes.wordpress.com/2008/11/22/ocultar-la-barra-de-titulo-de-un-jframe/#">copy to clipboard</a><a href="http://lefunes.wordpress.com/2008/11/22/ocultar-la-barra-de-titulo-de-un-jframe/#">print</a><a href="http://lefunes.wordpress.com/2008/11/22/ocultar-la-barra-de-titulo-de-un-jframe/#">?</a></div>
</div>
<ol class="dp-j">
<li class="alt"><span><span class="keyword">package</span><span> ar.lefunes;  </span></span></li>
<li><span>  </span></li>
<li class="alt"><span><span class="keyword">import</span><span> javax.swing.JFrame;  </span></span></li>
<li><span><span class="keyword">import</span><span> javax.swing.JLabel;  </span></span></li>
<li class="alt"><span>  </span></li>
<li><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Inicio {  </span></span></li>
<li class="alt"><span>  </span></li>
<li><span>    <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> main(String[] args) {  </span></span></li>
<li class="alt"><span>        JFrame sinBarraTitulo = <span class="keyword">new</span><span> JFrame();  </span></span></li>
<li><span>        sinBarraTitulo.setUndecorated(<span class="keyword">true</span><span>);  </span></span></li>
<li class="alt"><span>        sinBarraTitulo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  </span></li>
<li><span>  </span></li>
<li class="alt"><span>        sinBarraTitulo.add(<span class="keyword">new</span><span> JLabel(</span><span class="string">&#8220;Frame sin Barra de Titulo&#8221;</span><span>));  </span></span></li>
<li><span>        sinBarraTitulo.setSize(<span class="number">250</span><span>, </span><span class="number">250</span><span>);  </span></span></li>
<li class="alt"><span>  </span></li>
<li><span>        sinBarraTitulo.setLocationRelativeTo(<span class="keyword">null</span><span>);  </span></span></li>
<li class="alt"><span>        sinBarraTitulo.setVisible(<span class="keyword">true</span><span>);  </span></span></li>
<li><span>    }  </span></li>
<li class="alt"><span>}  </span></li>
</ol>
</div>
<p>Obtendremos un JFrame sin la barra de título:</p>
<div id="attachment_215" class="wp-caption aligncenter"><a href="http://lefunes.files.wordpress.com/2008/09/frame-sin-barra.png"><img class="size-full wp-image-215" src="http://lefunes.files.wordpress.com/2008/09/frame-sin-barra.png?w=544&amp;h=389" alt="Ejecutando el ejemplo desde el IDE" width="544" height="389" /></a></p>
<p class="wp-caption-text">Ejecutando el ejemplo desde el IDE</p>
<div>Fuente: <a href="http://lefunes.wordpress.com/2008/11/22/ocultar-la-barra-de-titulo-de-un-jframe/">http://lefunes.wordpress.com/2008/11/22/ocultar-la-barra-de-titulo-de-un-jframe/</a></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.finderit.com/java/2009/03/22/ocultar-la-barra-de-titulo-de-un-jframe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cargando imágenes desde Java</title>
		<link>http://blog.finderit.com/java/2009/03/22/cargando-imagenes-desde-java/</link>
		<comments>http://blog.finderit.com/java/2009/03/22/cargando-imagenes-desde-java/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 13:50:05 +0000</pubDate>
		<dc:creator>moyano</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.finderit.com/java/?p=94</guid>
		<description><![CDATA[En este pequeño post veremos como cargar imagenes en Java, tanto si se encuentran dentro del mismo Jar de la aplicación, como si la imagen se encuentra fuera del misma.
En ambos casos vamos a utilizar la clase ImageIcon para recuperar la imagen. Luego de obtener la imagen, esta clase nos permitirá utilizarla tanto para íconos, fondo de [...]]]></description>
			<content:encoded><![CDATA[<p>En este pequeño post veremos como cargar imagenes en Java, tanto si se encuentran dentro del mismo Jar de la aplicación, como si la imagen se encuentra fuera del misma.<br />
En ambos casos vamos a utilizar la clase <a href="http://java.sun.com/javase/6/docs/api/javax/swing/ImageIcon.html">ImageIcon</a> para recuperar la imagen. Luego de obtener la imagen, esta clase nos permitirá utilizarla tanto para íconos, fondo de contenedores, etc.</p>
<h3>Imágen externa al Jar</h3>
<p>Este es el caso que se produce cuando la imagen se encuentra en alguna carpeta del sistema operativo:</p>
<p><img class="aligncenter size-full wp-image-351" src="http://lefunes.files.wordpress.com/2009/01/cargar_img_01.png?w=133&amp;h=50" alt="cargar_img_01" width="133" height="50" /></p>
<p>Para cargarla podemos indicarle a ImageIcon tanto el path relativo (desde donde se ejecuta el Jar) como el path absoluto de la imagen.</p>
<p>Se realiza de la siguiente forma (ver que se utiliza <strong>getImage()</strong>):</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a href="http://lefunes.wordpress.com/2009/01/29/cargando-imagenes-desde-java/#">view plain</a><a href="http://lefunes.wordpress.com/2009/01/29/cargando-imagenes-desde-java/#">copy to clipboard</a><a href="http://lefunes.wordpress.com/2009/01/29/cargando-imagenes-desde-java/#">print</a><a href="http://lefunes.wordpress.com/2009/01/29/cargando-imagenes-desde-java/#">?</a></div>
</div>
<ol class="dp-j">
<li class="alt"><span><span>Image imagenExterna = </span><span class="keyword">new</span><span> ImageIcon(</span><span class="string">&#8220;tierra.jpg&#8221;</span><span>).getImage();  </span></span></li>
</ol>
</div>
<h3>Imágen interna al Jar</h3>
<p>Este caso ocurre cuando la imagen se encuentra dentro del Jar de la aplicación:</p>
<p><img class="aligncenter size-full wp-image-353" src="http://lefunes.files.wordpress.com/2009/01/cargar_img_02.png?w=196&amp;h=161" alt="cargar_img_02" width="196" height="161" /></p>
<p>Para cargarla podemos indicarle a ImageIcon el recurso que se quiere utilizar. Para instanciar el recurso debemos indicar el path relativo (desde la clase que quiere cargar la imagen) como el path absoluto de la imagen dentro del Jar (un path absoluto en el jar comienza con /, como por ejemplo “/ar/lefunes/recurso/imagen.png”).</p>
<p>Se realiza de la siguiente forma:</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a href="http://lefunes.wordpress.com/2009/01/29/cargando-imagenes-desde-java/#">view plain</a><a href="http://lefunes.wordpress.com/2009/01/29/cargando-imagenes-desde-java/#">copy to clipboard</a><a href="http://lefunes.wordpress.com/2009/01/29/cargando-imagenes-desde-java/#">print</a><a href="http://lefunes.wordpress.com/2009/01/29/cargando-imagenes-desde-java/#">?</a></div>
</div>
<ol class="dp-j">
<li class="alt"><span><span>Image imagenInterna = </span><span class="keyword">new</span><span> ImageIcon(  </span></span></li>
<li><span>   getClass().getResource(<span class="string">&#8220;satelite.jpg&#8221;</span><span>)  </span></span></li>
<li class="alt"><span>).getImage();  </span></li>
</ol>
</div>
<h3>Ejemplo</h3>
<p>Un ejemplo de como se pueden utilizar estos conceptos junto con <a href="http://lefunes.wordpress.com/2008/11/22/incluyendo-una-imagen-de-fondo-en-un-jpanel/">la clase JPanelConFondo que vimos en un post anterior</a>.</p>
<p>Código:</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a href="http://lefunes.wordpress.com/2009/01/29/cargando-imagenes-desde-java/#">view plain</a><a href="http://lefunes.wordpress.com/2009/01/29/cargando-imagenes-desde-java/#">copy to clipboard</a><a href="http://lefunes.wordpress.com/2009/01/29/cargando-imagenes-desde-java/#">print</a><a href="http://lefunes.wordpress.com/2009/01/29/cargando-imagenes-desde-java/#">?</a></div>
</div>
<ol class="dp-j">
<li class="alt"><span><span class="keyword">package</span><span> ar.lefunes.cargarimagenes;  </span></span></li>
<li><span>  </span></li>
<li class="alt"><span><span class="keyword">import</span><span> java.awt.Image;  </span></span></li>
<li><span><span class="keyword">import</span><span> javax.swing.ImageIcon;  </span></span></li>
<li class="alt"><span>  </span></li>
<li><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CargaImagenes </span><span class="keyword">extends</span><span> javax.swing.JFrame {  </span></span></li>
<li class="alt"><span>    <span class="keyword">private</span><span> JPanelConFondo jPanelConFondo1 = </span><span class="keyword">new</span><span> JPanelConFondo();  </span></span></li>
<li><span>    <span class="keyword">private</span><span> JPanelConFondo jPanelConFondo2 = </span><span class="keyword">new</span><span> JPanelConFondo();     </span></span></li>
<li class="alt"><span>  </span></li>
<li><span>    <span class="keyword">public</span><span> CargaImagenes() {  </span></span></li>
<li class="alt"><span>        <span class="comment">//&#8230;</span><span>  </span></span></li>
<li><span>        cargarImagenes();  </span></li>
<li class="alt"><span>    }  </span></li>
<li><span>  </span></li>
<li class="alt"><span>    <span class="keyword">private</span><span> </span><span class="keyword">void</span><span> cargarImagenes() {  </span></span></li>
<li><span>        Image imagenInterna = <span class="keyword">new</span><span> ImageIcon(  </span></span></li>
<li class="alt"><span>           getClass().getResource(<span class="string">&#8220;satelite.jpg&#8221;</span><span>)).getImage();  </span></span></li>
<li><span>        jPanelConFondo1.setImagen(imagenInterna);  </span></li>
<li class="alt"><span>  </span></li>
<li><span>        Image imagenExterna =  </span></li>
<li class="alt"><span>            <span class="keyword">new</span><span> ImageIcon(</span><span class="string">&#8220;tierra.jpg&#8221;</span><span>).getImage();  </span></span></li>
<li><span>        jPanelConFondo2.setImagen(imagenExterna);  </span></li>
<li class="alt"><span>    }  </span></li>
<li><span>  </span></li>
<li class="alt"><span>    <span class="comment">//&#8230;</span><span>  </span></span></li>
<li><span>}  </span></li>
</ol>
</div>
<p>Al ejecutar el código obtendremos la siguiente pantalla:</p>
<p><img class="aligncenter size-full wp-image-352" src="http://lefunes.files.wordpress.com/2009/01/cargar_img_03.png?w=394&amp;h=194" alt="cargar_img_03" width="394" height="194" /></p>
<p>tener en cunta que la imagen externa (”tierra.jpg” en este ejemplo) tienen que estar en la misma carpeta del jar, ó en la carpeta raiz del proyecto cuando ejecutamos el proyecto desde NetBeans.</p>
<h3>Ejemplo Descargable</h3>
<p>Puedes descargar el ejemplo completo desde<a href="http://lefunes.googlecode.com/files/CargarImagenes.zip">http://lefunes.googlecode.com/files/CargarImagenes.zip</a> (aprox. 54 KB)</p>
<p>Fuente: <a href="http://lefunes.wordpress.com/2009/01/29/cargando-imagenes-desde-java/">http://lefunes.wordpress.com/2009/01/29/cargando-imagenes-desde-java/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.finderit.com/java/2009/03/22/cargando-imagenes-desde-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
