在 JSF 中遍历 UIViewRoot 使用了哪种算法?

Which algorithum is used in traversing UIViewRoot in JSF?

在 JSF 中,为我们的 JSF 页面创建了一个 UIViewRoot。我们在遍历的时候,是用什么算法遍历的?

不确定 "algorithm" 是否正确。它至少支持两种 iterator and visitor 模式。

迭代器通过 UIComponent#findComponent()(单击 link 查看描述搜索算法的大量 javadoc)。

UIComponent found = someComponent.findComponent(clientIdExpression);
// ...

访客通过 UIComponent#visitTree() and UIComponent#invokeOnComponent().

someComponent.visitTree(VisitContext.createVisitContext(FacesContext.getCurrentInstance(), Arrays.asList(clientId), null), new VisitCallback() {
    @Override
    public VisitResult visit(VisitContext context, UIComponent found) {
        // ...    
        return VisitResult.COMPLETE;
    }
});
someComponent.invokeOnComponent(FacesContext.getCurrentInstance(), clientId, new ContextCallback() {
    @Override
    public void invokeContextCallback(FacesContext context, UIComponent found) {
        // ...    
    }
});

无论哪种方式,someComponent 都可以代表 UIViewRoot 本身,但它基本上可以是您想要的任何父组件。