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

    Visualizzare dati dal DB in modo che siano cliccabili [JSP-MVC]

    Qual'è la procedura corretta in Java-JSP utilizzando il pattern MVC per recuperare dati da un database, visualizzarli su una pagina jsp in modo che questi siano cliccabili, quindi una volta cliccato su uno specifico dato, passare nella richiesta informazioni realtive al dato al quale si vuole accedere.

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2014
    Messaggi
    10
    Facciamo un esempio con un catalogo di libri: dalla jsp accedo al bean che ha il compito di recuperare le informazioni come titolo autore ecc dalla tabella libri, questi vegono visualizzati come apunto un elenco di nomi statici, non è possibile interagire con essi. Come si può ottenre invece i dati in modo tale che ci possa cliccare sopra ad esempio per comprarli?

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    La struttura dovrebbe essere questa:

    1) Un bean che contiene i dati del Libro.
    2) Una Servlet che effettua l'interrogazione al DB, crea l'elenco di oggetti Libro (esempio un ArrayList<Libro>), li mette in request (o session) e richiama la JSP
    3) La JSP compone l'HTML prendendo i dati dall'oggetto (l'ArrayList) in request/session.

    Supponendo che tu abbia già un bean "Libro" con i dati del libro come l'ID, Il titolo, l'autore;
    supponendo che la servlet che effettua l'interrogazione e la costruzione dell'arraylist sia già fatta e che l'arraylist sia inserito in request col nome di "elencoLibri";

    Il bean, grossomodo:

    codice:
    public class Libro {
       private int idLibro;
       private String titolo;
       private String autore;
    
       ...  // getter e setter
    }

    La JSP è banalmente qualcosa del genere:


    codice:
    <html>
    ...
       <body>
          ...
          <ul>
          <c:forEach items="${elencoLibri}" var="libro">
             <li><a href="<c:url value="/visDettaglio?idLibro=${libro.idLibro}" />">${libro.titolo} - ${libro.autore}</a></li>
          </c:forEach>
          </ul>
          ...
       </body>
    </html>

    In questo caso io assumo che esista una servlet che risponde alla risorsa "visDettaglio", che si occuperà di prelevare l'ID del libro che gli viene passato come parametro in GET (nome parametro "idLibro"), effettuare una richiesta al DB per avere i dettagli di quel libro, valorizzare tutti i bean necessari e poi richiamare una JSP per visualizzare il dettaglio del libro.



    Ciao.
    Ultima modifica di LeleFT; 11-02-2014 a 17:57
    "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

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2014
    Messaggi
    10
    Ciao, guarda non so come ringraziarti, stavo impazzendo per una cavolata del genere... pensavo pure di essermi spiegato malissimo invece tu hai colto appieno il significato di ciò che volevo fare!! e non so come hai fatto sinceramente...

    Di fare come mi hai suggerito tu ci avevo pensato ma credevo che non fosse l'ideale per il pattern MVC ma a quanto pare mi sbagliavo! L'esempio che hai seguito è proprio appropriato perchè devo fare una libreria online e hai pure rispettato i nomi delle classi e dei parametri che sto usando io.

    Dunque io lo fare imitando il tuo codice ma sostituendo i tag <c: e il dollaro con il classico linguaggio di java mettendo tutto dentro <% %> è sbagliato?? Perchè quei tag non li consoco proprio e a lezione non li hanno spiegati..
    Grazie ancora infinite!!

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2014
    Messaggi
    10
    Perchè il mio problema principale è che devo seguire l'MVC e nella jsp non dovrei mettere codice java

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Quote Originariamente inviata da zipale99 Visualizza il messaggio
    Dunque io lo fare imitando il tuo codice ma sostituendo i tag <c: e il dollaro con il classico linguaggio di java mettendo tutto dentro <% %> è sbagliato?? Perchè quei tag non li consoco proprio e a lezione non li hanno spiegati..
    Grazie ancora infinite!!
    Non è sbagliato è solo "obsoleto": sono anni che non si usa più il vecchio scriptlet, in favore di librerie/framework più duttili. In particolare, i tag <c: fanno parte della libreria JSTL, che dovrebbero essere "il minimo" che si insegna al giorno d'oggi. Ripeto: non è sbagliato sostituirli con i vecchi scriptlet JSP: il risultato è equivalente, solo meno manutenibile.


    Quote Originariamente inviata da zipale99 Visualizza il messaggio
    Perchè il mio problema principale è che devo seguire l'MVC e nella jsp non dovrei mettere codice java
    Attenzione a non confondere il pattern MVC (che separa il modello dei dati, dalla logica di business e dalla presentation), con ciò che puoi o non puoi fare nella presentation.

    Il pattern MVC dice che nelle View (le pagine JSP) non devi mettere logica di business (ovvero, non devi far fare alla JSP il lavoro sporco della Servlet... come reperire i dati da DB). Ma non ti vieta di usare scriptlet Java nelle JSP... le JSP devono poter fare "logica di presentazione", altrimenti sarebbero inutili.

    E' anche per quello non ho usato scriptlet JSP, ma la libreria JSTL (Java Standard TAG Library) ed EL (Expression Language). Perchè queste "tecnologie" permettono di evitare lo scriptlet in favore di modelli di presentazione più efficati e manutenibili. Ma se non te li hanno insegnati, devi ricorrere per forza ad un minimo di codice Java... almeno per il ciclo for. E, ripeto: questo non è contrario al pattern MVC.


    Ciao.
    Ultima modifica di LeleFT; 12-02-2014 a 11:07
    "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

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2014
    Messaggi
    10
    Ciao LeleFT, scusa ma non so come ti chiami, ogni singola parola che dici mi aiuta definitivamente a chiarire ogni dubbio che avevo in questi giorni prima di scrivere qua sul forum. Lo so che magari era una cavolata ma io davvero non sapevo più dove andare a cercare informaizoni a riguardo! Sul web o sui libri non trovavo risposte... Ero proprio confuso su ciò che potevo o non potevo mettere nella jsp e volevo fare una cosa praticamente impossibile senza conoscere la libreria jstl e senza voler impiegare l'uso di codice java nella jsp. Conoscendo solo i tag get e set properties ero arrivato a fare in modo che il bean una volta recuperati i dati dal db, li stampasse assieme al codice html necessario a generare la tabella con i nomi cliccabili. e poi chiamarmi il suddetto metodo di stampa dalla jsp con il semplice tag get properties. Ma effettivamente in questo modo la jsp non faceva alcuna Presentation.

    Ecco l'esempio che ti dicevo, qua per ogni riga mettevo un bottone in cui una volta cliccato chiamava il controller
    e gli passava come parametr l'id del libro da acquistare.

    Catalogo.java
    codice:
    [...]
    public String getSelezionalibro() throws SQLException{
            String url = "jdbc:derby://localhost:1527/sample;";
            String user = "app";
            String pwd = "app";
            Connection conn = DriverManager.getConnection(url,user,pwd);
            Statement st = conn.createStatement();
            String out="";
            ResultSet rs =st.executeQuery("SELECT * FROM LIBRI");
            out+="<table> <tr><th>ID</th><th>Titolo</th><th>Autore</th><th>Prezzo</th></tr>";
            while(rs.next()){
                out+="<tr><td>"+rs.getInt("ID")+"</td><td> "+ rs.getString("TITOLO") + "</td><td> "+ rs.getString("AUTORE") +"</td> <td> " + rs.getDouble("PREZZO") +"</td>";
                out+="<td><button onclick=\"top.location.href = 'Controller?operazione=aggiungialcarrello&id="+rs.getInt("ID")+"'\">Aggiungi al Carrello</button></td></tr>";
            }
            out+="</table>";
            rs.close(); st.close(); conn.close();
            return out;
        }

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2014
    Messaggi
    10
    Comunque ora mi rivedo bene il programma del corso ma sono sicuro al 100% che le jstl non c'è le hanno spiegato, ecco altra cosa, ormai leggo e sento in giro che praticamente ovunque si utilizzano framework, non capisco perchè nelle università non vengano spiegati...

    Da quest'anno hanno iniziato solo ad accennare dell'esistenza di Spring, peccato perchè immagino poi che nelle aziende uno si troverà in difficoltà a non consocere certe cose.. Vorrà dire che ci si metterà da autodidatta!

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Quote Originariamente inviata da zipale99 Visualizza il messaggio
    Ecco l'esempio che ti dicevo, qua per ogni riga mettevo un bottone in cui una volta cliccato chiamava il controller
    e gli passava come parametr l'id del libro da acquistare.

    No, infatti, non è quello il modo procedere. Immagino che "Catalogo.java" sia il tuo bean... in questo caso stavi addirittura mescolando tutto assieme: logica di presentazione, logica di business e modello dei dati.

    Il bean (modello dei dati) dovrebbe essere solamente un contenitore di dati. I dati glieli deve fornire il controller (la logica di business = servlet)
    La servlet deve fare la logica di business (il lavoro sporco): interrograre il DB, creare i beans per contenere i dati, mettere questi beans a disposizione della view e passare la palla a quest'ultima.
    La view deve solo occuparsi di prendere i dati che gli sono stati forniti e visualizzarli.

    Questo è il pattern MVC. Più avanti ti posto una bozza molto sintetica dell'intera struttura.


    Quote Originariamente inviata da zipale99 Visualizza il messaggio
    Comunque ora mi rivedo bene il programma del corso ma sono sicuro al 100% che le jstl non c'è le hanno spiegato, ecco altra cosa, ormai leggo e sento in giro che praticamente ovunque si utilizzano framework, non capisco perchè nelle università non vengano spiegati...

    Da quest'anno hanno iniziato solo ad accennare dell'esistenza di Spring, peccato perchè immagino poi che nelle aziende uno si troverà in difficoltà a non consocere certe cose.. Vorrà dire che ci si metterà da autodidatta!

    Purtroppo conosco la situazione delle università italiane. Ci si deve "adattare"...


    Un abbozzo della struttura MVC di quello che stai facendo: se dobbiamo permettere all'utente di visualizzare un elenco di libri (e, quindi, successivamente poter selezionare un libro), allora si vedono questi 3 elementi:

    1) Un bean "Libro" (Model), che serve a contenere i dati del libro.
    2) Una Servlet (Controller), che effettua l'interrogazione sul DB per reperire tutti i libri, crea una serie di istanze del bean Libro (una per ciascun libro nel DB) e la fornisce ad una JSP per la visualizzazione
    3) Una JSP (View) che visualizza il risultato dell'elaborazione


    Libro.java

    codice:
    public class Libro {
       private int idLibro;   // Suppongo che l'ID sia un intero
       private String titolo;
       private String autore;
    
       public int getIdLibro() { return idLibro; }
       public String getTitolo() { return titolo; }
       public String getAutore() { return autore; }
    
       public void setIdLibro(int idLibro) { this.idLibro = idLibro; }
       public void setTitolo(String titolo) { this.titolo = titolo; }
       public void setAutore(String autore) { this.autore = autore; }
    }

    La servlet (metto solo il metodo doGet):

    codice:
    public class GestioneLibri extends HttpServlet {
       ...
       @Override
       protected void doGet(HttpServletRequest request,
                            HttpServletResponse response) throws ServletException, IOException {
    
          // Dico che la response sarà un documento HTML
          response.setContentType("text/html");
    
          // Recupero dal DB l'elenco dei libri
          List<Libro> listaLibri = recuperaLibriDaDb();
    
          // Inserisco l'elenco dei libri in request
          request.setAttribute("elencoLibri", listaLibri);
    
          // Passo la palla alla view (la pagina "listaLibri.jsp")
          request.getRequestDispatcher("listaLibri.jsp").forward(request, response);
       }
       ...
       private List<Libro> recuperaLibriDaDb() {
          List<Libro> ret = new ArrayList<Libro>();
    
          Statement stmt = null;
          ResultSet rs = null;
          try {
             // Creo lo statement dalla connessione (che sarà fatta altrove)
             stmt = con.createStatement("SELECT * FROM Libri");
    
             // Eseguo la query sul DB
             rs = stmt.executeQuery();
    
             // Scorro i risultati
             while( rs.next() ) {
                // Per ciascun record, creo un bean "Libro"
                Libro libro = new Libro();
    
                // Setto i valori del bean
                libro.setIdLibro( rs.getInt(1) );   // Suppongo che l'ID sia il primo campo
                libro.setTitolo( rs.getString(2) );   // Suppongo che il titolo sia il secondo campo
                libro.setAutore( rs.getString(3) );   // Suppongo che l'autore sia il terzo campo
    
                // Aggiungo alla lista di libri che restituirò
                ret.add( libro );
             }
          } catch (Exception e) {
             e.printStackTrace();
          } finally {
             if (rs != null) {
                try { rs.close(); } catch (Exception e) { }
             }
             if (stmt != null) {
                try { stmt.close(); } catch (Exception e) { }
             }
          }
    
          return ret;
       }
    }

    La pagina JSP (listaLibri.jsp):

    codice:
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="it" lang="it">
       <head>
          <title>Elenco dei libri</title>
       </head>
       <body>
          <h1>Elenco dei libri</h1>
          <ul>
          <c:forEach items="${elencoLibri}" var="libro">
             <li><a href="<c:url value="/visDettaglio?idLibro=${libro.idLibro}" />">${libro.titolo} - ${libro.autore}</a></li>
          </c:forEach>
          </ul>
       </body>
    </html>

    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

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2014
    Messaggi
    10
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    No, infatti, non è quello il modo procedere. Immagino che "Catalogo.java" sia il tuo bean... in questo caso stavi addirittura mescolando tutto assieme: logica di presentazione, logica di business e modello dei dati.

    Il bean (modello dei dati) dovrebbe essere solamente un contenitore di dati. I dati glieli deve fornire il controller (la logica di business = servlet)
    La servlet deve fare la logica di business (il lavoro sporco): interrograre il DB, creare i beans per contenere i dati, mettere questi beans a disposizione della view e passare la palla a quest'ultima.
    La view deve solo occuparsi di prendere i dati che gli sono stati forniti e visualizzarli.

    Questo è il pattern MVC. Più avanti ti posto una bozza molto sintetica dell'intera struttura.
    Ciao, grazie ancora per tutte le preziose informazioni e il lavoro che stai facendo per me.
    Ora ho impostato il tutto come mi hai fatto vedere e ho così eliminato il bean catalogo, lasciano solo il bean libro. Il tutto ha gia un aspetto molto più pulito.
    Scusa se ti rompo ancora ma penso proprio solo più di avere un ultimissimo dubbio dovuto a quello che ho studiato sulle slides del mio corso, in particolare questa immagine:


    mvc-uni.jpg

    Fa vedere chiaramente che la connessione e il recupero dati dal database, avviene solo nella classe del bean!
    Dici che è un errore farlo fare alla servlet?

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.