JSF - 如何使用托管bean将h添加到h:head或h:body

时间:2016-11-20 01:08:54

标签: jsf jsf-2 managed-bean

我正在尝试测试我的托管bean动态修改网页programmatically;大多数jsf示例显示如何使用绑定来修改ui但是网页的其余部分呢?这些示例显示了如何访问通常位于UIViewRoot区块中的h:body,但h:body本身或h:head呢?

所以我的问题是......是否有办法使用FacesContexth:bodyh:head作为父组件并使用托管bean添加子项或者请告知如何使用其他方式获得相似效果?

由于

2 个答案:

答案 0 :(得分:1)

UIViewRoot<f:view>标记表示。如果您没有在JSF页面中明确定义它,则会隐式添加它。

  

UIViewRoot,通常位于h:body block

不,身体内部,但默认情况下围绕身体和头部。像这样:

<html xmlns="http://www.w3.org/1999/xhtml"  
    xmlns:h="http://java.sun.com/jsf/html"  
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <f:view> <!-- No need to define. Added implicitly here in ComponentTree -->
        <h:head>
            <meta http-equiv="content-type" content="text/html;charset=UTF-8"/>
        </h:head> 
        <h:body>    
            <h:outputText value="#{hello.message}"/>            
       </h:body>
   </f:view>
</html> 

因此,如果您使用FacesContext.getCurrentInstance().getViewRoot()获取UIViewRoot并询问其子项(.getChildren()),您将获得4个元素的列表:

  1. UIInstructions:呈现<html>开启标记
  2. UIOutput:这是<h:head>。再次要求getChildren获取UIOutput代码
  3. <meta>
  4. HtmlBody:显然这是h:body。要求getChildren获取<h:outputText>
  5. UIInstructions:呈现</html>结束标记
  6.   

    使用托管bean

    添加子项

    是的,一般情况下,您可以使用ManagedBeans来操作UIComponentTree(例如,添加项目,然后重新加载页面以显示它)。但是,请考虑JSF lifecycle和处理顺序(例如,您无法在渲染阶段将子项添加为正文的第一个元素,因为项目已经处理过)。 将新元素添加到正文的示例:

    List<UIComponent> viewRootChildren = FacesContext.getCurrentInstance().getViewRoot().getChildren();
    for(UIComponent child : viewRootChildren){
        if( child instanceof HtmlBody ){
            HtmlOutputText newText = new HtmlOutputText();
            newText.setValue("added dynamically");
            child.add(newText);
        }
    }
    

答案 1 :(得分:0)

您可以使用rendered属性显示/隐藏JSF组件。

以下是一个示例 -

<h:outputText value="Result = #{calculator.result}" rendered="#{calculator.result != null}"/>

此处,只有当calculator.result不是nullcalculatormanagedBean的名称且result<h:panelGroup>时,此元素才会显示在用户界面中那个bean里面的变量。您可以在预渲染事件或AJAX调用或其他事件中更改此变量的值。

对于多个元素,您可以将rendered@register.filter(name='dj_iter') def dj_iter(gen): try: return next(gen) Except StopIteration: return 'Completed Iteration' 属性一起使用。