Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [JSP] Problema passaggio di oggetti tra pagine

    Ciao a tutti !
    Non sto usando il modello MVC e di conseguenza mi ritrovo a dover programmare con le standard action mischiando scriptlet e pagine di presentazione in un unico file.
    Ho creato un semplice esempio per illustrarvi la problematica.

    Ho tre pagine : prova.jsp , prova2.jsp , prova3.jsp.
    Nella prima setto degli attributi in un form, nella seconda recupero i dati e li memorizzo con l'oggetto implicito request e nella terza voglio ristampare a video il tutto.

    prova.jsp
    codice:
    <form action="prova2.jsp" method="post">
    		nickname:<input type="text" name="nickname" />
    		password:<input type="text" name="password" />
    		budget:	<input type="text" name="budget" />
    		<input type="submit" name="invio" value="invia dati" /> 
    
    		</form>
    prova2.jsp
    codice:
    		<jsp:useBean id="tizio" class="cinema.Utente" scope="session"/>
    		<jsp:setProperty name="tizio" property="nickname" value="<%=request.getParameter("nickname")%>" />
    		<jsp:setProperty name="tizio" property="password" value="<%=request.getParameter("password")%>" />
    		<jsp:setProperty name="tizio" property="budget" value="<%=request.getParameter("budget")%>" />
    
    		<%request.setAttribute("idtizio", tizio)/%>
    		<jsp:forward page="prova3.jsp" />
    prova3.jsp
    codice:
                  <% Utente u = (Utente) request.getAttribute("idtizio"); %>
    		<jsp:getProperty name="u" property="nickname" />
    		<jsp:getProperty name="u" property="password" />
    		<jsp:getProperty name="u" property="budget" />
    Come passo l'oggetto Utente da una pagina all'altra ?

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    51
    La mia prima pagina è identica alla tua.
    Nella seconda invece di settare i campi dell'oggetto User con il jsp:setProperty li ho settati direttamente con i suoi metodi setter. L'istanza di User raggiungibile con l'id "tizio" rimarrà raggiungibile per tutta la sessione quindi nn c'è bisogno di memorizzare l'oggetto nella request.

    codice:
            
            <jsp:useBean id="tizio" scope="session" class="cinema.User" />
            
            <%
                tizio.setUsername(request.getParameter("nickname"));
                tizio.setPassword(request.getParameter("password"));
                tizio.setBudget(Integer.valueOf(request.getParameter("budget")));
    
            %>
    
                <jsp:forward page="pag3.jsp" />
    Nella terza pagina con queste due righe recuperi l'oggetto tizio.

    codice:
            <jsp:useBean id="tizio" scope="session" class="cinema.User" />
            <%
                out.println((com.stywer.test.User) tizio);
            %>
    altrimenti puoi passarlo con una setAttribute sull'oggetto request.

    pagina 2

    codice:
            <%
                User usr = new User(request.getParameter("nickname"),
                                    request.getParameter("password"),
                                    Integer.valueOf(request.getParameter("budget"))
                );
                
                request.setAttribute("tizio", usr);
            %>
    
            <jsp:forward page="pag3.jsp" />
    pagina 3

    codice:
            <%
                out.println(request.getAttribute("tizio"));
            %>

  3. #3
    Grazie per l'aiuto!
    Ora è tutto funzionante.

    Dato che ho un po' di confusione in testa, vorrei chiedere ancora alcune cose:

    1. quando dichiaro un oggetto bean con useBean e scope session (ad es. con id="nomebean") "in una pag. dove si deve richiamare l'oggetto "nomebean" posso mettere solo useBean oppure lo si può recuperare anche con session.getAttribute()?

    2. In questo codice ho un elenco di utenti con scope attribute e ogni volta che devo fare un acquisto apro una sessione con un utente tramite un login.
    Quando c'è un acquisto, si modifica il campo budget dell'utente-che viene decrementato. Ho effettuato una stampa per vedere se mi fa questa modifica, ma non la presenta a video, se non nella successiva richiesta...come mai non riesco ad aggiornare immediatamente il valore della proprietà?



    codice:
    <%if(elencoutenti.cercaUtente(request.getParameter("nickname"),request.getParameter("password"))){ %>
    
        
    
     L'utente &egrave presente in elenco. </p>
    <%Utente utn = elencoutenti.cercaUtente(request.getParameter("nickname")); %>
    <%=utn.getBudget()%>
        <jsp:useBean id="u" scope="session" class="cinema.Utente"/>
    jsp:setProperty name="u" property="nickname" value"=<%=request.getParameter("nickname")%>" />   
                <jsp:setProperty name="u" property="password" value="<%=request.getParameter("password")%>" />
                <jsp:setProperty name="u" property="budget" value="<%=utn.getBudget()%>"/>
        <jsp:setProperty name="u" property="elenco" value="<%=application.getAttribute("elencoutenti")%>" />
       
        <jsp:useBean id="acq" class="cinema.Acquisto" scope="request"/>
        <jsp:setProperty name="acq" property="nomeutente" value="<%=u.getNickname()%>"/>
        <jsp:setProperty name="acq" property="elenco" value="<%=application.getAttribute("elencoutenti")%>"/>
        <jsp:setProperty name="acq" property="numbiglietti" value="<%=request.getParameter("numbigl")%>"/>   
       
        <%if(acq.isAcquistato()){%>
            
    
     Acquisto terminato: </p>
            
    
     Numero biglietti : <jsp:getProperty name="acq" property="numbiglietti"/></p>
            
    
     Nickname utente : <jsp:getProperty name="acq" property="nomeutente"/></p>
            <jsp:getProperty name="u" property="nickname"/>
            
    
     Importo totale transazione:<jsp:getProperty name="acq" property="importoacquisto"/> </p>
            
    
     Budget attuale utente<jsp:getProperty name="u" property="budget"/> </p>
       
            <%if(session.getAttribute("u")!=null){%>
                
    
     la sessione &egrave ancora in corso </p>           
            <%}else{%>
                
    
     la sessione &egrave terminata. </p>   
            <%}%>
            
    
     (Uscita automatica dalla sessione) </p>
                <%session.invalidate();%>   
    
        <%}else{%>
            
    
     Impossibile procedere con l'acquisto: budget insufficiente. </p>
              
        <%}%>
    
    
    	
    
    
    	<%}else{%>
    			
    
     Impossibile continuare: utente non presente in elenco. </p>
    		<%}%>

  4. #4
    Purtroppo è un po' troppo pieno di dettagli il codice, cmq ho messo molte stampe...

    In breve vi spiego cosa succede:
    per comprare un biglietto dal costo di 5 euro, un utente fa un login e si apre una sessione.

    Accedo con un utente. Es Nome: ddd password :ddd credito 200.

    1.Faccio un primo acquisto:
    Compro due biglietti (10 euro)
    mi stampa:200 (invece di 190.)

    2. Faccio un secondo acquisto:
    mi stampa:190 (invece di 180.)

    3. Attualmente con 180 euro posso comprare al massimo: 36 biglietti.

    4. Provo a comprare 37 biglietti: mi dice budget insufficiente.

    Quindi vuol dire che aggiorna il risultato, ma solo dopo essere usciti dalla pagina dell'acquisto.

    Dove può essere il problema?

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    51
    Questa riga di codice

    codice:
    <jsp:useBean id="tizio" scope="session" class="cinema.User" />
    non fa altro che evitarti di scrivere codice java per la memorizzazione di un oggetto accessibile per tutta la sessione, in questo caso specifico viene creato questa porzione di codice.

    [CODE]
    com.stywer.test.User tizio = null;
    synchronized (session) {
    tizio = (com.stywer.test.User) _jspx_page_context.getAttribute("tizio", javax.servlet.jsp.PageContext.SESSION_SCOPE);
    if (tizio == null){
    tizio = new com.stywer.test.User();
    _jspx_page_context.setAttribute("tizio", tizio, javax.servlet.jsp.PageContext.SESSION_SCOPE);
    }
    }
    [\CODE]

    come vedi l'oggetto tizio viene memorizzato in jspx_page_context con setAttribute(), quindi non viene memorizzato nell'oggetto request e quindi all'invocazione di request.getAttribute() ti verrà reso null. Su vuoi memorizzarlo su reques o lo fai direttamente invocando la setAttribute() di request oppure invece di impostare lo scope come session lo imposti come request, quindi:

    codice:
    <jsp:useBean id="tizio" scope="request" class="com.stywer.test.User" />
    e risulterà accessibile da getAttribute().

    Passando alla seconda domanda, potresti postare anche la pagina dove avviene sottrato l'importo del biglietto dal budget?

  6. #6
    Sto usando una classe bean Acquisto...
    nella pagina jsp imposto i vari valori con le setProperty e poi richiedo l'esecuzione del metodo isAcquistato() riportato qui sotto
    p.s. so che ci sono le stringhe al posto dei numeri, ma solo perché non sapevo che si può fare il cast con la request...

    codice:
    package cinema;
    
    public class Acquisto {
    
    	private String numbiglietti;
    	private final static float PREZZO=5;
    	private String nomeutente;
    	private String importoacquisto;
    	private ElencoUtenti elenco;
    	
    	
    	public Acquisto(){
    		elenco=new ElencoUtenti();
    	}
    	
    	public void setNomeutente(String n){
    		this.nomeutente=n;
    	}
    	
    	public void setElenco(ElencoUtenti e){
    		this.elenco = e;
    	}
    	
    	public void setNumbiglietti(String n){
    		
    		numbiglietti=n;
    	}
    
    	
    	public boolean isAcquistato(){
    		Integer nbigl = Integer.parseInt(numbiglietti);
    		Float importo = nbigl*PREZZO;
    		importoacquisto = importo.toString();
    		Utente u = elenco.cercaUtente(nomeutente);
    		
    		Float budget = Float.parseFloat(u.getBudget());
    		boolean acquistato=false;
    		
    		
    		if(budget>=importo){
    			Float newbudget = budget-importo;
    			String b = newbudget.toString();	
    			u.setBudget(b);
    			acquistato=true;
    		}
    
    	
    		
    		return acquistato;
    	}
    	
    	public String getNomeutente(){
    		return nomeutente;
    	}
    	
    	public String getNumbiglietti(){
    		return numbiglietti;
    	}
    	public String getImportoacquisto(){
    		return importoacquisto;
    	}
    }
    il metodo cercaUtente è questo, anche se non dà problemi altrove:

    codice:
    package cinema
    public class ElencoUtenti {
    	private LinkedList<Utente> elenco;
    
    //...altro codice
    
    public Utente cercaUtente(String nickname){
    		ListIterator<Utente> it= elenco.listIterator();
    		boolean trovato=false;
    		Utente u=null;
    		
    		while(it.hasNext()&&!trovato){
    			u = it.next();
    			if(u.getNickname().equals(nickname)){
    				trovato=true;
    			}
    		}
    
    		return u;
    		
    	}

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    51
    Se sostituisci questa riga

    codice:
     Budget attuale utente<jsp:getProperty name="u" property="budget"/> </p>
    con questa

    codice:
     Budget attuale utente u.getBudget() </p>
    ti viene visualizzato il budget aggiornato?

  8. #8
    ho scritto
    codice:
    
     Budget attuale utente <%=u.getBudget()%> </p>
    ma purtroppo mi continua a stampare il valore "immediatamente precedente"

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    51
    Credo di aver capito. Praticamente tu con queste righe di codice:
    codice:
    <jsp:useBean id="u" scope="session" class="cinema.Utente"/>
    jsp:setProperty name="u" property="nickname" value"=<%=request.getParameter("nickname")%>" />   
                <jsp:setProperty name="u" property="password" value="<%=request.getParameter("password")%>" />
                <jsp:setProperty name="u" property="budget" value="<%=utn.getBudget()%>"/>
        <jsp:setProperty name="u" property="elenco" value="<%=application.getAttribute("elencoutenti")%>" />
    recuperi un oggetto utente da una lista e con i suoi dati ne crei un altro.
    Quindi avrai un oggetto A (quello presente nella lista) e un oggetto B (la copia creata con i dati di A) con gli stessi dati ma cmq rimangono due oggetti distinti.

    Poi crei un oggetto Acquisto passandogli il nome di B (che è uguale a quello di A) e ricava dall'elenco l'oggetto A, a questo punto le modifiche vengono effettuate su A mentre B rimane identico. Sulla pagina tu stampi i dati di B che nn ha subito nessuna modifica durante la transazione.

    Quindi se vuoi stampare a video i dati correnti dell'utente devi recuperare l'oggetto Utente desiderato dall'elenco contenuto in acquisto.


    Poi avrei un dubbio su questa riga, l'oggetto elencoUtenti è lo stesso dell'oggetto Acquisto che usi per la transazione?

    codice:
    <%if(elencoutenti.cercaUtente(request.getParameter("nickname"),request.getParameter("password"))){ %>
    Fammi sapere se è tutto chiaro e corretto

  10. #10
    Perfetto! Funziona Era quello il problema!
    Una domanda però...io ricordo che java lavora sugli indirizzi non sulle copie...come mai allora non fa lo stesso anche per questo ?

    Cmq le modifiche che ho fatto sono:

    codice:
    public class ElencoUtenti {
    
    	
    private LinkedList<Utente> elenco;
    private String nickname; //<-- ho aggiunto una variabile d'istanza alla lista per recuperare il valore corretto
    
    //...metodi di get set e ricerca
    //ho aggiunto questi altri due metodi per ottenere il parametro budget da un utente della lista:
    
    	public void setNicknameUtente(String nickname){
    		this.nickname = nickname;
    	}
    	
    	public String getBudgetUtente(){
    		String b="";
    		Utente u = cercaUtente(nickname);		
    		b = u.getBudget();		
    		return b;
    	}
    Nel file .jsp ho invece scritto:

    codice:
    	<%if(acq.isAcquistato()){%>
    		
    
     Acquisto terminato: </p>
    		
    
     Numero biglietti : <jsp:getProperty name="acq" property="numbiglietti"/></p>
    		
    
     Nickname utente : <jsp:getProperty name="acq" property="nomeutente"/></p>
    		<jsp:getProperty name="u" property="nickname"/>
    
    
    //questa è la setProperty aggiunta	per assegnare il valore alla var. d'istanza dell'elenco, //"nickname"
    
    
    	<jsp:setProperty name="elencoutenti" property="nicknameUtente" value="<%=request.getParameter("nickname")%>" />
    
    
    		
    
     Importo totale transazione:<jsp:getProperty name="acq" property="importoacquisto"/> </p>
    
    
    
    //l'importo lo stampo con il secondo metodo aggiunto, ovvero getBudgetUtente()
    
    	
    
     Budget attuale utente <jsp:getProperty name="elencoutenti" property="budgetUtente"/> </p>
    Ho però un dubbio...formalmente è corretto mettere una variabile in più per avere un parametro dell'utente?
    Cioè esiste un modo per
    1. prelevare dall'elenco un utente (sempre con un'azione jsp, di tipo getProperty sull' elencoUtenti, (per richiamare ad esempio il metodo getUtente())
    2. porlo in un bean (dovrei usare useBean?)
    3. richiamare direttamente sull'utente scelto da elenco il metodo getBudget()? (con un'altra jsp:getProperty name="utente" property="budget") ?

    Senza usare scriplet, ma bean...

    cioè io avrei in mente qualcosa del tipo
    Utente u = <jsp:getProperty name="elencoutenti" property="utente" />
    <jsp:useBean id="u" class="cinema.Utente" />
    <jsp:getProperty name="u" property="budget" />

    so che è sbagliato (la prima e la seconda riga in particolare) però mi sembra ridondante riscrivere i metodi dell'utente nell'elenco...ma d'altra parte non so proprio come fare. Ho fatto così in tutti gli altri esercizi (con la ridondanza) perché è il solo modo in cui riesco a recuperare le informazioni usando i bean...

    grazie ancora per l'aiuto!

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.