<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4725395850223013052</id><updated>2012-01-19T12:01:32.341-06:00</updated><category term='hibernate'/><category term='red'/><category term='java. swing'/><category term='java'/><category term='IoC'/><category term='cache'/><category term='web'/><category term='spring'/><category term='substance'/><category term='jboss'/><category term='samba'/><category term='jsp'/><category term='graficas'/><category term='ftp'/><category term='jfreecahart'/><title type='text'>Bienvenido =)</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://publicajava.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://publicajava.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>--</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4725395850223013052.post-4166971866651322272</id><published>2011-05-12T14:21:00.000-05:00</published><updated>2011-05-13T15:36:32.600-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='parameters'/><category scheme='http://www.blogger.com/atom/ns#' term='JdbcCursorItemReader'/><category scheme='http://www.blogger.com/atom/ns#' term='spring batch'/><title type='text'>Parameters in sql of JdbcCursorItemReader</title><content type='html'>Si no conocen spring batch pueden mirar los siguientes enlaces :&lt;br /&gt;&lt;a href="http://static.springsource.org/spring-batch/index.html"&gt;http://static.springsource.org/spring-batch/index.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.dosideas.com/cursos/course/view.php?id=7"&gt;http://www.dosideas.com/cursos/course/view.php?id=7&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Estaba realizando algunos pruebas con esta herramienta, cuando me tope con un pequeño detalle al usar&amp;nbsp;JdbcCursorItemReader, esta clase es una implementacion de spring-batch para leer datos de la bd, entre sus propiedades tiene una nombrada "sql", y es en esta donde se declara el query que sera ejecutado, hasta ahi todo bien pero me surgio la inquietud de pasarle parametros a ese query buscando en google encontre algunas sugerencias pero siempre me falto algo para que funcionara el paso de parametros, bien les dejo la configuracion para poder hacerlo; en la&amp;nbsp;declaración&amp;nbsp;del itemReader debemos asignarle el scope de tipo step, en nuestro query colocamos el signo de ? en donde queremos meter el&amp;nbsp;parámetro,&amp;nbsp;después&amp;nbsp;colocamos la propiedad&amp;nbsp;preparedStatementSetter que es de tipo&amp;nbsp;ListPreparedStatementSetter que a su vez es una lista por lo que podemos asignarle varios valores, para agregar el&amp;nbsp;parámetro&amp;nbsp;que se recibe al ejecutar el Job de spring usamos spring(&lt;span class="Apple-style-span" style="color: #333333; font-family: monospace; font-size: 15px; line-height: 23px;"&gt;#{...}&lt;/span&gt;) EL para pasar el valor del&amp;nbsp;parámetro&amp;nbsp;a la lista, esto se realica en tiempo de ejecucion.&lt;br /&gt;&lt;br /&gt;&amp;lt;bean id="bdItemReader" class="org.springframework.batch.item.database.JdbcCursorItemReader" scope="step"&amp;gt;&lt;br /&gt;&amp;lt;property name="dataSource" ref="dataSource" /&amp;gt;&lt;br /&gt;&amp;lt;property name="sql"&amp;gt;&lt;br /&gt;&amp;lt;value&amp;gt;&lt;br /&gt;&amp;lt;![CDATA[&lt;br /&gt;select *&lt;br /&gt;from foo&lt;br /&gt;where propertyStr like ?&lt;br /&gt;]]&amp;gt;&lt;br /&gt;&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property name="preparedStatementSetter"&amp;gt;&lt;br /&gt;&amp;lt;bean class="org.springframework.batch.core.resource.ListPreparedStatementSetter"&amp;gt;&lt;br /&gt;&amp;lt;property name="parameters"&amp;gt;&lt;br /&gt;&amp;lt;list&amp;gt;&lt;br /&gt;&amp;lt;value&amp;gt;#{jobParameters[propertyStr]}&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/list&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property name="rowMapper"&amp;gt;&lt;br /&gt;&amp;lt;bean id="beneficiarioMapper" class="org.springframework.jdbc.core.BeanPropertyRowMapper"&amp;gt;&lt;br /&gt;&amp;lt;property name="mappedClass"&amp;gt;&lt;br /&gt;&amp;lt;value type="java.lang.Class"&amp;gt;pgs.example.Foo&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;y al lanzar el Job debemos pasar el parametro&amp;nbsp;propertyStr&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; JobParametersBuilder builder = new JobParametersBuilder();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.addDate("StartTime", new Date());&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.addString("jobName", "Export");&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.addString("propertyStr", "condition");&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;JobParameters parameters = builder.toJobParameters();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jobLauncher.run(job, parameters);&lt;br /&gt;&lt;br /&gt;y listo con estos, el query recibe el&amp;nbsp;parámetro.&lt;br /&gt;&lt;br /&gt;Nota: Probado con spring-batch-2.1.7&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725395850223013052-4166971866651322272?l=publicajava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicajava.blogspot.com/feeds/4166971866651322272/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4725395850223013052&amp;postID=4166971866651322272' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/4166971866651322272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/4166971866651322272'/><link rel='alternate' type='text/html' href='http://publicajava.blogspot.com/2011/05/parameters-in-sql-of.html' title='Parameters in sql of JdbcCursorItemReader'/><author><name>neo_lestat</name><uri>http://www.blogger.com/profile/11876929031619045256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725395850223013052.post-8303963756669745753</id><published>2010-03-18T12:36:00.001-06:00</published><updated>2010-06-30T09:49:54.086-05:00</updated><title type='text'>Ejemplo Message Drive Bean con Jboss 4.3</title><content type='html'>Vamos a realizar un pequeño ejemplo de Message Drive Bean en jboss este ejemplo aparece en el libro de Mastering Enterprise Java Beans 3.0 cuarta edición de Rima Patel Sriganesh, Geral Brose y Mica Silverman, y el tema se encuentra en el capitulo 7 el cual es una introducción a Message Drive Bean, el código del libro se realizo con glassfish como servidor de aplicaciones, he usado el mismo código adaptando solo algunas partes de acuerdo a la implementacion de jboss.&lt;br /&gt;&lt;br /&gt;El código &amp;nbsp;de nuestro Message Bean es el siguiente:&lt;br /&gt;&lt;br /&gt;package examples.messaging;&lt;br /&gt;&lt;br /&gt;import javax.annotation.PreDestroy;&lt;br /&gt;import javax.jms.*;&lt;br /&gt;import javax.ejb.*;&lt;br /&gt;&lt;br /&gt;@MessageDriven (&lt;br /&gt;&amp;nbsp;   activationConfig={&lt;br /&gt;&amp;nbsp;           @ActivationConfigProperty(propertyName="destination",&lt;br /&gt;&amp;nbsp;                                     propertyValue="topic/testTopic"),&lt;br /&gt;&amp;nbsp;           @ActivationConfigProperty(propertyName="destinationType",&lt;br /&gt;&amp;nbsp;                                     propertyValue="javax.jms.Topic")&lt;br /&gt;&amp;nbsp;       }&lt;br /&gt;&amp;nbsp;   )&lt;br /&gt;public class LogBean implements MessageListener {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;   public LogBean() {&lt;br /&gt;&amp;nbsp;       System.out.println("Log Bean Created");&lt;br /&gt;&amp;nbsp;   }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;   public void onMessage(Message message) {&lt;br /&gt;&amp;nbsp;       if (message instanceof TextMessage) {&lt;br /&gt;&amp;nbsp;           try {&lt;br /&gt;&amp;nbsp;               TextMessage txtMessage = (TextMessage) message;&lt;br /&gt;&amp;nbsp;               String text = txtMessage.getText();&lt;br /&gt;&amp;nbsp;               System.out.println("Recived new message : " + text);&lt;br /&gt;&amp;nbsp;           } catch (JMSException ex) {&lt;br /&gt;&amp;nbsp;              ex.printStackTrace();&lt;br /&gt;&amp;nbsp;           }&lt;br /&gt;&amp;nbsp;       }&lt;br /&gt;&amp;nbsp;   }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;   @PreDestroy&lt;br /&gt;&amp;nbsp;   public void remove(){&lt;br /&gt;&amp;nbsp;       System.out.println("Log Bean Destroyed");&lt;br /&gt;&amp;nbsp;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Estamos utilizando anotaciones para realizar la configuración de nuestro message bean, si no queremos usar estas anotaciones podemos usar el descriptor de despliegue (ejb-jar.xml) .&lt;br /&gt;&lt;br /&gt;La primera anotación &amp;nbsp;declara la configuración necesaria, primero el destino de nuestros mensajes y después el tipo. En el código utiliza la configuración de jms que jboss tiene por defecto, podemos crear las nuestras y cambiarlas.&lt;br /&gt;&lt;br /&gt;Esta clase tenemos que compilarla y empaquetarla en un jar, las dependencias se encuentran en las lib de jboss, colocamos el jar en nuestra carpeta deploy de nuestra configuración.&lt;br /&gt;&lt;br /&gt;El código del cliente es el siguiente, es un cliente standalone :&lt;br /&gt;&lt;br /&gt;package org.nl.examples.client;&lt;br /&gt;&lt;br /&gt;import java.util.Properties;&lt;br /&gt;import javax.jms.Session;&lt;br /&gt;import javax.jms.TextMessage;&lt;br /&gt;import javax.jms.Topic;&lt;br /&gt;import javax.jms.TopicConnection;&lt;br /&gt;import javax.jms.TopicConnectionFactory;&lt;br /&gt;import javax.jms.TopicPublisher;&lt;br /&gt;import javax.jms.TopicSession;&lt;br /&gt;import javax.naming.Context;&lt;br /&gt;import javax.naming.InitialContext;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;* @author usuario&lt;br /&gt;&amp;nbsp;* This class is a simple client for a stateful session bean&lt;br /&gt;&amp;nbsp;* To ilustrate how passivation works, configure your EJB server&lt;br /&gt;&amp;nbsp;* to allow only two stateful session beans in memory (Consult your&lt;br /&gt;&amp;nbsp;* vendor documentation for details on how to do this). We create&lt;br /&gt;&amp;nbsp;* 3 beans in this example to see how and when beans are passivated.&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;public class LogClient {&lt;br /&gt;&amp;nbsp;  &lt;br /&gt;&amp;nbsp;   public static final int noOfClients = 10;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; public static void main(String args[]) {&lt;br /&gt;&amp;nbsp;     try{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;       /*Estas propiedades nos sirven para conectarnos a jboss desde nuestro cliente standalone,&lt;br /&gt;si el cliente corre dentro de jboss esto no seria necesario*/&lt;br /&gt;&amp;nbsp;       Properties properties = new Properties();&lt;br /&gt;&amp;nbsp; properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");&lt;br /&gt;&amp;nbsp; properties.put("java.naming.factory.url.pkgs","=org.jboss.naming:org.jnp.interfaces");&lt;br /&gt;&amp;nbsp; properties.put("java.naming.provider.url","localhost:1099");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;       Context ctx = new InitialContext(properties);&lt;br /&gt;&amp;nbsp;       //ctx.lookup(CountBean.class.getSimpleName()+"/remote");&lt;br /&gt;&amp;nbsp;       // 1: Lookup the connection factory&lt;br /&gt;&amp;nbsp;       TopicConnectionFactory factory =  (TopicConnectionFactory) ctx.lookup("ConnectionFactory");&lt;br /&gt;&amp;nbsp;       // 2: Use connection factory to create a JMS connection&lt;br /&gt;&amp;nbsp;       TopicConnection connection = factory.createTopicConnection();&lt;br /&gt;&amp;nbsp;       // 3: Use connection to create a session&lt;br /&gt;&amp;nbsp;       TopicSession session = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);&lt;br /&gt;&amp;nbsp;       // 4: Lookup destination&lt;br /&gt;&amp;nbsp;       Topic topic = (Topic) ctx.lookup("topic/testTopic");&lt;br /&gt;&amp;nbsp;       // 5: Create a message publisher&lt;br /&gt;&amp;nbsp;       TopicPublisher publisher = session.createPublisher(topic);&lt;br /&gt;&amp;nbsp;       // 6: create and publish a message&lt;br /&gt;&amp;nbsp;       TextMessage msg = session.createTextMessage();&lt;br /&gt;&amp;nbsp;       msg.setText("This is a test message.");&lt;br /&gt;&amp;nbsp;       publisher.send(msg);&lt;br /&gt;&amp;nbsp;       // finish&lt;br /&gt;&amp;nbsp;       publisher.close();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;       System.out.println("Message published. Please check aplication server's console to see the response from MDB");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;     } catch(Exception e){&lt;br /&gt;&amp;nbsp;         e.printStackTrace();&lt;br /&gt;&amp;nbsp;     }&lt;br /&gt;&amp;nbsp;   }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Para compilarlo y ejecutarlo se necesitan las bibliotecas:&lt;br /&gt;-jboss-aop.jar&lt;br /&gt;-jbossall-client.jar&lt;br /&gt;-javassist.jar&lt;br /&gt;-trove.jar&lt;br /&gt;-log4j.jar&lt;br /&gt;&lt;br /&gt;&amp;nbsp;El libro que les mencione antes pueden descargarlo de&amp;nbsp;&lt;a href="http://www.theserverside.com/tt/books/wiley/masteringEJB3/index.tss"&gt;masteringEJB3,&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725395850223013052-8303963756669745753?l=publicajava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicajava.blogspot.com/feeds/8303963756669745753/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4725395850223013052&amp;postID=8303963756669745753' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/8303963756669745753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/8303963756669745753'/><link rel='alternate' type='text/html' href='http://publicajava.blogspot.com/2010/03/ejemplo-message-drive-bean-con-jboss-43.html' title='Ejemplo Message Drive Bean con Jboss 4.3'/><author><name>neo_lestat</name><uri>http://www.blogger.com/profile/11876929031619045256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725395850223013052.post-4610093857588584676</id><published>2010-03-18T12:06:00.001-06:00</published><updated>2010-03-18T12:06:44.440-06:00</updated><title type='text'>Problemas con charset en Spring MVC</title><content type='html'>El problema que tenia es que mi forma de spring mvc no me estaba aceptando caracteres como la ñ los acentos, y algunos otros, cuando hacia el submit de mi forma al llegar al controller los datos no llegaban correctamente. A pesar de que mi jsp tenia correctamente el charset los caracteres eran sustituidos para solucionar el problema unicamente tenemos que agregar un filtro de spring mvc, este filtro es CharacterEncodingFilter el cual se encargara de verificar que todo valla bien, la forma de acerlo es como sigue:&lt;br /&gt;&lt;br /&gt;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;filter-name&amp;gt;charsetFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;filter-class&amp;gt;org.springframework.web.filter.CharacterEncodingFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;init-param&amp;gt;&lt;br /&gt;&amp;nbsp;  &amp;lt;param-name&amp;gt;encoding&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;nbsp;  &amp;lt;param-value&amp;gt;UTF-8&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/init-param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/filter&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;filter-name&amp;gt;charsetFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;Y eso es todo con este filtro podemos reciber correctamente los caracteres de nuestra forma.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725395850223013052-4610093857588584676?l=publicajava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicajava.blogspot.com/feeds/4610093857588584676/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4725395850223013052&amp;postID=4610093857588584676' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/4610093857588584676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/4610093857588584676'/><link rel='alternate' type='text/html' href='http://publicajava.blogspot.com/2010/03/problemas-con-charset-en-spring-mvc.html' title='Problemas con charset en Spring MVC'/><author><name>neo_lestat</name><uri>http://www.blogger.com/profile/11876929031619045256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725395850223013052.post-716310426473910710</id><published>2009-10-02T14:19:00.002-05:00</published><updated>2009-10-02T14:29:06.213-05:00</updated><title type='text'>Servlet para el envio de multiples reportes al cliente</title><content type='html'>Bueno en este post esta relacionado con el anterior en donde se envian los reportes al cliente para imprimirlos en su impresora, bueno pues el codigo que faltaba para la generacion de los reportes de jasper es lo que les voy a poner en este post y es lo siguiente :&lt;br /&gt;&lt;br /&gt;/*Este metodo lo invocamos en doPost, doGet o ambos del servlet */&lt;br /&gt;  protected void processRequest(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;  throws ServletException, IOException {&lt;br /&gt;    Connection conection = null;&lt;br /&gt;    byte[] bytesReporte = null;&lt;br /&gt;    int in = 0;&lt;br /&gt;    &lt;br /&gt;    try {&lt;br /&gt;      /*La clase HelpConnection devuelve la conexion jdbc para llenar el reporte*/&lt;br /&gt;      conection = HelpConnection.getConnection();&lt;br /&gt;      &lt;br /&gt;/*Aqui recibo unos ids que sera mi dato para llenar mi reporte, &lt;br /&gt;* en mi caso tengo que llenar varios reportes de acuerdo a los id que recibo&lt;br /&gt;* y de acuerdo a esos ids se generan n reportes */&lt;br /&gt;      String [] ids = request.getParameterValues("idusuario");&lt;br /&gt;      &lt;br /&gt;      int numReportes = ids.length ;&lt;br /&gt;/*Estos archivos temporales van a guardar los datos del reporte, lo queria hacer&lt;br /&gt;* en memoria pero hubo algunos problemas. */&lt;br /&gt;      File files [] = new File [numReportes];&lt;br /&gt;      for(int i = 0; i &lt; files.length; i++){&lt;br /&gt;        files[i] = getTempFile(i+"report","tmp");&lt;br /&gt;      }&lt;br /&gt;          &lt;br /&gt;      String cs = File.separator;&lt;br /&gt;      String path = request.getSession().getServletContext().getRealPath("/");&lt;br /&gt;/*La ruta de mi reporte*/&lt;br /&gt;      String rutaReporte = path + "reporte"+ cs + "user.jasper";&lt;br /&gt;      //JasperReport reporte = (JasperReport) JRLoader.loadObject(rutaReporte);&lt;br /&gt;      FileInputStream fileJasper = null;//new FileInputStream(rutaReporte);&lt;br /&gt;      JasperPrint jasperPrint = null;&lt;br /&gt;      HashMap paramReport = new HashMap();&lt;br /&gt;      JRXmlExporter exporter = new JRXmlExporter();&lt;br /&gt;      /*Se llenan los reportes y se guardan en los archivos temporales*/&lt;br /&gt;      for (int k = 0; k &lt; numReportes; k++ ){&lt;br /&gt;        System.out.println("entro " + k);&lt;br /&gt;         fileJasper = new FileInputStream(rutaReporte);&lt;br /&gt;        paramReport.put("id", Integer.parseInt(ids[k]));&lt;br /&gt;        jasperPrint = JasperFillManager.fillReport(fileJasper, paramReport, conection);&lt;br /&gt;        exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);&lt;br /&gt;        exporter.setParameter(JRExporterParameter.OUTPUT_FILE, files[k] );&lt;br /&gt;        exporter.exportReport();&lt;br /&gt;        &lt;br /&gt;      }&lt;br /&gt;      &lt;br /&gt;/*y aqui los envio al cliente*/&lt;br /&gt;         OutputStream outStream =  response.getOutputStream();&lt;br /&gt;            DataOutputStream dataOut = new DataOutputStream(outStream);&lt;br /&gt;            //envio el numero de archivos a enviar&lt;br /&gt;            dataOut.writeInt(numReportes);&lt;br /&gt;          &lt;br /&gt;            FileInputStream fileStrm = null;&lt;br /&gt;            BufferedInputStream bufferStrm = null;&lt;br /&gt;            byte fileBytes[] = null;            &lt;br /&gt;            for (int k = 0; k &lt; numReportes; k++ ){  &lt;br /&gt;              //envio nombre del archivo&lt;br /&gt;              dataOut.writeUTF(files[k].getName());              &lt;br /&gt;              //envio tamño del archivo&lt;br /&gt;              dataOut.writeLong(files[k].length());&lt;br /&gt;              //abrimos el archivo a enviar&lt;br /&gt;              fileStrm = new FileInputStream(files[k]);&lt;br /&gt;              bufferStrm = new BufferedInputStream(fileStrm);&lt;br /&gt;              //Envia el archivo&lt;br /&gt;              while ((in = bufferStrm.read()) != -1){&lt;br /&gt;                dataOut.write(in);&lt;br /&gt;              }&lt;br /&gt;&lt;br /&gt;              outStream.flush();&lt;br /&gt;              fileStrm.close();&lt;br /&gt;              bufferStrm.close();&lt;br /&gt;             }&lt;br /&gt;               outStream.close();&lt;br /&gt;            dataOut.close();&lt;br /&gt;            outStream = null;&lt;br /&gt;            bufferStrm = null;&lt;br /&gt;            fileStrm = null;&lt;br /&gt;            dataOut = null;&lt;br /&gt;       for(int i = 0; i &lt; files.length; i++){&lt;br /&gt;        files[i].delete();&lt;br /&gt;      }&lt;br /&gt;      &lt;br /&gt;    } catch (Exception e) {&lt;br /&gt;      e.printStackTrace();&lt;br /&gt;    } finally {&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;El codigo funciona para 1 o n archivos, espero publicar la version del applet para un solo archivo, evidentemente eso es mas facil&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725395850223013052-716310426473910710?l=publicajava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicajava.blogspot.com/feeds/716310426473910710/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4725395850223013052&amp;postID=716310426473910710' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/716310426473910710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/716310426473910710'/><link rel='alternate' type='text/html' href='http://publicajava.blogspot.com/2009/10/servlet-para-el-envio-de-multiples.html' title='Servlet para el envio de multiples reportes al cliente'/><author><name>neo_lestat</name><uri>http://www.blogger.com/profile/11876929031619045256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725395850223013052.post-4260329123429925576</id><published>2009-10-01T17:03:00.008-05:00</published><updated>2009-10-02T10:43:38.226-05:00</updated><title type='text'>Imprimir reporte de Jasperreports en el Cliente</title><content type='html'>&lt;p&gt;Les traigo un ejemplo de como imprimir directamente a la impresora del cliente un reporte generado con jasperreport en el servidor.&lt;/p&gt;&lt;p&gt;Para poder invocar a la impresora del cliente tenemos que hacer un applet y firmarlo ya que esta restringido y no puede invocar recursos del cliente, por eso debemos firmarlo, este applet contiene una clase que va a recibir los datos que se generan en el servidor.&lt;/p&gt;&lt;p&gt;Este codigo que les proporciono ha sido probado con la version 3.0 de jasperreports.&lt;/p&gt;&lt;p&gt;Primero tenemos el codigo del Servlet que nos genera los reportes , bueno en este caso como estaba haciendo pruebas genere unos archivos.xml con ireport que contienen datos de un reporte, lo que tiene que hacer es cambiar esa parte por la generacion de sus reportes, este metodo lo invoco en doPost y doGet&lt;/p&gt;&lt;p&gt;  protected void processRequest(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;throws ServletException, IOException {&lt;br /&gt;&lt;br /&gt;int in;&lt;br /&gt;&lt;br /&gt;   try {    &lt;br /&gt;     /*Esta parte la deben de cambiar de acuerdo al numero de reportes que tiene que &lt;/p&gt;&lt;p&gt;     imprimir, deberia de funcionar con uno o mas reportes*/&lt;br /&gt;       int numFiles = 3;        &lt;br /&gt;        OutputStream outStream =  response.getOutputStream();&lt;br /&gt;        DataOutputStream dataOut = new DataOutputStream(outStream);&lt;br /&gt;        //envio el numero de archivos a enviar&lt;br /&gt;        dataOut.writeInt(numFiles);&lt;br /&gt;        /* Temporal */&lt;br /&gt;        File file = new File("C:\\prueba1.xml");&lt;br /&gt;        File files [] = new File [numFiles];&lt;br /&gt;        files[0] = file;&lt;br /&gt;        files[1] = new File("C:\\prueba2.xml");         &lt;br /&gt;        files[2] = new File("C:\\prueba3.xml");&lt;/p&gt;&lt;p&gt;/*Lo de arriba son mis archivos temporales, esto lo pueden cambiar generando archivos temporales en el servidor con jasperreport y luego los envian al cliente otra opcion es llenar su reporte y obtener los bytes para mandarlos al cliente, tiene que llenar sus repores con JRPrintXmlLoader, ejemplo&lt;/p&gt;&lt;p&gt;JasperReport reporte = (JasperReport) JRLoader.loadObject("reporte1.jasper");&lt;br /&gt;JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, conection);&lt;br /&gt;JRExporter exporter = new JRXmlExporter();&lt;br /&gt;exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);&lt;br /&gt;&lt;/p&gt;&lt;p&gt;y en el applet vamos a recuperar el (los) objeto jasperPrint para mandarlos a la impresora&lt;/p&gt;&lt;p&gt;*/&lt;br /&gt;        FileInputStream fileStrm = null;&lt;br /&gt;        BufferedInputStream bufferStrm = null;&lt;br /&gt;        byte fileBytes[] = null;        &lt;br /&gt;for (int k = 0; k &lt; numFiles; k++ ){                 &lt;br /&gt;              /*logger.info(" enviando el archivo no. " + k + " nombre Archivo " + files[k].getName() &lt;br /&gt;                           + " tamaño" +  files[k].length());&lt;br /&gt;             */&lt;br /&gt;              //envio nombre del archivo&lt;br /&gt;              dataOut.writeUTF(files[k].getName());              &lt;br /&gt;              //envio tamño del archivo&lt;br /&gt;              dataOut.writeLong(files[k].length());&lt;br /&gt;              //abrimos el archivo a enviar&lt;br /&gt;              fileStrm = new FileInputStream(files[k]);&lt;br /&gt;              bufferStrm = new BufferedInputStream(fileStrm);&lt;br /&gt;              //Envia el archivo &lt;br /&gt;              while ((in = bufferStrm.read()) != -1){&lt;br /&gt;                dataOut.write(in);&lt;br /&gt;              }&lt;br /&gt;&lt;br /&gt;              // if (logger.getLevel().INFO )&lt;br /&gt;//              logger.info("Archivo enviado :: " + files[k].getName() );   &lt;br /&gt;              &lt;br /&gt;              outStream.flush();&lt;br /&gt;              fileStrm.close();&lt;br /&gt;              bufferStrm.close();&lt;br /&gt;             }&lt;br /&gt;            &lt;br /&gt;             &lt;br /&gt;               outStream.close();&lt;br /&gt;             &lt;br /&gt;            dataOut.close();&lt;br /&gt;            outStream = null;&lt;br /&gt;            bufferStrm = null;&lt;br /&gt;            fileStrm = null;&lt;br /&gt;            dataOut = null;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Ahora el codigo de el applet, como dije antes en este applet vamos a recibir los datos de los objetos jasperPrint y despues los mandamos a imprimir&lt;/p&gt;&lt;p&gt;/*&lt;br /&gt;* AppletPrint.java&lt;br /&gt;*&lt;br /&gt;* Created on 1 de octubre de 2009, 12:40 PM&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;package mx.com.lmp.erp.print;&lt;br /&gt;&lt;br /&gt;import java.awt.BorderLayout;&lt;br /&gt;import java.io.BufferedInputStream;&lt;br /&gt;import java.io.DataInputStream;&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.io.FileInputStream;&lt;br /&gt;import java.io.FileOutputStream;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.net.URL;&lt;br /&gt;import java.net.URLConnection;&lt;br /&gt;import java.security.AccessController;&lt;br /&gt;import java.security.PrivilegedAction;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.List;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;import net.sf.jasperreports.engine.JRException;&lt;br /&gt;import net.sf.jasperreports.engine.JRExporterParameter;&lt;br /&gt;import net.sf.jasperreports.engine.JasperPrint;&lt;br /&gt;import net.sf.jasperreports.engine.JasperPrintManager;&lt;br /&gt;import net.sf.jasperreports.engine.export.JRPrintServiceExporter;&lt;br /&gt;import net.sf.jasperreports.engine.export.JRPrintServiceExporterParameter;&lt;br /&gt;import net.sf.jasperreports.engine.print.JRPrinterAWT;&lt;br /&gt;import net.sf.jasperreports.engine.xml.JRPrintXmlLoader;&lt;br /&gt;import net.sf.jasperreports.view.JRViewer;&lt;br /&gt;&lt;br /&gt;public class AppletPrint extends javax.swing.JApplet {&lt;br /&gt;&lt;br /&gt;/** Initializes the applet AppletPrint */&lt;br /&gt;public void init() {&lt;br /&gt;try {&lt;br /&gt;   this.urlService = getParameter("urlService");&lt;br /&gt;  java.awt.EventQueue.invokeAndWait(new Runnable() {&lt;br /&gt;    public void run() {&lt;br /&gt;      initComponents();&lt;br /&gt;    }&lt;br /&gt;  });&lt;br /&gt;} catch (Exception ex) {&lt;br /&gt;  ex.printStackTrace();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;private void initComponents() {&lt;br /&gt;jPanel1 = new javax.swing.JPanel();&lt;br /&gt;jBtnImprimir = new javax.swing.JButton();&lt;br /&gt;&lt;br /&gt;setLayout(new java.awt.BorderLayout());&lt;br /&gt;&lt;br /&gt;jBtnImprimir.setText("Imprimir");&lt;br /&gt;jBtnImprimir.addActionListener(new java.awt.event.ActionListener() {&lt;br /&gt;  public void actionPerformed(java.awt.event.ActionEvent evt) {&lt;br /&gt;    jBtnImprimirActionPerformed(evt);&lt;br /&gt;  }&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;jPanel1.add(jBtnImprimir);&lt;br /&gt;&lt;br /&gt;add(jPanel1, java.awt.BorderLayout.CENTER);&lt;br /&gt;&lt;br /&gt;}              &lt;br /&gt;&lt;br /&gt;private void jBtnImprimirActionPerformed(java.awt.event.ActionEvent evt) {                                         &lt;br /&gt;comunicacionServer();//para recibir los datos del server&lt;br /&gt;}                                        &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Variables declaration - do not modify                 &lt;br /&gt;private javax.swing.JButton jBtnImprimir;&lt;br /&gt;private javax.swing.JPanel jPanel1;&lt;br /&gt;// End of variables declaration               &lt;br /&gt;//Guardara la url del servlet al que se comunicara para imprimir&lt;br /&gt;private String urlService;&lt;br /&gt;&lt;br /&gt;private void comunicacionServer(){&lt;br /&gt;&lt;br /&gt;int in=0;&lt;br /&gt;long tamFile=0;&lt;br /&gt;&lt;br /&gt;/* Primero creamos la URL para la conexión. Tiene sentido construir la&lt;br /&gt;   dirección de esta forma tan "complicada" puesto que el applet solo puede&lt;br /&gt;   establecer conexiones con su servidor, y así, al construir la dirección&lt;br /&gt;   dinámicamente, no tenemos que retocar el código al irnos a otro servidor.&lt;br /&gt;   En todo caso, lo siguiente sería válido:&lt;br /&gt;   URL direccion = new URL ("http://www.javahispano.com/servlet/MiServlet");&lt;br /&gt; */&lt;br /&gt;URL pagina = this.getCodeBase();&lt;br /&gt;String protocolo = pagina.getProtocol();&lt;br /&gt;String servidor = pagina.getHost();&lt;br /&gt;int puerto = pagina.getPort();&lt;br /&gt;//String servlet = "/servlet/MiServlet";/ServletEnviaReport&lt;br /&gt; String servlet = "";&lt;br /&gt;   if ( this.urlService != null &amp;amp;&amp;amp;  !this.urlService.equals(""))&lt;br /&gt;     servlet = this.urlService;&lt;br /&gt;   else&lt;br /&gt;     servlet = "/PruebaApplet/ServletEnviaReportes";&lt;br /&gt;&lt;br /&gt;URL direccion = null;&lt;br /&gt;URLConnection conexion = null;&lt;br /&gt;try {&lt;br /&gt;  direccion = new URL(protocolo, servidor, puerto, servlet);&lt;br /&gt;  conexion = direccion.openConnection();&lt;br /&gt;  System.out.println(" Url del urlService " + direccion.toString());&lt;br /&gt;} catch (IOException ex) {&lt;br /&gt;  ex.printStackTrace();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*Lo siguiente es decirle al navegador que no use su&lt;br /&gt;cache para esta conexión, porque si lo hace vamos a&lt;br /&gt;tener un página estatica, y para eso no nos metemos&lt;br /&gt;en estos líos ;-).  */&lt;br /&gt;conexion.setUseCaches(false);&lt;br /&gt;&lt;br /&gt;/* Ahora añadimos todas las cabeceras de HTTP que necesitemos, Cookies, contenido,&lt;br /&gt;autorizacion, etc. con el método:&lt;br /&gt;          conexion.setRequestProperty ("cabecera", "valor");&lt;br /&gt;Consultar la especificación de HTTP para más detalles. Por ejemplo, para decir&lt;br /&gt;que preferentemente hablamos español:  */&lt;br /&gt;&lt;br /&gt;conexion.setRequestProperty("Accept-Language", "es");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; BufferedInputStream buffer = null ;&lt;br /&gt;try {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  /* Procesamos la información de la forma adecuada, según se&lt;br /&gt;     trate de datos ASCII o binarios. */&lt;br /&gt;  //Obtenemos el stream de entrada para leer la informacion que nos envie el&lt;br /&gt;  //server&lt;br /&gt;  DataInputStream dataIn = new DataInputStream(conexion.getInputStream());&lt;br /&gt;  buffer = new BufferedInputStream(conexion.getInputStream());&lt;br /&gt;  // Recibo el numero de archivos que enviara el servidor&lt;br /&gt;  int numArchivosRecibir = dataIn.readInt();  &lt;br /&gt;  System.out.println(" Numero de archivos para imprimir " + numArchivosRecibir);&lt;br /&gt;&lt;br /&gt;  // Recibe los archivos&lt;br /&gt;  String nameFiles[] =  new String[numArchivosRecibir];&lt;br /&gt;  File f = null;&lt;br /&gt;  File files[] = new File[numArchivosRecibir];&lt;br /&gt;  FileOutputStream ouputStream = null;&lt;br /&gt;&lt;br /&gt;  for(int k = 0; k &lt; f =" this.fileTemp(dataIn.readUTF(),null);" tamfile =" dataIn.readLong();" ouputstream =" new" j =" 0;" datain =" null;" buffer =" null;" ouputstream =" null;" inputstream =" null;" jasperprintlist =" new" j =" 0;" inputstream =" new"&gt;&lt;/p&gt;&lt;p&gt;/*Aqui es donde se cargan los datos recibidos del server y se lanza a la impresion*/&lt;br /&gt;          JasperPrint jsprint = JRPrintXmlLoader.load(inputStream);&lt;br /&gt;          JasperPrintManager.printReport(jsprint,true);&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;  } catch (JRException e1) {&lt;br /&gt;          e1.printStackTrace();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  //borramos los archivos temporales&lt;br /&gt;  for(File fi : files ){&lt;br /&gt;    fi.delete();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;} catch (IOException ex) {&lt;br /&gt;  ex.printStackTrace();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void ejecutaConJavascript (final String urlConParametros){&lt;br /&gt;&lt;br /&gt;AccessController.doPrivileged(new PrivilegedAction() {&lt;br /&gt;  public Object run() {&lt;br /&gt;    try {&lt;br /&gt;      comunicacionServer(urlConParametros);&lt;br /&gt;    } catch(Exception e) {&lt;br /&gt;      e.printStackTrace();&lt;br /&gt;      return false;&lt;br /&gt;    }&lt;br /&gt;    return null;&lt;br /&gt;  }&lt;br /&gt;});&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void comunicacionServer(String urlConParametros) {&lt;br /&gt;this.urlService = urlConParametros;&lt;br /&gt;this.comunicacionServer();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private File fileTemp (String name, String suffix) {&lt;br /&gt;try {&lt;br /&gt;  return File.createTempFile(name,suffix);&lt;br /&gt;} catch (IOException ex) {&lt;br /&gt;  ex.printStackTrace();&lt;br /&gt;  return null;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Bueno el codigo me base en un applet que encontre en javahispano, la parte importante es el metodo comunicacionServer() en este metodo se reciben los arhivos o datos que nos envia el server y despues se lanzan a la impresora, tambien tiene un metodo ejecuta con javascript este metodo es util para poder armar nuestra url con los parametros que necesitemos para generar nuestros reportes, ahora un codigo de ejemplo que iria en el jsp :&lt;/p&gt;&lt;p&gt;&lt;br /&gt;     &amp;lt;applet name="nomApplet"&lt;br /&gt;code="mx.com.lmp.erp.print.AppletPrint"&lt;br /&gt;archive="AppletPrintJRV.jar,jasperreports-3.0.0.jar,commons-digester-1.7.jar,&lt;br /&gt;            commons-javaflow-20060411.jar,commons-logging-1.0.2.jar,commons-logging-api-1.0.2.jar,&lt;br /&gt;            commons-beanutils-1.7.jar,commons-collections-2.1.jar"&lt;br /&gt;            width="100" height="100"&amp;gt;&lt;br /&gt;&amp;lt;param value="/WebApplication2/ServletReport" name="urlService"&amp;gt;&lt;br /&gt;&amp;lt;/applet&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;como pueden ver le estoy poniendo algunas libs y la de jassperreport bueno esto lo hice para que el applet pueda encontrar las libs necesarias tambien firme el jar de jasperreports ya que como observan en el codigo genero archivos temporales, si no lo hago asi pues no podria leer esos archivos temporales y pues otra opcion seria que en lugar de guardar los datos que recibo del server en temporales pues tomarlos de memoria y cargalos con JRPrintXmlLoader para generar el jasperPrint y enviarlo a la impresora (creo que lo intentare despues).&lt;/p&gt;&lt;p&gt;Con javascript seria algo asi :&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&amp;lt;script type="text/javascript" language="JavaScript"&amp;gt;&lt;br /&gt;function ejecutoApplet() {&lt;br /&gt;//aqui hay que mandarle el nombre que le dimos al applet&lt;br /&gt;var Myapplet = document.applets['nomApplet'];&lt;br /&gt;//alert(Myapplet);&lt;br /&gt;var p =  Myapplet.ejecutaConJavascript('/WebApplication2/ServletEnviaReport');&lt;br /&gt;//alert(p)  //si el metodo del applet retorna algo con esto podemos ver el resultado&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Bueno pues eso es todo por el momento en cuanto mejore el codigo actualizo este post o hago uno nuevo, les dejo mi codigo de ejemplo en la siguientes ligas &lt;a href="http://www.mediafire.com/file/2qmrzzjwzjm/AppletPrintJRV.rar"&gt;applet&lt;/a&gt;, &lt;a href="http://www.mediafire.com/file/tzzxyamzzm3/WebApplication2.rar"&gt;aplicacion web de ejemplo&lt;/a&gt;, &lt;a href="http://www.mediafire.com/file/njaoar2idgg/firmaNeo.rar"&gt;firmas del applet&lt;/a&gt;   &lt;/p&gt;&lt;p&gt;No olviden firmar el applet y colocarlo en su aplicacion si le hacen algun cambio pues de lo contrario les pueden salir problemas de permisos, espero les sirva&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725395850223013052-4260329123429925576?l=publicajava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicajava.blogspot.com/feeds/4260329123429925576/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4725395850223013052&amp;postID=4260329123429925576' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/4260329123429925576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/4260329123429925576'/><link rel='alternate' type='text/html' href='http://publicajava.blogspot.com/2009/10/imprimir-reporte-de-jasperreports-en-el.html' title='Imprimir reporte de Jasperreports en el Cliente'/><author><name>neo_lestat</name><uri>http://www.blogger.com/profile/11876929031619045256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725395850223013052.post-6921946178938763735</id><published>2009-07-16T12:14:00.002-05:00</published><updated>2009-07-16T12:38:39.008-05:00</updated><title type='text'>SLF4J</title><content type='html'>&lt;p&gt;Que es &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;sfl&lt;/span&gt;4j ??   Es una biblioteca para facilitar la traza de mensajes en nuestras &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;aplicaciones&lt;/span&gt; (Simple &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Logging&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Facade&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;for&lt;/span&gt; Java  - &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;SLF&lt;/span&gt;4J) con esta biblioteca podemos cambiar &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;facilmente&lt;/span&gt; entre otros &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;frameworks&lt;/span&gt; como &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;log&lt;/span&gt;4j, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;commos&lt;/span&gt;-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;loggin&lt;/span&gt;, o usar  java.util.loggin, y lo &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;unico&lt;/span&gt; que tenemos que hacer es agregar el &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;jar&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;slf&lt;/span&gt;4j-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;api&lt;/span&gt;.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;jar&lt;/span&gt;  y otro &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;jar&lt;/span&gt; que corresponde al sistema de traza que hallamos elegido por ejemplo&lt;/p&gt;&lt;p&gt;slf4j-log4j12-1.5.8.jarr para usarlo con &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;log&lt;/span&gt;4j &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;version&lt;/span&gt; 1.12 o superior&lt;/p&gt;&lt;p&gt;slf4j-jdk14-1.5.8.jar para usarlo con java.util.loggin&lt;/p&gt;&lt;p&gt;slf4j-jcl-1.5.8.jar para usarlo con &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;jakarta&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;commons&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;loggin&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;Ademas&lt;/span&gt; cuenta con una &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;carecteristica&lt;/span&gt; muy interesante llamada  "traza &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;parametrizada&lt;/span&gt;" (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;parametized&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;loggin&lt;/span&gt;) la cual mejora el &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;performance&lt;/span&gt; cuando se deshabilita la traza de mensajes.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Por ejemplo , para que nuestro sistema de traza mejore en &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;performance&lt;/span&gt;, se hace una &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;validacion&lt;/span&gt; para revisar si el nivel de traza esta habilitado y entonces se construye la cadena y se escribe la traza, si no es &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;asi&lt;/span&gt; pues se ahorra tiempo al no construir la cadena :&lt;/p&gt;&lt;p&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;if&lt;/span&gt;(&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;logger&lt;/span&gt;.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;isDebugEnabled&lt;/span&gt;()) {&lt;br /&gt;  &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;logger&lt;/span&gt;.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;debug&lt;/span&gt;("&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;Entry&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;number&lt;/span&gt;: " + i + " &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;is&lt;/span&gt; " + &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;String&lt;/span&gt;.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_40"&gt;valueOf&lt;/span&gt;(&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_41"&gt;entry&lt;/span&gt;[i]));&lt;br /&gt;}&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Con &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_42"&gt;slfj&lt;/span&gt;4 podemos realizar una traza &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_43"&gt;parametrizada&lt;/span&gt; (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_44"&gt;parametized&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_45"&gt;loggin&lt;/span&gt;) , ejemplo:&lt;/p&gt;&lt;p&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_46"&gt;Object&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_47"&gt;entry&lt;/span&gt; = &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_48"&gt;new&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_49"&gt;SomeObject&lt;/span&gt;();&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_50"&gt;logger&lt;/span&gt;.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_51"&gt;debug&lt;/span&gt;("&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_52"&gt;The&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_53"&gt;entry&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_54"&gt;is&lt;/span&gt; {}.", &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_55"&gt;entry&lt;/span&gt;);&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Pueden ver unas llaves en la cadena y una coma al final en lugar de un +,  con esto &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_56"&gt;slfj&lt;/span&gt;4 sabe que primero debe ver si el nivel &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_57"&gt;debug&lt;/span&gt; esta habilitado y &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_58"&gt;despues&lt;/span&gt; formara la cadena pasando el valor de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_59"&gt;entry&lt;/span&gt; (o lo que retorne su &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_60"&gt;metodo&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_61"&gt;toString&lt;/span&gt;) en lugar de las llaves, y al finalizar a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_62"&gt;escribira&lt;/span&gt; pero si el nivel &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_63"&gt;debug&lt;/span&gt; esta inhabilitado entonces no &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_64"&gt;hara&lt;/span&gt; nada y no &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_65"&gt;consumira&lt;/span&gt; tiempo, por lo que mejora nuestro &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_66"&gt;performance&lt;/span&gt; y no tenemos que hacer &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_67"&gt;comparaciones&lt;/span&gt; como la primera, sino que todo lo &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_68"&gt;hara&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_69"&gt;sfl&lt;/span&gt;4j.&lt;/p&gt;&lt;p&gt;Les recomiendo que lo prueben es interesante y  trabaja muy bien con otros &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_70"&gt;frameworks&lt;/span&gt;, yo lo tengo integrado con &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_71"&gt;log&lt;/span&gt;4j, lo &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_72"&gt;unico&lt;/span&gt; que tuve que hacer es colocar el &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_73"&gt;jar&lt;/span&gt; de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_74"&gt;logj&lt;/span&gt;4, los de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_75"&gt;sfl&lt;/span&gt;4j y el archivo &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_76"&gt;properties&lt;/span&gt; donde &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_77"&gt;log&lt;/span&gt;4j lee su &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_78"&gt;configuracion&lt;/span&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725395850223013052-6921946178938763735?l=publicajava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicajava.blogspot.com/feeds/6921946178938763735/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4725395850223013052&amp;postID=6921946178938763735' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/6921946178938763735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/6921946178938763735'/><link rel='alternate' type='text/html' href='http://publicajava.blogspot.com/2009/07/slf4j.html' title='SLF4J'/><author><name>neo_lestat</name><uri>http://www.blogger.com/profile/11876929031619045256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725395850223013052.post-3482843774409066126</id><published>2009-07-14T11:43:00.002-05:00</published><updated>2009-07-14T11:49:50.713-05:00</updated><title type='text'>Bordes de Celdas con Jasperreport 3</title><content type='html'>&lt;p&gt;En este pequeño post les dare un tip de como ver los bordes de las celdas cuando generamos un reporte en excel con jasperreport, este es el trozo de codigo donde les explicare las propiedades,&lt;/p&gt;&lt;p&gt;String reportSource =   "report.jasper";&lt;/p&gt;&lt;p&gt; HashMap parameters= new HashMap();&lt;/p&gt;&lt;p&gt;//Esta propiedad es para que  todo el reporte se genere en sin espacios entre paginas de una misma hoja&lt;br /&gt;            parameters.put(JRParameter.IS_IGNORE_PAGINATION, true);&lt;br /&gt;            JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportSource);&lt;br /&gt;            JasperPrint jasperPrint =&lt;br /&gt;                            JasperFillManager.fillReport(jasperReport, parameters, connection);&lt;br /&gt;&lt;/p&gt;&lt;p&gt;//Aqui generamos  la clase para generar el reporte a excel&lt;br /&gt;            JExcelApiExporter exporter = new JExcelApiExporter();&lt;/p&gt;&lt;p&gt;//le pasamos algunos parametros&lt;br /&gt;            exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);&lt;br /&gt;            exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, tempFile);&lt;/p&gt;&lt;p&gt;//este parametro es para decirle que todo el reporte se genera en una sola  hoja de excel&lt;br /&gt;            exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, false);&lt;/p&gt;&lt;p&gt;//con este le decimos que  detecte el tipo de celda.&lt;br /&gt;            exporter.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, true);&lt;/p&gt;&lt;p&gt;//El siguiente es para decirle que no ignore los bordes de las celdas, y el ultimo es para que no use un fondo blanco, con estos dos parametros jasperreport genera la hoja de excel con los bordes de las celdas.&lt;/p&gt;&lt;p&gt;            exporter.setParameter(JRXlsExporterParameter.IS_IGNORE_CELL_BORDER, false);&lt;br /&gt;            exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, false);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            exporter.exportReport();&lt;/p&gt;&lt;p&gt;Yo uso jasperreport 3, suerte !! &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725395850223013052-3482843774409066126?l=publicajava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicajava.blogspot.com/feeds/3482843774409066126/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4725395850223013052&amp;postID=3482843774409066126' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/3482843774409066126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/3482843774409066126'/><link rel='alternate' type='text/html' href='http://publicajava.blogspot.com/2009/07/bordes-de-celdas-con-jasperreport-3.html' title='Bordes de Celdas con Jasperreport 3'/><author><name>neo_lestat</name><uri>http://www.blogger.com/profile/11876929031619045256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725395850223013052.post-4818216123468500766</id><published>2009-07-09T12:13:00.021-05:00</published><updated>2009-10-09T11:13:00.998-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='cache'/><category scheme='http://www.blogger.com/atom/ns#' term='jboss'/><title type='text'>Jboss Cache 1.4 y Hibernate 3.2</title><content type='html'>&lt;p&gt;En este pequeño post veremos como configurar Jboss Cache 1.4.x (esta version viene por defecto en jboss 4.2.x ) como cache de segundo nivel para hibernate 3.2.x (yo probe con la version 3.2.5 de hibernate), esto puede parecer un poco complicado pero si siguen los siguientes pasos veran que en realidad es facil. &lt;/p&gt;&lt;p&gt;En este &lt;a href="http://www.jboss.org/community/wiki/NewJBossCache14xBasedHibernate32CacheProvider"&gt;link&lt;/a&gt; podemos leer acerca de configurar jboss cache y recomienda usar jboss cache con hibernate si estamos usando entidades de hibernate en aplicaciones stand alone o si no usamos ejb-entity ya que jboss ya esta configurado para optimizar la cache en los ejb.&lt;/p&gt;&lt;p&gt;Algunos se preguntara para que sirve la cache de segundo nivel en hibernate, esta cache nos sirve basicamente para cargar datos en ella y de esta manera no tenemos que consultar de nuevo la base de datos, con lo que reducimos los tiempos de respuesta, y porque usar jboss-cache y no otra ?? Porque esta cache funciona en clusters, si nuestra aplicacion va a correr en cluster es mejor usar esta cache ya que la replicacion y todo lo que tiene que ver con cluster es transparente para nosotros (en este link pueden ver una tabla comparativa).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Requerimientos :&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Jboss As 4.2.x (&lt;a href="http://www.jboss.org/jbossas/downloads/"&gt;descarga&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Hibernate 3.2.x (&lt;a href="https://sourceforge.net/projects/hibernate/files/"&gt;descarga&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Hibernate cache provider (hibernate-jbc-cacheprovider-1.0.1.GA.jar &lt;a href="http://repository.jboss.org/maven2/org/jboss/cluster/hibernate-jbc-cacheprovider/1.0.1.GA/"&gt;descarga&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Configuracion del Servicio de Jboss Cache &lt;/p&gt;&lt;p&gt;Primero necesitamos tener un servicio de cache en jboss, les recomiendo usar la instancia all ya que ahi tiene todas las bibliotecas necesarias (prometo investigar los libs necesarios para el uso de jboss cache para poder usarla en el instancia default), en la carpeta deploy donde colocamos nuestros wars y datasource y algunas otras cosas crearemos un archivo con el nombre : jboss-cache-service.xml y en el pegaran lo siguiente (esta configuracion la tome de este&lt;a href="http://www.jboss.org/community/wiki/JBossCacheHibernateTransactionsStandaloneExample"&gt; ejemplo&lt;/a&gt; ) : &lt;/p&gt;&lt;p&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- ===================================================================== --&amp;gt;&lt;br /&gt;&amp;lt;!-- --&amp;gt;&lt;br /&gt;&amp;lt;!-- Sample TreeCache Service Configuration --&amp;gt;&lt;br /&gt;&amp;lt;!-- Recommended for use as Hibernate's 2nd Level Cache --&amp;gt;&lt;br /&gt;&amp;lt;!-- For use with JBossCache &amp;gt;= 1.3.0 ONLY!!! --&amp;gt;&lt;br /&gt;&amp;lt;!-- --&amp;gt;&lt;br /&gt;&amp;lt;!-- ===================================================================== --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;server&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--classpath codebase="./lib" archives="jboss-cache.jar, jgroups.jar"/--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- ==================================================================== --&amp;gt;&lt;br /&gt;&amp;lt;!-- Defines TreeCache configuration --&amp;gt;&lt;br /&gt;&amp;lt;!-- ==================================================================== --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--mbean code="org.jboss.cache.TreeCache"&lt;br /&gt;name="jboss.cache:service=HibernateTreeCache"--&amp;gt;&lt;br /&gt;&amp;lt;mbean code="org.jboss.cache.TreeCache"&lt;br /&gt;name="portal:service=HibernateTreeCache,type=hibernate"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;depends&amp;gt;jboss:service=Naming&amp;lt;/depends&amp;gt;&lt;br /&gt;&amp;lt;depends&amp;gt;jboss:service=TransactionManager&amp;lt;/depends&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;Configure the TransactionManager&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;attribute name="TransactionManagerLookupClass"&amp;gt;org.jboss.cache.GenericTransactionManagerLookup&amp;lt;/attribute&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;Node locking scheme:&lt;br /&gt;OPTIMISTIC&lt;br /&gt;PESSIMISTIC (default)&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;attribute name="NodeLockingScheme"&amp;gt;OPTIMISTIC&amp;lt;/attribute&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;Note that this attribute is IGNORED if your NodeLockingScheme above is OPTIMISTIC.&lt;br /&gt;&lt;br /&gt;Isolation level : SERIALIZABLE&lt;br /&gt;REPEATABLE_READ (default)&lt;br /&gt;READ_COMMITTED&lt;br /&gt;READ_UNCOMMITTED&lt;br /&gt;NONE&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;attribute name="IsolationLevel"&amp;gt;REPEATABLE_READ&amp;lt;/attribute&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;Valid modes are LOCAL&lt;br /&gt;REPL_ASYNC&lt;br /&gt;REPL_SYNC&lt;br /&gt;INVALIDATION_ASYNC&lt;br /&gt;INVALIDATION_SYNC&lt;br /&gt;--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- This should ideally be set to INVALIDATION_ASYNC but due to JBCACHE-806 this has to be REPL_ASYNC for now --&amp;gt;&lt;br /&gt;&amp;lt;attribute name="CacheMode"&amp;gt;REPL_ASYNC&amp;lt;/attribute&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;Just used for async repl: use a replication queue&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;attribute name="UseReplQueue"&amp;gt;false&amp;lt;/attribute&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;Replication interval for replication queue (in ms)&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;attribute name="ReplQueueInterval"&amp;gt;0&amp;lt;/attribute&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;Max number of elements which trigger replication&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;attribute name="ReplQueueMaxElements"&amp;gt;0&amp;lt;/attribute&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Name of cluster. Needs to be the same for all clusters, in order&lt;br /&gt;to find each other&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;attribute name="ClusterName"&amp;gt;TreeCache-Cluster&amp;lt;/attribute&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- JGroups protocol stack properties. Can also be a URL,&lt;br /&gt;e.g. file:/home/bela/default.xml&lt;br /&gt;&amp;lt;attribute name="ClusterProperties"&amp;gt;&amp;lt;/attribute&amp;gt;&lt;br /&gt;--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;attribute name="ClusterConfig"&amp;gt;&lt;br /&gt;&amp;lt;config&amp;gt;&lt;br /&gt;&amp;lt;!-- UDP: if you have a multihomed machine,&lt;br /&gt;set the bind_addr attribute to the appropriate NIC IP address --&amp;gt;&lt;br /&gt;&amp;lt;!-- UDP: On Windows machines, because of the media sense feature&lt;br /&gt;being broken with multicast (even after disabling media sense)&lt;br /&gt;set the loopback attribute to true --&amp;gt;&lt;br /&gt;&amp;lt;UDP mcast_addr="228.1.2.3" mcast_port="48866"&lt;br /&gt;ip_ttl="64" ip_mcast="true"&lt;br /&gt;mcast_send_buf_size="150000" mcast_recv_buf_size="80000"&lt;br /&gt;ucast_send_buf_size="150000" ucast_recv_buf_size="80000"&lt;br /&gt;loopback="false"/&amp;gt;&lt;br /&gt;&amp;lt;PING timeout="2000" num_initial_members="3"&lt;br /&gt;up_thread="false" down_thread="false"/&amp;gt;&lt;br /&gt;&amp;lt;MERGE2 min_interval="10000" max_interval="20000"/&amp;gt;&lt;br /&gt;&amp;lt;!-- &amp;lt;FD shun="true" up_thread="true" down_thread="true" /&amp;gt;--&amp;gt;&lt;br /&gt;&amp;lt;FD_SOCK/&amp;gt;&lt;br /&gt;&amp;lt;VERIFY_SUSPECT timeout="1500"&lt;br /&gt;up_thread="false" down_thread="false"/&amp;gt;&lt;br /&gt;&amp;lt;pbcast.NAKACK gc_lag="50" retransmit_timeout="600,1200,2400,4800"&lt;br /&gt;max_xmit_size="8192" up_thread="false" down_thread="false"/&amp;gt;&lt;br /&gt;&amp;lt;UNICAST timeout="600,1200,2400" window_size="100" min_threshold="10"&lt;br /&gt;down_thread="false"/&amp;gt;&lt;br /&gt;&amp;lt;pbcast.STABLE desired_avg_gossip="20000"&lt;br /&gt;up_thread="false" down_thread="false"/&amp;gt;&lt;br /&gt;&amp;lt;FRAG frag_size="8192"&lt;br /&gt;down_thread="false" up_thread="false"/&amp;gt;&lt;br /&gt;&amp;lt;pbcast.GMS join_timeout="5000" join_retry_timeout="2000"&lt;br /&gt;shun="true" print_local_addr="true"/&amp;gt;&lt;br /&gt;&amp;lt;pbcast.STATE_TRANSFER up_thread="true" down_thread="true"/&amp;gt;&lt;br /&gt;&amp;lt;/config&amp;gt;&lt;br /&gt;&amp;lt;/attribute&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;Whether or not to fetch state on joining a cluster&lt;br /&gt;NOTE this used to be called FetchStateOnStartup and has been renamed to be more descriptive.&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;attribute name="FetchInMemoryState"&amp;gt;false&amp;lt;/attribute&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;Number of milliseconds to wait until all responses for a&lt;br /&gt;synchronous call have been received.&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;attribute name="SyncReplTimeout"&amp;gt;20000&amp;lt;/attribute&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Max number of milliseconds to wait for a lock acquisition --&amp;gt;&lt;br /&gt;&amp;lt;attribute name="LockAcquisitionTimeout"&amp;gt;15000&amp;lt;/attribute&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;The max amount of time (in milliseconds) we wait until the&lt;br /&gt;initial state (ie. the contents of the cache) are retrieved from&lt;br /&gt;existing members in a clustered environment&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;attribute name="InitialStateRetrievalTimeout"&amp;gt;20000&amp;lt;/attribute&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Name of the eviction policy class. --&amp;gt;&lt;br /&gt;&amp;lt;attribute name="EvictionPolicyClass"&amp;gt;&amp;lt;/attribute&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;Indicate whether to use region based marshalling or not. Set this to true if you are running under a scoped&lt;br /&gt;class loader, e.g., inside an application server. Default is "false".&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;attribute name="UseRegionBasedMarshalling"&amp;gt;false&amp;lt;/attribute&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/mbean&amp;gt;&lt;br /&gt;&amp;lt;/server&amp;gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;con esta configuracion ya tenemos un servicio de cache que puede ser utilizado por cualquiera de nuestras aplicaciones pero en este caso la usaremos como una cache de segundo nivel para hibernate,fijense bien en el nombre (portal:service=HibernateTreeCache,type=hibernate) pues con este nombre debemos configuralo en nuestra configuracion de hibernate pues si lo ponemos diferente no encontrara el servicio y nos marcara error. Cuando arrancamos jboss en la jmx-console al final podemos ver este servicio&lt;/p&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5356514813436091874" style="margin: 0px auto 10px; display: block; width: 320px; height: 240px; text-align: center;" alt="" src="http://1.bp.blogspot.com/_IeGxsoKClhs/SlYp18D53eI/AAAAAAAAABc/BZLaDBKjyo8/s320/jmx_portal.JPG" border="0" /&gt;&lt;/p&gt;&lt;p&gt;Configuracion de Hibernate &lt;/p&gt;&lt;p&gt;Ahora que ya tenemos la configuracion de nuestra cache, lo siguiente es configurar hibernate para habilitar la segunda cache y decirle que tipo de cache y el servicio. Para eso colocaremos lo siquiente en el archivo hibernate.cfg.xml :&lt;/p&gt;&lt;p&gt;&amp;lt;property name="hibernate.dialect"&amp;gt;org.hibernate.dialect.MySQLDialect&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property name="hibernate.connection.driver_class"&amp;gt;com.mysql.jdbc.Driver&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property name="hibernate.connection.datasource"&amp;gt;java:/MySqlDS&amp;lt;/property&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;property name="hibernate.cache.use_second_level_cache"&amp;gt;true&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;!-- Provider is JBoss TreeCache --&amp;gt;&lt;br /&gt;&amp;lt;property name="hibernate.cache.provider_class"&amp;gt;&lt;br /&gt;org.jboss.hibernate.jbc.cacheprovider.JmxBoundTreeCacheProvider&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property name="hibernate.treecache.mbean.object_name"&amp;gt;&lt;br /&gt;portal:service=HibernateTreeCache,type=hibernate&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;!-- Transaction strategy configuration--&amp;gt;&lt;br /&gt;   &amp;lt;property name="hibernate.current_session_context_class"&amp;gt;&lt;br /&gt;       jta&lt;br /&gt;   &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property name="hibernate.transaction.factory_class"&amp;gt;&lt;br /&gt;     org.hibernate.transaction.JTATransactionFactory    &amp;lt;/property&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;lt;property name="transaction.manager_lookup_class"&amp;gt;&lt;br /&gt;org.hibernate.transaction.JBossTransactionManagerLookup&amp;lt;/property&amp;gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Como observan en mi configuracion le digo a hibernate que usare MySQL y le paso un datasource que configure en jboss (mas abajo les pondre esa configuracion), despues le digo que habilite la cache de segundo nivel, posteriormente le indico la clase que me va a proveer el acceso a la cache y por ultimo es el nombre del servicio de jboss donde configure la cache.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;En la penultima propiedad donde tiene el comentario "Transaction strategy configuration" es para decirle a hibernate la estrategia de transaccion que debe usar, si no colocamos esta propiedad hibernate utilizar por default : org.hibernate.transaction.JDBCTransactionFactory y esta estrategia no es adecuada para usar con la cache, ya que nuestro servidor de aplicaciones puede encargarse de esto entonces le decimos que lo haga colocando la propiedad con el valor        org.hibernate.transaction.JTATransactionFactory para decirle que delegue el manejo de las transacciones al servidor de aplicaciones.&lt;/p&gt;&lt;p&gt;En la ultima propiedad le indico la clase que administra las transacciones, como usamos jboss, pues le indicamos que use la clase org.hibernate.transaction.JBossTransactionManagerLookup, ya que es la adecuada a nuestro application server.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Al comienzo del post les menciono la biblioteca hibernate-jbc-cacheprovider-1.0.1.GA.jar, este jar lo debemos agregar a las bibliotecas de nuestra apliacion es decir en el directorio Myapp/WEB-INF/lib, ya que este jar contiene las clases que permiten a hibernate usar la cache de jboss.&lt;/p&gt;&lt;p&gt;Configuracion Mpping Clases&lt;/p&gt;&lt;p&gt;Ya que hemos configurado hibernate para usar la segunda cache solo nos resta indicar que clases seran almacenadas en la cache y para eso unicamente tenemos que añadir en nuestros archivos de mapeo la siguiente linea :&lt;/p&gt;&lt;p&gt;&amp;lt;cache usage="nonstrict-read-write"&amp;gt;&amp;lt;/cache&amp;gt;&lt;/p&gt;&lt;p&gt;Para usage tenemos las siguientes opciones que son las que definen el nivel de aislamiento:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;transactional: Garantiza un nivel de aislamiento hasta repeatable read. Es el nivel más estricto. Solamente se puede utilizar en clusters, es decir, con cachés distribuidas.&lt;/li&gt;&lt;li&gt;read-write: Mantiene un aislamiento hasta el nivel de commited.&lt;/li&gt;&lt;li&gt;nonstrict read-write: No ofrece garantía de consistencia entre el caché y la base de datos.Es una estrategia ideal para almacenar datos que no cambian habitualmente y que no sean demasiado críticos.&lt;/li&gt;&lt;li&gt;read-only: Es la estrategia de concurrencia menos estricta. Recomendada para datos que nunca cambian&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Por ejemplo : &lt;/p&gt;&lt;p&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&amp;gt;&lt;br /&gt;&amp;lt;!-- Generated 7/07/2009 12:43:46 PM by Hibernate Tools 3.2.1.GA --&amp;gt;&lt;br /&gt;&amp;lt;hibernate-mapping&amp;gt;&lt;br /&gt;&amp;lt;class catalog="students" name="org.nl.pojos.People" table="people"&amp;gt;&lt;br /&gt;&amp;lt;cache usage="read-only"&amp;gt;&amp;lt;/cache&amp;gt;&lt;br /&gt;&amp;lt;id name="id" type="java.lang.Integer"&amp;gt;&lt;br /&gt;&amp;lt;column name="id"/&amp;gt;&lt;br /&gt;&amp;lt;generator class="identity"/&amp;gt;&lt;br /&gt;&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;lt;property name="name" type="string"&amp;gt;&lt;br /&gt;&amp;lt;column length="65535" name="name"/&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property name="companyId" type="string"&amp;gt;&lt;br /&gt;&amp;lt;column length="65535" name="company_id"/&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/class&amp;gt;&lt;br /&gt;&amp;lt;/hibernate-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Appendice :&lt;/p&gt;&lt;p&gt;Datasources de MySql debe ser colocado en la carpeta deploy de nuestra instancia de jboss&lt;/p&gt;&lt;p&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- $Id: mysql-ds.xml 63175 2007-05-21 16:26:06Z rrajesh $ --&amp;gt;&lt;br /&gt;&amp;lt;!-- Datasource config for MySQL using 3.0.9 available from:&lt;br /&gt;http://www.mysql.com/downloads/api-jdbc-stable.html&lt;br /&gt;--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;datasources&amp;gt;&lt;br /&gt;&amp;lt;local-tx-datasource&amp;gt;&lt;br /&gt;&amp;lt;jndi-name&amp;gt;MySqlDS&amp;lt;/jndi-name&amp;gt;&lt;br /&gt;&amp;lt;connection-url&amp;gt;jdbc:mysql://localhost:3306/students&amp;lt;/connection-url&amp;gt;&lt;br /&gt;&amp;lt;driver-class&amp;gt;com.mysql.jdbc.Driver&amp;lt;/driver-class&amp;gt;&lt;br /&gt;&amp;lt;user-name&amp;gt;root&amp;lt;/user-name&amp;gt;&lt;br /&gt;&amp;lt;!--password&amp;gt;y&amp;lt;/password--&amp;gt;&lt;br /&gt;&amp;lt;exception-sorter-class-name&amp;gt;org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter&amp;lt;/exception-sorter-class-name&amp;gt;&lt;br /&gt;&amp;lt;!-- should only be used on drivers after 3.22.1 with "ping" support&lt;br /&gt;&amp;lt;valid-connection-checker-class-name&amp;gt;org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker&amp;lt;/valid-connection-checker-class-name&amp;gt;&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;!-- sql to call when connection is created&lt;br /&gt;&amp;lt;new-connection-sql&amp;gt;some arbitrary sql&amp;lt;/new-connection-sql&amp;gt;&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;!-- sql to call on an existing pooled connection when it is obtained from pool - MySQLValidConnectionChecker is preferred for newer drivers&lt;br /&gt;&amp;lt;check-valid-connection-sql&amp;gt;some arbitrary sql&amp;lt;/check-valid-connection-sql&amp;gt;&lt;br /&gt;--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml --&amp;gt;&lt;br /&gt;&amp;lt;metadata&amp;gt;&lt;br /&gt;&amp;lt;type-mapping&amp;gt;mySQL&amp;lt;/type-mapping&amp;gt;&lt;br /&gt;&amp;lt;/metadata&amp;gt;&lt;br /&gt;&amp;lt;/local-tx-datasource&amp;gt;&lt;br /&gt;&amp;lt;/datasources&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Si alguien quiere mi proyecto de prueba escribame un comentario con su mail y se los envio&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Referencias :&lt;/p&gt;&lt;p&gt;http://federicovarela.blogspot.com/2007/12/cache-en-hibernate.html&lt;/p&gt;&lt;p&gt;http://www.jboss.org/community/wiki/JBossCacheHibernate&lt;/p&gt;&lt;p&gt;http://www.jboss.org/community/wiki/NewJBossCache14xBasedHibernate32CacheProvider&lt;/p&gt;&lt;p&gt;http://www.jboss.org/community/wiki/JBossCacheHibernateTransactionsStandaloneExample&lt;/p&gt;&lt;p&gt;update :&lt;/p&gt;&lt;p&gt;Si quieren el proyecto de ejemplo lo pueden&lt;a href="http://www.mediafire.com/?m0urnjndnym"&gt; descargar ,&lt;/a&gt;&lt;/p&gt;&lt;p&gt;es un proyecto de netbeans, no lo limpie por eso esta pesado, jejeje, espero les sirva&lt;/p&gt;&lt;p&gt;update: puede que tenga algunos errores dado que jboss utiliza por default el clasloder de tomcat para que funcione correctamente deben cambiar el classloder para eso tiene que abrir el archivo jboss-service.xml y buscar la propiedad UseJBossWebLoader que por default se encuentra en false y deben cambiarlo a verdadero, el archivo se encuentra en jboss4.2.2/server/instancia/deploy/jboss-web.deployer/META-INF/jboss-service.xml donde nombre instancia es su instacia de jboss por ejemplo all.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725395850223013052-4818216123468500766?l=publicajava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicajava.blogspot.com/feeds/4818216123468500766/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4725395850223013052&amp;postID=4818216123468500766' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/4818216123468500766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/4818216123468500766'/><link rel='alternate' type='text/html' href='http://publicajava.blogspot.com/2009/07/jboss-cache-14-y-hibernate-32.html' title='Jboss Cache 1.4 y Hibernate 3.2'/><author><name>neo_lestat</name><uri>http://www.blogger.com/profile/11876929031619045256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_IeGxsoKClhs/SlYp18D53eI/AAAAAAAAABc/BZLaDBKjyo8/s72-c/jmx_portal.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725395850223013052.post-3480567162550366734</id><published>2009-05-25T12:51:00.008-05:00</published><updated>2009-05-28T15:21:30.875-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Invocar metodos de una clase externa desde una clase Interna en Java (anidada)</title><content type='html'>&lt;p&gt;En este pequeño post veremos como podemos invocar los métodos de una clase que contiene una clase anidada con nombres de metodos y miembros(varibles)  iguales, ya que las clases anidadas pueden acceder a cualquier método o miembro de la clase que la contiene lo único que nesecitamos para invocar metodos o miembros de la clase externa es usar el nombre de la varibale o metodo como si la clase interna fuera un metodo de la clase externa, pero cuando los metodos o miembros tienen los mismos nombres ocurre un problema pues se invocan los que estan definidos en la clase interna, entonces tenemos que tener cuidado con esto.&lt;/p&gt;&lt;p&gt;Para poder acceder a los miembros y métodos de la clase externa que tienen nombre igual al de la clase interna tenemos que colocar el nombre de la clase externa, despues un punto, despues la palabra reservada this y por ultimo el nombre de la variable o el método que deseamos invocar o acceder, por ejemplo :&lt;/p&gt;&lt;p&gt;         NombreClaseExterna.this.variableUno&lt;/p&gt;&lt;p&gt;ó&lt;/p&gt;&lt;p&gt;          NombreClaseExterna.this.miembroUno()&lt;/p&gt;&lt;p&gt;Bien les pongo un Ejemplo:&lt;/p&gt;&lt;p&gt;/**&lt;br /&gt; * Definimos una clase externa con una variable nombre&lt;br /&gt; * y definimos el get y set correspondiente&lt;br /&gt; */&lt;br /&gt;public class ClaseExterna {&lt;br /&gt;  &lt;br /&gt;  private String nombre;&lt;br /&gt;&lt;br /&gt;  public ClaseExterna() {&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public String getNombre() {&lt;br /&gt;    return nombre;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setNombre(String nombre) {&lt;br /&gt;    this.nombre = nombre;&lt;br /&gt;  }&lt;br /&gt;  /*&lt;br /&gt;   * Aqui definimos la clase interna, la cual contiene&lt;br /&gt;   * una variable nombre, un metodo para obtener la variable&lt;br /&gt;   * nombre y dos metodos que imprimen un mensaje&lt;br /&gt;   */&lt;br /&gt;  class ClaseInterna {&lt;br /&gt;&lt;br /&gt;    private String nombre;&lt;br /&gt;&lt;br /&gt;    /* Constructor: Inicializa la variable nomnbre*/&lt;br /&gt;    ClaseInterna(){&lt;br /&gt;        nombre = "clase interna";&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String getNombre() {&lt;br /&gt;        return nombre;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /* Aqui invocamos el miembro y el metodo de la clase interna*/&lt;br /&gt;    public void hola(){&lt;br /&gt;      System.out.println("Hola : " + nombre);&lt;br /&gt;      System.out.println("Hola : " + getNombre());      &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /* Aqui se invoca el miebro y el metodo de la clase externa*/&lt;br /&gt;    public void holaDos(){&lt;br /&gt;      System.out.println("Hola : " + ClaseExterna.this.nombre);&lt;br /&gt;      System.out.println("Hola : " + ClaseExterna.this.getNombre());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  /*&lt;br /&gt;   * Aqui probamos las clases, primero creamos una instancia&lt;br /&gt;   * de la clase externa, despues inicializamos su variable nombre&lt;br /&gt;   * posteriormente creamos una instancia de las clase interna,&lt;br /&gt;   * y con el objeto que creamos de la clae interna invocamos sus&lt;br /&gt;   * metodos.&lt;br /&gt;   */&lt;br /&gt;  public static void main(String args []){&lt;br /&gt;    ClaseExterna ce = new ClaseExterna();&lt;br /&gt;    ce.setNombre("Mundo");&lt;br /&gt;    ClaseExterna.ClaseInterna ci = ce.new ClaseInterna();&lt;br /&gt;    &lt;br /&gt;    ci.hola();&lt;br /&gt;    ci.holaDos();&lt;br /&gt;    &lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;La salida del programa es :&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Hola : clase internaHola : clase internaHola : Mundo&lt;br /&gt;Hola : Mundo&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Cualquier duda escriban un comentario ...&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725395850223013052-3480567162550366734?l=publicajava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicajava.blogspot.com/feeds/3480567162550366734/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4725395850223013052&amp;postID=3480567162550366734' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/3480567162550366734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/3480567162550366734'/><link rel='alternate' type='text/html' href='http://publicajava.blogspot.com/2009/05/invocar-metodos-de-una-clase-externa.html' title='Invocar metodos de una clase externa desde una clase Interna en Java (anidada)'/><author><name>neo_lestat</name><uri>http://www.blogger.com/profile/11876929031619045256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725395850223013052.post-5781392269390477629</id><published>2009-04-21T11:56:00.003-05:00</published><updated>2009-04-21T12:24:53.614-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='IoC'/><category scheme='http://www.blogger.com/atom/ns#' term='jsp'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Obtener Beans del IoC de Spring en JSP's</title><content type='html'>Bien en un modulo que estoy realizando unos cambios me encontre con la sorpresa de que se estaban instanciando Daos (data acces object) dentro del jsp y esto pues es un pequeño problema de performance pues cada vez que se presenta el jsp se crea un objeto.&lt;br /&gt;&lt;br /&gt;Lo primero que hice fue declarar los Daos asi:&lt;br /&gt;&lt;br /&gt;&amp;lt;%!DaoCatalogo daoCatalogo = new DaoCatalogo();%&amp;gt;&lt;br /&gt;&lt;br /&gt;Con lo anterior aseguro que solo habrá una instancia del objeto para cada peticion al jsp, pero ya que estamos usando spring porque no mejor obtener los objetos del contenedor de spring (IoC).&lt;br /&gt;&lt;br /&gt;Este pequeño detalle no se hubiera dado si el desarrollador anterior hubiera ocupado bien el springMVC, pero bueno lo que hice fue una clase estatica con un metodo estatico al cual le paso el nombre del bean definido en nuestro applicationContext y el ServletContext para poder obtener el objeto la clase es la siguiente&lt;br /&gt;&lt;br /&gt;&lt;em&gt;package com.example.nl;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;import javax.servlet.ServletContext;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;import org.springframework.context.ApplicationContext;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;import org.springframework.web.context.support.WebApplicationContextUtils;&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;public class SpringLocateBean {&lt;br /&gt;&lt;br /&gt;public static Object getBean (String nameBean, ServletContext sc){ &lt;/em&gt;&lt;br /&gt;&lt;em&gt;Object objBean = null;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;ApplicationContext actx = WebApplicationContextUtils.&lt;/em&gt;&lt;br /&gt;&lt;em&gt;getWebApplicationContext(sc); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;objBean = actx.getBean(nameBean); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;return objBean; &lt;/em&gt;&lt;br /&gt;&lt;em&gt;}&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;}&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Como se observa en la clase lo que hace es obtener el ApplicationContext con la ayuda de la clase WebApplicationContextUtils con el metodo getWebApplicationContext(ServletContext) al cual se le pase el contexto de nuestro servlet (jsp), una vez obtenido el ApplicationContext obtenemos el bean (objeto) que queremos a travez del nombre que le pasamos al metodo getBean(String), este metodo nos devuelve el bean que queremos pero en tipo Object por lo que en el jsp tenemos que hacer un cast al tipo de objeto adecuado&lt;br /&gt;&lt;br /&gt;En el jsp tenemos lo siguiente :&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&amp;lt;%@ page import="com.example.nl.SpringLocateBean"%&amp;gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&amp;lt;%!&lt;/em&gt;&lt;br /&gt;&lt;em&gt;DaoCatalogo daoCatalogo;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;public void jspInit() { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;daoCatalogo = (DaoCatalogo) SpringLocateBean. &lt;/em&gt;&lt;br /&gt;&lt;em&gt;getBean ("daoCatalogo", getServletConfig().getServletContext());&lt;/em&gt;&lt;br /&gt;&lt;em&gt;} &lt;/em&gt;&lt;br /&gt;&lt;em&gt;%&amp;gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Como vemos en el jsp importamos nuestra clase que obtiene los objetos de spring, despues declaramos la variable DaoCatalogo y posteriorme un metodo jspInit() en el cual se inicializa el objeto con nuestra clase SpringLocateBean ejecutando el metodo getBean y pasando el nombre del bean (ojo este nombre esta definido en el applicationContext.xml ) y el contexto del jsp&lt;br /&gt;&lt;br /&gt;Nota: el metodo jspInit() se ocupa cuando ocupamos alguna libreria de etiquetas (custom tags) como por ejemplo JSTL, si no utilizamos ninguna en nuestro jsp podemos usar el metodo _jspInit(), esto si usas algun servidor basado en tomcat o tomcat en otros no he probado&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bueno esto les puede servir si necesitan incorporar Spring a una aplicacion web con servltes y jsp pero sin usar springMVC.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725395850223013052-5781392269390477629?l=publicajava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicajava.blogspot.com/feeds/5781392269390477629/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4725395850223013052&amp;postID=5781392269390477629' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/5781392269390477629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/5781392269390477629'/><link rel='alternate' type='text/html' href='http://publicajava.blogspot.com/2009/04/obtener-beans-del-ioc-de-spring-en-jsps.html' title='Obtener Beans del IoC de Spring en JSP&apos;s'/><author><name>neo_lestat</name><uri>http://www.blogger.com/profile/11876929031619045256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725395850223013052.post-7745943338394282292</id><published>2009-04-13T12:53:00.004-05:00</published><updated>2009-04-13T13:08:26.213-05:00</updated><title type='text'>Problema texto largo en jasperreports y linux</title><content type='html'>Les cuento que en la aplicacion que desarrollo tengo unos reportes y usamos jasperreports3.0 para generar archivos pdf, bien teniamos un problema con estos reportes en un campo de texto que podia ser corto o muy largo, el problema es que a veces el texto se cortaba, en windows funcionaba muy bien, todo el texto se mostraba perfecto, pero en linux no, entonces escribi a jasperreport.org y me contestaro que se debia a un problema con las fuentes, en este campo la fuente definida es Arial y en windows esta fuente trabaja muy bien pues es nativa de este sisteama operativo pero en linux no la tiene ya que es una fuente propietaria, y bueno para esto installe la fuente Arial en linux y el problema se soluciono.&lt;br /&gt;&lt;br /&gt;Para saber mas acerca de este bug pueden leer en este FAQ de jasper, en la parte donde dice:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#cc0000;"&gt;&lt;a href="http://jasperforge.org/uploads/publish/jasperreportswebsite/trunk/faq.html?group_id=252#FAQ25"&gt;Why is my text not displayed correctly in PDF?&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Para instalar la fuente arial segui los siguientes pasos (el servidor linux que usamos es un red hat enterprise 5):&lt;br /&gt;&lt;br /&gt;1.-  Crear una carpeta en la ruta /usr/share/fonts&lt;br /&gt;            mkdir windowsfonts&lt;br /&gt;&lt;br /&gt;2.-  Copiar las fuentes Arial de la carpeta c:\WINDOWS\fonts a la carpeta creada en el punto 1 (windowsfonts)&lt;br /&gt;&lt;br /&gt;3.-  Cambiar el propietario y los permisos de las fuentes que se copiaron&lt;br /&gt;   Ejecutar :&lt;br /&gt;cd /usr/share/fonts/windowsfonts &lt;br /&gt;chown root.root *.tff&lt;br /&gt;chmod 644 *.ttf&lt;br /&gt;&lt;br /&gt;4.-  Ejecutar el commando mkfontdir dentro de la carpeta que contiene las fuentes (windowsfonts)&lt;br /&gt;&lt;br /&gt;5.-  Cambiar al directorio padre (fonts), ejecutando cd ..&lt;br /&gt;&lt;br /&gt;6.- Ejecutar el comando fc-cache windowsfonts&lt;br /&gt;&lt;br /&gt;Para mas referencias sobre installar la fuente arial aqui estan estos links:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://linuxhelp.blogspot.com/2005/12/adding-windows-fonts-in-linux.html"&gt;http://linuxhelp.blogspot.com/2005/12/adding-windows-fonts-in-linux.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Este es de redhat&lt;br /&gt;&lt;a href="http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5.2/html/Deployment_Guide/s3-x-fonts-fontconfig-add.html"&gt;http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5.2/html/Deployment_Guide/s3-x-fonts-fontconfig-add.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jasperforge.org/uploads/publish/jasperreportswebsite/trunk/faq.html?group_id=252#FAQ25"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725395850223013052-7745943338394282292?l=publicajava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicajava.blogspot.com/feeds/7745943338394282292/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4725395850223013052&amp;postID=7745943338394282292' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/7745943338394282292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/7745943338394282292'/><link rel='alternate' type='text/html' href='http://publicajava.blogspot.com/2009/04/problema-texto-largo-en-jasperreports-y.html' title='Problema texto largo en jasperreports y linux'/><author><name>neo_lestat</name><uri>http://www.blogger.com/profile/11876929031619045256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725395850223013052.post-4292235764958455890</id><published>2009-03-25T16:28:00.005-06:00</published><updated>2009-03-25T17:22:40.222-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java. swing'/><category scheme='http://www.blogger.com/atom/ns#' term='substance'/><title type='text'>Substance, JComboBox, Problema al colocar una fuente en JComboBox</title><content type='html'>En cierta aplicacion de swing me asignaron implementar el evento enter del teclado para que al dar enter se cambiara de componente en componente de acuerdo a un orden establecido, bien esto lo solucione con keyListeners en los respectivos objetos que se despliegan en la pantalla, pero con el JComboBox tuvimos algunos problemas.&lt;br /&gt;Para empezar un JComboBox esta compuesto por otros objetos (una lista desplegable y una caja de texto), cuando queria agregar el keyLystener lo hacia directo a mi objeto JComboBox y cuando lo ejecutaba pues no se realizaba la accion del enter ya que no estaba dando enter al JComboBox sino a su campo de texto, entonces para solucionar esto añadi el listener a el campo de texto, asi:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;JTextComponent editor; &lt;/em&gt;&lt;br /&gt;&lt;em&gt;//myJcomboBox es el objeto JComboBox&lt;/em&gt;&lt;br /&gt;&lt;em&gt;editor = (JTextComponent) myJcomboBox.getEditor().getEditorComponent(); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;final ComboBoxEditor cmboxEditor = this.getEditor();&lt;/em&gt;&lt;br /&gt;&lt;em&gt;editor.addKeyListener(new KeyAdapter() {&lt;/em&gt;&lt;br /&gt;&lt;em&gt;public void keyPressed(KeyEvent e) {&lt;/em&gt;&lt;br /&gt;&lt;em&gt;System.out.println("KeyAdapter keypressed " + e.getKeyCode() ); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;}&lt;/em&gt;&lt;br /&gt;&lt;em&gt;});&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;como la aplicacion usa substance para hacer mas amigable la intefaz, cuando la aplicacion despliega algunos JComboBox les coloca un tipo de fuente y al hacer eso y estar utilizando substance podemos decir que se rehacia ese objeto por lo cual los listeners que le colocaba desaparecian, bien para solucionar esto debemos añadir un &lt;em&gt;PropertyChangeListener&lt;/em&gt; a el JComboBox :&lt;br /&gt;&lt;br /&gt;&lt;em&gt;JComboBox myComboBox = new MyComboBox(); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;//al colocar la fuente los listeners se pierden&lt;/em&gt;&lt;br /&gt;&lt;em&gt;myComboBox.setFont(new Font("Arial",Font.BOLD,12));&lt;/em&gt;&lt;br /&gt;&lt;em&gt;//Se coloca final para poder utilizar esta variable dentro de la clase anonima&lt;/em&gt;&lt;br /&gt;&lt;em&gt;final JComboBox mycmb = myComboBox; &lt;/em&gt;&lt;br /&gt;&lt;em&gt;//Se agrega un PropertyChangeListener para añadir el listener del teclado&lt;/em&gt;&lt;br /&gt;&lt;em&gt;myComboBox.addPropertyChangeListener( new PropertyChangeListener() { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;public void propertyChange(PropertyChangeEvent propertyChangeEvent) { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;String property = propertyChangeEvent.getPropertyName(); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;System.out.println("En property changer " + property); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;if ("editor".equals(property)) { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;// Si queremos obtener la propiedad editor en este punto&lt;/em&gt;&lt;br /&gt;&lt;em&gt;// Obtenemos un nullpointer exception &lt;/em&gt;&lt;br /&gt;&lt;em&gt;System.out.println("Entra en property changer " + property); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;} &lt;/em&gt;&lt;br /&gt;&lt;em&gt;if ("UI".equals(property)) { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;System.out.println("Entra en property changer " + property); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;System.out.println(mycmb); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;//aqui es donde se agrega el listener del teclado &lt;/em&gt;&lt;br /&gt;&lt;em&gt;mycmb.getEditor().getEditorComponent() &lt;/em&gt;&lt;br /&gt;&lt;em&gt;.addKeyListener(new KeyAdapter() {&lt;/em&gt;&lt;br /&gt;&lt;em&gt;public void keyPressed(KeyEvent e) { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;System.out.println("KeyAdapter keypressed " + e.getKeyCode() ); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;} &lt;/em&gt;&lt;br /&gt;&lt;em&gt;}); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;} &lt;/em&gt;&lt;br /&gt;&lt;em&gt;} &lt;/em&gt;&lt;br /&gt;&lt;em&gt;} );&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;Y asi los listeners que le agrego al combobox ya no se pierden y esta resuelto el problema&lt;br /&gt;&lt;br /&gt;Les dejo el codigo que estuve probando pero necesitaran substance aqui esta su link &lt;a href="https://substance.dev.java.net/"&gt;https://substance.dev.java.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Y el codigo es el siguiente :&lt;br /&gt;&lt;br /&gt;&lt;em&gt;import java.awt.*;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;import java.awt.event.*;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;import java.beans.PropertyChangeEvent;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;import java.beans.PropertyChangeListener;import javax.swing.*;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;import javax.swing.text.JTextComponent;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;public class ExampleJComboBox extends JFrame { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;MyComboBox myComboBox; &lt;/em&gt;&lt;br /&gt;&lt;em&gt;public ExampleJComboBox() { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;String[] names = { "hemanth", "Shawn", "Hunter", "Undertaker", "Big Show" }; myComboBox = new MyComboBox(); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;myComboBox.setFont(new Font("Arial",Font.BOLD,12));&lt;br /&gt;getContentPane().add(myComboBox, BorderLayout.NORTH); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;JButton jbnOk = new JButton("Ok"); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;getContentPane().add(jbnOk, BorderLayout.SOUTH); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;JTextComponent editor; &lt;/em&gt;&lt;br /&gt;&lt;em&gt;editor = (JTextComponent) myComboBox.getEditor().getEditorComponent(); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;final JTextComponent jedit = editor; &lt;/em&gt;&lt;br /&gt;&lt;em&gt;editor.addKeyListener(new KeyAdapter() { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;public void keyPressed(KeyEvent e) { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;System.out.println("KeyAdapter keypressed " + e.getKeyCode() ); } }); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;// Print Name of the Selected Combo Box Item to Console when OK button is pressed &lt;/em&gt;&lt;br /&gt;&lt;em&gt;jbnOk.addActionListener( new ActionListener() { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;public void actionPerformed(ActionEvent e) { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;System.out.println( myComboBox.getSelectedItem() ); } &lt;/em&gt;&lt;br /&gt;&lt;em&gt;}); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;// Print Name of the Selected Combo Box Item to Console when Enter is pressed myComboBox.addActionListener( new ActionListener() { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;public void actionPerformed(ActionEvent e) { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;System.out.println( myComboBox.getSelectedItem() ); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;} &lt;/em&gt;&lt;br /&gt;&lt;em&gt;}); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;final MyComboBox mycmb = myComboBox; &lt;/em&gt;&lt;br /&gt;&lt;em&gt;myComboBox.addPropertyChangeListener( new PropertyChangeListener() { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;public void propertyChange(PropertyChangeEvent propertyChangeEvent) { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;String property = propertyChangeEvent.getPropertyName(); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;System.out.println("En property changer " + property); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;if ("editor".equals(property)) { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;System.out.println("Entra en property changer " + property); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;System.out.println(mycmb); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;} &lt;/em&gt;&lt;br /&gt;&lt;em&gt;if ("UI".equals(property)) { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;System.out.println("Entra en property changer " + property); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;System.out.println(mycmb); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;mycmb.getEditor().getEditorComponent() &lt;/em&gt;&lt;br /&gt;&lt;em&gt;.addKeyListener(new KeyAdapter() { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;public void keyPressed(KeyEvent e) { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;System.out.println("KeyAdapter keypressed " + e.getKeyCode() ); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;} &lt;/em&gt;&lt;br /&gt;&lt;em&gt;}); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;} &lt;/em&gt;&lt;br /&gt;&lt;em&gt;} &lt;/em&gt;&lt;br /&gt;&lt;em&gt;} &lt;/em&gt;&lt;br /&gt;&lt;em&gt;); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;} &lt;/em&gt;&lt;br /&gt;&lt;em&gt;class MyComboBox extends JComboBox { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;public MyComboBox(){ &lt;/em&gt;&lt;br /&gt;&lt;em&gt;super( new Object[] {"Ester", "Jordi", "Jordina", "Jorge", "Sergi"}); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;// has to be editable &lt;/em&gt;&lt;br /&gt;&lt;em&gt;this.setEditable(true);&lt;/em&gt;&lt;br /&gt;&lt;em&gt;// JTextComponent editor;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;// editor = (JTextComponent) this.getEditor().getEditorComponent();&lt;/em&gt;&lt;br /&gt;&lt;em&gt;// final ComboBoxEditor cmboxEditor = this.getEditor();&lt;/em&gt;&lt;br /&gt;&lt;em&gt;// editor.addKeyListener(new KeyAdapter() {&lt;/em&gt;&lt;br /&gt;&lt;em&gt;// public void keyPressed(KeyEvent e) {&lt;/em&gt;&lt;br /&gt;&lt;em&gt;// System.out.println("KeyAdapter keypressed " + e.getKeyCode() );&lt;/em&gt;&lt;br /&gt;&lt;em&gt;// }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;// }); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;} &lt;/em&gt;&lt;br /&gt;&lt;em&gt;} &lt;/em&gt;&lt;br /&gt;&lt;em&gt;public static void main(String[] args) { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;java.awt.EventQueue.invokeLater(new Runnable() { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;public void run() { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;try { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;UIManager.setLookAndFeel("org.jvnet.substance.skin.SubstanceMistAquaLookAndFeel"); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;} catch (UnsupportedLookAndFeelException ex) { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;ex.printStackTrace(); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;} catch (IllegalAccessException ex) {&lt;/em&gt;&lt;br /&gt;&lt;em&gt;ex.printStackTrace(); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;} catch (InstantiationException ex) { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;ex.printStackTrace(); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;} catch (ClassNotFoundException ex) { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;ex.printStackTrace(); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;} catch (Exception ex) { &lt;/em&gt;&lt;br /&gt;&lt;em&gt;ex.printStackTrace(); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;} &lt;/em&gt;&lt;br /&gt;&lt;em&gt;ExampleJComboBox frame = new ExampleJComboBox(); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;frame.setDefaultCloseOperation( EXIT_ON_CLOSE ); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;frame.pack(); frame.setLocationRelativeTo( null ); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;frame.setVisible( true ); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;} &lt;/em&gt;&lt;br /&gt;&lt;em&gt;}); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;}&lt;/em&gt;&lt;br /&gt;&lt;em&gt;}&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Nota: no olviden agregar substance.jar a su classpath&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725395850223013052-4292235764958455890?l=publicajava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicajava.blogspot.com/feeds/4292235764958455890/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4725395850223013052&amp;postID=4292235764958455890' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/4292235764958455890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/4292235764958455890'/><link rel='alternate' type='text/html' href='http://publicajava.blogspot.com/2009/03/substance-jcombobox-problema-al-colocar.html' title='Substance, JComboBox, Problema al colocar una fuente en JComboBox'/><author><name>neo_lestat</name><uri>http://www.blogger.com/profile/11876929031619045256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725395850223013052.post-6107090872874727838</id><published>2009-02-24T11:07:00.009-06:00</published><updated>2009-02-24T12:53:58.091-06:00</updated><title type='text'>Hola mundo Flex compilado con Ant</title><content type='html'>En este post vamos a ver como hacer un hola mundo en flex y construirlo con ant, esto les puede servir si no pueden obtener el flex builder o el pluguin para eclipse, pues de esta manera podriamos construir nuestros proyectos sin embargo sera un poco mas de trabajo.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Lo que necesitamos :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ant &lt;a href="http://ant.apache.org/"&gt;descargar&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Flex SDK &lt;a href="http://www.adobe.com/products/flex/flexdownloads/index.html"&gt;descargar&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Editor de textos (Les recomiendo notepad++ &lt;a href="http://notepad-plus.sourceforge.net/es/site.htm"&gt;descargar&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Que es flex ?&lt;/p&gt;&lt;p&gt;Flex es un conjunto de librerías o framework – para desarrollo de interfaces de usuario. Este framework usa ActionScript 3.0 (AS3). Si el código AS3 que se programe utiliza los componentes y métodos definidos en el Flex framework, entonces se esta usando Flex. Es decir, AS3 no es por si solo &lt;a href="http://www.holaflex.com/?p=34"&gt;flex&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Tendremos la siguiente estructura de nuestro proyecto&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Carpeta raiz del proyecto: hello_flex_ant&lt;/li&gt;&lt;li&gt;dentro de la carpeta raiz tendremos los archivos build.xml, build.properties, y una subcarpeta src&lt;/li&gt;&lt;li&gt;dentro de la subcarpeta src creamos una subcarpeta flex y dentro de esta crearemos el archivo HelloFlexAnt.mxml&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;Les debe quedar asi:&lt;/p&gt;&lt;img id="BLOGGER_PHOTO_ID_5306421120144773458" style="margin: 0px auto 10px; display: block; width: 296px; height: 154px; text-align: center;" alt="" src="http://3.bp.blogspot.com/_IeGxsoKClhs/SaQx5ObcEVI/AAAAAAAAAA0/IUx9gduWtDk/s320/flex1.JPG" border="0" /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5306421363470972050" style="margin: 0px auto 10px; display: block; width: 320px; height: 151px; text-align: center;" alt="" src="http://3.bp.blogspot.com/_IeGxsoKClhs/SaQyHY47NJI/AAAAAAAAAA8/OqfbAxjf-Jg/s320/flex2.JPG" border="0" /&gt;&lt;br /&gt;En el archivo HelloFlexAnt.mxml colocaremos lo siguiente: &lt;/p&gt;&lt;pre&gt;&lt;span class="mxmlCdata"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="mxmlComponent"&gt;&amp;lt;mx:Application&lt;/span&gt;&lt;br /&gt; xmlns:mx="&lt;span class="mxmlString"&gt;http://www.adobe.com/2006/mxml&lt;/span&gt;"&lt;br /&gt; viewSourceURL="&lt;span class="mxmlString"&gt;src/HelloWorld/index.html&lt;/span&gt;"&lt;br /&gt; horizontalAlign="&lt;span class="mxmlString"&gt;center&lt;/span&gt;" verticalAlign="&lt;span class="mxmlString"&gt;middle&lt;/span&gt;"&lt;br /&gt; width="&lt;span class="mxmlString"&gt;300&lt;/span&gt;" height="&lt;span class="mxmlString"&gt;160&lt;/span&gt;"&lt;br /&gt;&lt;span class="mxmlComponent"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="mxmlComponent"&gt;&amp;lt;mx:Panel&lt;/span&gt;&lt;br /&gt;     paddingTop="&lt;span class="mxmlString"&gt;10&lt;/span&gt;" paddingBottom="&lt;span class="mxmlString"&gt;10&lt;/span&gt;"&lt;br /&gt;     paddingLeft="&lt;span class="mxmlString"&gt;10&lt;/span&gt;" paddingRight="&lt;span class="mxmlString"&gt;10&lt;/span&gt;"&lt;br /&gt;     title="&lt;span class="mxmlString"&gt;My Application&lt;/span&gt;"&lt;br /&gt; &lt;span class="mxmlComponent"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;     &lt;span class="mxmlComponent"&gt;&amp;lt;mx:Label&lt;/span&gt; text="&lt;span class="mxmlString"&gt;Hello World!&lt;/span&gt;" fontWeight="&lt;span class="mxmlString"&gt;bold&lt;/span&gt;"&lt;br /&gt;            fontmxmlString"&gt;24"&lt;span class="mxmlComponent"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="mxmlComponent"&gt;&amp;lt;/mx:Panel&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="mxmlComponent"&gt;&amp;lt;/mx:Application&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;En al archivo build.properties colocaremos la ruta donde tengamos instalado el SDK de flex, o podemos ponerlo directamente el el archivo build.xml&lt;/p&gt;&lt;p&gt;Ejemplo en build.properties :&lt;/p&gt;&lt;p style="font-family: courier new;"&gt;ruta.FLEX_HOME = C:/flex_sdk_3&lt;/p&gt;&lt;p&gt;Ejemplo en build.xml&lt;/p&gt;&lt;p style="font-family: courier new;"&gt;&amp;lt;property name="FLEX_HOME" location="/Users/mykola/java/flex"&amp;gt; &lt;/p&gt;&lt;p&gt;Si colocamos la ruta de flex en el build properties entonces en nuestro build.xml tendremos la siguientes linas:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;property file="build.properties"&amp;gt;&lt;/span&gt; &lt;/p&gt;&lt;p&gt;&amp;lt;property name="FLEX_HOME" location="${ruta.FLEX_HOME}"&amp;gt; &lt;/p&gt;&lt;p&gt;El build.xml contendra lo siguiente:&lt;/p&gt;&lt;p&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;project name="HelloFlexAnt" default="all"&amp;gt;&lt;br /&gt;&amp;lt;!-- Init the build process --&amp;gt;&lt;br /&gt;&amp;lt;target name="init" unless="initialized"&amp;gt;&lt;br /&gt;  &amp;lt;!-- Name of project and version --&amp;gt;&lt;br /&gt;&amp;lt;property name="FLEX_HOME" location="/Users/mykola/java/flex"/&amp;gt;&lt;br /&gt;  &amp;lt;property name="proj.name" value="${ant.project.name}" /&amp;gt;&lt;br /&gt;  &amp;lt;property name="proj.shortname" value="${ant.project.name}" /&amp;gt;&lt;br /&gt;  &amp;lt;property name="version.major" value="0" /&amp;gt;&lt;br /&gt;  &amp;lt;property name="version.minor" value="9" /&amp;gt;&lt;br /&gt;  &amp;lt;property name="version.revision" value="0" /&amp;gt;&lt;br /&gt;  &amp;lt;property name="APP_TITLE" value="Sample Application" /&amp;gt;&lt;br /&gt;  &amp;lt;property name="APP_WIDTH" value="800" /&amp;gt;&lt;br /&gt;  &amp;lt;property name="APP_HEIGHT" value="600" /&amp;gt;&lt;br /&gt;  &amp;lt;!-- Global properties for this build --&amp;gt;&lt;br /&gt;  &amp;lt;property name="build.dir" location="${basedir}/build" /&amp;gt;&lt;br /&gt;  &amp;lt;property name="flex_src" location="${basedir}/src" /&amp;gt;&lt;br /&gt;  &amp;lt;path id="project.classpath"&amp;gt;&lt;br /&gt;      &amp;lt;pathelement path="${java.class.path}" /&amp;gt;&lt;br /&gt;  &amp;lt;/path&amp;gt;&lt;br /&gt;  &amp;lt;taskdef resource="flexTasks.tasks"&lt;br /&gt;           classpath="${FLEX_HOME}/ant/lib/flexTasks.jar" /&amp;gt;&lt;br /&gt;  &amp;lt;echoproperties/&amp;gt;&lt;br /&gt;  &amp;lt;property name="initialized" value="true" /&amp;gt;&lt;br /&gt;  &amp;lt;mkdir dir="${build.dir}" /&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&amp;lt;!-- Default target: clean and build the application --&amp;gt;&lt;br /&gt;&amp;lt;target name="all" depends="init"&amp;gt;&lt;br /&gt;  &amp;lt;antcall target="clean" /&amp;gt;&lt;br /&gt;  &amp;lt;antcall target="build" /&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&amp;lt;!-- Compile Flex files --&amp;gt;&lt;br /&gt;&amp;lt;target name="compile.flex" depends="init"&amp;gt;&lt;br /&gt;  &amp;lt;property name="module"&lt;br /&gt;            value="${ant.project.name}"&lt;br /&gt;            description="The name of the application module." /&amp;gt;&lt;br /&gt;  &amp;lt;mxmlc file="${flex_src}/${module}.mxml"&lt;br /&gt;         keep-generated-actionscript="true"&lt;br /&gt;         output="${build.dir}/${ant.project.name}/${module}.swf"&lt;br /&gt;         actionscript-file-encoding="UTF-8"&lt;br /&gt;         incremental="true"&lt;br /&gt;         context-root="${ant.project.name}"&lt;br /&gt;         debug="true"&amp;gt;&lt;br /&gt;      &amp;lt;load-config filename="${FLEX_HOME}/frameworks/flex-config.xml" /&amp;gt;&lt;br /&gt;      &amp;lt;source-path path-element="${FLEX_HOME}/frameworks" /&amp;gt;&lt;br /&gt;      &amp;lt;compiler.source-path path-element="${flex_src}" /&amp;gt;&lt;br /&gt;  &amp;lt;/mxmlc&amp;gt;&lt;br /&gt;  &amp;lt;html-wrapper title="${APP_TITLE}"&lt;br /&gt;                file="index.html"&lt;br /&gt;                application="app"&lt;br /&gt;                swf="${module}"&lt;br /&gt;                width="${APP_WIDTH}"&lt;br /&gt;                height="${APP_HEIGHT}"&lt;br /&gt;                version-major="${version.major}"&lt;br /&gt;                version-minor="${version.minor}"&lt;br /&gt;                version-revision="${version.revision}"&lt;br /&gt;                history="true"&lt;br /&gt;                template="express-installation"&lt;br /&gt;                output="${build.dir}/${ant.project.name}/" /&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&amp;lt;!-- Build the application --&amp;gt;&lt;br /&gt;&amp;lt;target name="build" depends="init"&amp;gt;&lt;br /&gt;  &amp;lt;antcall target="compile.flex" /&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&amp;lt;!-- Clean build files --&amp;gt;&lt;br /&gt;&amp;lt;target name="clean" depends="init"&amp;gt;&lt;br /&gt;  &amp;lt;delete dir="${basedir}/generated" /&amp;gt;&lt;br /&gt;  &amp;lt;delete dir="${build.dir}" /&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&amp;lt;target name="usage" description="Usage documentation"&amp;gt;&lt;br /&gt;  &amp;lt;echo&amp;gt;&lt;br /&gt;          all - clean and build the project&lt;br /&gt;  &amp;lt;/echo&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;/p&gt;&lt;p&gt;Este build lo encontre en este blog : &lt;a href="http://mdzyuba.blogspot.com/2008/05/building-flex-project-with-ant.html"&gt;blog on programming &lt;/a&gt; &lt;/p&gt;&lt;p&gt;Para compilar nuestro hola mundo abrimos una consola de comandos, y nos vamos hasta la carpeta de nuestro proyecto donde se encuentra nuestro build xml, y ahi ejecutamos ant all, para observar lo que se ha compilado entramos  a la carpeta build y ahi podemos darle en el index.html o darle en el archivo swf que se genera si tenemos el reproductor de flash&lt;/p&gt;El codigo del hola mundo desde la pagina de flex &lt;a href="http://www.adobe.com/devnet/flex/quickstart/your_first_application/"&gt; hola mundo flex&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Y al final debemos tener lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_IeGxsoKClhs/SaRCDoYhAzI/AAAAAAAAABE/RialQhoI8FM/s1600-h/helloFlex.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 312px; height: 216px;" src="http://2.bp.blogspot.com/_IeGxsoKClhs/SaRCDoYhAzI/AAAAAAAAABE/RialQhoI8FM/s320/helloFlex.JPG" alt="" id="BLOGGER_PHOTO_ID_5306438891096572722" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725395850223013052-6107090872874727838?l=publicajava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicajava.blogspot.com/feeds/6107090872874727838/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4725395850223013052&amp;postID=6107090872874727838' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/6107090872874727838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/6107090872874727838'/><link rel='alternate' type='text/html' href='http://publicajava.blogspot.com/2009/02/hola-mundo-flex-compilado-con-ant.html' title='Hola mundo Flex compilado con Ant'/><author><name>neo_lestat</name><uri>http://www.blogger.com/profile/11876929031619045256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_IeGxsoKClhs/SaQx5ObcEVI/AAAAAAAAAA0/IUx9gduWtDk/s72-c/flex1.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725395850223013052.post-8742030838199638785</id><published>2009-01-22T16:28:00.008-06:00</published><updated>2009-02-20T16:36:27.921-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jfreecahart'/><category scheme='http://www.blogger.com/atom/ns#' term='graficas'/><title type='text'>Invertir los Ejes en una Grafica de jfreechart</title><content type='html'>Bien esta semana he tenido que actualizar un par de gráficas dentro de un reporte, para esto las gráficas se generan con jfreechart que es una librería para hacer dicha tarea de manera mas fácil y obteniendo resultados muy buenos.&lt;br /&gt;&lt;br /&gt;Las gráficas que se estaban generando tenían un pequeño detalle y es que la gráfica debería de contener los valores negativos de las y en la parte superior y no en la parte inferior que es como esta por default y es por eso que revisando ejemplos, asi como el api de jfreechart pues encontré la forma de hacerlo y se puede hacer tanto para el eje x como para el eje y.&lt;br /&gt;&lt;br /&gt;por ejemplo tenemos la siguiente grafica con dos series de valores, uno corresponde a la funcion&lt;br /&gt;y = x, y el segundo corresponde a la serie de valores y = x + 2&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_IeGxsoKClhs/SXj6rvvhuYI/AAAAAAAAAAc/We9Ba-Bi2UQ/s1600-h/Barchart.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5294256991431145858" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: pointer; HEIGHT: 192px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_IeGxsoKClhs/SXj6rvvhuYI/AAAAAAAAAAc/We9Ba-Bi2UQ/s320/Barchart.jpg" border="0" /&gt;&lt;/a&gt;Bien para esto tengo el siguiente código:&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;import java.awt.Color;&lt;br /&gt;import java.awt.image.BufferedImage;&lt;br /&gt;import java.math.BigDecimal;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.Iterator;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.io.*;&lt;br /&gt;import org.jfree.chart.ChartFactory;&lt;br /&gt;import org.jfree.chart.ChartUtilities;&lt;br /&gt;import org.jfree.chart.JFreeChart;&lt;br /&gt;import org.jfree.chart.axis.AxisLocation;&lt;br /&gt;import org.jfree.chart.axis.NumberAxis;&lt;br /&gt;import org.jfree.chart.plot.PlotOrientation;&lt;br /&gt;import org.jfree.chart.plot.XYPlot;&lt;br /&gt;import org.jfree.chart.renderer.xy.StandardXYItemRenderer;&lt;br /&gt;import org.jfree.data.xy.XYSeries;&lt;br /&gt;import org.jfree.data.xy.XYSeriesCollection;&lt;br /&gt;&lt;br /&gt;public class EjemploGrafica {&lt;br /&gt;&lt;br /&gt;public BufferedImage generaGrafica(ArrayList areo, ArrayList oseo, String title) {&lt;br /&gt;System.out.println(" Generando la grafica con titulo " + title);&lt;br /&gt;BufferedImage buf = null;&lt;br /&gt;try {&lt;br /&gt;&lt;br /&gt;XYSeries series = this.llenaSerie(areo,"Serie Uno");&lt;br /&gt;XYSeries series2 = this.llenaSerie(oseo,"Serie Dos");&lt;br /&gt;&lt;br /&gt;XYSeriesCollection data = new XYSeriesCollection(series);&lt;br /&gt;XYSeriesCollection data2 = new XYSeriesCollection(series2);&lt;br /&gt;//Se crea el objeto para generar la grafica&lt;br /&gt;JFreeChart chart = ChartFactory.createXYLineChart(&lt;br /&gt;title,&lt;br /&gt;"",&lt;br /&gt;"",&lt;br /&gt;null,&lt;br /&gt;PlotOrientation.VERTICAL,&lt;br /&gt;false,&lt;br /&gt;true,&lt;br /&gt;false&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;chart.setBorderVisible(true);&lt;br /&gt;chart.setBorderPaint(Color.black);&lt;br /&gt;XYPlot plot = chart.getXYPlot();&lt;br /&gt;pintaSerieCirculo(plot,data );&lt;br /&gt;pintaSerieCirculo(plot,data2 );&lt;br /&gt;&lt;br /&gt;/*Comentar esta linea si únicamente queremos que retorne la BufferreImage y el catch con la IOException */&lt;br /&gt;ChartUtilities.saveChartAsJPEG(new File("c:\\Barchart.jpg"), chart, 500,&lt;br /&gt;300);&lt;br /&gt;&lt;br /&gt;buf = chart.createBufferedImage(500,300);&lt;br /&gt;} catch (IOException e) {&lt;br /&gt;e.printStackTrace();&lt;br /&gt;System.err.println("Error creando grafico.");&lt;br /&gt;} catch (Exception e) {&lt;br /&gt;System.out.println(e.toString());&lt;br /&gt;System.err.println("Error creando grafico.");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return buf;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;private void pintaSerie(XYPlot plot, XYSeriesCollection data){&lt;br /&gt;int index = plot.getDatasetCount();&lt;br /&gt;&lt;br /&gt;System.out.println(" numero de data sets " + index);&lt;br /&gt;plot.setDataset(index,data);&lt;br /&gt;System.out.println(" numero de data sets " + index);&lt;br /&gt;StandardXYItemRenderer sxyiRender = new StandardXYItemRenderer();&lt;br /&gt;//sxyiRender.setPlotImages(true);&lt;br /&gt;plot.setRenderer(index,sxyiRender);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private void pintaSerieCirculo(XYPlot plot, XYSeriesCollection data){&lt;br /&gt;int index = plot.getDatasetCount();&lt;br /&gt;&lt;br /&gt;System.out.println(" numero de data sets " + index);&lt;br /&gt;plot.setDataset(index,data);&lt;br /&gt;System.out.println(" numero de data sets " + index);&lt;br /&gt;StandardXYItemRenderer sxyiRender = new StandardXYItemRenderer();&lt;br /&gt;//sxyiRender.setPlotImages(true);&lt;br /&gt;sxyiRender.setShapesFilled(true);&lt;br /&gt;sxyiRender.setBaseSeriesVisible(true);&lt;br /&gt;sxyiRender.setBaseShapesVisible(true);&lt;br /&gt;plot.setRenderer(index,sxyiRender);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private XYSeries llenaSerie(ArrayList data, String title) {&lt;br /&gt;BeanValoresGrafica valores = null;&lt;br /&gt;XYSeries series = new XYSeries(title);&lt;br /&gt;for(Object valorXy : data){&lt;br /&gt;valores = (BeanValoresGrafica) valorXy;&lt;br /&gt;series.add(valores.getX(), valores.getY());&lt;br /&gt;}&lt;br /&gt;return series;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;BeanValoresGrafica b = null;&lt;br /&gt;ArrayList a = new ArrayList();&lt;br /&gt;for(int i = -5 ; i &lt; b =" new" ab =" new" i =" -2" b =" new"&gt;&lt;br /&gt;&lt;br /&gt;Ahora yo necesito que mi gráfica quede asi :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_IeGxsoKClhs/SXj8KPEmCRI/AAAAAAAAAAk/BHliq2GqGgg/s1600-h/Barchart.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5294258614748711186" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: pointer; HEIGHT: 192px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_IeGxsoKClhs/SXj8KPEmCRI/AAAAAAAAAAk/BHliq2GqGgg/s320/Barchart.jpg" border="0" /&gt;&lt;/a&gt;Como observan los valores negativos de y se encuentran en la parte superior y no en la inferior para invertirlos realizaremos lo siguiente (incluir esta parte de codigo despues de obtener el objeto XYPlot y las llamadas del metodo pintaSerieCirculo)&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;font-size:85%;"  &gt;.&lt;br /&gt;.&lt;br /&gt;pintaSerieCirculo(plot,data2 );&lt;br /&gt;plot.setDomainAxisLocation(AxisLocation.TOP_OR_LEFT);&lt;br /&gt;NumberAxis domainAxis = (NumberAxis) plot.getDomainAxis();&lt;br /&gt;//*Invierte los valores del eje x */&lt;br /&gt;// domainAxis.setInverted(true);&lt;br /&gt;NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();&lt;br /&gt;//*Aqui es donde se invirte el eje y*/&lt;br /&gt;rangeAxis.setInverted(true);&lt;br /&gt;ChartUtilities.saveChartAsJPEG(new File("c:\\Barchart.jpg"), chart, 500,&lt;br /&gt;300);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El metodo que genera la grafica nos retorna un objeto de tipo java.awt.image.BufferedImage este objeto podemos utilizarlo par mostrarlo en una aplicación swing o en un reporte de jasperreport o guardar la imagen en jpg y adjuntarla en algún informe, etc.&lt;br /&gt;&lt;br /&gt;Bien pues es lo que yo necesitaba y espero que les sirva&lt;br /&gt;&lt;br /&gt;La grafica final :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_IeGxsoKClhs/SXkAuc9brUI/AAAAAAAAAAs/gDcqzTP9ABc/s1600-h/Barchart.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5294263634998570306" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: pointer; HEIGHT: 192px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_IeGxsoKClhs/SXkAuc9brUI/AAAAAAAAAAs/gDcqzTP9ABc/s320/Barchart.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Como observan es lo mismo que lo anterior solo que se colocaron las etiquetas del eje x en la parte superior para eso tenemos el siguiente código:&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;AxisLocation axloc = plot.getDomainAxisLocation();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;plot.setDomainAxisLocation(AxisLocation.TOP_OR_LEFT);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bueno eso es todo, ha se me olvidaba que yo utilizo un bean para pasar valores le coloco el bean que no es la gran cosa pero es parte del codigo&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;import java.io.Serializable;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;public class BeanValoresGrafica implements Serializable {&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;public BeanValoresGrafica() {&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;private double x;&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;private double y;&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;public double getX(){&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;return x;&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;public double getY(){&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;return y;&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;public double setX(double x){&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;return this.x = x;&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;public double setY(double y){&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;return this.y = y;&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;font-family:courier new;" &gt;}&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725395850223013052-8742030838199638785?l=publicajava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicajava.blogspot.com/feeds/8742030838199638785/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4725395850223013052&amp;postID=8742030838199638785' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/8742030838199638785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/8742030838199638785'/><link rel='alternate' type='text/html' href='http://publicajava.blogspot.com/2009/01/invertir-los-ejes-en-una-grafica-de.html' title='Invertir los Ejes en una Grafica de jfreechart'/><author><name>neo_lestat</name><uri>http://www.blogger.com/profile/11876929031619045256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_IeGxsoKClhs/SXj6rvvhuYI/AAAAAAAAAAc/We9Ba-Bi2UQ/s72-c/Barchart.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725395850223013052.post-5534344356239941218</id><published>2009-01-13T09:25:00.005-06:00</published><updated>2010-02-26T11:12:44.411-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='ftp'/><category scheme='http://www.blogger.com/atom/ns#' term='red'/><title type='text'>Acceder a un Ftp con jakarta commons-net</title><content type='html'>El proyecto jakarta commons-net nos proporciona implementaciones  protocolos de Internet  en java para poder utilizarlos en el lado del cliente. Los protocolos que soporta son los siguientes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;FTP/FTPS  &lt;/li&gt;&lt;li&gt;NNTP  &lt;/li&gt;&lt;li&gt;SMTP  &lt;/li&gt;&lt;li&gt;POP3  &lt;/li&gt;&lt;li&gt;Telnet  &lt;/li&gt;&lt;li&gt;TFTP  &lt;/li&gt;&lt;li&gt;Finger  &lt;/li&gt;&lt;li&gt;Whois  &lt;/li&gt;&lt;li&gt;rexec/rcmd/rlogin  &lt;/li&gt;&lt;li&gt;Time (rdate) and Daytime  &lt;/li&gt;&lt;li&gt;Echo  &lt;/li&gt;&lt;li&gt;Discard  &lt;/li&gt;&lt;li&gt;NTP/SNTP &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;En este ejemplo veremos como acceder a un ftp con esta libreria&lt;br /&gt;&lt;br /&gt;Para usarlo tenemos que descargar los siguientes jar de la pagina oficial:&lt;br /&gt;&lt;br /&gt;- commons-net-1.4.1.jar&lt;br /&gt;- jakarta-oro-2.0.8.jar&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El primer jar nos proporciona las clases que implementan los protocolos antes mencionados y en el segundo jar contiene algunas clases para evaluar expresiones. El primero usa clases del segundo por lo cual necesitamos agregar ambos a nuestro classpath.&lt;br /&gt;&lt;br /&gt;Aquí tenemos el ejemplo :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: Verdana;"&gt;import java.io.IOException;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;import java.net.SocketException;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;import org.apache.commons.net.ftp.FTPClient;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;import org.apache.commons.net.ftp.FTPClientConfig;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;import org.apache.commons.net.ftp.FTPFile;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;public class Main {  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;  public static void main(String[] args) {   &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;    FTPClient f = new FTPClient();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;    try {   &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;      FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX); &lt;span style="font-style: italic;"&gt;//Este objeto nos &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;      f.configure(conf); &lt;span style="font-style: italic;"&gt;//permite configurar opciones de conexion como idioma y sistema de archivos&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;      f.connect("127.0.0.1"); &lt;span style="font-style: italic;"&gt; // ip del servidor ftp&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;      f.login("usuario", "usuario"); &lt;span style="font-style: italic;"&gt;// usuario y password para  conectarnos al ftp &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;      f.changeWorkingDirectory("diruno");&lt;span style="font-style: italic;"&gt; // Cambiamos de la raiz al subdirectorio uno&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;      System.out.println(" Crea directorio ? "+f.mkd("dirprueba")); &lt;span style="font-style: italic;"&gt;//crea un directorio en diruno&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;      FTPFile[] files = f.listFiles(); &lt;span style="font-style: italic;"&gt;// Obtiene los archivos del servidor y los mostramos&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;      System.out.println(f.isConnected());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;      for (FTPFile arch : files){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;        System.out.println(arch.toString());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;      f.disconnect();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;      System.out.println(f.isConnected());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;    } catch (IOException ex) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;      ex.printStackTrace();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;}&lt;br /&gt;&lt;br /&gt;Les dejo el link de la pagina oficial &lt;a href="http://commons.apache.org/net/"&gt; http://commons.apache.org/net/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: Verdana;"&gt;Upate: Les dejo un ejemplo mas, es como el anterior pero almacena un arcivo de la maquina local en el ftp&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: Verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: Verdana;"&gt;&lt;br /&gt;public class Main {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;public static void main(String[] args) {&lt;br /&gt;&amp;nbsp; FTPClient f = new FTPClient();&lt;br /&gt;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;  FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX); //Este objeto nos&lt;br /&gt;&amp;nbsp;  f.configure(conf); //permite configurar opciones de conexion como idioma y sistema de archivos&lt;br /&gt;&amp;nbsp;  f.connect("127.0.0.1"); // ip del servidor ftp&lt;br /&gt;&amp;nbsp;  f.login("usuario", "usuario"); // usuario y password para conectarnos al ftp&lt;br /&gt;&amp;nbsp;  System.out.println(f.isConnected());&lt;br /&gt;&amp;nbsp;  f.changeWorkingDirectory("diruno"); // Cambiamos de la raiz al subdirectorio uno&lt;br /&gt;&amp;nbsp;  System.out.println(" Crea directorio ? "+f.mkd("dirprueba")); //crea un directorio en diruno  &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;  FileInputStream fis = new FileInputStream("archivo.doc"); //Se abre un archivo de nuestra maquina local&lt;br /&gt;&amp;nbsp;  f.setFileType(f.BINARY_FILE_TYPE); //Se pone tipo binario para poder enviar archivos de cualquier tipo&lt;br /&gt;&amp;nbsp;  boolean res = ftpClient.storeFile("/diruno/dirprueba", fis ); //Con esta instruccion se sube el archivo al ftp&lt;br /&gt;&amp;nbsp;  System.out.println("Resultado de subir el archivo es " + res);&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;  FTPFile[] files = f.listFiles(); // Obtiene los archivos del servidor y los mostramos  &lt;br /&gt;&amp;nbsp;  for (FTPFile arch : files){&lt;br /&gt;&amp;nbsp;   System.out.println(arch.toString());&lt;br /&gt;&amp;nbsp;  }&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;  f.disconnect();&lt;br /&gt;&amp;nbsp;  System.out.println(f.isConnected());&lt;br /&gt;&amp;nbsp; } catch (IOException ex) {&lt;br /&gt;&amp;nbsp;  ex.printStackTrace();&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725395850223013052-5534344356239941218?l=publicajava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicajava.blogspot.com/feeds/5534344356239941218/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4725395850223013052&amp;postID=5534344356239941218' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/5534344356239941218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/5534344356239941218'/><link rel='alternate' type='text/html' href='http://publicajava.blogspot.com/2009/01/acceder-un-ftp-con-jakarta-commons-net.html' title='Acceder a un Ftp con jakarta commons-net'/><author><name>neo_lestat</name><uri>http://www.blogger.com/profile/11876929031619045256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725395850223013052.post-1198420296384652250</id><published>2009-01-08T13:54:00.004-06:00</published><updated>2009-04-01T11:35:44.577-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='samba'/><category scheme='http://www.blogger.com/atom/ns#' term='red'/><title type='text'>Usar el protocolo samba con jCIFS</title><content type='html'>En el proyecto donde estoy colaborando hay una aplicación que necesita escribir archivos en un directorio compartido en un servidor windows por lo que necesitamos usar el protocolo CIFS/SMB, bien para esto tenemos la librería jCIFS que es una implementación de dicho protocolo y esta hecha en java completamente además de que es opensource.&lt;br /&gt;&lt;br /&gt;También es posible usar esta librería para compartir recursos entre maquinas windows y máquinas unix que cuenten con el servicio samba.&lt;br /&gt;&lt;br /&gt;Por ejemplo en este metodo escribimos un archivo en la carpeta compartida por otra maquina:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;private boolean escribeArchivo(String encodedMessage, String nombreArchivo)&lt;br /&gt;throws SmbException, MalformedURLException, UnknownHostException, IOException{&lt;br /&gt;&lt;br /&gt;boolean exitoArchivo = false;&lt;br /&gt;&lt;br /&gt;//String url = "smb://127.0.0.1/compartida/"+ nombreArchivo ;&lt;br /&gt;//String url = "smb://usuario:usuario@127.0.0.1/compartida/"+ nombreArchivo ;&lt;br /&gt;String url = "smb://"+ USR_SERVIDOR +":"+ PASS_SERVIDOR +"@"&lt;br /&gt;+ URL_SERVIDOR + nombreArchivo + EXT_ARCHIVO;&lt;br /&gt;&lt;br /&gt;try{&lt;br /&gt;SmbFileOutputStream out = new SmbFileOutputStream(url, false);&lt;br /&gt;&lt;br /&gt;out.write(encodedMessage.getBytes());&lt;br /&gt;// encodeMessage es el texto que contiene el archivo&lt;br /&gt;// aqui podemos enviar los bytes de algun archivo de la maquina local&lt;br /&gt;&lt;br /&gt;out.close();&lt;br /&gt;&lt;br /&gt;exitoArchivo = true;&lt;br /&gt;&lt;br /&gt;System.out.println("generado " + url );&lt;br /&gt;} catch(IOException ex){&lt;br /&gt;exitoArchivo = false;&lt;br /&gt;} finally{&lt;br /&gt;return exitoArchivo;&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para borrar un archivo en la carpeta compartida:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;private void borraArchivo(String archivo) throws SmbException,&lt;br /&gt;MalformedURLException, UnknownHostException{&lt;br /&gt;&lt;br /&gt;//String url = "smb://127.0.0.1/compartida/"+ nombreArchivo ;&lt;br /&gt;//String url = "smb://usuario:usuario@127.0.0.1/compartida/"+ nombreArchivo ;&lt;br /&gt;String url = "smb://"+ USR_SERVIDOR +":"+ PASS_SERVIDOR +"@"+ URL_SERVIDOR ;&lt;br /&gt;String rutArchivo = url + archivo;&lt;br /&gt;SmbFile sFile = new SmbFile(rutArchivo);&lt;br /&gt;if(sFile.exists())&lt;br /&gt;sFile.delete();&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para descargar la libreria y un poco de mas informacion pues sigan este link&lt;br /&gt;&lt;a href="http://jcifs.samba.org/"&gt;http://jcifs.samba.org/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725395850223013052-1198420296384652250?l=publicajava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicajava.blogspot.com/feeds/1198420296384652250/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4725395850223013052&amp;postID=1198420296384652250' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/1198420296384652250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/1198420296384652250'/><link rel='alternate' type='text/html' href='http://publicajava.blogspot.com/2009/01/usar-el-protocolo-samba-con-jcifs.html' title='Usar el protocolo samba con jCIFS'/><author><name>neo_lestat</name><uri>http://www.blogger.com/profile/11876929031619045256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725395850223013052.post-7490808338412860378</id><published>2008-11-24T15:50:00.002-06:00</published><updated>2008-11-24T16:26:15.998-06:00</updated><title type='text'>Campos BLOB</title><content type='html'>En los post anteriores sobre insertar imágenes en una base de datos mediante una aplicación web o una stand alone mencionamos el tipo de dato BLOB, donde se almacena información en formato binario, este tipo de dato puede variar, varia de acuerdo a las bases de datos , y como lo apunta Danguer en su comentario podría darnos problemas si el archivo es mas grande de lo que nos permite guardar el tipo BLOB. Entonces hay que revisar si el motor de base de datos que estamos usando y su implementación de los BLOB estan de acuerdo a nuestras necesidades en otro caso seria mejor buscar otro tipo de dato como lo hizo Danguer que uso un tipo LONGBLOB&lt;br /&gt;&lt;br /&gt;Bien les dejo una tablita tipos de datos BLOB de MySQL que muestra la capacidad de almacenamiento:&lt;br /&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="literal"&gt;TINYBLOB&lt;/code&gt;, &lt;code class="literal"&gt;TINYTEXT&lt;/code&gt; &lt;/td&gt; &lt;td&gt; &lt;em class="replaceable"&gt;&lt;code&gt;L&lt;/code&gt;&lt;/em&gt;+1 byte, donde &lt;em class="replaceable"&gt;&lt;code&gt;L&lt;/code&gt;&lt;/em&gt;               &lt;&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;code class="literal"&gt;BLOB&lt;/code&gt;, &lt;code class="literal"&gt;TEXT&lt;/code&gt; &lt;/td&gt; &lt;td&gt; &lt;em class="replaceable"&gt;&lt;code&gt;L&lt;/code&gt;&lt;/em&gt;+2 bytes, donde &lt;em class="replaceable"&gt;&lt;code&gt;L&lt;/code&gt;&lt;/em&gt;               &lt;&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;code class="literal"&gt;MEDIUMBLOB&lt;/code&gt;, &lt;code class="literal"&gt;MEDIUMTEXT&lt;/code&gt; &lt;/td&gt; &lt;td&gt; &lt;em class="replaceable"&gt;&lt;code&gt;L&lt;/code&gt;&lt;/em&gt;+3 bytes, donde &lt;em class="replaceable"&gt;&lt;code&gt;L&lt;/code&gt;&lt;/em&gt;               &lt;&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;code class="literal"&gt;LONGBLOB&lt;/code&gt;, &lt;code class="literal"&gt;LONGTEXT&lt;/code&gt; &lt;/td&gt; &lt;td&gt; &lt;em class="replaceable"&gt;&lt;code&gt;L&lt;/code&gt;&lt;/em&gt;+4 bytes, donde &lt;em class="replaceable"&gt;&lt;code&gt;L&lt;/code&gt;&lt;/em&gt;               &lt;&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;En derby los datos BLOB se les puede asignar un tamaño, por default el tamaño es de 2 gb.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Mas informacion en:&lt;br /&gt;&lt;br /&gt;http://dev.mysql.com/doc/refman/5.0/es/storage-requirements.html&lt;br /&gt;http://db.apache.org/derby/docs/10.4/ref/ref-single.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725395850223013052-7490808338412860378?l=publicajava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicajava.blogspot.com/feeds/7490808338412860378/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4725395850223013052&amp;postID=7490808338412860378' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/7490808338412860378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/7490808338412860378'/><link rel='alternate' type='text/html' href='http://publicajava.blogspot.com/2008/11/campos-blob.html' title='Campos BLOB'/><author><name>neo_lestat</name><uri>http://www.blogger.com/profile/11876929031619045256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725395850223013052.post-6133185499471668621</id><published>2008-11-20T13:46:00.010-06:00</published><updated>2008-11-20T14:19:21.338-06:00</updated><title type='text'>OAS + JAAS</title><content type='html'>Hace unos días, tuve que usar el estándar de &lt;br /&gt;seguridad Java (JAAS) para mayor referencia &lt;a href="http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/JAASRefGuide.html"&gt;Click Aquí&lt;/a&gt;.&lt;br /&gt;En esta ocasión para el servidor de aplicaciones&lt;br /&gt;OAS.&lt;br /&gt;En esta página puedes revisar a fondo &lt;br /&gt;JAAS sobre OAS.&lt;a href="http://docs.tpu.ru/docs/oracle/en/oas/10.1.2.0.2/web.1012/b14019/toc.htm"&gt;Jaas sobre OAS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En esta ocasión solo  definiré perfiles y usuarios &lt;br /&gt;el archivo web.xml y su correspondiente en el archivo&lt;br /&gt;jazn-data.xml por parte de OAS.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Los archivos que deben ser modificados para poder &lt;br /&gt;implementar esta seguridad son los siguientes:&lt;br /&gt;&lt;br /&gt;web.xml &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_tJj3rkOMtFY/SSXGOH8CCOI/AAAAAAAAAEs/LR_FXRAcerw/s1600-h/jaaswebxml.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 145px;" src="http://2.bp.blogspot.com/_tJj3rkOMtFY/SSXGOH8CCOI/AAAAAAAAAEs/LR_FXRAcerw/s400/jaaswebxml.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5270836884858341602" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Continua...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725395850223013052-6133185499471668621?l=publicajava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicajava.blogspot.com/feeds/6133185499471668621/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4725395850223013052&amp;postID=6133185499471668621' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/6133185499471668621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/6133185499471668621'/><link rel='alternate' type='text/html' href='http://publicajava.blogspot.com/2008/11/oas-jaas.html' title='OAS + JAAS'/><author><name>--</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_tJj3rkOMtFY/SSXGOH8CCOI/AAAAAAAAAEs/LR_FXRAcerw/s72-c/jaaswebxml.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725395850223013052.post-7830507750729798375</id><published>2008-11-19T11:44:00.002-06:00</published><updated>2008-11-20T12:47:30.713-06:00</updated><title type='text'>Insertar una imagen en una base de datos mediante una aplicacion stand alone</title><content type='html'>En la entrada anterior vimos como insertar una imagen en la base de datos  en una app web, bueno el procedimiento anterior es aplicable a cualquier otro archivo ya que en donde se inserta es un dato de tipo BLOB es decir un archivo muy grande (bueno creo que es hasta 4gb) en modo binario, ahora veremos como hacerlo desde la aplicación stand alone o de escritorio (Esto lo pidieron en un comentario jejeje).&lt;br /&gt;&lt;br /&gt;El proyecto lo hice en netbeans, Lo que necesitamos:&lt;br /&gt;&lt;br /&gt;- Driver para la base de datos, (en mi caso es derbyclient.jar)&lt;br /&gt;- Base de datos con soporte para datos BLOB&lt;br /&gt;- Netbeans (opcional)&lt;br /&gt;&lt;br /&gt;Tenemos la siguiente tabla   (la definición corresponde a derby tal vez necesite adecuarse para MySql y/u otras) :&lt;br /&gt;&lt;br /&gt;create table IMAGEN_T&lt;br /&gt;(&lt;br /&gt;ID_IMAGEN INTEGER not null primary key,&lt;br /&gt;DESCRIPCION VARCHAR(100),&lt;br /&gt;IMAGEN BLOB(1048576)&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;Para insertar las imágenes tenemos un DAO el cual contiene el método insertaImagen (aunque este método debe funcionar para cualquier archivo recordemos que el archivo se guarda en binario)&lt;br /&gt;&lt;br /&gt;insertaImagen(String nameFile, int id)&lt;br /&gt;throws FileNotFoundException, SQLException{&lt;br /&gt;&lt;br /&gt;File fileIn = new File(nameFile);&lt;br /&gt;InputStream fis = new FileInputStream(fileIn);&lt;br /&gt;ps = conn.prepareStatement("INSERT INTO IMAGEN_T VALUES (?, ?, ?)");&lt;br /&gt;ps.setInt(1,id);&lt;br /&gt;ps.setString(2, "Probando insertar una imagen");&lt;br /&gt;int fileLength = (int) fileIn.length();&lt;br /&gt;System.out.println(" los datos "  + fileLength + " fis " + fis.toString());&lt;br /&gt;ps.setBinaryStream(3, fis, fileLength);&lt;br /&gt;ps.executeUpdate();&lt;br /&gt;    ps.close();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;En este método creamos un File con el nombre del archivo que recibe (el nombre contiene la ruta completa) para a su vez crear un FileInputStream que a su vez asignamos a un InputStream, con estos objetos se leerán los bytes del archivo, obtenemos un objeto PreparedStatment y colocamos el id para el registro, una descripción (aqui podria ser mejor guardar el nombre para cuando se necesite recuperar el archivo recuerden que esta app es solo un ejemplo) y posteriormente se realiza el setBinaryStream y le pasamos el objeto InputStream para que pueda leer los bytes y también le pasamos el tamaño del archivo es decir el numero de bytes que se tienen que leer.&lt;br /&gt;&lt;br /&gt;A continuación tenemos el método que recupera el archivo:&lt;br /&gt;&lt;br /&gt;recuperaImagenBD(int idImagen, String path)&lt;br /&gt;throws IOException, SQLException{&lt;br /&gt;&lt;br /&gt;FileOutputStream fos = null;&lt;br /&gt;Connection conn=null; &lt;br /&gt;PreparedStatement ps=null;&lt;br /&gt;ResultSet rs = null;&lt;br /&gt;Statement st = null;&lt;br /&gt;String sql =  "SELECT IMAGEN FROM IMAGEN_T WHERE ID_IMAGEN = ?";&lt;br /&gt;ps = conn.prepareStatement(sql);&lt;br /&gt;     ps.setInt(1, idImagen);&lt;br /&gt;&lt;br /&gt;     rs = ps.executeQuery();&lt;br /&gt;    if (rs.next()){&lt;br /&gt;  &lt;br /&gt;      String pathname=  path;&lt;br /&gt;      File file = new File(pathname);&lt;br /&gt;      fos = new FileOutputStream(file);&lt;br /&gt;      Blob bin = rs.getBlob("IMAGEN");&lt;br /&gt;      InputStream inStream = bin.getBinaryStream();&lt;br /&gt;      int size = (int)bin.length();&lt;br /&gt;      byte[] buffer = new byte[size];&lt;br /&gt;      int length = -1;&lt;br /&gt;      while ((length = inStream.read(buffer)) != -1) {&lt;br /&gt;        fos.write(buffer, 0, length);&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;En este método tenemos que crear un objeto FileOutputStream para poder escribir los bytes que nos retorna la consulta, a este objeto le pasamos un objeto file que ha sido creado con una ruta donde se guardara el archivo, después obtenemos el dato BLOB y de este obtenemos un objeto InputStream para leer los bytes, después obtenemos el numero de bytes del Blob, posteriormente creamos un arreglo de bytes en el que se leerán los bytes  y  de donde el outputStream obtendrá los bytes, le hice una pequeña ventanita para hacer pruebitas&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_IeGxsoKClhs/SSRZSrG-ggI/AAAAAAAAAAM/EBmR8hBoMy0/s1600-h/cap01.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 238px;" src="http://3.bp.blogspot.com/_IeGxsoKClhs/SSRZSrG-ggI/AAAAAAAAAAM/EBmR8hBoMy0/s320/cap01.PNG" alt="" id="BLOGGER_PHOTO_ID_5270435641274827266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En cuanto pueda colocare los proyectos en algun servicio de hostig, si alguien le intereas el codigo escriba un comentario con su mail para enviarselos.&lt;br /&gt;Tal vez haya algunas mejoras en el código, espero sus comentarios ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725395850223013052-7830507750729798375?l=publicajava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicajava.blogspot.com/feeds/7830507750729798375/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4725395850223013052&amp;postID=7830507750729798375' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/7830507750729798375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/7830507750729798375'/><link rel='alternate' type='text/html' href='http://publicajava.blogspot.com/2008/11/inertar-una-imagen-en-una-base-de-datos.html' title='Insertar una imagen en una base de datos mediante una aplicacion stand alone'/><author><name>neo_lestat</name><uri>http://www.blogger.com/profile/11876929031619045256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_IeGxsoKClhs/SSRZSrG-ggI/AAAAAAAAAAM/EBmR8hBoMy0/s72-c/cap01.PNG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725395850223013052.post-5307937752454570054</id><published>2008-11-17T13:11:00.000-06:00</published><updated>2008-11-18T16:39:57.894-06:00</updated><title type='text'>Insertar imagenes en una base de datos en una aplicacion web</title><content type='html'>&lt;span style=";font-family:verdana;font-size:85%;"  &gt;Que tal, en esta primer entrada veremos como insertar una imagen en la base de datos y también como recuperarla y mostrarla dentro de nuestra aplicación web. Para hacer esto, haremos uso de un par de jar's de jakarta-commons, no hay que re-inventar la rueda.&lt;/span&gt;&lt;div  style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div  style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;Lo que necesitamos:&lt;/span&gt;&lt;/div&gt;&lt;div  style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div  style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;- eclipse (con wtp para mayor comodidad)&lt;/span&gt;&lt;/div&gt;&lt;div  style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;- apache tomcat 6 (o algun otro contenedor de servlets)&lt;/span&gt;&lt;/div&gt;&lt;div  style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;- commons-fileupload-1.2.jar&lt;/span&gt;&lt;/div&gt;&lt;div  style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;- commons-io-1.3.1.jar&lt;/span&gt;&lt;/div&gt;&lt;div  style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;- mysql-connector-java-5.1.5-bin.jar (Este driver depende de su motor de base de datos)&lt;/span&gt;&lt;/div&gt;&lt;div  style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;- MySql 5.0.67 (Esta es la bd que uso, podrían ocupar cualquier otra que soporte datos BLOB)&lt;/span&gt;&lt;/div&gt;&lt;div  style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;- Opcionalmente: log4-1.2.11.jar, jstl.jar, standar.jar (las ultimas dos vienen en los ejemplos de apache-tomcat 6, en versiones anteriores se encuentran en el directorio lib de tomcat)&lt;/span&gt;&lt;/div&gt;&lt;div  style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div  style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;No es absolutamente necesario usar eclipse, podrían realizar el proyecto con algún otro ide o sin usar algún ide.&lt;/span&gt;&lt;/div&gt;&lt;div  style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div  style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;Para insertar la imagen realice el siguiente método que pertenece a mi DAO&lt;/span&gt;&lt;span style="font-size:85%;"&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre&gt;public void insertaImagenProducto(int idProducto,&lt;br /&gt; InputStream inps, long size) {&lt;br /&gt;&lt;br /&gt;PreparedStatement ps=null;&lt;br /&gt;try {&lt;br /&gt;&lt;br /&gt;ps = con.prepareStatement(&lt;br /&gt;"UPDATE PRODUCTOS SET IMAGEN = ? WHERE" +&lt;br /&gt;" PRODUCTO_ID = ?");&lt;br /&gt;&lt;br /&gt;  ps.setBinaryStream(1, inps, (int)size);&lt;br /&gt;ps.setInt(2, idProducto);&lt;br /&gt;  ps.executeUpdate();&lt;br /&gt;  ps.close();&lt;br /&gt;&lt;br /&gt;} catch (SQLException e) {&lt;br /&gt;&lt;br /&gt;e.printStackTrace();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:85%;"&gt;En el método de insertaImagen, únicamente recibo un InputStream del cual se leerán los bytes que se insertaran en el campo BLOB, tambien se recibe el tamaño del InputStream o el numero de bytes que contiene y finalmente se llama al método setBinaryStream del objeto preparedStatment con el cual se inserta la imagen en la bd&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:85%;"&gt;Para recuperar un dato BLOB de la bd se realiza lo siguiente:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;public byte[] obtenImagenProducto(int idProducto)  {&lt;br /&gt;&lt;br /&gt;ResultSet rst = null;&lt;br /&gt;PreparedStatement pstm = null;&lt;br /&gt;byte[] buffer = null;&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt;logger.info("Datos producto id "  +idProducto);&lt;br /&gt;String sql = "select imagen from&lt;br /&gt;productos where producto_id = ?";&lt;br /&gt;pstm = con.prepareStatement(sql);&lt;br /&gt;pstm.setInt(1, idProducto);&lt;br /&gt;rst = pstm.executeQuery();&lt;br /&gt;while (rst.next()){&lt;br /&gt;Blob bin = rst.getBlob("imagen");&lt;br /&gt;if (bin != null) {&lt;br /&gt;InputStream inStream = bin.getBinaryStream();&lt;br /&gt;int size = (int) bin.length();&lt;br /&gt;System.out.println(" El tamaño en bytes " + size);&lt;br /&gt;buffer = new byte[size];&lt;br /&gt;int length = -1;&lt;br /&gt;int k = 0;&lt;br /&gt;try {&lt;br /&gt;inStream.read(buffer, 0, size);&lt;br /&gt;} catch (IOException ex) {&lt;br /&gt;ex.printStackTrace();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;} catch (SQLException ex) {&lt;br /&gt;logger.error("ERROR " + ex);&lt;br /&gt;return null;&lt;br /&gt;} finally {&lt;br /&gt;/*&lt;br /&gt;rst.close();&lt;br /&gt;stm.close();&lt;br /&gt;*/&lt;br /&gt;rst = null;&lt;br /&gt;pstm = null;&lt;br /&gt;}&lt;br /&gt;return buffer;&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div  style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;Este método obtiene un dato de tipo BLOB, si el dato es diferente de nulo entonces se crea un objeto de tipo InputStream con el cual se leerán los bytes del dato blob, se crea un arreglo de bytes de acuerdo al tamaño del blob y posteriormente se leen, una vez leídos los bytes estos simplemente se retornan en el arreglo creado, en la siguiente capa se reciben estos bytes y se envian al navegador.&lt;/span&gt;&lt;/div&gt;&lt;div  style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div  style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;Lo anterior es la parte que pertenece al modelo, ahora vamos con la parte correspondiente a la vista, en esta parte tenemos un jsp que contiene el siguiente formulario :&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;form name="myform" action="./ServletProductoImagen"&lt;br /&gt;method="post" enctype="multipart/form-data"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type="hidden" value="${param.idProducto}" name="idProducto"&amp;gt;&lt;br /&gt;Selecciona la Image:&lt;br /&gt;&lt;br /&gt;&amp;lt;input type="file" name="myimage"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type="submit" name="Aceptar" value="Submit your files"&amp;gt;&lt;br /&gt;&amp;lt;form&amp;gt;&lt;/pre&gt;&lt;div&gt;&lt;span style="font-size:85%;"&gt;Bien con este formulario escogeremos el archivo que se agregara a la base de datos,&lt;br /&gt;yo le paso un parámetro, el idProducto con este sabre en que registro insertar la imagen,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:85%;"&gt;Ahora veamos el servlet que inserta la imagen, en el método post :&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;// first check if the upload request&lt;br /&gt;//coming in is a multipart request&lt;br /&gt;//Revisa si la peticion es multipart&lt;br /&gt;boolean isMultipart = ServletFileUpload.isMultipartContent(request);&lt;br /&gt;&lt;br /&gt;// Create a factory for disk-based file items&lt;br /&gt;//Esto es parte de la lib de commons-fileupload&lt;br /&gt;//y es un objeto para generar archivos temporales&lt;br /&gt;FileItemFactory factory = new DiskFileItemFactory();&lt;br /&gt;&lt;br /&gt;// Create a new file upload handler&lt;br /&gt;//Aqui crea un objeto para manejar la peticion&lt;br /&gt;//que llega con un archivo&lt;br /&gt;ServletFileUpload upload = new ServletFileUpload(factory);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// parse this request by the handler&lt;br /&gt;// this gives us a list of items from the request&lt;br /&gt;List items = null;&lt;br /&gt;try {&lt;br /&gt;//Se obtienen los items de la forma&lt;br /&gt;//es decir obtenemos los parametros de la forma&lt;br /&gt;items = upload.parseRequest(request);&lt;br /&gt;} catch (FileUploadException e) {&lt;br /&gt;// TODO Auto-generated catch block&lt;br /&gt;e.printStackTrace();&lt;br /&gt;}&lt;br /&gt;String idProducto = "";&lt;br /&gt;Iterator itr = items.iterator();&lt;br /&gt;while(itr.hasNext()) {&lt;br /&gt;&lt;br /&gt;//recorremos los items en busca del id&lt;br /&gt;//para realizar el insert&lt;br /&gt;FileItem item = (FileItem) itr.next();&lt;br /&gt;&lt;br /&gt;if(item.isFormField()) {&lt;br /&gt; // get the name of the field&lt;br /&gt;    String fieldName = item.getFieldName();&lt;br /&gt;&lt;br /&gt;if(fieldName.equals("idProducto"))&lt;br /&gt;       idProducto = item.getString();&lt;br /&gt;}&lt;br /&gt;logger.info("ID Producto" + idProducto);&lt;br /&gt;}&lt;br /&gt;itr = items.iterator();&lt;br /&gt;//ahora lo recorremos para obtener el archivo que se&lt;br /&gt;//envio en la forma&lt;br /&gt;while(itr.hasNext()) {&lt;br /&gt; FileItem item = (FileItem) itr.next();&lt;br /&gt;&lt;br /&gt; // check if the current item is a form field or&lt;br /&gt; //an uploaded file&lt;br /&gt; if(! item.isFormField() ){&lt;br /&gt;&lt;br /&gt;   // the item must be an uploaded file save it to disk.&lt;br /&gt;// Note that there&lt;br /&gt;   // seems to be a bug in item.getName() as it&lt;br /&gt;//returns the full path on&lt;br /&gt;   // the client's machine for the uploaded file name,&lt;br /&gt;// instead of the file&lt;br /&gt;   // name only. To overcome that, I have used a&lt;br /&gt;// workaround using&lt;br /&gt;   // fullFile.getName().&lt;br /&gt;//Aqui es donde se obtiene el nombre del archivo, esto podriamos&lt;br /&gt;//usarlo si queremos gurdar el nombre o guardar el archivo en&lt;br /&gt;//alguno de nuestros directorios.&lt;br /&gt;  //File fullFile  = new File(item.getName());&lt;br /&gt;     //File savedFile = new File(fullFile.getName());&lt;br /&gt;   try {&lt;br /&gt;//Este metodo comentado escribe el archivo en nuestro&lt;br /&gt;//sistema de archivos con una ruta adecuada&lt;br /&gt;//item.write(savedFile);&lt;br /&gt;&lt;br /&gt;//pero lo que nos interesa es gurdar la imagen en la bd, asi&lt;br /&gt;//que invocamos a nuestro dao y le pasmos los valores&lt;br /&gt;//necesarios y es todo&lt;br /&gt;  daoProductos.insertaImagenProducto(&lt;br /&gt; Integer.parseInt(idProducto),&lt;br /&gt;    item.getInputStream(),&lt;br /&gt;    item.getSize());&lt;br /&gt;} catch (Exception e) {&lt;br /&gt;// TODO Auto-generated catch block&lt;br /&gt;e.printStackTrace();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;   System.out.println("Archivo guardado");&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;RequestDispatcher r =&lt;br /&gt; request.getRequestDispatcher("./index.jsp");&lt;br /&gt;&lt;br /&gt;r.forward(request, response);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div  style="text-align: justify;font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;font-size:85%;" &gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;Aqui es donde hacemos uso de el jar commons-fileupload, con este obtenemos &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div  style="text-align: justify;font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;font-size:85%;" &gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;el archivo que se envio al servlet a travez de la forma, revisamos por los&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div  style="text-align: justify;font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;font-size:85%;" &gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;parametros que se encuentran en la forma, el id para saber el registro en&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div  style="text-align: justify;font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;font-size:85%;" &gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;donde se insertara la imagen, posteriormente obtenemos un inputStream con los&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div  style="text-align: justify;font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;font-size:85%;" &gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;bytes de la imagen y el numero de bytes. Y lo enviamos a nuestro dao para que&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div  style="text-align: justify;font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;font-size:85%;" &gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;realize el insert en la bd.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;font-size:85%;" &gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;font-size:85%;" &gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;Para terminar, para mostrar la imagen en nuestro jsp entonces invocamos al metodo&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;font-size:85%;" &gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;doGet de el servlet en el cual tenemos lo siguiente:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;String idProducto = request.getParameter("idProducto");&lt;br /&gt;System.out.println(" El id del idProducto " + idProducto);&lt;br /&gt;if(idProducto!=null &amp;amp;&amp;amp; !idProducto.equals("")){&lt;br /&gt;&lt;br /&gt;   int idProd = Integer.parseInt(idProducto);&lt;br /&gt;   response.setContentType("image/gif");&lt;br /&gt;   byte [] imag = this.obtieneProducto(idProd);&lt;br /&gt;   if(imag != null) {&lt;br /&gt;   ServletOutputStream out = response.getOutputStream();&lt;br /&gt;   out.write(imag);&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;Aqui le enviamos el id del registro del cual se obtendra la imagen despues colocamos el contentype del response como image, invocamos anuestro dao que nos devolvera los bytes, obtenemos el ServletOutputStream para enviar los bytes de la imagen, en nuestro jsp simplemente hariamos:&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;div&gt;&lt;pre&gt;&amp;lt;img src="./ServletProductoImagen?idProducto=${producto.idProducto}"&lt;br /&gt;alt="${producto.nombre}" height="150" width="150" &amp;gt;&lt;/pre&gt;&lt;span style="font-size:85%;"&gt;Espero colocar el proyecto de eclipse para que puedan descargarlo solo debo ver como o donde&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725395850223013052-5307937752454570054?l=publicajava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicajava.blogspot.com/feeds/5307937752454570054/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4725395850223013052&amp;postID=5307937752454570054' title='12 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/5307937752454570054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725395850223013052/posts/default/5307937752454570054'/><link rel='alternate' type='text/html' href='http://publicajava.blogspot.com/2008/11/insertar-imagenes-en-una-base-de-datos.html' title='Insertar imagenes en una base de datos en una aplicacion web'/><author><name>neo_lestat</name><uri>http://www.blogger.com/profile/11876929031619045256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry></feed>
