Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    8

    [J2EE/JSP] Dialogo tra pagina JSP e unità di persistenza (JPA)

    Salve a tutti!
    Ho realizzato un progetto in j2ee (su NetBeans), si tratta di un prototipo di un sito.

    Ho creato la parte della persistenza seguendo questa guida http://code.google.com/p/barattalo/wiki/PageName e tutto funziona senza problemi.

    Nel senso che la pagina jsp propone, per esempio, il form di iscrizione

    codice:
    <form action="ServletIscrizione">
        Nome: <input type='text' name='nome' />
    
        Cognome: <input type='text' name='cognome' />
    
        Citta': <input type='text' name='citta' />
    
        Indirizzo: <input type='text' name='indirizzo' />
    
        Email: <input type='text' name='email' />
    
    
        <input type="submit" name="inviaIscrizione" value="Invia"/>
    </form>
    che rimanda alla servlet dedicata. Questa gestisce l'operazione, interagisce con la parte della persistenza e memorizza l'utente, dando in output anche i dati appena inseriti:

    codice:
    [...]
    
    @WebServlet(name="ServletIscrizione", urlPatterns={"/ServletIscrizione"})
    public class ServletIscrizione extends HttpServlet {
        //questo è il bean che fornisce l'interfaccia per manipolare gli oggetti persistenti
        @EJB
        private GestoreProgettoBeanLocal gestoreProgettoBean;
    
    [...]
    
            if (request.getParameter("inviaIscrizione")!=null){
                gestoreProgettoBean.addUtente([...]);
                out.println("appena aggiunto: "+gestoreProgettoBean.findUtente([...]));
            }
    [...]
    E fin qui tutto bene. Sostanzialmente la pagina JSP inoltra la richiesta alla Servlet che, avvalendosi di "gestoreProgettoBean" agisce sulla parte della persistenza. "GestoreProgettoBean" è, per l'appunto, un bean:

    codice:
    [...]
    
    @Stateless
    public class GestoreProgettoBean implements GestoreProgettoBeanLocal {
    
        @EJB
        private UtenteFacadeLocal utenteFacade;
        @EJB
        private BarattoFacadeLocal barattoFacade;
        @EJB
        private ItemFacadeLocal itemFacade;
        @EJB
        private MessaggioFacadeLocal messaggioFacade;
    
    
        //**********************************************
        //**********************************************
        //
        //      METODI PER MANIPOLARE ---UTENTE---
        //
        //**********************************************
        //**********************************************
    
        public String getProva(){
            return findUtenti().get(0).getOpenID();
        }
    
        public List<Utente> findUtenti() {
            List<Utente> listaUtenti = utenteFacade.findAll();
            return listaUtenti;
        }
    
    [...]
    Quello che vorrei, invece, è fare in modo che la JSP dialogi direttamente con "GestoreProgettoBean". Mi son detto: "è un bean, sarà sufficiente nella pagina JSP una riga di..."

    codice:
    <jsp:useBean id="bean" scope="session" class="oggettiPersistenti.GestoreProgettoBean" />
    Solo che così mi funziona solo a metà:
    se "GestoreProgettoBean" lo modifico aggiungendo

    codice:
        private String stringadiprova="ciao";
    
        public String getStringadiprova() {
            return stringadiprova;
        }
    
        public void setStringadiprova(String stringadiprova) {
            this.stringadiprova = stringadiprova;
        }
    Nella JSP basta inserire un

    codice:
    <jsp:getProperty name="bean" property="stringadiprova" />
    Per farmi stampare a schermo il parametro.
    Solo che se modifico così il getter

    codice:
        @Stateless
        public class GestoreProgettoBean implements GestoreProgettoBeanLocal {
    
        @EJB
        private UtenteFacadeLocal utenteFacade;
        @EJB
        private BarattoFacadeLocal barattoFacade;
        @EJB
        private ItemFacadeLocal itemFacade;
        @EJB
        private MessaggioFacadeLocal messaggioFacade;
    
        private String stringadiprova="ciao";
    
        public String getStringadiprova() {
            return getProva();
        }
    
        public void setStringadiprova(String stringadiprova) {
            this.stringadiprova = stringadiprova;
        }
    
        //**********************************************
        //**********************************************
        //
        //      METODI PER MANIPOLARE ---UTENTE---
        //
        //**********************************************
        //**********************************************
    
        public String getProva(){
            return findUtenti().get(0).getNome();
        }
    
        public List<Utente> findUtenti() {
            List<Utente> listaUtenti = utenteFacade.findAll();
            return listaUtenti;
        }
    Insomma, semplicemente voglio che mi restituisca il nome del primo utente registrato (e vi assicura che c'è). Quindi, nel momento in cui entrano in gioco azioni di persistenza il bean non funzona più e mi da quest'errore:

    codice:
    AVVERTENZA: StandardWrapperValve[jsp]: PWC1406: Servlet.service() for servlet jsp threw exception
    java.lang.NullPointerException
            at oggettiPersistenti.GestoreProgettoBean.findUtenti(GestoreProgettoBean.java:52)
            at oggettiPersistenti.GestoreProgettoBean.getProva(GestoreProgettoBean.java:48)
            at oggettiPersistenti.GestoreProgettoBean.getStringadiprova(GestoreProgettoBean.java:21)
            at org.apache.jsp.index_jsp._jspService(index_jsp.java from :74)
            at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:109)
    [...]
    Insomma, è come se mi dicesse "Ok, gioca quanto vuoi col tuo bean dalla jsp, ma se vuoi fare ricerche nel DB questa non è la strada giusta".
    Cosa sto sbagliando? Perchè dalla servlet invece mi funziona? Tipo aggiungendo nella servlet

    "out.println(gestoreProgettoBean.getStringadiprova ());"

    funziona, mi stampa il nome del primo iscritto...

    Scusate per la lunghezza, ma non sapevo come sintetizzare più di così...

  2. #2
    GestoreProgettoBean non è un Bean ma un EJB ossia Enterprise Java Bean che è una cosa completamente diversa visto che sfrutta RMI quindi un interfaccia Local e una Remote per far vedere la classe a due differenti JVM.

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    8
    snakeplinsky grazie della risposta... mi documenterò meglio su EJB e bean... Ma nel frattempo, è possibile risolvere il problema facilmente? Si tratta solo di qualche dichiarazione che non conosco da aggiungere nella jsp?

    Ovvero, se da JSP voglio stampare il nome del primo utente iscritto, dove "Utente" è un oggetto persistente, come devo fare??

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    8
    Ho scoperto che è una domanda più diffusa di quanto credessi, qui sembrano avvicinarsi alla mia situazione più che altrove: http://www.ianaz.ch/language/25/cat/...rom_a_JSP_page
    does it make sense??

  5. #5
    Certo che questo ha senso, in quanto dato che container non riesce a gestire la resource injection e quindi a renderti direttamente l'ejb da te richiesto non ti resto altro da fare che caricartelo a "manella" tramite il lookup del EJB; attenzione il percorso JNDI è diverso in base all'application server in cui l'ejb viene deployato.
    codice:
            InitialContext ctx = new InitialContext();
            CategoriaFacadeLocal cat = (CategoriaFacadeLocal) ctx.lookup("java:comp/env/CategoriaEJB");
    Ovviamente questo viene fatto all'interno della JSP (<%%>) ma nulla ti vieta di farlo anche all'interno di un Bean di pagina o all'interno di un'altro EJB.
    Ciao

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.