Foros del Web » Programación para mayores de 30 ;) » Java »

Problemas al guardar ficheros en un proyecto Web trabajando con Eclipse

Estas en el tema de Problemas al guardar ficheros en un proyecto Web trabajando con Eclipse en el foro de Java en Foros del Web. Me explico, a ver si alguien puede ayudarme. Resulta que grabo un fichero que es un XML de la siguiente forma: PrintStream ficheroxml = new ...
  #1 (permalink)  
Antiguo 27/04/2007, 06:32
 
Fecha de Ingreso: abril-2007
Mensajes: 9
Antigüedad: 17 años
Puntos: 0
Pregunta Problemas al guardar ficheros en un proyecto Web trabajando con Eclipse

Me explico, a ver si alguien puede ayudarme.

Resulta que grabo un fichero que es un XML de la siguiente forma:

PrintStream ficheroxml = new PrintStream(new FileOutputStream("ruta/mi_fichero.xml"));

//informacion_del_fichero es un String que obtengo de un mapeo a XML.
ficheroxml.print(informacion_del_fichero);
ficheroxml.close();
ficheroxml.flush();

Ese fichero xml contiene información que tiene que leer un calendario
hecho con AJAX y resulta que me encuentro con el siguiente problema.

El fichero se crea correctamente y se graba en el disco duro, es decir, las sentencias anteriores van bien. Pero resulta que el navegador siempre lee
la versión anterior creada del fichero, ya que para que lo lea tengo yo
que actualizar (refresh con F5) manualmente el XML en Eclipse porque hasta que no refresco, el Eclipse no detecta el cambio en el fichero. Una vez que refresco entonces el fichero se actualiza y el navegador lee el fichero nuevo con los cambios.

¿Qué me puede estar pasando?. Me urge la respuesta pues tengo que entregar el proyecto el Lunes y me está volviendo loco esto.

Uso servidor Tomcat, por si puede ser el problema el servidor.

Me han comentado algo del caché, que no se actualiza, pero eso ya se me escapa.

Gracias por atender mi pregunta.
  #2 (permalink)  
Antiguo 27/04/2007, 08:58
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: Problemas al guardar ficheros en un proyecto Web trabajando con Eclipse

Es un problema del navegador por guardar en cache tu documento XML, y en parte del servidor web por no decirle que envíe las cabeceras adecuadas para que no cachee los documentos de ese tipo/carpeta.

Una solucion rapida, usar el filtro definido en este articulo:
http://www.onjava.com/pub/a/onjava/2...3/filters.html
y aplicarselo a los ficheros *.xml poniendoles el "max-age" a unos pocos milisegundos o asi

S!
  #3 (permalink)  
Antiguo 27/04/2007, 11:38
 
Fecha de Ingreso: abril-2007
Mensajes: 9
Antigüedad: 17 años
Puntos: 0
Re: Problemas al guardar ficheros en un proyecto Web trabajando con Eclipse

Antes yo tenía algo como esto:

<?xml version="1.0" encoding="ISO-8859-1"?>
<calendario>

<reserva fecha="1-4-2007" hora="10:00" duracion="1"/>
<reserva fecha="2-4-2007" hora="12:00" duracion="2"/>
<reserva fecha="3-4-2007" hora="11:00" duracion="3"/>
</calendario>


y ahora tengo el nuevo XML con lo que me has recomendado GreenEyed, pero el problema persiste,

<?xml version="1.0" encoding="ISO-8859-1"?>
<calendario>
<init-param>
<param-name>Cache-Control</param-name>
<param-value>max-age=1</param-value>
</init-param>
<reserva fecha="1-4-2007" hora="10:00" duracion="1"/>
<reserva fecha="2-4-2007" hora="12:00" duracion="2"/>
<reserva fecha="3-4-2007" hora="11:00" duracion="3"/>
</calendario>


Sigue sin refrescarse bien hasta que no guardo los cambios en Eclipse,
¿qué pasará?.
  #4 (permalink)  
Antiguo 27/04/2007, 13:17
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: Problemas al guardar ficheros en un proyecto Web trabajando con Eclipse

Escribir eso en el fichero XML no sirve de nada puesto que no Tomcat no procesa los ficheros y además eso no es estándar HTML.

Lo que hay que hacer es un ServletFilter, como explica en el enlace, que añada las cabeceras a la petición. No hay que tocar nada de los ficheros XML. Se trata de "interceptar" las llamadas a los ficheros y añadirles lo que queramos a las cabeceras, a través del objeto response.

