Ho un problema che non riesco a risolvere. da un html con un form per inserire i dati di chi si deve registrare al sito dall'action di tale form viene lanciata una servlet.
La servlet verifica se il file registrati.xml esiste, se non esiste lo crea e aggiunge il registrato che ha avuto la fortuna di essere stato il primo a registrarsi al sito.
Se il file invece esiste non fa altro che caricarlo in memoria analizzarlo per vedere se un registrato ha la password uguale a quella dell'utente che sta tentando di registrarsi, se uno ce la uguale allora comunica che la registrazione è fallita causa duplicazione pasword altrimenti agiunge il nuovo registyrato allla struttura ad albero del documento e poi riscrive il file.
Funziona tutto per il primo utente che si registra (viene creato registrati.xml con il primo registrato - c'è perchè ho verificato) poi appena tento di aggiungere altri registrati mi dice che
org.jdom.IllegalAddException: The Content already has an existing parent "registrati"
org.jdom.ContentList.add(ContentList.java:218)
org.jdom.ContentList.add(ContentList.java:140)
java.util.AbstractList.add(AbstractList.java:89)
org.jdom.Element.addContent(Element.java:809)
registrazione.aggiungiRegistrato(registrazione.jav a:67)
registrazione.doPost(registrazione.java:144)
javax.servlet.http.HttpServlet.service(HttpServlet .java:710)
javax.servlet.http.HttpServlet.service(HttpServlet .java:803)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.10 logs.
La struttura del registrati.xml è questa
MENTRE LA SERVLET è QUESTA:codice:<?xml version="1.0" encoding="UTF-8"?> <registrati> <registrato password="p" username="p" ruolo="generico"> <nome>p</nome> <cognome>p</cognome> <via>p</via> <numciv>p</numciv> <city>p</city><area/> <telefono>p</telefono> <provincia>pp</provincia> <cap>p</cap> <nazione>p</nazione> <professione>pp</professione> <data_di_nascita> <giorno /> <mese /> <anno /> </data_di_nascita> </registrato> </registrati>
codice:import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.io.File; import java.util.*; import java.text.*; import org.jdom.*; import org.jdom.input.SAXBuilder; import org.jdom.output.XMLOutputter; import java.util.Iterator; import java.util.List; public class registrazione extends HttpServlet{ StringBuffer buf = new StringBuffer(); Document documento = null; Element elementoRegistrati; Element registrato = new Element("registrato"); String nome,cognome,via,numciv,città,area,telefono,provincia,cap,nazione,professione,giorno_nascita,mese_nascita,anno_nascita,password_inviata,username_inviato; public void aggiungiRegistrato(){ Element element_nome = new Element("nome"); Element element_cognome = new Element("cognome"); Element element_via = new Element("via"); Element element_numciv = new Element("numciv"); Element element_city = new Element("city"); Element element_area = new Element("area"); Element element_telefono = new Element("telefono"); Element element_provincia = new Element("provincia"); Element element_cap = new Element("cap"); Element element_nazione = new Element("nazione"); Element element_professione = new Element("professione"); Element element_giorno = new Element("giorno"); Element element_mese = new Element("mese"); Element element_anno = new Element("anno"); Element nascita = new Element("data_di_nascita"); element_nome.setText(nome); element_cognome.setText(cognome); element_via.setText(via); element_numciv.setText(numciv); element_city.setText(città); element_area.setText(area); element_telefono.setText(telefono); element_provincia.setText(provincia); element_cap.setText(cap); element_nazione.setText(nazione); element_professione.setText(professione); element_giorno.setText(giorno_nascita); element_mese.setText(mese_nascita); element_anno.setText(anno_nascita); nascita.addContent(element_giorno); nascita.addContent(element_mese); nascita.addContent(element_anno); registrato.addContent(element_nome); registrato.addContent(element_cognome); registrato.addContent(element_via); registrato.addContent(element_numciv); registrato.addContent(element_city); registrato.addContent(element_area); registrato.addContent(element_telefono); registrato.addContent(element_provincia); registrato.addContent(element_cap); registrato.addContent(element_nazione); registrato.addContent(element_professione); registrato.addContent(nascita); registrato.setAttribute("password",password_inviata); registrato.setAttribute("username",username_inviato); registrato.setAttribute("ruolo","generico"); elementoRegistrati.addContent(registrato); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ response.setContentType("text/html"); PrintWriter responseOutput = response.getWriter(); String controllo = new String("ok"); //RECUPERO LE INFORMAZIONI INVIATE DAL FORM nome = request.getParameter("nome"); cognome = request.getParameter("cognome"); via = request.getParameter("via"); numciv =request.getParameter("numciv"); città =request.getParameter("città"); area =request.getParameter("area"); telefono =request.getParameter("telefono"); provincia =request.getParameter("provincia"); cap =request.getParameter("cap"); nazione =request.getParameter("nazione"); professione =request.getParameter("professione"); giorno_nascita = request.getParameter("giorno_nascita"); mese_nascita = request.getParameter("mese_nascita"); anno_nascita = request.getParameter("anno_nascita"); password_inviata = request.getParameter("password_registrazione"); username_inviato = request.getParameter("username_registrazione"); //CONTROLLO SE ESISTE GIA' UN FILE .XML CHE SI CHIAMA REGISTRATI String path = new String ("../webapps/restaurants/xml/registrati.xml"); File file = new File(path); //SE IL FILE NON ESISTE LO CREO E GLI AGGIUNGO L'ELEMENTO RADICE IL PRIMO REGISTRATO if (!file.exists()){ file.createNewFile(); elementoRegistrati = new Element("registrati"); //AGGIUNGO IL REGISTARTO CHE RISULTA IL PRIMO DATO CHE IL FILE REGISTRATI.XML NON ESISTEVA aggiungiRegistrato(); //SCRIVO IL DOCUMENT NEL FILE documento = new Document(elementoRegistrati); XMLOutputter xmlOutputter = new XMLOutputter(); try{ FileOutputStream fileOutputStream = new FileOutputStream(new File(path)); xmlOutputter.output(documento, fileOutputStream); } catch (FileNotFoundException ex){ System.err.println(ex); } catch (IOException ex){ System.err.println(ex); } } else{ //SE IL FILE ESISTE LO CARICO IN MEMORIA SAXBuilder saxBuilder = new SAXBuilder(); try{ documento = saxBuilder.build(new File(path)); } catch (JDOMException ex){ System.err.println(ex); } catch (IOException ex){ System.err.println(ex); } //POI UNA VOLTA CARICATO CONTROLLO CHE NON CI SIA GIA' UN REGISTRATO CON TALE LOGIN E SE NON C'è INSERISCO IL NUOVO REGISTRATO ALTRIMENTI GLI DICO DI CAMBIARE LOGIN elementoRegistrati = documento.getRootElement(); List lista_registrati = elementoRegistrati.getChildren(); // ottengo un iteratore alla lista chiamando il metodo iterator() di Collection (essendo una list una collection) Iterator iteratore = lista_registrati.iterator(); while (iteratore.hasNext()) { // ottengo l'elemento corrente chiamando next() sull'iteratore Element registrato_corrente = (Element)iteratore.next(); String username = registrato_corrente.getAttributeValue("username"); String password = registrato_corrente.getAttributeValue("password"); if (password_inviata.equals(password)){ buf.append("Password già presente, sceglierla diversamente"); controllo = new String("ko"); break; } } if (controllo.equals("ok")){ //RISCRIVO L'INTERO DOCUMENTO NEL FILE XML DOPO AVER AGGIUNTO IL REGISTRATO aggiungiRegistrato(); XMLOutputter xmlOutputter = new XMLOutputter(); //IL METODO SEGUENTE Format.getPrettyFormat() SERVE PER SCRIVERE SUL FILE XML IN MODO BEN FORMATTATO CON GLI A CAPO E LE INDENTAZIONI PER OGNI ELEMENTO, MA NON ME LO ACCETTA //xmlOutputter.setFormat(Format.getPrettyFormat()); try{ FileOutputStream fileOutputStream = new FileOutputStream(new File(path)); xmlOutputter.output(documento, fileOutputStream); } catch (FileNotFoundException ex){ System.err.println(ex); } catch (IOException ex){ System.err.println(ex); } } } responseOutput.println(buf.toString()); responseOutput.close(); } }

Rispondi quotando