2011-11-16 10 views
6

Necesito una forma de guardar una configuración elegida por el usuario compuesta por diferentes partes. cada parte se elige en una página separada, de una lista proporcionada por un frijol administrado (una por tipo de parte).sesión beaded managed bean vs stateful bean vs httpsession

ahora la parte divertida. Tengo una tabla de datos, siempre visible, la misma para todas las páginas que inserté con <ui:include> en la plantilla para todas las páginas mencionadas anteriormente. Quiero que esta tabla de datos refleje las elecciones o cambios en la elección que hacen los usuarios de las partes. tal vez también guarde esa configuración en el DB, pero esa no es mi prioridad ahora. es una especie de carrito de compras, pero no tengo diferentes usuarios (es solo un prototipo), por lo que no es necesario iniciar sesión.

siendo este mi primer encuentro con javaee, jsf, ejb, no sé cuál sería el mejor enfoque. He leído sobre las diferentes opciones, y siento que de cualquier manera funcionaría, por lo que podría estar perdiendo algo.

Agradecería que alguien me señalara en la dirección correcta.

Respuesta

11

Puede usar un bean gestionado con ámbito de sesión para almacenar la información del carro. Aquí hay un ejemplo básico patada de salida (duplicar los productos y la cantidad no contabilizados, es sólo para dar la idea general):

@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; 
    } 

} 

(Se puede usar un Map<Product, Integer> o Map<Product, Order> para realizar un seguimiento de la cantidad)

Usted podría a continuación, mostrar la cesta de la siguiente manera:

<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> 

Se podría añadir productos a la cesta de otra tabla de la siguiente manera:

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

Un EJB con estado solo es interesante si desea poder usarlo en otro lugar en la aplicación mediante diferentes API/frameworks o incluso en clientes remotos, o si desea utilizar el contexto de persistencia para bloquear los elementos actualmente en el carro, para que otros clientes no puedan agregarlo al carrito. El HttpSession no es relevante ya que JSF almacena los beans administrados de ámbito de sesión allí de todos modos y no desea exponer la API de Servlet sin procesar desde las cubiertas de JSF al exterior.

+1

gracias youuuuu. es casi como navidad cada vez que respondes una de mis preguntas – glasspill

+0

De nada. – BalusC

+0

Y si obtiene un error como 'La clase 'javax.faces.component.html.HtmlDataTable' no tiene la propiedad 'description'' cambia el nombre de' var', ya que probablemente haya usado el mismo nombre para otro en otros lugares, eso está en conflicto con el actual y pasarás siglos buscando la causa. – glasspill

Cuestiones relacionadas