J2EE

di il
30 risposte

30 Risposte - Pagina 2

  • Re: J2EE

    Alessandro35 ha scritto:


    Se invece facciamo in modo che il session bean venga sempre richiesto ,ovvero che il suo lookup venga eseguito(mettendo ad esempio il relativo codice in un metodo della servlet) ,dovresti sperimentare proprio il funzionamento dell'application server relativamente al ciclo di vita di un session bean.
    In questo caso se il bean in questione fosse stateless, una volta terminato il metodo in cui avviene il lookup(), il conteiner riporterebbe l'istanza nel pool e anche se memorizzassi il riferimento al bean all'interno della sessione utente, un eventuale chiamata di un metodo del bean non funzionerebbe poichè l' istanza non è più attiva?
  • Re: J2EE

    Alessandro non riesco a fare il lookup("java:comp/env/ejb/StatefullContaLocal") del mio bean e mi viene sollevata un NamingException.
    Devo configurare il file sun-web.xml prima di poter fare questa operazione? Come va configurato alle voci "ejb reference name" e J"NDI name" ?
  • Re: J2EE

    Ciao, volevo fare una correzione riguardo a quanto detto precedentemente, effettivamente per richiesta verso un session bean stateless si intende l'invocazione di un suo metodo(non lookup), quindi anche se il riferimento è memorizzato come variabile a livello di servlet ogni volta che invochiamo un metodo di un session al termine del metodo il session ritorna nel pool, alla successiva chiamata di un metodo del session ne viene scelto uno tra quelli del pool(può essere anche lo stesso).Pensavo che il tenerlo a livello di variabile di istanza della servlet lo mantenesse in qualche modo non rilasciato, ma non è cosi, terminato il metodo il bean dovrebbe tornare nel pool.Adesso il fatto che ottenevi la stessa istanza è davvero un caso particolare secondo me.Quindi nel tua domanda, quando hai il riferimento del session in sessione e lo recuperi invocando un suo metodo, viene selezionato uno session bean dal pool e ne viene eseguito il metodo.Forse per testare il funzionamento dei session bean dovresti provare con un client che effettua tante chiamate http simultaneamente verso la servlet che usa il session e vedere cosa accade.
    Per il lookup immagino tu lo stia facendo da una servlet ,se cosi,prova in questo modo:

    Immagino il tuo session:


    @Local
    public interface StatefullContaLocal{
    .....
    }

    @Stateless(mappedName = "StatefullContaLocal")
    public class StatefullConta implements StatefullContaLocal{
    ......
    }


    import javax.naming.InitialContext;
    import javax.naming.NamingException;

    @EJB(name="StatefullContaLocal",beanInterface=StatefullContaLocal.class)
    class MiaServlet extends HttpServlet {

    private StatefullContaLocal statefullContaLocal;

    public void doGet(HttpServletRequest req, HttpServletResponse res)
    throws ServletException {
    InitialContext context;

    try {
    context = new InitialContext();

    statefullContaLocal=
    (StatefullContaLocal)context.lookup("java:comp/env/StatefullContaLocal");

    } catch (NamingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    }

    }
  • Re: J2EE

    Riguardo al metodo lookup() avevo trovato la soluzione anche io leggendo il blog di un tizio inglese e usa il tuo stesso metodo senza configurare il file xml. Ma da quanto capito l annotation @EJB con i parametri settati non fanno che la stessa cosa che configurare il file xml.
    Per quanto riguardo il bean session stateless ho provato a fare come dici tu inviado tqnte richeiste http tramite tre browser diversi ma il risultato non cambia.IL bean è sempre lo stesso ! non so come testare la differenza tra le due tipologia di bean a questo punto
  • Re: J2EE

    ...Mentre non risolvo il "mistero" di questi bean voglio proseguire il la scrittura dell'agenda.

    Devo risolvere il seguente problema.Implementare il metodo

    ArrayList<Appuntamento> getAppuntamenti(Utente ut)

    Il quale dato un utente di input torni i suoi appuntamenti.
    Nell'ipotesi che usi un l'Entity manager em, come per ottenre la lista degli appuntamenti
    dell'utente?


    Gli entity bean Utente e Appuntamento sono i seguenti :
    
    @Entity
    @Table(name = "UTENTE")
    @NamedQueries({
        @NamedQuery(name = "Utente.findAll", query = "SELECT u FROM Utente u"),
        @NamedQuery(name = "Utente.findById", query = "SELECT u FROM Utente u WHERE u.id = :id"),
        @NamedQuery(name = "Utente.findByNome", query = "SELECT u FROM Utente u WHERE u.nome = :nome")})
    public class Utente implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @Basic(optional = false)
        @Column(name = "ID")
        private Integer id;
        @Column(name = "NOME")
        private String nome;
    
        public Utente() {
        }
    
        public Utente(Integer id) {
            this.id = id;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getNome() {
            return nome;
        }
    
        public void setNome(String nome) {
            this.nome = nome;
        }
    
        @Override
        public int hashCode() {
            int hash = 0;
            hash += (id != null ? id.hashCode() : 0);
            return hash;
        }
    
        @Override
        public boolean equals(Object object) {
            // TODO: Warning - this method won't work in the case the id fields are not set
            if (!(object instanceof Utente)) {
                return false;
            }
            Utente other = (Utente) object;
            if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
                return false;
            }
            return true;
        }
    
        @Override
        public String toString() {
            return "modello.Utente[id=" + id + "]";
        }
    
    }
    
    @Entity
    @Table(name = "APPUNTAMENTO")
    @NamedQueries({
        @NamedQuery(name = "Appuntamento.findAll", query = "SELECT a FROM Appuntamento a"),
        @NamedQuery(name = "Appuntamento.findById", query = "SELECT a FROM Appuntamento a WHERE a.id = :id"),
        @NamedQuery(name = "Appuntamento.findByOra", query = "SELECT a FROM Appuntamento a WHERE a.ora = :ora"),
        @NamedQuery(name = "Appuntamento.findByUtente", query = "SELECT a FROM Appuntamento a WHERE a.utente = :utente")})
    public class Appuntamento implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @Basic(optional = false)
        @Column(name = "ID")
        private Integer id;
        @Column(name = "ORA")
        private String ora;
    
    /*Nella tabella Appuntamento ho la chiave esterna Utente che si riferisce alla chiave primaria ID della tabella Utente
    */
        @ManyToOne@JoinColumn(name="UTENTE", referencedColumnName="ID")
        private Utente utente;
    
        public Appuntamento() {
        }
    
        public Appuntamento(Integer id) {
            this.id = id;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getOra() {
            return ora;
        }
    
        public void setOra(String ora) {
            this.ora = ora;
        }
    
        public Utente getUtente() {
            return utente;
        }
    
        public void setUtente(Utente utente) {
            this.utente = utente;
        }
    
        @Override
        public int hashCode() {
            int hash = 0;
            hash += (id != null ? id.hashCode() : 0);
            return hash;
        }
    
        @Override
        public boolean equals(Object object) {
            // TODO: Warning - this method won't work in the case the id fields are not set
            if (!(object instanceof Appuntamento)) {
                return false;
            }
            Appuntamento other = (Appuntamento) object;
            if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
                return false;
            }
            return true;
        }
    
        @Override
        public String toString() {
            return "modello.Appuntamento[id=" + id + "]";
        }
    
    }
    
    Un appuntamento è riferito ad un Utente mentre un utente può rendere più appuntamenti.IL mapping JPA della relazione se non ho fatto errori di sintassi è giusta.
  • Re: J2EE

    Bene ho risolto il discorso della persistenza ed ho terminato le funzionalità log in, inserisci appuntamento, e visualizza appuntamento.
    Non ho però gestito le eccezzioni poichè lo scopo del mio tutorial era solo familiarizzare con la teconologia Enterprise.

    Se mi dite in che modo, metto a disposizione il codice per chi volesse avvicinarsi per la prima volta
    a JEE .

    Il mio prossimo obiettivo è dare un aspetto grafico accettabile alla mia agenda poichè attualmente la grafica è inesistente.
    Pensavo di sfruttare la tecnologia JSF che a quanto pare permette, un pò come fa .NET, di sfruttare componenti grafici predefiniti , che vengono poi tradotti in codice htm nel momento in cui vengono eseguiti.Se la strada che ho intenzione di intraprendere per fare la grafica è sbagliata vi prego di indicarmi il modo più giusto per proseguire.
  • Re: J2EE

    Ciao, la strada è giusta secondo me, JSF ormai giunto alla versione 2.0 è un ottimo framework che io personalmente utilizzo in ambito lavorativo da oltre 2 anni. Librerie di estensione che lo potenziano sono : PrimeFaces,RichFaces e IceFaces.Si tratta inoltre dello standard J2EE per il livello di presentation.
  • Re: J2EE

    Ciao Alessandro, mica avresti del codice che mostra l'utilizzo della tecnologia JSF per dare un aspetto grafico piacevole alle applicazioni JEE .
    Eventualmente per spedirmi i file ti mando in privato il mio indirizzo mail
  • Re: J2EE

    Alessandro se puoi mandami qualkosa su JSF , magari del tuo codice che mi mostri l'utilizzo di questa tecnologia che voglio assolutamente imparare.

    Grazie in anticipo
  • Re: J2EE

    Ciao, ti rispondo adesso perchè purtroppo non ho avuto tempo di venire sul forum ultimamente.Allora adesso non ho qualcosa di pronto adatto a chi sta per iniziare, però ti do il link di un sito dove trovi tanto materiale molto interessante per chi inizia:

    http://www.coreservlets.com/JSF-Tutorial/jsf2

    poi ti posso consigliare il libro Core JavaServer Faces terza edizione, penso il miglior libro attualmente su JSF che io personalmente uso:

    http://horstmann.com/corejsf
  • Re: J2EE

    Ciao Alessandro, sto leggendo il libro che mi hai indicato, lho trovato in Inglese, e dopo aver letto i primi 3 capitoli mi sembra di aver capito che con jsf si usa molto il concetto di Managed Bean mentre i session Bean stateless o statefull ed entity Bean non vengono mensionati. Significa che jsf maschera tutto ciò e definisce un modo di programmare tramite Bean molto simile alle applicazioni Desktop??


    ps: cmq mi gusta questo jsf devo impararlo assolutamente
  • Re: J2EE

    Ciao, no attenzione, JSF è lo standard Sun (adesso appartanente ad Oracle...) per lo strato di presentation... EJB riguarda la logica di business, JPA la persistenza. Personalmente posso dirti che a lavoro sviluppo i sistemi secondo questa architettura:

    JSF 2 con estensione PrimeFaces 2.2.1 per la presentazione
    EJB 3 per la logica di business
    JPA 1.0 per la persistenza (giunto però adesso alla version 2.0 credo)

    i managed bean sono quelle classi che ti permettono di interagire con le pagine, un consiglio, nello sviluppo usa facelets e quindi xhtml per la costruzione delle pagine.La logica ad eventi si, richiama lo sviluppo java delle applicazioni grafiche e, come avrai già visto, c'e' un ciclo di vita del framework che è fondamentale capire prima di tutto.
  • Re: J2EE

    Ciao Alessandro, innanzitutto grazie di rispondere ai miei post, sei l'unico a farlo

    Il concetto che :
    JSF 2 per la presentazione
    EJB 3 per la logica di business
    JPA 1.0 per la persistenza (giunto però adesso alla version 2.0 credo)

    Mi è chiaro. La perplessità sui menaged bean da me accennati è nato dopo aver letto il libro jsf complete reference e anche la guida ufficiale rilasciata da Oracle che recita:

    "
    Backing Beans
    A typical JavaServer Faces application includes one or more backing beans, each of which is a
    JavaServer Faces managed bean that is associated with the UI components used in a particular
    page. Managed beans are JavaBeans components (see “JavaBeans Components” on page 163)
    that you can configure using the managed bean facility
    , which is described in “Configuring
    Beans” on page 426. This section introduces the basic concepts on creating, configuring, and
    using backing beans in an application.

    Creating a Backing Bean Class
    In addition to defining a no-arg constructor, as all JavaBeans components must do, a backing
    bean class also defines a set of UI component properties and possibly a set of methods that
    perform functions for a component.
    Each of the component properties can be bound to one of the following:
    ¦ A component’s value
    ¦ A component instance
    ¦ A converter instance
    ¦ A listener instance
    ¦ A validator instance
    The most common functions that backing bean methods perform include the following:
    ¦ Validating a component’s data
    ¦ Handling an event fired by a component
    ¦ Performing processing to determine the next page to which the application must navigate
    As with all JavaBeans components, a property consists of a private data field and a set of
    accessor methods, as shown by this code from the GuessNumber example:
    Integer userNumber = null;
    ...
    public void setUserNumber(Integer user_number) {
    userNumber = user_number;
    }
    public Integer getUserNumber() {
    return userNumber;
    }
    public String getResponse() {
    ...
    }

    Because backing beans follow JavaBeans component conventions, you can reference beans
    you’ve already written from your JavaServer Faces pages.

    "


    Da quello che capisco questi Backing Bean, sono classi che rispettano la specifica dei JavaBean, associati ad un UI Component. Per capirci , magari tu sei abituato a chiamarli in un altro modo sono quelli del seguente esempio:

    ...
    ...
    <h:inputText id="userNo" label="User Number"
    value="#{BackingBeanname.proprietà}">
    ...
    </h:inputText>
    ...
    ....


    L'ultima parte da me sottolineata mi far venire in mente la seguente domanda:
    Come Backing bean posso usare anche un Entity Bean di EJB 3.0 in quanto segue la convenzione dei JavaBean giusto?


    ps:Appena mi è tutto più chiaro su JSF converto l'agenda elettronica inizialmente in versione JSF e la pubblico ..........cmq il php rispetto al "mondo" JEE è una bazzecola
  • Re: J2EE

    Ciao. In genere per quello che ho letto, si usa il nome managed bean per i bean che utilizzi nelle pagine jsf legandoli con i tipi java a livello di variabili di istanza. Se invece li leghi con le classi proprie dei tag (uso dell'attributo binding) allora si usa il termine backing bean, ma a livello di faces-config non cambia nulla è solo terminologia e chiaramente l'uso dell'attributo value in un caso e di binding nell'altro. Penso che tecnicamente sia possibile usare un entity come managed bean ma sinceramente non l'ho mai fatto perchè preferisco operare una precisa distinzione a livello progettuale tra classi del modello (entity) e classi legate all'interfaccia e ai suoi eventi. Ad esempio se sto realizzando un sistema per la gestione di utenti, realizzo il managed bean MBGestioneUtenti ,distinto dall'entity Utente, che viene utilizzata però al suo interno come variabile di istanza:

    public class MBGestioneUtenti {

    private Utente utente;

    //...get e set per Utente

    //..... altri metodi per gli eventi ad esempio di inserimento,aggiornamento,cancellazione...


    }

    poi all'interno di una pagina jsf

    <h:inputText value="#{mBGestioneUtenti.utente.nome}" />
    <h:inputText value="#{mBGestioneUtenti.utente.cognome}" />
    <h:inputText value="#{mBGestioneUtenti.utente.codiceFiscale}" />
    .......

    diciamo che non c'e' un solo modo di fare le cose, entra poi in gioco anche la tua idea architetturale.
  • Re: J2EE

    Ok Alessandro inizio ad avere un quadro di insieme su JEE più chiaro.
    Ho però altre domande e considerazioni da farti e vorrei il tuo esperto parere a riguardo

    1)Con EJB 2.0 gli entity bean erano alla pari dei sesion bean degli oggetti distributi remoti interrogabili da qualsiasi client java sia Applicazioni Desktop che da Servlet e Jsp tramite utilizzo del servizio di naming più precisamente usando il metodo lookup(). Con EJB 3.0 invece mi sembra di aver capito che soltanto i session bean hanno mantenuto questa caratteristica di essere oggetti distributi il cui loro ciclo di vita è gestito dal EJB conteiner, mentre gli enity baen vengono usati per solo per gestire la persistenza dei dati. E' vero??

    2) Inoltre gli EJB 3.0 sono usati solo nel caso in cui un programmatore voglia rendere la propria logica di buisness distribuita, ma se non ha queste esigenze può semplicemente utilizzare comuni classi java (magari JavaBean) per implemenare la propria logica di buisness.

    3)Se volessi gestire la persistenza senza usare il framework JPA ma tramite uso della JDBC API, si può fare in JEE? (prima di JPA ho sempre usato l'approccio DAO per gestire la persistenza nelle mie apllicazioni desktop)
    Ad esempio da una servlet vorrei fare una query al mio DB.

    4)Come faccio ad installare l'estensione JSF da te usata? ( in pratica una raccolta di UI component disegnati da qualke buon uomo )

    5)Che relazione c'è tra JSTL e JSF?

    ti ringrazio in anticipo per la tua disponibilità

    ps: all'università invece di farci studiare fisica e algebra potevano fare un corso mirato su JEEv
Devi accedere o registrarti per scrivere nel forum
30 risposte