不能在同一页面上使用复合组件与ui:include依赖于ui:params

时间:2012-07-05 15:07:07

标签: jsf-2

我有一个使用ui:include的基页来包含另一个页面。 ui:include使用ui:param将参数传递给包含的页面。 param在包含页面的控制器的PostConstruct方法中读取。

此设计正常工作,直到我将复合组件添加到基页;一旦添加,包含的页面控制器报告ui:param的值为null。一旦我从页面中删除了复合组件,就可以通过包含页面的控制器读取ui:param(即非空)。请帮忙!


要重现问题的文件:

myPage.xhtml

<html xmlns:ui="http://java.sun.com/jsf/facelets"   
      xmlns:mycomponents="http://java.sun.com/jsf/composite/mycomponents">

    <ui:include src="includePage.xhtml">
        <ui:param name="myParam" value="myValue"/>
    </ui:include>

    <p/>

    <mycomponents:myComponent/>

</html>

myIncludedPage.xhtml

<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets">

    The value of the param is: #{includedPageController.myParam}

</ui:composition>

myComponent.xhtml (置于“资源/ mycomponents”中)

<html xmlns="http://www.w3.org/1999/xhtml"   
      xmlns:composite="http://java.sun.com/jsf/composite">

      <composite:interface/>

      <composite:implementation>
        I am the composite component
      </composite:implementation>

</html>

IncludedPageController.java

@ManagedBean
public class IncludePageController
{
    String myParam;

    @PostConstruct
    private void init()
    {
        FaceletContext faceletContext = (FaceletContext)FacesContext.getCurrentInstance().
                getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
        myParam = (String)faceletContext.getAttribute("myParam");               
    }   

    public String getMyParam()
    {       
        return myParam;
    }

    public void setMyParam(String myParam)
    {
        this.myParam = myParam;
    }   
}

1 个答案:

答案 0 :(得分:0)

请参阅:How do I set Managed Bean field to the value of a ui:param?。在JSF API中没有做这种事情的标准。应使用复合或自定义组件,而不是include / param标签组合。