如何在支持 bean 中检索 ui:param 的值

问题描述 投票:0回答:4

我正在将参数

p1
传递到另一个页面
page.xhtml
:

<ui:include src="page.xhtml">
    <ui:param name="p1" value="#{someObject}"/>
</ui:include>

是否可以在

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

FacesContext currentInstance = FacesContext.getCurrentInstance();
currentInstance.getApplication().evaluateExpressionGet(currentInstance, "#{p1}", String.class);

为什么我需要这个?

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

jsf-2 parameters el
4个回答
11
投票

在Mojarra中,您可以将其作为

FaceletContext
的属性来获取。您可以在托管 bean 的
@PostConstruct
中获取它,该 bean 保证在包含的页面中首次被引用/构造(因此在组件树中声明 <ui:param> 之前)不在父页面中).

FaceletContext faceletContext = (FaceletContext) FacesContext.getCurrentInstance().getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY); Object p1 = faceletContext.getAttribute("p1");

在 MyFaces 中,整个 
FaceletContext

在托管 bean 中不可用,因为它在视图构建时间结束时被丢弃,并且此构造将不起作用。为了独立于 JSF 实现,您可能需要考虑通过

<c:set scope="request">
来设置它。然后它可以作为请求属性使用。

对于具体的功能需求,可以考虑创建一个带有支持组件的复合组件。有关一些示例,请参阅

我们的复合组件 wiki 页面

以及有关 在复合组件中使用多个输入组件 的博客。另请参阅 何时使用 、标记文件、复合组件和/或自定义组件?


2
投票

遵循将 p1 参数传递给 page.xhtml 模板的 OP 示例

主页:

<ui:include src="page.xhtml"> <ui:param name="p1" value="#{someObject}"/> </ui:include>

page.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" ...> <ui:composition> <f:event listener="#{backingBean.init(p1)}" type="preRenderComponent"/> ... </ui:composition> </html>

BackingBean.java:

@ViewScoped public class BackingBean{ private Object p1; public void init(Object value){ this.p1=p1; } ... }

该事件在 ui:composition 标签渲染之前触发,即在 page.xhtml 渲染之前


0
投票

<ui:include src="page.xhtml"> <ui:param name="p1" value="#{someObject}"/> </ui:include>

page.xhtml:

<c:set var="data" value="#{p1}" scope="request"/>

你的豆子:

@ViewScoped public class ManagedBean{ private Object someObject; public Object getSomeObject(){ if(someObject== null){ HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); someObject= request.getAttribute("data"); } return someObject; } public void setSomeObject(Object someObject){ this.someObject = someObject; }}



0
投票

FaceletContext FaceletContext = (FaceletContext) FacesContext.getCurrentInstance().getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY); 对象 p1 =faceletContext.getAttribute("p1");

© www.soinside.com 2019 - 2024. All rights reserved.