Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    48

    Aiuto:2 tipi di richieste con un solo doPost!!

    Ciao a tutti!
    Ho un'applicazione web che mi permette di eseguire le funzioni seguenti:
    1) caricare (fare upload) un file di testo nel quale, sottoforma di tabella, vengono riportati dati di alcune caratteristiche riguardanti alcune coordinate geografiche, tipo:
    Latitudine Longitudine Feature1 Feature 2 Feature 3

    2)una volta caricati i dati, l'utente può posizionarsi su un'area di una mappa di Google Maps, dalla quale viene estratta la latitudine max e minima e la longitudine max e minima dell'area selezionata.

    3)vengono estratte le intestazioni del file di testo precedentemente caricato e mostrate con una select multipla, in modo tale che possano essere selezionate dall'utente (via ajax).
    Una volta che l'utente ha selezionato le coordinate max e minim e le feature dalla select creata, schiacciando un pulsante viene fatta una richiesta ajax alla servlet per eseguire un post, inviando i dati selezionati. Con questo post vengono estratti dal file caricato in precedenza solo quei dati che rientrano nel range di coordinate selezionate, e che corrispondono alle feature selezionate dall'utente, creando così un file di testo che può essere scaricato dall'utente stesso.

    Ora, il mio problema sta nel fatto che l'upload del file e quest'ultima richiesta alla servlet, vengono fatte entrambe con un POST, e quindi non so come far distinguere al doPost che tipo di richiesta deve soddisfare!

    Ho provato in questo modo, non avendo successo:
    appena richiamata la doPost viene riempito l'oggetto enumeration parameters,
    parameters = request.getParameterNames();

    Poi vado a contare quanti elementi sono contenuti in parameters:
    int p = 0;
    while (parameters.hasMoreElements()) {
    p++;
    }
    se p==0 allora faccio l'upload, altrimenti faccio la seconda richiesta, poichè per la seconda richiesta ho dei parametri da mandare e quindi p sarà sicuramente diverso da 0.
    Invece parameters è sempre uguale a 0, anche se faccio l'altra richiesta...allora c'è qualcosa che non va in come mando i parametri alla post!

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    48
    I parametri li mando in questo modo, attraverso una chiamata ajax:
    function requestKML(dataSource) {
    extractOptions();
    createXmlHttpRequest();
    latmax = document.getElementById("latmax").value;
    latmin = document.getElementById("latmin").value;
    lngmax = document.getElementById("lngmax").value;
    lngmin = document.getElementById("lngmin").value;
    params = "latmax="+encodeURI(latmax)+"&lngmax="+encodeURI(l ngmax)+"&latmin="+encodeURI(latmin)+"&lgnmin="+enc odeURI(lngmin);
    for (i=0; i<selected.length;i++){
    params += "&features"+(i+1)+"="+ encodeURI(selected[i]);
    params += "&number"+(i+1)+"="+ encodeURI(selectedIndex[i]);
    }
    alert(params);
    if(XMLHttpRequestObject) {
    XMLHttpRequestObject.open("POST", dataSource, true);

    XMLHttpRequestObject.onreadystatechange = function() {
    if (XMLHttpRequestObject.readyState == 4) {
    if (XMLHttpRequestObject.status == 200) {
    var xmldoc = XMLHttpRequestObject.responseXML;
    var content = xmldoc.getElementsByTagName('root').item(0).firstC hild.data;
    document.getElementById("link").innerHTML = "<a href=\""+content+"\">Scarica il tuo KML</a>";
    }
    }
    }
    XMLHttpRequestObject.send(params);
    }

    }

    In pratica mi creo la stringa formata da coppie nome/valore concatenate tramite un &, e la mando alla servlet tramite XMLHttpRequestObject.send(params);...ma evidentemente non arriva niente, e non capisco perchè!!!
    Mi potete aiutare, visto che mi manca questo ostacolo a finire questo progetto???

    Grazie mille in anticipo a tutti quelli che interverranno!!

    Ciao ciao
    Angelo

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Forse è un problema di javascript?
    codice:
    function requestKML(dataSource) {
    	extractOptions();
    	createXmlHttpRequest();
    	latmax = document.getElementById("latmax").value;
    	latmin = document.getElementById("latmin").value;
    	lngmax = document.getElementById("lngmax").value;
    	lngmin = document.getElementById("lngmin").value;
    	params = "latmax="+encodeURI(latmax)+"&lngmax="+encodeURI(lngmax)+"&latmin="+encodeURI(latmin)+"&lgnmin="+encodeURI(lngmin);
    	for (i=0; i<selected.length;i++){
    		params += "&features"+(i+1)+"="+ encodeURI(selected[i]);
    		params += "&number"+(i+1)+"="+ encodeURI(selectedIndex[i]); 
    	}
    	alert(params);
    	if(XMLHttpRequestObject) {	    	
    		XMLHttpRequestObject.open("POST", dataSource, true); 
    	
    		XMLHttpRequestObject.onreadystatechange = function() { 
    			if (XMLHttpRequestObject.readyState == 4) {
    				if (XMLHttpRequestObject.status == 200) {
    					var xmldoc = XMLHttpRequestObject.responseXML;
    					var content = xmldoc.getElementsByTagName('root').item(0).firstChild.data;
    					document.getElementById("link").innerHTML = "<a href=\""+content+"\">Scarica il tuo KML</a>";
    				}
    			}
    		}  
    		XMLHttpRequestObject.send(params); 
    	}
    
    }
    Indentiamo il codice così si riesce a leggere (con il tago CODE). Poi, vedo che fai un alert della stringa params... ne esce niente? Altra cosa, dataSource immagino che sia l'URL dello script che riceve i dati in POST, è corretto?

    Detto ciò, hai controllato che la console degli errori o quale altro debugger javascript sia collegato al tuo browser non segnali niente? Se sembra tutto corretto, allora magari il problema è nella servlet
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    48
    Intanto grazie mille!!

    L'alert di params mi scrive correttamente la sequenza dei parametri;
    dataSource è il nome della servlet che viene richiamata;
    lato javascript dovrebbe funzionare tutto;
    mi sembra alquanto strano il fatto che faccio la send dei parametri e poi la servlet non vede niente!
    Ti posto anche il codice della servlet, magari ti fa comodo:
    codice:
    import java.io.*;
    import java.util.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import uk.me.jstott.jcoord.*;
    import com.oreilly.servlet.MultipartRequest;
    
    
    public class UploadServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
           
    	private String webTempPath, filePath, file, result;
    	private MyParser ps;
    	private UTMRef UTMmax, UTMmin; 
    	private LatLng latlngMax, latlngMin;
    	private Enumeration parameters;
    
        public void init( ){   	
        	webTempPath = getServletContext().getRealPath("/") + "tabelle";    
        	try
        	{
        		File file = new File(webTempPath);
        		if (!file.exists()){
        			if (file.mkdir()){
        				System.out.println("Directory di Upload creata");
        			} else {
        				System.out.println("Directory di Upload già esistente");
        			}
        		}
        	}
        	catch (Exception e)
        	{
        	System.err.println("errore\n"+e);
        	}
        }
    
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		processGet(request, response);
    	}
    
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		parameters = request.getParameterNames();
    		System.out.println(parameters.toString());
    		
    		int p = 0;
    		while (parameters.hasMoreElements()) {
    			System.out.println(parameters.nextElement());
    			p++;
    		}				
    		
    		if (p == 0) {
    			upload(request, response);
    		} 
    		else if (p > 0) {// richiesta di creazione file
    			create(request, response);
    		}
    	} 
    	
    
    	protected void processGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    
    		if (filePath != null){
    			ps = new MyParser(filePath);    	
    			result = ps.getColumns();
    			//per togliere le parentesi quadre all'inizio e alla fine
    			result = result.substring(1, result.length()-1);
    		} else {
    			result = "Seleziona prima un Dataset da caricare!";
    		}
    
            response.setContentType("text/xml");
            response.setHeader("Cache-Control", "no-cache");
            PrintWriter out = response.getWriter();
            
            out.println("<?xml version=\"1.0\" standalone=\"yes\"?>");
            out.println("<root>");
            out.println(result);
            out.println("</root>");
    
            out.close();
        }
    	
    	
    	protected void upload(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    		System.out.println("upload");
    		//file limit size of 5 MB
    		MultipartRequest mpr = new MultipartRequest(request,webTempPath,5 * 1024 * 1024);
    		Enumeration enums = mpr.getFileNames( );
    		response.setContentType("text/html");
    		file = mpr.getFilesystemName((String) enums.nextElement());
    		filePath = webTempPath + "\\" + file;
    		PrintWriter out = response.getWriter( );
    
    		out.println("<html>");
    		out.println("<head>");
    		out.println("<title>Servlet upload</title>"); 
    		out.println("</head>");
    		out.println("<body bgcolor=\"#6A95B2\">");
    		out.println("<center><font face=\"Tahoma\" size=\"4\">UPLOAD ESEGUITO!</font>
    
    
    
    ");
    		out.println("<center>The name of uploaded file is: " 
    				+ file + "
    
    ");
    		out.println(webTempPath);
    		out.println("
    
    
    <a href=\"index.html\"><img src=\"ico/home1.gif\"</a></center>");
    		out.println("</body>");
    		out.println("</html>");
    	}
    	
    	
    	protected void create(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    		ArrayList<String> param = new ArrayList<String>();
    		System.out.println("creation");
    		int i = 0;
    		while (parameters.hasMoreElements()) {
    			
    			System.out.println(parameters.nextElement());
    			param.add(i, (String)parameters.nextElement());
    			System.out.println(param.get(i));
    			i++;
    		}
    		latlngMax = new LatLng(Double.parseDouble(param.get(0)), Double.parseDouble(param.get(1)));
    		latlngMin = new LatLng(Double.parseDouble(param.get(2)), Double.parseDouble(param.get(3)));
    		UTMmax = latlngMax.toUTMRef();
    		UTMmin = latlngMin.toUTMRef();
    		
    		param.add(Double.toString(UTMmax.getEasting()));
    		param.add(Double.toString(UTMmax.getNorthing()));
    		param.add(Double.toString(UTMmin.getEasting()));
    		param.add(Double.toString(UTMmin.getNorthing()));
    		
    		result = ps.makeFile(param, webTempPath);
    		response.setContentType("text/xml");
    		response.setHeader("Cache-Control", "no-cache");
    		PrintWriter out = response.getWriter();
    
    		out.println("<?xml version=\"1.0\" standalone=\"yes\"?>");
    		out.println("<root>");
    		out.println(result);
    		out.println("</root>");
    
    		out.close();
    	}
    	
    }
    Questa è la servlet in cui faccio il controllo e chiedo di fare 2 richieste con una sola doPost...però ne ho anche fatta un altra di servlet, per prova, in cui facevo solo la seconda richiesta, nella quale le mando i parametri, ma anche lì non mi vede nessun parametro!

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Può darsi che sia un problema di percorso (dataSource -> Servlet) allora? Se non lo stai già facendo, giusto per prova, passa tutto il percorso alla servlet in dataSource (e intendo dire tutto, incluso http://)
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    48
    Sai cosa? sto facendo tutto in locale...quindi che gli dò http://localhost:8080/...ecc??

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    esatto.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    48
    Niente da fare...mi dice sempre che l'oggetto parameters è vuoto!

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Perfetto, quindi abbiamo accertato che il problema sta nel passaggio AJAX. Prova ad aggiungere dopo
    codice:
    XMLHttpRequestObject.open("POST", dataSource, true);
    Queste linee:
    codice:
    XMLHttpRequestObject.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    XMLHttpRequestObject.setRequestHeader("Content-length", params.length);
    XMLHttpRequestObject.setRequestHeader("Connection", "close");
    Nelle richieste POST la lunghezza di quanto inviato va nell'header (non mi ero accorto prima della sua mancanza).
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    48
    il punto cruciale è che non mi passa i parametri, altrimenti se li passasse allora mi andrebbe a estrarre le informazioni e a scrivere il file, senza problemi (credo!)

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.