gpt4 book ai didi

jsf - 组件绑定(bind)与 findComponent() - 何时使用哪个?

转载 作者:行者123 更新时间:2023-12-04 14:15:55 26 4
gpt4 key购买 nike

this question 中所述我尝试在支持 bean 端的表单中执行一些字段验证。为此,我想访问违规字段以标记它们。
从网上搜索似乎有两种方法可以做到这一点:

  • 将组件存储在支持 bean 中以供访问,并通过 binding 在 JSF 页面中使用它们属性。
  • 在 JSF 页面中使用标准值绑定(bind),当需要从 bean 访问组件时,通过 UIViewRoot.findComponent(String id) 查找它

  • 据我所知,这两种方式都有缺点:
    组件绑定(bind)使用变量和 getter/setter 炸毁了支持 bean,一些站点强烈反对使用组件绑定(bind)。无论如何,建议使用请求范围。另一方面, findComponent() 总是遍历树,这可能会或可能不会很昂贵,对吧? (另外,目前我根本找不到我的组件,但这是另一个问题)

    哪条路要走?这些是可互换的替代方案吗?如果不是,您选择的标准是什么?目前我只是没有足够的洞察力来做出一个体面的决定......

    最佳答案

    首先,无论选择哪种方式,两者都是不好的做法。另见 How does the 'binding' attribute work in JSF? When and how should it be used?

    如果您必须做出选择,组件绑定(bind)肯定更快更便宜。 UIComponent#findComponent() 所做的树扫描在逻辑上完全合理。有其性能影响。

    实际上,持有组件绑定(bind)的支持 bean 必须是请求范围的,但是您可以通过 @ManagedProperty 轻松地注入(inject)一个不同范围的支持 bean,其中包含业务逻辑。 .

    更简洁的方法是使用 Map作为所有组件绑定(bind)的持有者。您只需将以下条目添加到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>

    这可以用作
    <h:inputSome binding="#{components.input1}" />
    <h:inputSome binding="#{components.input2}" />
    <h:inputSome binding="#{components.input3}" />

    这可以在其他bean中获得
    Map<String, UIComponent> components = (Map<String, UIComponent>) externalContext.getRequestMap().get("components");

    这样您就不必担心指定单个属性/getter/setter。在上面的例子中, Map将包含三个带有键 input1 的条目, input2input3 , 每个都有各自的 UIComponent实例作为值。

    无关对于具体问题,您在另一个问题中描述的具体问题可能有一个更简单的解决方案,而不是在操作方法中执行验证(这实际上是糟糕的设计)。我已经在那里发布了答案。

    关于jsf - 组件绑定(bind)与 findComponent() - 何时使用哪个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12474004/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com