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的资源注入中返回了错误
答案 0 :(得分:4)
这是一个经典的视图构建时间与视图渲染时间问题:<ui:include>
是一个在视图构建时评估的标记处理程序,而<f:event type="preRenderView">
当然是在视图即将呈现。正如你猜测的那样,后一个事件发生在之后前者,而你期待它。但是,当前一个标记请求评估其属性时,它肯定是null
,或者还没有。
阅读经典 JSTL in JSF2 Facelets... makes sense? ,以便更好地了解这两个JSF生命周期阶段之间的关系。