ui: включаемое значение оценивается перед preRenderView

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, я отправляю идентификатор в качестве параметра, где в соответствии с этим идентификатором я буду отображать страницу

проблема в том, что страница не может быть найдена

Я печатаю в консоли, что происходит, что я обнаружил, что он оценивает getMyString() перед переходом к init preRenderView, так почему это происходит так

я также попытался постстроить, он возвратил ошибку при внедрении ресурса managedBean

1 ответ

Это классическое представление времени сборки против проблемы времени представления представления: <ui:include> является обработчиком тега, который оценивается во время сборки представления, в то время как <f:event type="preRenderView"> естественно, вызывается именно тогда, когда представление должно быть визуализировано. Как вы думаете, последнее событие происходит после первого, тогда как вы ожидаете, что это будет иначе. Тем не менее, когда предыдущий тег запрашивает оценку его атрибута, он определенно null или еще не там.

Читать классические JSTL в JSF2 Facelets... имеет смысл? чтобы лучше понять, как соотносятся эти две фазы жизненного цикла JSF.

Другие вопросы по тегам