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

时间:2013-01-22 13:36:37

标签: jsf-2 parameters el

我正在将参数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,以便我的组件每次都包含我的自定义数据。

3 个答案:

答案 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的呈现之前触发