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.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
ho complicato un po' le cose..
XMLManager:
index.jspcodice:package it.unirc.bd2.juventusclubdoc.util; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; 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) throws URISyntaxException { //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 URL url=XMLManager.class.getResource("Data_"+country+".xml"); File file=new File(url.toURI()); // creo l'oggetto di tipo file che è l'input //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 ""; } }
codice:<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ page import="it.unirc.bd2.juventusclubdoc.util.XMLManager"%> <!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>JuventusClubDOC</title> <link href="CSS/style.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="header"> </div> <div id="container"> <% String language=request.getParameter("language"); if("".equals(language)) language="IT"; %> <div id="middle"> <ul id="menu"> <li><a href="index.jsp">Home</a></li> <li> <a href="tesseramento.jsp"> <% out.print(XMLManager.getText("item3",language));%> </a> <ul> <li> <a href="#">Juventus-Milan (C.Italia)</a> <ul> <li> <a href="#">Biglietti</a> </li> <li> <a href="#">TerzoTempoDOC</a> < </li> <li> <a href="#">WalkAbout</a> </li> </ul> </li> <li> <a href="#">Juventus-Galatasaray</a> <ul> <li> <a href="#">Biglietti</a> </li> <li> <a href="#">TerzoTempoDOC</a> </li> <li> <a href="#">WalkAbout</a> </li> </ul> </li> <li> <a href="#">Juventus-Parma</a> <ul> <li> <a href="#">Biglietti</a> </li> <li> <a href="#">TerzoTempoDOC</a> </li> <li> <a href="#">WalkAbout</a> </li> </ul> </li> </ul> </li> <li> <a href="biglietti&abbonamenti.jsp"><% out.print(XMLManager.getText("item4",request.getParameter("language")));%></a> <ul> <li> <a href="Milan.html">Juventus-Milan (C.Italia)</a> </li> <li> <a href="#">Lazio-Juventus</a> </li> </ul> </li> </li> <li> <a href="trasferte.jsp"><% out.print(XMLManager.getText("item5",request.getParameter("language")));%></a> </li> <li> <a href="contatti.jsp"><% out.print(XMLManager.getText("item6",request.getParameter("language")));%></a> </li> <li> <a href="login.jsp">Login</a> </li> </ul> <div id="spazio"> </div> <a href="index.jsp?language=IT"><img src="img/bandiera_italiana.jpg" ></a> <a href="index.jsp?language=ENG"><img src="img/bandinglese.gif" ></a> <div id="tabella1"> <div align="center"> <titolo> <% out.print(XMLManager.getText("item1",request.getParameter("language")));%> </titolo> </div> </div> <div id="spazio"> </div> <img width="168" height="144" style="cursor: -moz-zoom-in;" src="img/scirea.jpg" onclick="this.width=960;this.height=603;" ondblclick="this.width=168;this.height=144;" title="cena" alt="testo alternativo" /> <img width="168" height="144" style="cursor: -moz-zoom-in;" src="img/coppa.jpg" onclick="this.width=960;this.height=640;" ondblclick="this.width=168;this.height=144;" title="scudetto" alt="testo alternativo" /> <img width="168" height="144" style="cursor: -moz-zoom-in;" src="img/soci.jpg" onclick="this.width=800;this.height=800;" ondblclick="this.width=168;this.height=144;" title="soci" alt="testo alternativo" /> <img width="168" height="144" style="cursor: -moz-zoom-in;" src="img/risto.jpg" onclick="this.width=960;this.height=720;" ondblclick="this.width=168;this.height=144;" title="festeggiamenti" alt="testo alternativo" /> <img width="168" height="144" style="cursor: -moz-zoom-in;" src="img/32.jpg" onclick="this.width=720;this.height=960;" ondblclick="this.width=168;this.height=144;" title="maglia celebrativa" alt="testo alternativo" /> <div id="tabella1"> <descrizione> <% out.print(XMLManager.getText("item2",request.getParameter("language")));%> </descrizione> </div> <img width="168" height="144" style="cursor: -moz-zoom-in;" src="img/cena.jpg" onclick="this.width=960;this.height=640;" ondblclick="this.width=168;this.height=144;" title="cena" alt="testo alternativo" /> <img width="168" height="144" style="cursor: -moz-zoom-in;" src="img/arena.jpg" onclick="this.width=960;this.height=720;" ondblclick="this.width=168;this.height=144;" title="arena" alt="testo alternativo" /> <img width="168" height="144" style="cursor: -moz-zoom-in;" src="img/bandiere.jpg" onclick="this.width=960;this.height=720;" ondblclick="this.width=168;this.height=144;" title="bandiere" alt="testo alternativo" /> <img width="168" height="144" style="cursor: -moz-zoom-in;" src="img/barnabeu.jpg" onclick="this.width=960;this.height=640;" ondblclick="this.width=168;this.height=144;" title="barnabeu" alt="testo alternativo" /> <img width="168" height="144" style="cursor: -moz-zoom-in;" src="img/ita.jpg" onclick="this.width=800;this.height=597;" ondblclick="this.width=168;this.height=144;" title="curva" alt="testo alternativo" /> </div> </body> </html>
type Exception report
message java.lang.NullPointerException
description The server encountered an internal error that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException: java.lang.NullPointerException
org.apache.jasper.servlet.JspServletWrapper.handle JspException(JspServletWrapper.java:549)
org.apache.jasper.servlet.JspServletWrapper.servic e(JspServletWrapper.java:470)
org.apache.jasper.servlet.JspServlet.serviceJspFil e(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspSe rvlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet .java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilt er(WsFilter.java:52)
root cause
java.lang.NullPointerException
it.unirc.bd2.juventusclubdoc.util.XMLManager.getTe xt(XMLManager.java:32)
org.apache.jsp.index_jsp._jspService(index_jsp.jav a:94)
org.apache.jasper.runtime.HttpJspBase.service(Http JspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet .java:727)
org.apache.jasper.servlet.JspServletWrapper.servic e(JspServletWrapper.java:432)
org.apache.jasper.servlet.JspServlet.serviceJspFil e(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspSe rvlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet .java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilt er(WsFilter.java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.52 logs.
il problema è che se io vado manualmente a scrivere IT per ottenere l'url, all'interno della classe xmlmanager,funziona tutto e riesco a fare il passaggio dalla lingua inglese ad italiano senza problemi
se riavvio eclipse e mi ricompare sempre questo errore
come mai?
Innanzitutto, l'ho precisato prima, c'è un build() che accetta URL. Se hai un URL e la API (SAXBuilder) accetta URL, usa quello, non lanciarti mai in conversioni che potrebbero non essere appropriate in tutti i contesti.
E comunque se il punto incriminato da
java.lang.NullPointerException
it.unirc.bd2.juventusclubdoc.util.XMLManager.getTe xt(XMLManager.java:32)
è File file=new File(url.toURI());
allora significa che url è null, dovuto alla risorsa che non è stata trovata. Per come è specificato, Data_xyz.xml deve trovarsi nello stesso package della classe XMLManager. Ovvero, nella directory dove viene creato XMLManager.class deve esserci quel file.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
il file xml si trova nello stesso package di xmlmanager