Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,509

    [Java] - Problemi con un if...else if...else if...else

    Da una form in una jsp posso inserire autore e/o titolo di un libro in modo tale che poi mi venga mostrata una tabella con i risultati.
    Funziona tutto correttamente se inserisco il nome dell'autore, oppure il titolo del libro (anche se sono sbagliati il tutto viene gestito correttamente), non funziona invece se metto entrambi o se non metto niente.
    Spiego cosa succede:
    - se metto sia autore che titolo: viene comunque eseguita la query che mi ritorna l'elenco di tutti i libri di quell'autore nel database invece del solo libro specifico
    - se non metto niente: ottengo una pagina vuota invece della errsearch.jsp (che ho visualizzato da parte ed è corretta)

    Questo è il codice che ho scritto, cosa c'è che non va?
    codice:
        String _autore = "";
        String _titolo = "";
        String address = "";
    ...
        Statement stmt = dbconn.createStatement();
        ResultSet rs = null;
        _autore = request.getParameter("autore");
        _titolo = request.getParameter("titolo");
        if(!_autore.equals("") && !_titolo.equals("")) { //se entrambi i campi del form non erano vuoti
            //cerca nel DB la corrispondenza sia per autore che per titolo
            rs = stmt.executeQuery("Select ISBN, authors, title, summary FROM book WHERE authors='"+_autore+"' AND title='"+_titolo+"';");
        }
        else if(!_autore.equals("")) { //se il campo autore non era vuoto
            //cerca nel DB la corrispondenza solo per autore
            rs = stmt.executeQuery("Select ISBN, authors, title, summary FROM book WHERE authors='"+_autore+"';");
        }
        else if(!_titolo.equals("")) { //se il campo titolo non era vuoto
            //cerca nel DB la corrispondenza solo per titolo
            rs = stmt.executeQuery("Select ISBN, authors, title, summary FROM book WHERE title='"+_titolo+"';");
        }
        else { //se il campo autore e il campo titolo erano vuoti
            //non bisogna cercare niente, c'è stato un errore nell'inserimento
            address="/errsearch.jsp";
            RequestDispatcher dispatcher = request.getRequestDispatcher(address);
            dispatcher.forward(request, response);
        }
        if(rs.next()==false){ //se non ho trovato nessuna corrispondenza nel DB
            address="/noresult.jsp"; //vado alla pagina che notifica l'assenza del libro
        }
        else { //se è stata trovata qualche corrispondenza
            address="/searchresult.jsp"; //vado alla pagina che mostrerà i risultati della ricerca
        }

  2. #2
    - se non metto niente: ottengo una pagina vuota invece della errsearch.jsp (che ho visualizzato da parte ed è corretta)
    Questa parte di codice viene eseguita sempre e comunque... dovresti eseguirla solo se hai fatto una query... (quindi non il 4 caso)

    codice:
    if(rs.next()==false){ //se non ho trovato nessuna corrispondenza nel DB
      address="/noresult.jsp"; //vado alla pagina che notifica l'assenza del libro
    }
    else { //se è stata trovata qualche corrispondenza
      address="/searchresult.jsp"; //vado alla pagina che mostrerà i risultati della ricerca
    }

  3. #3
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,509
    Infatti se non faccio nessuna query dovrebbe vuol dire che viene eseguito il codice dentreo l'ultimo else dell'if...else if...else if...else e dentro questo l'ultima istruzione è: dispatcher.forward(request, response);
    e il forward una volta eseguito dovrebbe terminare da solo l'esecuzione della servlet, o no?

  4. #4
    Allora ti consiglio di fare un po' di buon vecchio debugging, mettendoci un po' di System.out

    Prova così... che valori hanno autore e titolo? Il flusso logico ti torna?

    codice:
    System.out.println("autore: " + _autore); 
    System.out.println("titolo: " + _titolo); 
    if(!_autore.equals("") && !_titolo.equals("")) { //se entrambi i campi del form non erano vuoti
            //cerca nel DB la corrispondenza sia per autore che per titolo
            rs = stmt.executeQuery("Select ISBN, authors, title, summary FROM book WHERE authors='"+_autore+"' AND title='"+_titolo+"';");
    System.out.println("Primo if"); 
        }
        else if(!_autore.equals("")) { //se il campo autore non era vuoto
            //cerca nel DB la corrispondenza solo per autore
            rs = stmt.executeQuery("Select ISBN, authors, title, summary FROM book WHERE authors='"+_autore+"';");
    System.out.println("Secondo if"); 
        }
        else if(!_titolo.equals("")) { //se il campo titolo non era vuoto
            //cerca nel DB la corrispondenza solo per titolo
            rs = stmt.executeQuery("Select ISBN, authors, title, summary FROM book WHERE title='"+_titolo+"';");
    System.out.println("Terzo if"); 
        }
        else { //se il campo autore e il campo titolo erano vuoti
            //non bisogna cercare niente, c'è stato un errore nell'inserimento
            address="/errsearch.jsp";
            RequestDispatcher dispatcher = request.getRequestDispatcher(address);
            dispatcher.forward(request, response);
    System.out.println("Else"); 
        }
        if(rs.next()==false){ //se non ho trovato nessuna corrispondenza nel DB
            address="/noresult.jsp"; //vado alla pagina che notifica l'assenza del libro
    System.out.println("No Result"); 
        }
        else { //se è stata trovata qualche corrispondenza
            address="/searchresult.jsp"; //vado alla pagina che mostrerà i risultati della ricerca
    System.out.println("Search Result"); 
        }
    Fammi sapere

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Io consiglio di cominciare ad utilizzare correttamente l'indentazione. Il codice che hai postato è indentato in modo pessimo, non rispecchiando l'effettiva logica.

    Ricorda che un blocco if -else -if -else di questo tipo (indentazione pessima)
    codice:
    if( condizione ) {
       ...
    } else if( condizione ) {
       ...
    } else {
       ...
    }
    è strutturato logicamente in questo modo:

    codice:
    if( condizione ) {
       ...
    } else {
       if( condizione ) {
          ...
       } else {
          ...
       }
    }
    I due codici sono del tutto equivalenti. Solo che il secondo è scritto meglio.


    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

  6. #6
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,509
    Originariamente inviato da non_pervenuto
    Allora ti consiglio di fare un po' di buon vecchio debugging, mettendoci un po' di System.out

    Fammi sapere
    La servlet non apre la console, quindi niente stampe a video.

    Ho cambiato anche l'indentazione, ma era già corretto come l'avevo scritto il codice, dunque continua a non funzionare come dovrebbe.

    Dal form vengono sicuramente presi correttamente l'autore e il titolo, altrimenti non funzionerebbe neanche se ne scrivo uno alla volta e invece in tali casi il codice fa ciò che mi aspetterei.
    Sembra che la prima condizione però risulti sempre falsa... una cosa stupida, ma iniziano a venirmi tutti i dubbi possibili:
    if (!_autore.equals("") && !_titolo.equals("")) vol dire "se _autore è diverso da "" E _titolo è diverso da "" "?

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 © 2026 vBulletin Solutions, Inc. All rights reserved.