component binding vs findComponent() - when to use which?

后端 未结 1 398
故里飘歌
故里飘歌 2021-02-02 04:16

As described in this question I try to perform some field validation in a form on the backing bean side. For this I would like to access the violating fields to mark them. From

相关标签:
1条回答
  • 2021-02-02 04:42

    First of all, regardless of the choice, both are a poor practice. See also How does the 'binding' attribute work in JSF? When and how should it be used?

    If you had to make the choice, component bindings are definitely faster and cheaper. It makes logically completely sense that a tree scan as done by UIComponent#findComponent() has its performance implications.

    Indeed, the backing bean holding the component bindings must be request scoped, but you could easily inject a different scoped backing bean holding the business logic in it by @ManagedProperty.

    A cleaner approach would be to use a Map as holder of all component bindings. You only need to add the following entry to 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>
    

    This can just be used as

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

    And this can be obtained in other beans as

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

    This way you don't need to worry about specifying individual properties/getters/setters. In the above example, the Map will contain three entries with keys input1, input2 and input3, each with the respective UIComponent instance as value.


    Unrelated to the concrete question, there may be a much simpler solution to the concrete problem as you described in the other question than performing the validation in the action method (which is actually Bad Design). I've posted an answer over there.

    0 讨论(0)
提交回复
热议问题