La creación de maestro-detalle de las páginas de las entidades, cómo vincularlos y que bean alcance para elegir

He comenzado el aprendizaje de JSF, pero, lamentablemente, la mayoría de los tutoriales que hay presentes sólo en un registro o en una sección del registro.

Puede que me apunte a algunos más en profundidad ejemplos? Una cosa que me interesa es una página que presenta una lista de productos. Estoy en la página casa y pulse en la página productos para que yo pueda ver la última productos añadido. Y cada vez que visite la página, el producto se creará una lista de las últimas entradas en la base de datos. ¿Cómo puedo manejar esto?

Una forma de resolver esto sería la creación de un ámbito de sesión bean gestionado en el que me darían lugar a diferentes entidades actualizado a través de otros managed beans. He encontrado este tipo de enfoque en algunos tutoriales, pero parece bastante difícil y torpe.

Que sería el mejor enfoque para resolver una cosa como esta? ¿Cuál es el uso correcto de un ámbito de sesión en dos páginas maestra-detalle de la interfaz de usuario?

OK gracias. En este caso, donde debo guardar la lista de productos?. Ahora tengo un Controlador Bean llamado Controlador de Productos (con todas las acciones que son llamados por el Producto de la Entidad) y Un Modelo de Producto (Un Java Bean con los mismos atributos de acuerdo a la tabla de base de datos). Donde debo guardar el objeto atributo de modo que pueda acceder el formulario de la producto de la página
Bien en la necesidad de la lista de productos en el producto sólo en la página. Y cada vez que visite la página, el producto se creará una lista de las últimas entradas en la base de datos. ¿Cómo puedo manejar esto?
Me gustaría que hubiera más preguntas y respuestas como esta para el correcto respaldo de frijol de uso. La mayoría de los ejemplos que veo por ahí son simplemente erróneas.
La pregunta del título no representa su contenido. El maestro-detalle concepto es totalmente diferente de una simple página de listado de productos.

OriginalEl autor TGM | 2011-12-10

