Stampo risultato in pagina jsp (JEE)

di il
8 risposte

Stampo risultato in pagina jsp (JEE)

Ciao a tutti,

forse qualcuno di voi avrà già visto il progetto a cui sto lavorando, al momento sto cercando di rendere un mio programma java in una web-app e sto operando con delle classi di prova per capire logica e funzioni di jee.

Per ora mi trovo con la seguente classe java (opportunamente mappata con le servlet, con una pagina jsp di partenza in cui trovo il bottone che "avvia" la classe e una jsp di arrivo con "File: ${risultato}" in cui dovrebbe apparire il risultato):

"public class ReaderTest extends HttpServlet {

public ArrayList<String> main(String path) {

File filePath = new File(path);

ArrayList<String> result = new ArrayList<>();

try {
// creo un DocumentBuilder
DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();

// creo un documento
DocumentBuilder builder = documentFactory.newDocumentBuilder();

// ricrca del file .xml nel path specifico
Document document = builder.parse(filePath);

// tag di ricerca all'interno del file e output
NodeList persone = document.getElementsByTagName("persona");
System.out.println("Totale persone: " + persone.getLength());

// ciclo for per scorrere i nodi del file e lo analizza
for (int i = 0; i < persone.getLength(); i++) {

Node nodo = persone.item(i);

if (nodo.getNodeType() == Node.ELEMENT_NODE) {
Element persona = (Element) nodo;

String nome = persona.getElementsByTagName("nome").item(0).getFirstChild().getNodeValue();
String cognome = persona.getElementsByTagName("cognome").item(0).getFirstChild().getNodeValue();
String telefono = persona.getElementsByTagName("telefono").item(0).getFirstChild().getNodeValue();

result.add("Nome: " + nome + "\nCognome " + cognome + "\nTelefono: " + telefono + "\n");
}
}
} catch (Exception e) {
e.printStackTrace(); // TODO: evita di fare un catch di una generica Exception su blocchi lunghi di codice!
result.add("Doesn't works man");
return result;
}
return result;
}

protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {

res.setContentType("text/html");
//HttpSession s0 = req.getSession();

String path = "rubrica.xml";

ReaderTest r = new ReaderTest();

req.setAttribute("risultato", r.main(path) );
RequestDispatcher dis = req.getRequestDispatcher("risultato.jsp");
dis.forward(req,res);

}
}"

Avviato tutto il processo dovrei quindi ottenere in output sullo specifico jps: "File: Nome: nome Cognome: cognome e Telefono: telefono" (ripetuto per tutte le persone presenti nel file xml che viene analizzato dalla funzione).
Alla fine però ottengo "File: [Doesn't works man ]" ovvero viene riportato il messaggio inizializzato nel catch.
Qualcuno può darmi una mano a far funzionare correttamente il programma?

