Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    16

    ServletFilter, ServletContext, WebDescriptor e Richiamo ad altra classe

    salve, il titolo è un pò trubdolo, ma non so come centrare il problema...panoramica:

    Ho implementato un ServletFilter da utilizzare in un progetto già esistente (nello specifico Apache Lenya).
    compilata la classe e copiata all'interno di Lenya, con l'opportuna dichiarazione del filter e del filter mapping all'interno del web.xml di lenya, il tutto funziona egregiamente.

    Adesso però vorrei richiamare dalla classe del filtro un'altra classe (sempre da me implementata) con i suoi metodi.
    Finchè tale classe non fa nulla di particolare (tipo scrivere su file) il tutto funziona perfettamente (mi basta copiarla nella stessa directory di lenya dove c'è il filtro, appartenendo allo stesso package).

    Il problema è che appena inserisco codice prettamente "j2ee" all'interno della seconda classe, nel momento del richiamo ottengo un nullpointerexception.

    in particolare...prendiamo il caso che io voglia prendere il ServletContextPath...

    nel filtro richiamo la seconda classe (MetadataRetriever) così:

    MetadataRetriever meta = new MetadataRetriever();
    meta.retrieveMetadata();


    ed il metodo retrieveMetadata() della classe MetadataRetriever è:

    public void retrieveMetadata() throws IOException {
    String percorso = getServletContext().getRealPath("");
    FileWriter f3 = new FileWriter("c:/path.txt",true);
    PrintWriter out3 = new PrintWriter(f3);
    out3.println(percorso);
    out3.close();
    }


    ovviamente per utilizzare il metodo getServletContext() la classe MetadaRetriever deve estendere HttpServlet...e qui penso ci sia l'arcano...a questo punto devo definire tale classe all'interno del descriptor di lenya come servlet (anche se in realtà non è che sia una vera e propria servlet, o meglio a me non interessa utilizzarla come tale)...e se sì, come?

    o è tutto il metodo sbagliato?

    nota: sono un pò alle prime armi con le j2ee, in caso non linciatemi

    vi ringrazio anticipatamente e chiedo scusa per la lunghezza del messaggio (nella speranza di essere riuscito a spiegare il problema)

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Non puoi passare al costruttore di MetadataRetriever il ServletContext della Servlet su cui stai lavorando?
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    16
    servlet su cui sto lavorando che intendi?

    se parli del servletfilter che richiama la classe è dichiarata così:
    public class LenyaFilter implements Filter {
    ...
    }

    e quindi non posso prendere il servlet context da passare all'altra classe (non è una servlet, ma un servletfilter e quindi non posso chiamere il getServletContext() ).

    se ti riferisci alla servlet originaria di lenya (che sarebbe cocoon), come faccio? è buildata e non posso metterci mani.

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    16
    edit: come non detto...non ho tenuto conto del filterconfig.

    provo subito

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Ecco, stavo per dirti che per forza dovevi avere qualche info, visto che init vuole FilterConfig, il quale ha un getServletContext...
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    16
    stavi per dirmi una cosa giustissima che pure un cieco avrebbe visto subito (tranne io ).
    ovviamente funziona, grazie

    in realtà non era proprio quello che dovevo fare, ma almeno un dubbio è chiarito.

    se posso approfittare della tua disponibilità e della tua preparazione in fatto di Servlet, vorrei chiederti una cosa:

    dalla mia classe devo prendere un file dal repository di lenya, per fare ciò però devo prima definire la pubblicazione...ora il costruttore dell'oggetto pubblicazione è questo:

    FilePublication
    public FilePublication(java.lang.String id,
    java.lang.String servletContextPath)
    throws PublicationException.

    Parameters:
    id - The publication ID.
    servletContextPath - The servlet context path.
    Throws:
    PublicationException - when something went wrong.

    ma ho qualche dubbio sul paramentro servletContextPath (da passare come stringa)... sarebbe il RealPath del metodo che ho usato in qualche posto più su o che altro?

    sempre grazie anticipatamente

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    16
    lasciando perdere il post di cui sopra che è un problema secondario e risolvibile in qualche modo....

    al di là del servletcontext (risolto) il problema del richiamo del metodo della seconda classe da parte del servlet filter continua a darmi dei problemi che non capisco.

    ricapitolando....

    la struttura:
    classe servlet filter
    seconda classe

    all'interno del metodo dofilter del servletfilter richiamo:

    MetadataRetriever meta = new MetadataRetriever();
    try {
    meta.retrieveMetadata(filterConfig.getServletConte xt(), idDoc, urisDoc);
    } catch (DocumentException e) {
    e.printStackTrace();
    }


    in particolare il metodo retrieveMetadata fa questo:

    public void retrieveMetadata(ServletContext sc, String id, String uris) throws DocumentException, IOException {

    String pathFile = sc.getRealPath("").replace('/','\\') + "\\lenya\\pubs\\default\\content\\live" + id.replace('/','\\') + "\\index_en.xml";

    // controllo path file

    FileWriter f = new FileWriter("c:/path.txt",true);
    PrintWriter out = new PrintWriter(f);
    out.println(pathFile);
    out.close();
    //

    SAXReader reader = new SAXReader();
    Document document = reader.read(pathFile);

    Element root = document.getRootElement();
    Element metaRoot = root.element("meta");

    String metadato[] = new String[17];
    int j = -1;

    for (Iterator i = metaRoot.elementIterator(); i.hasNext() {
    Element metaGroup = (Element) i.next();
    j++;
    metadato[j] = metaGroup.getText();
    }

    MetaLenya metalenya = new MetaLenya(metadato);

    //output di test sul metadato dc:title dall'oggetto metalenya

    FileWriter f2 = new FileWriter("c:/meta_check.txt",true);
    PrintWriter out2 = new PrintWriter(f2);
    out2.println("Metadati del documento " + pathFile);
    out2.println();
    out2.println(metalenya.getTitle());
    out2.close();
    //


    Ora, il primo file (path.txt) viene creato e riempito tranquillamente, tutto il resto del codice invece non fa assolutamente nulla (da SaxReader) ma quella stessa porzione di codice all'interno di un mio altro progetto funziona perfettamente.

    Qual è il problema per cui non posso crearmi quegli oggetti lì?
    Il codice è funzionante al 100%, quindi il problema non può stare altro in un qualcosa di strutturale (il richiamo dal filter / problemi di visibilità / non so).

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    16
    edit: aggiungo che l'eccezione sul documento è:

    C:\Programmi\Apache-Software-Foundation\Tomcat-5.5\webapps\lenya\lenya\pubs\default\content\live\ testdata\index_en.xml (Impossibile trovare il file specificato) Nested exception: C:\Programmi\Apache-Software-Foundation\Tomcat-5.5\webapps\lenya\lenya\pubs\default\content\live\ testdata\index_en.xml (Impossibile trovare il file specificato)

    nel codice precedente davo il percorso al file con i vari "\\" , adesso ho riprovato con il path espresso tutto in "/" e non va uguale.

    entrambi i tipi di rappresentazione nell'altro progetto in cui uso il saxreader funzionano però.

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    16
    risolto, fate finta di niente.

    non aveva senso richiamare la classe durante l'elaborazione della request.
    così facendo il file non era ancora stato creato, bisognava richiamarlo durante l'elaborazione della response.

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.