JSF backing bean structure (mejores prácticas)


Espero que en este post, pueda obtener las opiniones de la gente sobre las mejores prácticas para la interfaz entre las páginas de JSF y los frijoles de respaldo.

Una cosa en la que nunca puedo asentarme es la estructura de mis frijoles de respaldo. Además, nunca he encontrado un buen artículo sobre el tema.

¿Qué propiedades pertenecen a qué frijoles de respaldo? ¿Cuándo es apropiado agregar más propiedades a un frijol dado en lugar de crear un frijol nuevo y agregar las propiedades a él? Para aplicaciones sencillas, ¿tiene sentido tener un solo frijol de respaldo para toda la página, teniendo en cuenta la complejidad que implica inyectar un frijol en otro? ¿Debe el frijol de respaldo contener alguna lógica de negocio real, o debe contener estrictamente datos?

Siéntase libre de responder estas preguntas y cualquier otra que pueda surgir.


En cuanto a reducir el acoplamiento entre la página JSF y el frijol de respaldo, nunca permito que la página JSF acceda a las propiedades de ninguna propiedad de frijol de respaldo. Para por ejemplo, nunca permito algo como:

<h:outputText value="#{myBean.anObject.anObjectProperty}" />

Siempre requiero algo como:

<h:outputText value="#{myBean.theObjectProperty}" />

Con un valor de frijol de respaldo de:

public String getTheObjectProperty()
{
    return anObject.getAnObjectProperty();
}

Cuando hago un bucle sobre una colección, uso una clase wrapper para evitar profundizar en un objeto en una tabla de datos, por ejemplo.

En general, este enfoque me parece "correcto". Evita cualquier acoplamiento entre la vista y los datos. Por favor corrígeme si me equivoco.

 114
Author: Zack Marrapese, 2009-04-14

6 answers

Es posible que desee comprobar esto: haciendo distinciones entre diferentes tipos de frijoles administrados JSF.

Aquí está una descripción de los diferentes tipos de frijol, como se define en el artículo anterior de Neil Griffin:

  • Modelo de Frijol Administrado: Normalmente ámbito de sesión. Este tipo de frijol administrado participa en la preocupación "Modelo" del patrón de diseño MVC. Cuando veas la palabra "modelo" think piensa en DATOS. Un modelo JSF-bean debe ser un POJO que siga el Patrón de diseño JavaBean con getters / setters encapsulando propiedades. El caso de uso más común para un modelo bean es ser una entidad de base de datos, o simplemente representar un conjunto de filas del conjunto de resultados de una consulta de base de datos.
  • Respaldo de Frijol Administrado: Normalmente solicitar alcance. Este tipo de managed-bean participa en la preocupación "View" del patrón de diseño MVC. El propósito de un backing-bean es apoyar la lógica de UI, y tiene una relación 1:: 1 con una vista JSF, o una JSF forma en un Facelet composición. Aunque normalmente tiene propiedades de estilo JavaBean con getters/setters asociados, estas son propiedades de la vista not no del modelo de datos de la aplicación subyacente. JSF backing-beans también puede tener JSF ActionListener y valueChangeListener métodos.
  • Controller Managed-Bean: Normalmente solicitar alcance. Este tipo de managed-bean participa en la preocupación "Controller" del patrón de diseño MVC. El propósito de un frijol controlador es ejecutar algún tipo de lógica de negocio y devolver un resultado de navegación al JSF navigation-handler. JSF controller-beans típicamente tienen métodos de acción JSF (y no métodos ActionListener).
  • Soporte gestionado-Bean: Normalmente sesión o ámbito de aplicación. Este tipo de bean "soporta" una o más vistas en la preocupación "View" del patrón de diseño MVC. El caso de uso típico es suministrar una ArrayList a las listas desplegables de JSF h: selectOneMenu que aparecen en más de una JSF vista. Si los datos en las listas desplegables son particulares para el usuario, entonces el bean se mantendría en el ámbito de la sesión. Sin embargo, si los datos se aplican a todos los usuarios (como una lista desplegable de provincias), entonces el bean se mantendría en el ámbito de aplicación, de modo que pueda almacenarse en caché para todos los usuarios.
  • Utilidad administrada-Bean: Normalmente ámbito de aplicación. Este tipo de bean proporciona algún tipo de función "utility" a una o más vistas JSF. Un buen ejemplo de esto podría ser un FileUpload bean que se puede reutilizar en múltiples aplicaciones web.
 141
Author: cecemel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-31 19:41:32

Gran pregunta. Sufrí mucho con el mismo dilema cuando me mudé a JSF. Realmente depende de su aplicación. Soy del mundo de Java EE, así que recomendaría tener la menor lógica de negocios en sus frijoles de respaldo como sea posible. Si la lógica está puramente relacionada con la presentación de su página, entonces está bien tenerlo en el frijol de respaldo.

Creo que una de las (muchas) fortalezas de JSF es en realidad el hecho de que puede exponer objetos de dominio directamente en los frijoles administrados. Me por lo tanto, recomendaría encarecidamente el enfoque <:outputText value="#{myBean.anObject.anObjectProperty}" />, de lo contrario, terminará haciendo demasiado trabajo para sí mismo al exponer manualmente cada propiedad. Además, sería un poco complicado al insertar o actualizar datos si encapsulara todas las propiedades. Hay situaciones en las que un solo objeto de dominio puede no ser suficiente. En esos casos preparo un ValueObject antes de exponerlo en el frijol.

EDITAR: En realidad, si va a encapsular cada propiedad de objeto que desea exponer, le recomendaría que en su lugar vincule los componentes de la interfaz de usuario al bean de respaldo y luego inyecte el contenido directamente en el valor del componente.