Puedes ver tutoriales de como escribir filtros aqui:
http://javaboutique.internet.com/tut...rvlet_Filters/
http://java.sun.com/products/servlet/Filters.html

S!
  #5 (permalink)  
Antiguo 28/04/2007, 03:45
 
Fecha de Ingreso: abril-2007
Mensajes: 9
Antigüedad: 17 años
Puntos: 0
Re: Problemas al guardar ficheros en un proyecto Web trabajando con Eclipse

Bueno, pues ahora me ha surgido otro problema. A ver si me puedes echar una mano que te lo agradecería infinitamente.

Ahora mismo lo del tema de refrescar el fichero se ha quedado en segundo plano porque me ha surgido un problema que sucede con anterioridad a la creación del fichero. Te explico.

Ya te dije que yo hago un mapeo de unas clases Java a un XML, pues para ello uso el API XStream que es muy cómodo de usar y da buen resultado.

Qué ocurre, pues bien, cuando yo hacía el mapeo aparte en una clase main para probar como funcionaba el API XStream la cosa iba de lujo salvo lo que te comenté de que no se me refrescaba el fichero XML que creaba.

Ahora, resulta que instancio un objeto de la clase que mapea dentro de un servlet, que es donde realmente se debe hacer el mapeo tras una petición del cliente web, me salta una excepción como la que te muestro al final de este mensaje. ¿No entiendo porque no encuentra esa clase (SingleValueConverter)? ¿Parece que haya una incompatibilidad entre los servlets y el API que uso? Espero que no sea así porque si no me va a mandar al garete todo el trabajo de esta semana y tengo que entregar este proyecto el Lunes.
Ya miré en el .classpath y el API está correctamente referenciado, al menos creo.

GRAVE: Servlet.service() para servlet Controlador lanzó excepción
java.lang.NoClassDefFoundError: com/thoughtworks/xstream/converters/SingleValueConverter
at servlet.Controlador.doPost(Controlador.java:160)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:803)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invo ke(StandardWrapperValve.java:210)
at org.apache.catalina.core.StandardContextValve.invo ke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invok e(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.servic e(CoyoteAdapter.java:151)
at org.apache.coyote.http11.Http11Processor.process(H ttp11Processor.java:870)
at org.apache.coyote.http11.Http11BaseProtocol$Http11 ConnectionHandler.processConnection(Http11BaseProt ocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.process Socket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThr ead.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlR unnable.run(ThreadPool.java:685)
at java.lang.Thread.run(Unknown Source)
  #6 (permalink)  
Antiguo 28/04/2007, 04:41
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: Problemas al guardar ficheros en un proyecto Web trabajando con Eclipse

Seguramente te faltara poner el Jar que tiene API XStream en WEB-INF/lib de tu aplicacion web. El .classpath es solo para el Eclipse, tienes que configurar bien las librerias para que se ejecuten en el contenedor web, ya que el profe seguramente no lo ejecutará en el Eclipse si no en un Tomcat a solas.

Así en breve, los .class van en WEB-INF/classes y los .jar que necesites en WEB-INF/lib.

S!
  #7 (permalink)  
Antiguo 28/04/2007, 08:25
 
Fecha de Ingreso: abril-2007
Mensajes: 9
Antigüedad: 17 años
Puntos: 0
Re: Problemas al guardar ficheros en un proyecto Web trabajando con Eclipse

Muchas gracias, lo que me has comentado era la solución, he copiado el API en WEB-INF/lib y ha encontrado las Clases que no hallaba antes.

Mi problema ahora es el siguiente. Vas a acabar hasta el gorro de mí, espero no agobiarte mucho, es que no es precisamente un profe a quien le tengo que entregar el proyecto si no a un evaluador de una empresa para que me contraten en la misma, y me estoy jugando un trabajo en una empresa buenecita, cosa que me hace mucha falta. Me han propuesto el proyecto a ver como me desenvolvía con el tema este de JSP, servlets y tal, y yo la verdad que en Java me he movido más bien en otro ámbito, API's SWING, AWT, JDBC y trabajo con multiprocesos (THREAD), esas fueron las cosillas que me enseñaron en un curso de 500 horas de Java que he hecho, el desarrollo Web con Java lo vi muy por encima.

Te cuento, resulta que desde mi ya comentada clase main desde la que hacía las pruebas, una vez que hago el mapeo, problema ya resuelto en el servlet, utilizo las siguientes sentencias para copiar la información en un fichero.xml:

fichero = new PrintStream(new FileOutputStream(ruta/fichero.xml));

// la información es un String que está bien estructurado como un fichero XML, eso no es problema

fichero.println(informacion);
fichero.close();
fichero.flush();

Si estoy trabajando con mi clase main, no hay problemas, el fichero se crea perfectamente en la ruta que le indico y lo único que me ocurría era el problema de que se produciera el refresco del fichero para que me lo lea el calendario AJAX, pero si intento hacerlo desde el servlet, si le pongo la ruta y al final el nombre del fichero.xml me da problemas diciendo que no encuentra la ruta especificada, y si le pongo sólo el nombre del fichero.xml (cogiendo previamente el fichero.xml original y poniéndolo en la raíz del proyecto para que no sea necesario escribir la ruta), entonces no me salta la excepción anterior pero no hace nada, no sobreescribe el fichero.xml.

¿Qué me está ocurriendo?. Seguramente te estaré pareciendo un tarugo, pero me faltan muchas tablas todavía en esto de JSP, servlets .....

Gracias por atenderme.
  #8 (permalink)  
Antiguo 28/04/2007, 10:30
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: Problemas al guardar ficheros en un proyecto Web trabajando con Eclipse

Ummmm, así sin información de diagnostico es dificil saber exactamente que esta pasando, pero vamos a jugar a las adivinanzas .

El primer detalle supongo que es un error de copy paste, pero no deberías hacer el flush() despues del close(), si no antes, si lo haces despues puede que te salte un error y aunque no te salte, igualmente no te servirá de nada hacerlo despues.

En cuanto a lo del fichero.... yo tiraria de System.err.println paso a paso para ver que ocurre. A ver donde te crea el fichero, etc. Ten en cuenta que si usas caminos relativos, el directorio por defecto es desde donde se inicia el java.exe... y eso es desde donde se arranca el tomcat, que puede ser cualquier sitio. Por eso en aplicaciones web se suele tomar como base el directorio ServletContext.getRealPath("") que es el directorio donde esta montado el contexto, al nivel de tus ficheros HTML etc. Así que cojes ese directorio, y montas tus caminos a partir de el, para que funcionen donde quiera que pongan tu aplicacion web.

Tambien tienes que tener en cuenta a la hora de crear un fichero que si te dice "could not find path" es que seguramente el directorio donde intentas crear el fichero no existe. Es decir, si le dices que cree el fichero c:\xx\file.txt y el directorio c:\xx no existe, no te creara el fichero y te dara error. Primero hay que crear el directorio, si este no existe. Hay un metodo en la clase File muy util para eso que te crea los directorios que hagan falta.

Yo iria paso a paso con sentencias de debug y bloques try/catch pequeños, no uno grande general, y sobretodo con printStackTrace() para que no te pase ninguna excepcion desapercibida. Es la forma de ir paso a paso viendo donde falla exactamente etc.

Bienvenido al mundo web, veras que es bastante diferente .
  #9 (permalink)  
Antiguo 29/04/2007, 13:09
 
Fecha de Ingreso: abril-2007
Mensajes: 9
Antigüedad: 17 años
Puntos: 0
Re: Problemas al guardar ficheros en un proyecto Web trabajando con Eclipse

Hola, ¿qué tal?.

Te cuento GreenEyed, resulta que ya he conseguido por ahí una forma un poco más artesanal pero igualmente valida para pasar mi cadena de texto String que contiene la información XML a un fichero de texto. Te la muestro:

OutputStream salidaBytes = null;
try {
salidaBytes = new FileOutputStream(new File("ruta/calendario.xml"));
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}

int lng = miCadenaXML.length();
for (int i=0; i<lng; i++)
try {
salidaBytes.write((byte) miCadenaXML.charAt(i));
} catch (IOException e) {
e.printStackTrace();
}
try {
salidaBytes.close();
} catch (IOException e1) {
e1.printStackTrace();
}

El problema que encuentro es que el fichero me lo crea pero sólo si le pongo
una ruta física de mi equipo, es decir, si le pongo C:/calendario.xml ó C:/Calendario/calendario.xml, pero si le pongo calendario.xml a secas, no hace nada aunque yo pensaba que me lo crearía en el directorio raíz de mi proyecto, y también he intentado ponerle delante el nombre de mi proyecto,
es decir, MiProyecto/calendario.xml, pero nada de nada, no me lo graba.
Ya parece que estoy más cerca de conseguirlo. ¿Sabes que fallo puedo estar cometiendo ahora?. Qué tarugo soy.
  #10 (permalink)  
Antiguo 29/04/2007, 17:43
 
Fecha de Ingreso: abril-2007
Mensajes: 9
Antigüedad: 17 años
Puntos: 0
Re: Problemas al guardar ficheros en un proyecto Web trabajando con Eclipse

He estado consultando esto último de escribir el fichero en el proyecto y ya creo que sé cual es el problema. El fichero se crea en el lado del cliente por el simple hecho de cargarse la página y quiero que se grabe en la estructura de directorios del servidor, en concreto, en la carpeta raíz del proyecto.

Por lo que he leido esto no se puede hacer así tan fácil, hay que habilitar unos permisos o algo así y además he leido que el API fileupload te permite escribir ficheros en el lado del servidor, ¿estoy en lo cierto?, ¿podrías orientarme un poco?

Gracias.
  #11 (permalink)  
Antiguo 30/04/2007, 09:06
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: Problemas al guardar ficheros en un proyecto Web trabajando con Eclipse

El fichero te lo creará en el servidor, aunque solo le pongas la ruta relativa. Lo que pasa es que no lo encuentras . Si en vez de
Código:
salidaBytes = new FileOutputStream(new File("ruta/calendario.xml"));
pones
Código:
File aFile = new File("ruta/calendario.xml");
System.err.println("El fichero es: " + aFile.getAbsolutePath());
salidaBytes = new FileOutputStream(afile);
Verás donde te lo está creando. El fichero se crea en el servidor, si estamos hablando de JSP/servlets, y el API fileupload es para enviar ficheros desde el cliente al servidor. Para simplemente crearlos en el servidor no hace falta.

S!
  #12 (permalink)  
Antiguo 30/04/2007, 10:20
 
Fecha de Ingreso: abril-2007
Mensajes: 9
Antigüedad: 17 años
Puntos: 0
Re: Problemas al guardar ficheros en un proyecto Web trabajando con Eclipse

He hecho lo que me has dicho y resulta que me aparece que crea el fichero en C:/eclipse/fichero.xml. Eso es un pastelón porque me sigue creando el fichero dentro de mi equipo, es decir, en una dirección física, y eso a mí no me interesa, yo quiero que esté dentro del proyecto, ¿no?.

O a lo mejor resulta que debe ser así, no sé, estoy perdido, a lo mejor cuando lo importe en un war se corrige, pero lo dudo, pero claro, el javascript necesita leer el fichero xml en una ruta relativa al proyecto no de una dirección física.

¿Cuál puede ser la solución?. Gracias.

Nota: hoy han visto por encima mi proyecto en esta empresa que te digo y han alucinado al ver que me he atrevido con AJAX pero claro hasta que no consiga lo del grabado del fichero en el servidor el calendario no funcionará al 100% y no se van a quedar contentos, ¡qué tios!.
  #13 (permalink)  
Antiguo 30/04/2007, 13:04
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: Problemas al guardar ficheros en un proyecto Web trabajando con Eclipse

Me cito a mi mismo, a ver si esta vez lo ves:
Cita:
Iniciado por GreenEyed Ver Mensaje
... Ten en cuenta que si usas caminos relativos, el directorio por defecto es desde donde se inicia el java.exe... y eso es desde donde se arranca el tomcat, que puede ser cualquier sitio. Por eso en aplicaciones web se suele tomar como base el directorio servletContext.getRealPath("") que es el directorio donde esta montado el contexto, al nivel de tus ficheros HTML etc. Así que cojes ese directorio, y montas tus caminos a partir de el, para que funcionen donde quiera que pongan tu aplicacion web.
...
Así que como verás es normal que sin poner nada te cree el directorio en c:\eclipse, puesto que ahi debe ser donde arranca la JVM el Eclipse. Y si, es mejor que los guardes relativos al contexto, así que usa servletContext.getRealPath("") como base.

En cuanto a que te guarde el fichero en tu maquina... si estas ejecutando en tu máquina el cliente y el servidor... no hay otra opción .

Olvida el fileupload de momento, no es para que lo tu crees.

S!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:53.