我正在将参数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,以便我的组件每次都包含我的自定义数据。
答案 0 :(得分:8)
在Mojarra中,您可以将其作为FaceletContext
的属性。您可以在托管bean的@PostConstruct
中获取它,该托管bean保证在包含的页面中首次引用/构造(因此不会在之前的中的{em>} {{1>} 1}}在组件树中声明。
<ui:param>
在MyFaces中,整个FaceletContext faceletContext = (FaceletContext) FacesContext.getCurrentInstance().getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
Object p1 = faceletContext.getAttribute("p1");
在托管bean中不可用,因为它在视图构建时间结束时被丢弃,因此该构造不起作用。要独立于JSF实现,您可能需要考虑通过FaceletContext
来设置它。然后它可以作为请求属性使用。
关于具体的功能要求,考虑创建一个带有支持组件的comoposite组件。有关示例,请参阅our composite component wiki page和此博客有关using multiple input components in a composite component的信息。另请参阅When to use <ui:include>, tag files, composite components and/or custom components?
答案 1 :(得分: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;
}}
答案 2 :(得分:0)
该参数在@PostConstruct方法中不可用;您可以使用preRenderComponent事件初始化后备bean中的参数;只需将其放在包含页面的ui:composition之后,它将在呈现包含页面本身之前执行。
以下将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的呈现之前触发