Visualizzazione dei risultati da 1 a 10 su 14

Hybrid View

  1. #1

    jsp non legge item di un file xml

    index.jsp
    codice:
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Nome del sito</title>
    </head>
    <body>
    <link href="CSS/style.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
    
    <%@include file="CSS/header.html" %>
    
    <div id="container">
     
        <%@ include file ="CSS/left.jsp" %>
            
            
              </div><!--#navigation-->
            
                <div id="center"> 
                
                contenuto della home
                
                 </div>
             
            
     
    </div><!--#container-->
    
    
    
    </body>
    </html>
    classe XMLManager:
    codice:
    package it.unirc.bd2.sito.util;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.Iterator;
    
    import org.jdom2.Content;
    import org.jdom2.Document;
    import org.jdom2.Element;
    import org.jdom2.JDOMException;
    import org.jdom2.input.SAXBuilder;
    
    public class XMLManager {
        
        
        // si potrebbe rendere più efficiente evitando il parsin ogni volta che si chiede il testo
        public static String getText(String key, String country){
            
            //potrei passare la variabile path direttamente qui, non uso l'indirizzo!!! devo usare la variabile path!!
            
            //se country = it fai così (Gestione country in base alla lingua)
            
            
            //gestione country
            
        
            //File file=new File("src/it/unirc/bd2/xml/Data_"+country+".xml"); // creo l'oggetto di tipo file che è l'input
            File file =new File("Data_"+country+".xml");
            //if(!file.exists())  // se non esiste creo file 
                //file= new File("c:/Data_IT.xml");
                
                //file = new File("src/it/unirc/bd2/xml/Data_"+country+".xml");
            
            
            SAXBuilder builder= new SAXBuilder(); // oggetto che si occuperà del parsing del documento creato
            Document document =null; //l'output
            
            try {
                document=builder.build(file);
            } catch (JDOMException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            Element root=document.getRootElement();
            
            Content c;
            
            Iterator<Content> discendenti=document.getDescendants();
              //document.getDescendants(); // mi restituisce un 'iteratore di contenuti
              
              while (discendenti.hasNext()){   // serve a navigare sul documento xml quando non conosciamo la struttura
                  c=discendenti.next();
                  if (c.getCType().equals(Content.CType.Element)){ //verifico che ciò che cerco è un element
                      Element e=(Element) c;
                      if (e.getName().equals(key))
                      return (e.getText());
                      
                  }
              }
            
            
            
            
            
            
            
            
            
            return "";
        }
    
    }
    left.jsp
    codice:
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
        <%@ page import="it.unirc.bd2.sito.util.XMLManager"%>
        
        
        
    <div id="left"> 
    
    <%
    //String path=request.getRealPath(""); //la risorsa di cui voglio il path fisico passando il path relativo
    XMLManager.getText("item1","IT");
     //out.print(path);  %>          
            <br/>
            voce2<br/>
            <a href="Login.jsp">Login</
    Data_IT.xml
    codice:
    <?xml version="1.0" encoding="UTF-8"?>
    
    <root>
          <item1>Gestione Studenti</item1>
          <item2>Ciao</item2>
    </root>
    Grave: Servlet.service() for servlet [jsp] in context with path [/sito] threw exception [java.lang.NullPointerException] with root cause
    java.lang.NullPointerException
    at it.unirc.bd2.sito.util.XMLManager.getText(XMLManag er.java:48)
    at org.apache.jsp.index_jsp._jspService(index_jsp.jav a:96)
    at org.apache.jasper.runtime.HttpJspBase.service(Http JspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet .java:727)
    at org.apache.jasper.servlet.JspServletWrapper.servic e(JspServletWrapper.java:432)
    at org.apache.jasper.servlet.JspServlet.serviceJspFil e(JspServlet.java:390)
    at org.apache.jasper.servlet.JspServlet.service(JspSe rvlet.java:334)
    at javax.servlet.http.HttpServlet.service(HttpServlet .java:727)
    at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilt er(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invo ke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invo ke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBas e.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(A ccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invok e(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.servic e(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.p rocess(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnect ionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProce ssor.run(JIoEndpoint.java:313)
    at java.util.concurrent.ThreadPoolExecutor.runWorker( Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run (Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    pare che il problema sia nel "Element root=document.getElementRoot();"
    cosa consigliate?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da thedoctor89 Visualizza il messaggio
    pare che il problema sia nel "Element root=document.getElementRoot();"
    cosa consigliate?
    Essendo lì l'eccezione di NullPointerException innanzitutto vuol dire che document è null. Se document è null, è perché il build(file) evidentemente è fallito lanciando una eccezione (che tu sì, hai catturato ma senza far "reagire" in modo più corretto e pertanto prosegue nel codice) quindi document è rimasto appunto a null.

    Perché il build fallisce .... presumibilmente la specifica del file non è corretta/appropriata.


    P.S. dal e.printStackTrace(); allora dovresti avere la stampa anche di un altro stack-trace. Guarda quello.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Essendo lì l'eccezione di NullPointerException innanzitutto vuol dire che document è null. Se document è null, è perché il build(file) evidentemente è fallito lanciando una eccezione (che tu sì, hai catturato ma senza far "reagire" in modo più corretto e pertanto prosegue nel codice) quindi document è rimasto appunto a null.

    Perché il build fallisce .... presumibilmente la specifica del file non è corretta/appropriata.


    P.S. dal e.printStackTrace(); allora dovresti avere la stampa anche di un altro stack-trace. Guarda quello.
    la specifica del file dovrei farla rispetto alla cartella dove è contenuto nel mio pc?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da thedoctor89 Visualizza il messaggio
    la specifica del file dovrei farla rispetto alla cartella dove è contenuto nel mio pc?
    Ehm ... allora, nelle web application le cose vanno un po' diversamente per quanto riguarda i riferimenti ai file.
    - mettere un path "relativo" (alla directory "corrente") nel sorgente non va bene, quale sia la directory corrente dipende dall'application server e da come viene avviato (potresti averne il controllo o no). Potrebbe essere la directory di installazione del server o poco più sotto ma in ogni caso è altamente improbabile che sia una directory utile per una o più applicazioni.
    - mettere path "assoluti" nel sorgente non va mai bene, qualunque sia il tipo di applicazione.

    Se i file da rintracciare e leggere fanno parte "fissi" della webapp, le soluzioni sono almeno 2:

    1) Usare il concetto delle risorse che vengono cercate lungo il classpath.

    URL fileUrl = UnaTuaClasse.class.getResource("documento.xml");
    oppure
    InputStream fileStream = UnaTuaClasse.class.getResourceAsStream("documento. xml");

    documento.xml nell'esempio sta nello stesso package di UnaTuaClasse. Nota: SAXBuilder ha i build() sia con URL che con InputStream, vedi suo javadoc.

    2) Usare i getResource/getResourceAsStream di ServletContext. Questi metodi non usano i concetti del classloader. La specifica del file deve iniziare con "/" che è riferito alla context-root della applicazione.

    ServletContext sc = .....
    URL fileUrl = sc.getResource("/WEB-INF/myfiles/documento.xml");
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Ehm ... allora, nelle web application le cose vanno un po' diversamente per quanto riguarda i riferimenti ai file.
    - mettere un path "relativo" (alla directory "corrente") nel sorgente non va bene, quale sia la directory corrente dipende dall'application server e da come viene avviato (potresti averne il controllo o no). Potrebbe essere la directory di installazione del server o poco più sotto ma in ogni caso è altamente improbabile che sia una directory utile per una o più applicazioni.
    - mettere path "assoluti" nel sorgente non va mai bene, qualunque sia il tipo di applicazione.

    Se i file da rintracciare e leggere fanno parte "fissi" della webapp, le soluzioni sono almeno 2:

    1) Usare il concetto delle risorse che vengono cercate lungo il classpath.

    URL fileUrl = UnaTuaClasse.class.getResource("documento.xml");
    oppure
    InputStream fileStream = UnaTuaClasse.class.getResourceAsStream("documento. xml");

    documento.xml nell'esempio sta nello stesso package di UnaTuaClasse. Nota: SAXBuilder ha i build() sia con URL che con InputStream, vedi suo javadoc.

    2) Usare i getResource/getResourceAsStream di ServletContext. Questi metodi non usano i concetti del classloader. La specifica del file deve iniziare con "/" che è riferito alla context-root della applicazione.

    ServletContext sc = .....
    URL fileUrl = sc.getResource("/WEB-INF/myfiles/documento.xml");
    posso usare servletContext ed i relativi metodi anche se sono all'internno di una classe e non di una servlet?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da thedoctor89 Visualizza il messaggio
    posso usare servletContext ed i relativi metodi anche se sono all'internno di una classe e non di una servlet?
    Certo, basta che la classe possa ricevere (in qualunque modo, almeno che sia "pulito") il riferimento all'oggetto ServletContext (che è uno solo per una istanza della webapp su una istanza della VM).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Altra considerazione: nella tua JSP fai


    codice:
    <div id="left"> 
    
    <%
    //String path=request.getRealPath(""); //la risorsa di cui voglio il path fisico passando il path relativo
    XMLManager.getText("item1","IT");
     //out.print(path);  %>

    Che non fa certo quel che tu ti aspetti: il risultato del metodo getText(), in quel modo, viene buttato via. Se vuoi "spedire in output" al client il risultato dell'elaborazione, devi, appunto, "spedirla in output":


    codice:
    <div id="left"> 
    
    <%
    //String path=request.getRealPath(""); //la risorsa di cui voglio il path fisico passando il path relativo
    out.print( XMLManager.getText("item1","IT") );
     //out.print(path);  %>

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Altra considerazione: nella tua JSP fai


    codice:
    <div id="left"> 
    
    <%
    //String path=request.getRealPath(""); //la risorsa di cui voglio il path fisico passando il path relativo
    XMLManager.getText("item1","IT");
     //out.print(path);  %>

    Che non fa certo quel che tu ti aspetti: il risultato del metodo getText(), in quel modo, viene buttato via. Se vuoi "spedire in output" al client il risultato dell'elaborazione, devi, appunto, "spedirla in output":


    codice:
    <div id="left"> 
    
    <%
    //String path=request.getRealPath(""); //la risorsa di cui voglio il path fisico passando il path relativo
    out.print( XMLManager.getText("item1","IT") );
     //out.print(path);  %>

    Ciao.
    grazie , mi era sfuggito

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.