5

我将参数传递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,以便我的组件每次都使用我的自定义数据。

4

3 回答 3

10

在 Mojarra 中,您可以将其作为FaceletContext. 您可以在托管 bean 中获取它,该bean 保证在包含的页面中第一次被引用/构造(因此在组件树中声明之前不在@PostConstruct父页面中)。<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 页面和有关在复合组件中使用多个输入组件的博客。另请参阅何时使用 <ui:include>、标记文件、复合组件和/或自定义组件?

于 2013-01-22T16:33:49.967 回答
2

@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 渲染之前

于 2018-10-17T10:36:24.893 回答
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;
     }}
于 2017-05-03T15:06:06.827 回答