8 Risposte

  • Re: Stampo risultato in pagina jsp (JEE)

    Ragnar ha scritto:


    public class ReaderTest extends HttpServlet {
    
        public ArrayList<String> main(String path) {
    
            File filePath = new File(path);
    
    [....]
        }
    
        protected void doGet(HttpServletRequest req, HttpServletResponse res)
                throws ServletException, IOException {
    
            res.setContentType("text/html");
            //HttpSession s0 = req.getSession();
    
            String path = "rubrica.xml";
    
            ReaderTest r = new ReaderTest();
    
            req.setAttribute("risultato", r.main(path) );
            RequestDispatcher dis = req.getRequestDispatcher("risultato.jsp");
            dis.forward(req,res);
    
        }
    }
    Prima cosa: NON ha affatto granché senso istanziare nel doGet il ReaderTest che è la "Servlet" in cui sei. La istanza ce l'hai già, è quella creata e gestita dal servlet-container (es. Tomcat/GlassFish/ecc..) e su cui è invocato il doGet.

    Seconda cosa: path = "rubrica.xml"

    Il path NON è assoluto, quindi è relativo alla directory "corrente". Quale è la directory corrente? Beh ... nelle webapp Java è una cosa molto vaga, perché dipende da diversi fattori: dal servlet-container, da come/da dove viene avviato, ecc..
    In sostanza: nelle webapp la directory "corrente" NON serve e non è affatto "usabile" in modo utile.

    Precisa DOVE sta questo rubrica.xml e in base a dove è dovrà essere referenziato in modo più opportuno.
  • Re: Stampo risultato in pagina jsp (JEE)

    Quindi dandogli il path assoluto dovrebbe funzionare?
    In ogni caso modificando il codice in questo modo:

    "public class ReaderTest extends HttpServlet {

    public ArrayList<String> main(String path) throws ParserConfigurationException, IOException, SAXException {

    File filePath = new File(path);

    ArrayList<String> result = new ArrayList<>();

    //try {
    // creo un DocumentBuilder
    DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();

    // creo un documento
    DocumentBuilder builder = documentFactory.newDocumentBuilder();

    // ricrca del file .xml nel path specifico
    Document document = builder.parse(filePath);

    // tag di ricerca all'interno del file e output
    NodeList persone = document.getElementsByTagName("persona");
    System.out.println("Totale persone: " + persone.getLength());

    // ciclo for per scorrere i nodi del file e lo analizza
    for (int i = 0; i < persone.getLength(); i++) {

    Node nodo = persone.item(i);

    if (nodo.getNodeType() == Node.ELEMENT_NODE) {
    Element persona = (Element) nodo;

    String nome = persona.getElementsByTagName("nome").item(0).getFirstChild().getNodeValue();
    String cognome = persona.getElementsByTagName("cognome").item(0).getFirstChild().getNodeValue();
    String telefono = persona.getElementsByTagName("telefono").item(0).getFirstChild().getNodeValue();

    result.add("Nome: " + nome + "\nCognome " + cognome + "\nTelefono: " + telefono + "\n");
    }
    }
    /*} catch (Exception e) {
    e.printStackTrace(); // TODO: evita di fare un catch di una generica Exception su blocchi lunghi di codice!
    result.add("Doesn't works");*/
    //}
    return result;
    }

    protected void doGet(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {

    res.setContentType("text/html");
    //HttpSession s0 = req.getSession();

    String path = "rubrica.xml";

    ReaderTest r = new ReaderTest();

    try {
    req.setAttribute("risultato", r.main(path) );
    } catch (ParserConfigurationException e) {
    e.printStackTrace();
    } catch (SAXException e) {
    e.printStackTrace();
    }
    RequestDispatcher dis = req.getRequestDispatcher("risultato.jsp");
    dis.forward(req,res);

    }
    }"

    E mettendo una copia dell'xml in : C:\\Documenti\JEE\glassfish4\glassfish\domains\domains1\config
    riesco ad ottenere il risultato voluto...però non credo sia il metodo "giusto", giusto?
  • Re: Stampo risultato in pagina jsp (JEE)

    Ragnar ha scritto:


    Quindi dandogli il path assoluto dovrebbe funzionare?
    Sì, certo. Sebbene tenere un path "assoluto" nel sorgente non sia affatto una buona cosa, detto in generale.

    Ragnar ha scritto:


    E mettendo una copia dell'xml in : C:\\Documenti\JEE\glassfish4\glassfish\domains\domains1\config
    riesco ad ottenere il risultato voluto...però non credo sia il metodo "giusto", giusto?
    No, infatti non è particolarmente buono nemmeno questo.
  • Re: Stampo risultato in pagina jsp (JEE)

    Ma come agisco per risolvere questo problema? Perchè in realtà il file xml è già all'interno del progetto (nella cartella web), infatti se creo un link con "href" mi basta digitare il nome del file per richiamarlo (senza path assoluto) e non capisco perchè non vada bene anche nel metodo da me creato.
  • Re: Stampo risultato in pagina jsp (JEE)

    Ragnar ha scritto:


    Perchè in realtà il file xml è già all'interno del progetto (nella cartella web), infatti se creo un link con "href" mi basta digitare il nome del file per richiamarlo (senza path assoluto)
    Se il file xml è "esposto" su HTTP è un conto. Ha un URL assoluto, di per sé, e se hai una pagina web puoi mettere un url anche RELATIVO che punta al file xml. Questo funziona.

    Ragnar ha scritto:


    e non capisco perchè non vada bene anche nel metodo da me creato.
    Perché solo "rubrica.xml" è RELATIVO alla directory CORRENTE. Qui sei sul file-system! (non su HTTP) Questo è il problema, perché nelle webapp la directory corrente è vaga/variabile. Non è usabile, detto in generale.

    Se il file xml è nella context "root" allora puoi usare ad esempio il getRealPath di ServletContext:
    ServletContext sc = ........// ottieni il ServletContext
    String path = sc.getRealPath("/rubrica.xml");
    Questo path lo PUOI passare a File o altra classe di I/O che riceve un pathname di un file.

    NOTA: Questo funziona SOLO se la webapp NON è servita direttamente da un .war. Tomcat ad esempio spacchetta un war di norma. GlassFish non so/non ricordo.
  • Re: Stampo risultato in pagina jsp (JEE)

    "String path = req.getServletContext().getRealPath("rubrica.xml");"
    Facendo così funziona tutto
  • Re: Stampo risultato in pagina jsp (JEE)

    Ragnar ha scritto:


    "String path = req.getServletContext().getRealPath("rubrica.xml");"
    Il ServletContext lo puoi ottenere dalla request ... ma anche dalla servlet stessa.

    Metti per chiarezza/completezza /rubrica.xml
    Dove la / denota la "context root".
    Senza, dovrei andare a rileggere cosa dice a riguardo.
  • Re: Stampo risultato in pagina jsp (JEE)

    Ok, grazie per l'aiuto!
Devi accedere o registrarti per scrivere nel forum
8 risposte