Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Caricare un file al deploy sul server Tomcat (Struts)

    Ciao a tutti,

    il problema che mi attanaglia è il seguente e spero che qualcuno mi possa aiutare.

    Sto realizzando un'applicazione distribuita -framework Struts 1.3 - su tre host differenti al quale si deve accedere via browser da vari host,:

    -interfaccia client (Tomcat 6.0);
    -middleware EJB (Glassfish 2.1);
    -database (mysql server 5.5).

    Una delle funzioni che ho sviluppato prevede il caricamento di un file xml dal browser del quale fa prima la validazione direttamente dall'interfaccia e nel caso in cui questa sia corretta passa il contenuto del file al middleware che inserisce i suoi dati nel database.
    Il problema sta nel fatto che questo file deve per specifiche rispettare un determinato file.dtd e fare la validazione anche tramite quello.
    Quando quando faccio il deploy dell'interfaccia client su Tomcat l'unico modo per fargli trovare il file.dtd è copiarlo "a mano" nella cartella /bin di Apache altrimenti non lo trova e mi da un errore (impostato a me).

    Le domande sono due:

    1)posso, magari tramite web.xml di Struts, dire che questo file.dtd deve essere caricato in una posizione specifica del server Tomcat, all''interno della mia applicazione, nel momento in cui faccio il deploy del file war?

    2)cosa devo specificare nel file xml che deve essere validato per fargli cercare il file dtd (si chiama locations.dtd) anzichè nella /bin all'interno di quella cartella nella quale eventualmente ho caricato il file?

    Attualmente il file xml che carico ha questa intestazione:
    <!DOCTYPE locations SYSTEM "locations.dtd">

    Scusate se forse ho postato nella sezione sbagliata ma c'è sia Struts che altre cose che non c'entrano direttamente con java...

    ...grazie in anticipo per aiuti e suggerimenti,

    ciao

    p.s. scusate anche se sono stato prolisso ma volevo darvi più informazioni possibili per comprendere il problema

  2. #2

    Re: Caricare un file al deploy sul server Tomcat (Struts)

    Originariamente inviato da maceman
    Ciao a tutti,

    il problema che mi attanaglia è il seguente e spero che qualcuno mi possa aiutare.

    Sto realizzando un'applicazione distribuita -framework Struts 1.3 - su tre host differenti al quale si deve accedere via browser da vari host,:

    -interfaccia client (Tomcat 6.0);
    -middleware EJB (Glassfish 2.1);
    -database (mysql server 5.5).

    Una delle funzioni che ho sviluppato prevede il caricamento di un file xml dal browser del quale fa prima la validazione direttamente dall'interfaccia e nel caso in cui questa sia corretta passa il contenuto del file al middleware che inserisce i suoi dati nel database.
    Il problema sta nel fatto che questo file deve per specifiche rispettare un determinato file.dtd e fare la validazione anche tramite quello.
    Quando quando faccio il deploy dell'interfaccia client su Tomcat l'unico modo per fargli trovare il file.dtd è copiarlo "a mano" nella cartella /bin di Apache altrimenti non lo trova e mi da un errore (impostato a me).

    Le domande sono due:

    1)posso, magari tramite web.xml di Struts, dire che questo file.dtd deve essere caricato in una posizione specifica del server Tomcat, all''interno della mia applicazione, nel momento in cui faccio il deploy del file war?

    2)cosa devo specificare nel file xml che deve essere validato per fargli cercare il file dtd (si chiama locations.dtd) anzichè nella /bin all'interno di quella cartella nella quale eventualmente ho caricato il file?

    Attualmente il file xml che carico ha questa intestazione:
    <!DOCTYPE locations SYSTEM "locations.dtd">

    Scusate se forse ho postato nella sezione sbagliata ma c'è sia Struts che altre cose che non c'entrano direttamente con java...

    ...grazie in anticipo per aiuti e suggerimenti,

    ciao

    p.s. scusate anche se sono stato prolisso ma volevo darvi più informazioni possibili per comprendere il problema
    Che mi risulti il dtd può avere una url http assoluta quindi puoi semplicemente esporlo sullo stesso server che serve le tue pagine...o no?
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  3. #3
    Ho un nuovo problema legato sempre a questioni simili alle precedenti.

    Quando creo un file nella parte view del mio programma ovvero su Tomcat questo me lo salva all'interno della cartella BIN anzichè nella root della mia apps (che si trova nella directory CATALINA_BASE anzichè nel CATALINA_HOME). Qualcuno sa come fare ad impostare come root di salvataggio la root del progetto anzichè quella di Tomcat? Mi crea qualche problema quando devo recuperare la path per restituire il file appena creato all'utente sul browser...

    codice:
    String nomefile= "orders.xml";
    File file = new File(nomefile);
    if(!file.exists())
    file.createNewFile()
    ...
    int read = 0;             
    byte[] bytes = new byte[1024];             
    response.setContentType("application/octet-stream");             
    response.setHeader("Content-Disposition", "attachment;filename=\"" + file.getName() + "\"");              
    FileInputStream fis = null;             
    OutputStream os = null;             
    //Questo è l'escamotage per aggirare il problema del PATH
    File path = new File("");             
    String abspath = path.getAbsolutePath();             
    path.delete();             
    System.out.println(abspath);             
    fis = new FileInputStream(new File(abspath+"/", file.getName()));             
    os = response.getOutputStream();             
    while ((read = fis.read(bytes)) != -1)             
    {                  
    os.write(bytes, 0, read);             
    }             
    fis.close();             
    os.flush();             
    file.delete();          
    }

  4. #4
    Originariamente inviato da maceman
    Ho un nuovo problema legato sempre a questioni simili alle precedenti.
    e l'altro come lo hai risolto? Se posti la soluzione può essere utile ad altri, è sempre buona norma farlo.
    Originariamente inviato da maceman
    Quando creo un file nella parte view del mio programma ovvero su Tomcat questo me lo salva all'interno della cartella BIN anzichè nella root della mia apps (che si trova nella directory CATALINA_BASE anzichè nel CATALINA_HOME). Qualcuno sa come fare ad impostare come root di salvataggio la root del progetto anzichè quella di Tomcat? Mi crea qualche problema quando devo recuperare la path per restituire il file appena creato all'utente sul browser...

    codice:
    String nomefile= "orders.xml";
    File file = new File(nomefile);
    if(!file.exists())
    file.createNewFile()
    ...
    int read = 0;             
    byte[] bytes = new byte[1024];             
    response.setContentType("application/octet-stream");             
    response.setHeader("Content-Disposition", "attachment;filename=\"" + file.getName() + "\"");              
    FileInputStream fis = null;             
    OutputStream os = null;             
    //Questo è l'escamotage per aggirare il problema del PATH
    File path = new File("");             
    String abspath = path.getAbsolutePath();             
    path.delete();             
    System.out.println(abspath);             
    fis = new FileInputStream(new File(abspath+"/", file.getName()));             
    os = response.getOutputStream();             
    while ((read = fis.read(bytes)) != -1)             
    {                  
    os.write(bytes, 0, read);             
    }             
    fis.close();             
    os.flush();             
    file.delete();          
    }
    Perché non ne configuri il path assoluto in una property di un file di configurazione? Una volta installato il tuo applicativo in un dato host, il path è sempre lo stesso quindi mi sembra la cosa più sensata da fare, senza stare a costruire dinamicamente il path.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  5. #5
    Allora diciamo che girandoci intorno posso risolvere tutto...

    1)potrei copiare a mano sul server il file .dtd nella directory /BIN/ di Tomcat e con l'intestazione <!DOCTYPE locations SYSTEM "locations.dtd"> funzionerebbe.

    2)Per quanto riguarda recuperare il file copiato nella BIN basterebbe utilizzare un piccolo trucco:
    codice:
    ...
    
    file.createNewFile();
    
    ...
    
    File path = new File("");             
    String abspath = path.getAbsolutePath();              
    path.delete();              
    System.out.println(abspath);              
    fis = new FileInputStream(new File(abspath+"/", file.getName()));
    In questo modo creo sia il file che mi serve (file) che un file senza nome che con getAbsolutePath() mi ritorni solo il path senza il nome del file.

    Quindi questa è la mia attuale soluzione.

    Però nella pratica mi rimangono due problemi:
    Il pc su cui dovrò installare la mia app ha dei privilegi di admin molto stretti, dei quali io non posso usufruire, e mi permette di copiare i file solo sul desktop o nella cartella utente (all'interno della quale c'è la cosiddetta %CATALINA_BASE% ovvero una cartella che TOMCAT6 utilizza per più utenti che condividono lo stesso sistema e nella quale mette le applicazioni deployed da quell'utente, anzichè metterle all'interno di %CATALINA_HOME% che è la root principale di TOMCAT che invece si trova in c:/programmi).
    Quindi il problema due posso anche lasciarlo risolto così ma per il problema (1) non ho ancora trovato soluzione.


    Mi basterebbe capire come fare a far sì che TOMCAT lavori in quella cartella personale piuttosto che nella sua BIN... possibile che debba aggiungere una workdir sul context.xml della mia app? E sì, qualcuno mi saprebbe indicare i tag precisi perchè ho riscontrato degli errori facendo delle prove.

  6. #6
    Per il come caricare il dtd che valida il tuo xml te l'ho già data anche io una soluzione (pensavo avessi usato qualcos'altro), ti è sufficiente mettere il dtd nella "doc root" del tuo applicativo (quindi fuori dalla WEB-INF) in modo che il dtd sia pubblicamente visibile alla url http://www.yourhost.com/your_appa/yourdtd.dtd e linkarlo nell'xml esattamente con questo path

    per il secondo problema puoi caricare i file in maniera dinamica senza usare path assoluti, anche usando il classLoader.

    codice:
    getClass().getClassLoader().getResourceAsStream("/your_file.xml")
    ti carica un file come stream cercandolo a partire dalla cartella classes della tua webapp
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  7. #7
    per il secondo problema puoi caricare i file in maniera dinamica senza usare path assoluti, anche usando il classLoader.
    Il file non viene caricato ma creato direttamente sul server (estrapola tramite il server glassfish dei dati dal database e li scrive nel documento xml che crea quando viene chiamata la funzione) e poi mandato al browser che visualizza il modulo di download (quello del browser stesso)...

  8. #8
    Originariamente inviato da maceman
    Il file non viene caricato ma creato direttamente sul server (estrapola tramite il server glassfish dei dati dal database e li scrive nel documento xml che crea quando viene chiamata la funzione) e poi mandato al browser che visualizza il modulo di download (quello del browser stesso)...
    Si ok, ma allora non ho capito il path a cosa ti serve se lo scrivi direttamente nella response come stream senza passare per un file...
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  9. #9
    Allora provo a spiegare bene cosa fa così mi aiutate a capire se posso farlo effettivamente scrivendo sullo stream:

    Fa una chiamata a glassfish ed ottiene un Hashtable ordini di oggetti di tipo ordine, ognuno dei quali ottiene i suoi valori del database ed ha i suoi metodi get.
    Una volta fatto questo scorro i vari oggetti nell'hastable e con i metodi get mi creo un DOM degli ordini.

    A questo punto avuto il mio DOM che si chiama "doc" devo fare un parsing su file per questo non posso scrivere direttamente sullo stream in uscita.


    codice:
    // Prepara il documento DOM per la scrittura             
    Source source = new DOMSource(doc);  
                
    //Prepara il file in uscita             
    String nomefile= "orders.xml"; 
               
    File file = new File(nomefile);             
    if(!file.exists())                 
    file.createNewFile();             
    else             
    {                 
    file.delete();                 
    file = new File(nomefile);                 
    file.createNewFile();             
    }              
    Result result = new StreamResult(file); 
             
    // Scrive il documento DOM nel file sul server             
    Transformer xformer = TransformerFactory.newInstance().newTransformer();      
    xformer.transform(source, result);         
    
    //Manda il file alla destinazione utente (il download è gestito dal browser)             
    int read = 0;             
    byte[] bytes = new byte[1024];            
    response.setContentType("application/octet-stream");             
    response.setHeader("Content-Disposition", "attachment;filename=\"" + file.getName() + "\"");             
    FileInputStream fis = null;           
    OutputStream os = null;           
    fis = new FileInputStream(new File("", file.getName()));             
    os = response.getOutputStream();           
    while ((read = fis.read(bytes)) != -1)           
    {                  
    os.write(bytes, 0, read);       
    }             
    fis.close();          
    os.flush();             
    file.delete();       
    }

  10. #10
    Sia la creazione di un DOM xml sia le trasformazioni XSLT non necessitano di un file, si possono effettuare mediante streams, quindi puoi fare tutto al volo e scrivere il risultato sulla response in modo che il browser cominci il download. Il tutto ovviamente se l'operazione non è molto onerosa, nel qual caso rischi un timeout e una broken pipe (cioè la response si "sgancia") . In questo secondo caso le cose si complicato perché ti tocca gestire la faccenda in maniera asincrona utilizzando non solo un file, ma anche un thread. Spero di essermi spiegato, non ho il tempo di modificare il tuo codice ora, magari più tardi, in ogni caso provaci se hai capito ciò che ti ho detto.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.