gpt4 book ai didi

jsf - 在 JSF 中按类型查找组件

转载 作者:行者123 更新时间:2023-12-04 10:49:59 25 4
gpt4 key购买 nike

我的问题与此有关Get all hidden input fields in JSF dynamically但这与我想使用 JSF 而不是纯 HTML 不同,并假设我的 .xhtml 中有以下内容文件:

<h:inputHidden id="name1" value="SomeValue1"/>
<h:inputHidden id="name2" value="SomeValue2"/>

我开发了一个小代码,试图获取所有 h:inputHidden动态标记并将它们的值打印到控制台,但问题是我无法弄清楚如何使一切动态化。在我的代码中,我应该知道 id 的形式如果我想遍历 uicomponents,如何遍历所有 UIComponent在组件树中? (我试过 UIViewRoot#getChildren() 但我只得到了第一个 child )。

这是代码片段:
// formId is the id of my form
List<UIComponent> components = FacesContext.getCurrentInstance().getViewRoot().findComponent("formId").getChildren();
// A List of UIComponent where I am adding my Hidden Inputs
List<UIComponent> hiddenComponents = new ArrayList<UIComponent>();

for (UIComponent component : components) {

// using the hidden inputs type in JSF: HtmlInputHidden
if (component instanceof HtmlInputHidden) {
hiddenComponents.add(component);
}

}

for (UIComponent component : hiddenComponents) {

// Printing the hidden inputs values for demonstration purposes
System.out.println(((HtmlInputHidden)component).getValue());

}

最佳答案

您还需要迭代 child 的 child ,以及他们的 child 等等。你看,它是一个组件 .

这是一个实用方法的启动片段,它使用 tail recursion :

public static <C extends UIComponent> void findChildrenByType(UIComponent parent, List<C> found, Class<C> type) {
for (UIComponent child : parent.getChildren()) {
if (type.isAssignableFrom(child.getClass())) {
found.add(type.cast(child));
}

findChildrenByType(child, found, type);
}
}

以下是您可以使用它的方法:
UIForm form = (UIForm) FacesContext.getCurrentInstance().getViewRoot().findComponent("formId");
List<HtmlInputHidden> hiddenComponents = new ArrayList<>();
findChildrenByType(form, hiddenComponents, HtmlInputHidden.class);

for (HtmlInputHidden hidden : hiddenComponents) {
System.out.println(hidden.getValue());
}

或者,最好使用 UIComponent#visitTree() 它使用 visitor pattern .主要区别在于它还对迭代组件进行迭代,例如 <ui:repeat><h:dataTable>并为每次迭代恢复子状态。否则,当您拥有 <h:inputHidden> 时,您最终将得不到任何值(value)。包含在这样的组件中。
FacesContext context = FacesContext.getCurrentInstance();
List<Object> hiddenComponentValues = new ArrayList<>();
context.getViewRoot().findComponent("formId").visitTree(VisitContext.createVisitContext(context), new VisitCallback() {
@Override
public VisitResult visit(VisitContext visitContext, UIComponent component) {
if (component instanceof HtmlInputHidden) {
hiddenComponentValues.add(((HtmlInputHidden) component).getValue());
return VisitResult.COMPLETE;
} else {
return VisitResult.ACCEPT;
}
}
});

for (Object hiddenComponentValue : hiddenComponentValues) {
System.out.println(hiddenComponentValue);
}

也可以看看:
  • How to collect values of an UIInput component inside an UIData component in bean's action method?
  • How do I attach a FacesMessage from the backing bean to a specific field in a ui:repeat?
  • Accessing dynamic UIComponents in JSF Managed Bean
  • JSF 2 -- Save All Valid Component Values

  • 毕竟,最简单的方法是将它们绑定(bind)到一个 bean 属性上,如果有必要的话,在 <ui:repeat> 中。 :
    <h:inputHidden id="name1" value="#{bean.name1}"/>
    <h:inputHidden id="name2" value="#{bean.name2}"/>

    关于jsf - 在 JSF 中按类型查找组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28567359/

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