ui:include值在preRenderView之前进行评估

时间:2013-05-14 13:34:39

标签: jsf-2

page1.xhtml

<h:body>
<h:link outcome="page2.xhtml>
<f:param name="id" value="1"/>
</hlink>
</h:body>

page2.xhtml

 <h:body>
    <f:metadata>
    <f:event type="preRenderView" listener="#{myBean.init}"/>
    </f:metadata>
    <ui:include src="#{myBean.myString}"/>
    </h:body>

MyBean.java

public void init(ComponentsystemEvent e){
  Map<String,String> params = 
  FacesContext.getExternalContext().getRequestParameterMap();
  String myId = params.get("id");
  int id = Integer.parseInteger(myId);
  if(id==1)
    setMyString = "myPage.xhtml";
}

当我从page1.xhtml导航到page2.xhtml时,我发送一个id作为参数,根据这个id,我将显示一个页面

问题是页面无法找到

我正在控制台中打印正在发生的事情是我在转到preRenderView init之前正在评估getMyString()所以为什么会发生这样的事情

我还尝试了post constru,它在managedBean的资源注入中返回了错误

1 个答案:

答案 0 :(得分:4)

这是一个经典的视图构建时间与视图渲染时间问题:<ui:include>是一个在视图构建时评估的标记处理程序,而<f:event type="preRenderView">当然是在视图即将呈现。正如你猜测的那样,后一个事件发生在之后前者,而你期待它。但是,当前一个标记请求评估其属性时,它肯定是null,或者还没有。

阅读经典 JSTL in JSF2 Facelets... makes sense? ,以便更好地了解这两个JSF生命周期阶段之间的关系。