Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    31

    come fa una servlet a ricevere un paramentro da una jsp?

    Ciao, dalla domanda si capisce che mi sto approcciando per la prima volta all'argomento, perchè penso di non aver proprio capito il meccanismo che le collega.
    Sono riuscita a fare la prima parte dove una jsp1 prende gli elementi di un vettore (passato con servlet1) e li stampa sottoforma di tabella:

    <%for (Cliente cliente:clienti){ %>
    <tr>
    <td><%=cliente.getId() %></td>
    <td><%=cliente.getNome() %></td>
    <td><%=cliente.getCognome() %></td>
    <td> <a href="Elimina?id=<%=cliente.getId() %>" >Elimina</a></td>

    </tr>
    <%} %>

    Ora vorrei che cliccando sul link Elimina venisse eliminato dal vettore l'oggetto corrispondente al suo id; ma sinceramente, pur avendo cercato in rete, non ho capito come implementare la mia servlet2 Elimina, direi con un doGet. Ma una volta eliminato l'oggetto dal vettore, come faccio a visualizzare di nuovo la tabella aggiornata?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da cri43 Visualizza il messaggio
    Ciao, dalla domanda si capisce che mi sto approcciando per la prima volta all'argomento, perchè penso di non aver proprio capito il meccanismo che le collega.
    Quando il risultato di una Servlet/JSP è arrivato al client (tipicamente browser) e la response è quindi terminata, l'unico modo per far eseguire di nuovo una Servlet/JSP è quello di fare un'altra request al server. Tramite un link (in GET) o tramite l'invio di un form (in GET o POST) e i "parametri" (quelli intesi da getParameter(String name) e affini di (Http)ServletRequest) possono arrivare o tramite query param nel URL o nel body della request (se in POST da un form).

    Quote Originariamente inviata da cri43 Visualizza il messaggio
    come faccio a visualizzare di nuovo la tabella aggiornata?
    Facendo un "forward" alla pagina JSP. Come presumibilmente hai già fatto per passare dalla servlet 1 a quella pagina JSP.

    Poi visto che parli di "vettore", bisogna anche vedere come è gestito cioè dove è memorizzato. È persistente tra richieste differenti? O è creato ad ogni request? E in che modo?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    31
    Il vettore è inizializzato molto semplicemente nella servlet1; questo è il doGet:

    Vector<Cliente> clienti = new Vector<Cliente>();
    Cliente cliente1=new Cliente(1,"marrrio","rossi");
    Cliente cliente2=new Cliente(2,"mario","rossi");
    Cliente cliente3=new Cliente(3,"marioooo","rossi");
    clienti.add(cliente1);
    clienti.add(cliente2);
    clienti.add(cliente3);


    request.setAttribute("clienti", clienti);
    request.getRequestDispatcher("cliente.jsp").forwar d(request, response);



    A questo punto cliente.jsp mostra sul browser la tabella, e cliccando su uno dei link Elimina devo cancellare il corrispondente cliente.
    Quindi il forward deve essere fatto di nuovo a cliente.jsp...quando ho provato però mi indirizzava in una pagina bianca del browser; beh chiaramente sbaglio il codice, ne sono consapevole.
    Pur vergognandomi, questo è quello che ho scritto:

    String parametro=request.getParameter("id"); //per prendere l'id dalla jsp

    Vector<Cliente> clienti = new Vector<Cliente>();
    boolean esito;
    for (Cliente cliente:clienti){
    int id=cliente.getId();
    String s = Integer.toString (id);

    if(parametro.equals(s)){

    esito=clienti.removeElement(cliente);
    if(esito)

    request.getRequestDispatcher("cliente.jsp").forwar d(request, response);
    }}

    Forse si evince che non conosco bene neppure java.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da cri43 Visualizza il messaggio
    Il vettore è inizializzato molto semplicemente nella servlet1;
    E nella servlet2? Viene ricreato questo Vector? Perché visto che il Vector lo metti nel request scope, una volta terminato il ciclo di questa request/response verso il client .... il tuo oggetto Vector sparisce completamente!

    Quote Originariamente inviata da cri43 Visualizza il messaggio
    codice:
    String parametro=request.getParameter("id");  //per prendere l'id dalla jsp
        
        Vector<Cliente> clienti = new Vector<Cliente>();
                boolean esito;
                for (Cliente cliente:clienti){
                            int id=cliente.getId();
            String s = Integer.toString (id);
    
            if(parametro.equals(s)){
                    
                    esito=clienti.removeElement(cliente);
                    if(esito)
                    
                request.getRequestDispatcher("cliente.jsp").forward(request, response);
    }}
    Visto che il id del cliente è un int, sarebbe più ragionevole e sensato effettuare il parsing del parametro, ottenere un int e poi confrontare int ... non confrontare stringhe!

    C'è comunque anche un altro problema: se stai iterando sui clienti, non puoi usare removeElement sulla collezione mentre stai iterando sulla collezione stessa! In questi casi meglio usare il Iterator esplicitamente e usare il suo remove() (non i remove della collezione).

    Ma il punto comunque non sono questi aspetti .... ma proprio la gestione del Vector.

    Quote Originariamente inviata da cri43 Visualizza il messaggio
    Forse si evince che non conosco bene neppure java.
    Il problema (lo dico senza voler criticare) è che arrivare a Servlet/JSP senza avere le idee chiare su Java ..... questo sì che è un bel problema.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    31
    Sì, lo so, a volte non voglio neanche postare le domande perchè le risposte potrebbero essere banali, ma ho l'esigenza di dover imparare in contemporanea, purtroppo!
    Quindi, vediamo se ho capito...mi stai dicendo che il vettore così fatto ha tempo di vita di una request/response, quindi una volta invocata la jsp sparisce, e quindi dovrei ricrearlo nella seconda servlet senza una delle righe, cioè quella corrispondente all'id che passo dalla jsp?
    Immagino che l'istruzione per farlo non sia quella che ho scritto :P
    ---------------------------------------------
    Allora, nella seconda servlet ho scritto:

    Vector<Cliente> clienti = new Vector<Cliente>();
    Cliente cliente1=new Cliente();
    Cliente cliente2=new Cliente(2,"mario","rossi");
    Cliente cliente3=new Cliente(3,"marioooo","rossi");
    clienti.add(cliente1);
    clienti.add(cliente2);
    clienti.add(cliente3);


    request.setAttribute("clienti", clienti);
    request.getRequestDispatcher("cliente.jsp").forwar d(request, response);

    Cliccando sul link elimina del primo cliente adesso riappare la tabella, ma con la prima riga tutta di null.
    Ultima modifica di cri43; 18-04-2015 a 16:53

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da cri43 Visualizza il messaggio
    mi stai dicendo che il vettore così fatto ha tempo di vita di una request/response, quindi una volta invocata la jsp sparisce
    Se lo crei nella servlet1 e lo metti solo nel "request scope", una volta terminata la response, cioè dopo aver inviato al client tutto quanto generato dinamicamente dalla JSP .... sì, sparisce.

    Quote Originariamente inviata da cri43 Visualizza il messaggio
    e quindi dovrei ricrearlo nella seconda servlet senza una delle righe
    Ma se anche nella servlet2 ricrei il Vector con tutti i dati come in servlet1 e poi in base al id vai a rimuovere quello richiesto ... certo poi nell'output vedi l'elemento rimosso (ok) ma se richiedi di nuovo servlet1 li rivedi tutti .... quale è lo scopo finale di tutto questo?
    Se stai solo "giocherellando" per provare questi concetti, ovviamente va bene.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    31
    Sì esattamente! Lo scopo è vedere il funzionamento, cioè verificare se effettivamente i parametri vengono passati, ecc...
    Dopo (ma moooolto dopo) dovrò prelevare e modificare i dati da un db.
    Comunque grazie per i chiarimenti

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.