En términos de estructura de frijol, el punto de inflexión para mí fue cuando ignoré con fuerza todo lo que sabía sobre la creación de aplicaciones web y comencé a tratarlo como una aplicación GUI en su lugar. JSF imita mucho Swing y, por lo tanto, las mejores prácticas para desarrollar aplicaciones Swing también se aplicarían principalmente a creación de aplicaciones JSF.

 14
Author: Allan Lykke Christensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-14 21:34:30

Puede que no responda a todas sus preguntas, porque pocas parecen bastante dependientes de caso a caso.

  • Esto está bien para tener una lógica de negocios en su frijol de respaldo. Depende de dónde vienen. Si está practicando el diseño impulsado por el dominio, se sentirá tentado a incluir la lógica de negocios en el respaldo de bean o también puede ser lógica de persistencia. Argumentan que por qué tan tonto objeto. El objeto debe llevar no solo el estado sino también el comportamiento. Por otro lado si consideras tradicional Java EE forma de hacer las cosas, es posible que tenga ganas de tener datos en su frijol de respaldo, que también puede ser su frijol entidad, y otros negocios y lógica de persistencia en algún frijol de sesión o algo así. Eso también está bien.

  • Está perfectamente bien tener un solo frijol de respaldo para toda la página. No veo ningún problema con esto solo. Esto puede no parecer correcto, pero eso depende del caso.

  • Su otra pregunta es mucho más dependiente del caso que usted es tener en la mano. Preferiría ir dominio conducido aquí, podría ser apropiado agregar propiedades a la existente o de lo contrario crear un nuevo frijol para eso. El que mejor se adapte. No creo que haya una bala de plata para esto.

  • Qué propiedades pertenece a qué frijol de respaldo. Bueno, ¿no depende del objeto de dominio? O puede ser que la pregunta no esté tan clara.

Además, en su ejemplo de código dado, no estoy viendo ningún gran beneficio.

 4
Author: Adeel Ansari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-14 03:20:32

Creo que lo más importante con sus frijoles de respaldo es separar sus lógicas. Si tiene una portada para un sistema CMS, lo vería como una mala práctica poner cada pieza de código en un solo frijol porque:

  1. El frijol se volvería muy grande eventualmente
  2. Es más fácil para otras personas encontrar lo que están buscando si están resolviendo problemas en la página de inicio de sesión, si luego pueden buscar fácilmente el código de inicio de sesión.archivo java.
  3. A veces tienes pequeños trozos de funcionalidad que es claramente distinta del resto de su código, al separar esto, me imagino que le haría más fácil a usted mismo volver a desarrollar/expandir este código en algo más grande, cuando ya tiene un buen frijol con buena estructura.
  4. Tener 1 big bean, para hacerlo todo, lo hará más dependiente de la memoria si / cuando tienes que hacer declaraciones como esta MyBigBean bigBean = new MyBigBean (); en lugar de usar la funksjonality que realmente necesitabas haciendo loginBean loginBean = new loginBean (); (Corrígeme si estoy equivocado aquí???)
  5. En mi opinión, separar tus frijoles es como separar tus métodos. Usted no quiere 1 método grande que se ejecuta más de 100 de líneas, sino más bien dividirlo con nuevos métodos que maneja su tarea específica.
  6. Recuerde, lo más probable es que alguien que no sea usted también tenga que trabajar en sus proyectos JSF.


En cuanto al acoplamiento, no lo veo como un problema problemático para permitir que sus páginas JSF accedan también a las propiedades en objetos en su backingbean. Este es el soporte que está integrado en JSF, y realmente solo hace que sea más fácil de leer y construir imo. Ya estás separando la lógica del MVC estrictamente. Al hacer esto, te ahorras toneladas de líneas con getters y setters en tu backingbean. Por ejemplo, tengo un objeto realmente enorme que me han dado los servicios web, donde necesito usar algunas propiedades en mi presentación. Si tuviera que hacer un getter / setter para cada propiedad mi frijol se expandiría con al menos 100 más líneas de variables y métodos para obtener las propiedades. Al usar la funcionalidad JSF incorporada, se ahorran mi tiempo y preciosas líneas de código.

Solo mis 2 centavos con respecto a esto, incluso con la pregunta ya marcada como respondida.

 4
Author: Chris Dale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-16 07:58:29

No sería necesario mantener solo un frijol de respaldo por página. Depende de la funcionalidad, pero la mayoría de las veces tenía un frijol por página, ya que en su mayoría una página maneja una funcionalidad. Por ejemplo, en una página tengo un enlace de registro (enlazaré con RegisterBean) y un enlace de cesta de la compra (ShoopingBasketBean).

Utilizo este <:outputtext> ya que normalmente sigo respaldando beans como action beans que contiene un objeto de datos. No quiero escribir una wrapper en mi bean de respaldo para acceder a las propiedades de mis objetos de datos.

 3
Author: Bhushan Bhangale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-14 03:21:24

Me gusta probar código de negocio sin Vista, por lo que considero BackingBeans como interfaces desde la Vista hasta el código del modelo. Nunca puse ninguna regla o proceso en un fondo. Ese código va a Servicios o Helpers, permitiendo su reutilización.

Si usa validadores, sáquelos de su BackingBean y haga referencia a ellos desde su método de validación.

Si accede a DAOs para rellenar Selects, Radios, Checkboxes, hágalo siempre desde un BackingBean.

Créeme!. Usted puede inyectar un JavaBean en un BackingBean, pero intenta inyectar un BackingBean en otro. Pronto estará en un nigntmare de mantenimiento y comprensión de código.

 0
Author: jjruiz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-13 14:23:07