1

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 我将显示一个页面

问题是找不到该页面

我正在控制台中打印发生了什么我发现它正在评估 getMyString() 在进入 preRenderView init 之前为什么会这样

我也尝试过构建它在 managedBean 的资源注入中返回错误

4

1 回答 1

4

这是一个经典的视图构建时间与视图渲染时间问题:<ui:include>是一个标签处理程序,在视图构建时进行评估,而在视图即将被渲染<f:event type="preRenderView">时自然会被调用。正如您所猜测的那样,后一个事件发生在前一个事件之后,而您期望不是这样。尽管如此,当前一个标签请求评估其属性时,它肯定是,或者还没有。null

阅读 JSF2 Facelets 中的经典JSTL... 有意义吗?更好地掌握 JSF 生命周期的这两个阶段之间的关系。

于 2013-05-14T17:05:39.903 回答