2012-09-18 13 views
6

Como se describe en this question Intento realizar alguna validación de campo en un formulario en el lado del bean de respaldo. Para esto, me gustaría acceder a los campos infractores para marcarlos. De buscar en la web parece que hay dos maneras de hacer esto:unión de componentes frente a findComponent(): ¿cuándo usar qué?

  • almacenar los componentes en el bean de respaldo para el acceso y el uso de ellos en las páginas JSF a través del atributo binding.
  • El valor de uso estándar de unión en las páginas JSF y cuando se necesita acceso a un componente de la semilla, mirar hacia arriba a través de UIViewRoot.findComponent(String id)

Por lo que yo puedo ver las dos formas tienen inconvenientes: fijaciones de componentes explota la backing bean con variables y getters/setters, algunos sitios desaconsejan el uso de enlaces de componentes. En cualquier caso, se recomienda un alcance de solicitud. Por otro lado, findComponent() siempre cruza el árbol, lo que puede o no ser costoso, ¿verdad? (Además, en este momento no puedo encontrar mi componente, pero ese es otro problema)

¿Cuál sería el camino a seguir? ¿Son estas alternativas intercambiables y, de no ser así, según los criterios elegidos? Actualmente, simplemente no tengo suficiente información para tomar una decisión decente ...

+0

La misma pregunta en [este otro foro] (http://www.jguru.com/forums/view.jsp?EID = 1522894 #), pero desafortunadamente, no hay respuestas;) – Louise

Respuesta

8

En primer lugar, independientemente de la elección, ambos son una práctica deficiente. Consulte también How does the 'binding' attribute work in JSF? When and how should it be used?

Si tuviera que elegir, los enlaces de componentes son definitivamente más rápidos y económicos. Tiene sentido lógicamente que un análisis de árbol como el realizado por UIComponent#findComponent() tenga sus implicaciones de rendimiento.

De hecho, el bean de respaldo que sostiene los enlaces de componentes debe ser un ámbito de petición, pero que podría fácilmente inyectar un bean de respaldo de ámbito diferente que sostiene la lógica de negocio en él por @ManagedProperty.

Un enfoque más limpio sería utilizar un Map como titular de todas las fijaciones de componentes. Sólo tiene que añadir la siguiente entrada al faces-config.xml:

<managed-bean> 
    <managed-bean-name>components</managed-bean-name> 
    <managed-bean-class>java.util.HashMap</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
</managed-bean> 

Esto sólo se puede utilizar como

<h:inputSome binding="#{components.input1}" /> 
<h:inputSome binding="#{components.input2}" /> 
<h:inputSome binding="#{components.input3}" /> 

Y esto puede obtenerse de otros granos como

Map<String, UIComponent> components = (Map<String, UIComponent>) externalContext.getRequestMap().get("components"); 

De esta manera usted no necesita preocuparse por especificar propiedades/getters/setters individuales. En el ejemplo anterior, el Map contendrá tres entradas con las claves input1, input2 y input3, cada una con la respectiva instancia UIComponent como valor.


Sin relación a la cuestión concreta, puede haber una solución mucho más simple al problema concreto como se describe en la otra pregunta que realizar la validación del método de acción (que es en realidad Mal diseño). He publicado una respuesta allí.

+0

significa que el uso de enlazadores de propiedades normalmente no es una buena práctica. Deberíamos preferir enlaces de componentes en este caso? – benz

+0

No quise dar a entender que. El uso de enlaces de valores de componentes debería ser preferible, pero esto está fuera de tu pregunta actual, ¿no? – BalusC

+0

Eso es correcto. Vi la pregunta y pensé en preguntar. Voy a hacer una pregunta sobre esto por separado. – benz

Cuestiones relacionadas