2 Kommentare

  1. 50

    ¿Cuál es el uso correcto de un ámbito de sesión

    Usarlo para un ámbito de sesión sólo datos, nada más. Por ejemplo, el usuario ha iniciado sesión, la configuración, el lenguaje elegido, etcétera.

    Véase también:


    Y cada vez que visite la página, el producto se creará una lista de las últimas entradas en la base de datos. ¿Cómo puedo manejar esto?

    Generalmente, puede utilizar la solicitud o de la vista alcance. La carga de la lista que debe suceder en un @PostConstruct método. Si la página no contiene ningún <h:form>, entonces el ámbito de petición está bien. Una vista ámbito de frijol podría comportarse como un ámbito de petición cuando no hay <h:form> de todos modos.

    Todos «ver producto» y «modificar producto» enlaces/botones, que sólo recuperar información (es decir, idempotente) debe ser simplemente OBTENER <h:link> /<h:button> en donde pasar el identificador de entidad como un parámetro de la petición por <f:param>.

    Todos «eliminar producto» y «guardar producto» enlaces/botones los cuales se manipular la información (es decir, no idempotente) debe realizar POST por <h:commandLink>/<h:commandButton> (no quiero ser marcable/searchbot-intercambiables!). Esto a su vez requiere un <h:form>. Con el fin de preservar los datos de validaciones y peticiones ajax (de modo que usted no tendrá que volver a cargar/preinitialize la entidad en cada solicitud), el grano debe ser preferiblemente de vista ámbito.

    Tenga en cuenta que usted debe, básicamente, se han separado de frijol para cada vista, y también se nota que los frijoles no necesariamente tiene que hacer referencia a cada uno de los otros.

    Así, dado que este «producto» de la entidad:

    @Entity
    public class Product {
    
        @Id
        private Long id;
        private String name;
        private String description;
    
        //...
    }

    Y este «producto» servicio de EJB:

    @Stateless
    public class ProductService {
    
        @PersistenceContext
        private EntityManager em;
    
        public Product find(Long id) {
            return em.find(Product.class, id);
        }
    
        public List<Product> list() {
            return em.createQuery("SELECT p FROM Product p", Product.class).getResultList();
        }
    
        public void create(Product product) {
            em.persist(product);
        }
    
        public void update(Product product) {
            em.merge(product);
        }
    
        public void delete(Product product) {
            em.remove(em.contains(product) ? product : em.merge(product));
        }
    
        //...
    }

    Usted puede tener este «ver productos» en /products.xhtml:

    <h:dataTable value="#{viewProducts.products}" var="product">
        <h:column>#{product.id}</h:column>
        <h:column>#{product.name}</h:column>
        <h:column>#{product.description}</h:column>
        <h:column>
            <h:link value="Edit" outcome="/products/edit">
                <f:param name="id" value="#{product.id}" />
            </h:link>
        </h:column>
    </h:dataTable>
    @Named
    @RequestScoped
    public class ViewProducts {
    
        private List<Product> products; //+getter
    
        @EJB
        private ProductService productService;
    
        @PostConstruct
        public void init() {
            products = productService.list();
        }
    
        //...
    }

    Y usted puede tener esta «editar producto» en /products/edit.xhtml:

    <f:metadata>
        <f:viewParam name="id" value="#{editProduct.product}" 
            converter="#{productConverter}" converterMessage="Unknown product, please use a link from within the system."
            required="true" requiredMessage="Bad request, please use a link from within the system."
        />
    </f:metadata>
    
    <h:messages />
    
    <h:form rendered="#{not empty editProduct.product}>
        <h:inputText value="#{editProduct.product.name}" />
        <h:inputTextarea value="#{editProduct.product.description}" />
        ...
        <h:commandButton value="save" action="#{editProduct.save}" />
    </h:form>
    @Named
    @ViewScoped
    public class EditProduct {
    
        private Product product; //+getter +setter
    
        @EJB
        private ProductService productService;
    
        public String save() {
            productService.save(product);
            return "/products?faces-redirect=true";
        }
    
        //...
    }

    Y este convertidor para <f:viewParam> de «editar producto»:

    @Named
    @RequestScoped
    public class ProductConverter implements Converter {
    
        @EJB
        private ProductService productService;
    
        @Override
        public Object getAsObject(FacesContext context, UIComponent component, String value) {
            if (value == null || value.isEmpty()) {
                return null;
            }
    
            try {
                Long id = Long.valueOf(value);
                return productService.find(id);
            } catch (NumberFormatException e) {
                throw new ConverterException("The value is not a valid Product ID: " + value, e);
            }
        }
    
        @Override    
        public String getAsString(FacesContext context, UIComponent component, Object value) {        
            if (value == null) {
                return "";
            }
    
            if (value instanceof Product) {
                Long id = ((Product) value).getId();
                return (id != null) ? String.valueOf(id) : null;
            } else {
                throw new ConverterException("The value is not a valid Product instance: " + value);
            }
        }
    
    }

    Véase también:

    +1 muy buen patrón para hacer de maestro/detalle de la edición en JSF. Sólo esto debe ser puesto en un blue-print en algún lugar.
    Gracias! Tu post me dio todas las respuestas que necesitaba.
    ¿cómo incorporar sus sugerencias de uso de la misma página de ediciones y opiniones en este post stackoverflow.com/questions/8768117/… cuando se que el post tiene un backing bean método que establece la edición booleano pero aquí usted está sugiriendo una simple OBTENER enlace? Me gusta el de arriba, es simple, pero también me gustaría decir ‘hey usted no está autorizado a editar» y redirec/fwd para leer sólo si alguien adivina la dirección URL ‘edición.xhtml?product_id=###’ sé que este post es viejo, tal vez usted tiene algunas actualizado manera de hacer las cosas ahora
    muchas gracias por este gran ejemplo, usted salvó mi día 🙂

    OriginalEl autor BalusC

  2. 0

    Como una pequeña mejora a lo BalusC recomendado, a veces puede quitar el required /requiredMessage parte de la <f:viewParam> de su «detalles» de la pantalla, y en lugar de usar el condicional de representación del formulario de edición (como BalusC hizo) con un revés condición para recomendar un enlace específico para la «lista maestra» de la pantalla o, incluso el uso de un viewAction que pondría a prueba el param y la fuerza de una redirección a la lista.

    OriginalEl autor Eduard Korenschi

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea