【问题标题】:ui:include value is evaluated before preRenderViewui:include 值在 preRenderView 之前评估
【发布时间】:2013-05-14 13:34:38
【问题描述】:

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 初始化之前所以为什么会这样

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

【问题讨论】:

  • PostConstruct 似乎更正确。发布堆栈跟踪

标签: jsf-2


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 2012-10-28
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    相关资源
    最近更新 更多