如何在辅助bean中检索ui:param的值

Moh*_*sen 5 parameters el jsf-2

我正在将参数传递p1给另一个页面page.xhtml:

<ui:include src="page.xhtml">
    <ui:param name="p1" value="#{someObject}"/>
</ui:include>
Run Code Online (Sandbox Code Playgroud)

这可以评估#{p1}支持bean的@PostConstruct方法page.xhtml吗?使用以下代码,#{p1}无法解决:

FacesContext currentInstance = FacesContext.getCurrentInstance();
currentInstance.getApplication().evaluateExpressionGet(currentInstance, "#{p1}", String.class);
Run Code Online (Sandbox Code Playgroud)

我为什么需要这个?

我正在使用xhtml文件(比如component.xhtml)作为自定义UI组件.这个文件有一个支持bean,我应该从中获取组件数据.由于我在我的主JSF页面中包含这个xhtml文件两次或更多,我想将不同的对象传递给每个component.xhtml,以便我的组件每次都包含我的自定义数据.

Bal*_*usC 9

在Mojarra,你可以把它作为一个属性FaceletContext.您可以在得到它@PostConstruct(并因此不在父页面这是保证被引用/首次构建了包含页面管理bean的之前<ui:param>在组件树声明).

FaceletContext faceletContext = (FaceletContext) FacesContext.getCurrentInstance().getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
Object p1 = faceletContext.getAttribute("p1");
Run Code Online (Sandbox Code Playgroud)

在MyFaces中,整个FaceletContext在托管bean中不可用,因为它在视图构建时间结束时被丢弃,因此这个构造不起作用.要独立于JSF实现,您可能需要考虑通过它来设置它<c:set scope="request">.然后它可以作为请求属性使用.

至于具体的功能要求,考虑创建一个带有背衬组件的comoposite组件.有关示例,请参阅我们的复合组件Wiki页面和此博客,了解如何在复合组件中使用多个输入组件.另请参见何时使用<ui:include>,标记文件,复合组件和/或自定义组件?