2011-11-16 18 views
6

Ho bisogno di un modo per salvare una configurazione scelta dall'utente composta da parti diverse. ogni parte viene scelta in una pagina separata, da un elenco fornito da un bean gestito (uno per tipo di parte).bean gestito con scope sessione vs bean stateful vs httpsession

ora la parte divertente. Ho un datatable, sempre visibile, uguale per tutte le pagine che ho inserito con <ui:include> nel modello per tutte le pagine sopra citate. voglio che questo datatable rifletta le scelte o i cambiamenti nella scelta che gli utenti fanno per le parti. magari salvare una tale configurazione anche nel db, ma non è la mia priorità ora. è una specie di carrello della spesa, ma non ho utenti diversi (è solo un prototipo), quindi non è necessario il login.

questo è il mio primo incontro con javaee, jsf, ejb, non so quale sarebbe l'approccio migliore. Ho letto delle diverse opzioni e credo che in entrambi i casi funzionerebbe, quindi potrei mancare qualcosa.

Gradirei qualcuno che mi indicasse la giusta direzione.

risposta

11

È possibile utilizzare un bean gestito con ambito sessione per contenere le informazioni sul carrello. Ecco un esempio di base kickoff (duplicare prodotti e la quantità non rappresentato, è solo per dare l'idea generale):

@ManagedBean 
@SessionScoped 
public class Cart { 

    private List<Product> products = new ArrayList<Product>(); 

    public void add(Product product) { 
     products.add(product); 
    } 

    public void remove(Product product) { 
     products.remove(product); 
    } 

    public List<Product> getProducts() { 
     return products; 
    } 

} 

(si potrebbe usare un Map<Product, Integer> o Map<Product, Order> per monitorare la quantità)

Si potrebbe quindi visualizzare il carrello come segue:

<h:dataTable value="#{cart.products}" var="product"> 
    <h:column>#{product.description}</h:column> 
    <h:column><h:commandButton value="Remove" action="#{cart.remove(product)}" /></h:column> 
</h:dataTable> 

si potrebbe aggiungere i prodotti al carrello da un altro tavolo come segue:

Un EJB stateful è interessante solo se si desidera poterlo utilizzare altrove nella webapp da API/framework diversi o anche in client remoti o quando si desidera utilizzare il contesto di persistenza per bloccare gli elementi attualmente nel carrello, in modo che altri clienti non possano aggiungerlo al carrello. Lo HttpSession non è rilevante in quanto JSF memorizza i bean gestiti con scope di sessione in ogni caso e non si desidera esporre l'API dei servlet raw da sotto le copertine di JSF all'esterno.

+1

thank youuuuu. è quasi come Natale ogni volta che rispondi a una delle mie domande – glasspill

+0

Prego. – BalusC

+0

E se si ottiene un errore come 'La classe 'javax.faces.component.html.HtmlDataTable' non ha la proprietà 'description'' cambia il nome di' var', come probabilmente hai usato lo stesso nome per un altro altrove, questo è in conflitto con quello attuale e trascorrerai anni a cercare la causa. – glasspill

Problemi correlati