我在f:metadata元素中使用prerender视图事件调用另一个页面。
如果我使用<h:link>
导航到页面,它可以工作并调用侦听器方法。
但是,如果我使用属于调用页面的托管bean的action方法的结果导航到页面,则prerenderview中指定的侦听器不会被调用(如果通过链接调用的话)。它会导航到第二页,只是没有监听器调用。
我真的更喜欢从action方法调用,因为我使用它来做一些工作并在会话映射中放置一个变量来使用。我不确定如何使用链接实现相同的功能。对象可能相当大...... kb不是Mb但仍然不是我想要放在请求中的东西。
我已经尝试使调用页面请求的托管bean作用域并查看作用域。
如果从托管bean结果中调用prerenderview,是不是可以触发它?正如我所说,我从一个链接开始工作。
<body>
<ui:define name="metadata">
<f:view>
<f:metadata>
<f:event type="preRenderView" listener="#{businessBean.init}" />
</f:metadata>
</f:view>
</ui:define>
<ui:composition template="#{navigationprops.soulard_2col_uprefs_template}">
答案 0 :(得分:6)
ui:组合标签修剪它之外的所有内容,因此facelets编译器没有机会读取代码。相反,您应该使用ui:decorate,但请记住f:metadata标签仅适用于顶级页面,而不适用于模板客户端。例如:
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<f:metadata>
<f:viewParam name="hotid"
value="#{hotelBooking.hotelId}"
converter="javax.faces.Long"/>
<f:event type="preRenderView" listener="#{hotelBooking.selectHotel}"/>
</f:metadata>
<ui:decorate template="template.xhtml">
<ui:define name="content">
<!-- ... -->
</ui:define>
</ui:decorate>
</ui:composition>
有关详细信息,请参阅This example。
答案 1 :(得分:0)
我尝试了另一个答案,这是我唯一能做的工作......它通过以编程方式调用redirect来模仿action方法中的链接。
public void editArticle(Article article) {
FacesContext fcontext = FacesContext.getCurrentInstance();
ExternalContext context = fcontext.getExternalContext();
Map<String, Object> sessionMap = context.getSessionMap();
sessionMap.put("articleId", article.getArticleId());
String urlString = navBundle.getString("ARTICLE_EDITOR");
String url = context.encodeActionURL(fcontext.getApplication().getViewHandler().getActionURL(fcontext, urlString));
try {
context.redirect(url);
} catch (IOException ex) {
ELSLogger.LOG(Level.SEVERE, this.getClass().getName(), "checkEligableToLogin", "Couldn't Redirect to: " + url);
}
}
现在事实证明我在prerender视图上改变了主意,但这已经完成并且有效,所以我稍后会重构。但是如果有人想要看到可以从支持bean以编程方式调用另一个页面的工作代码,那么就是这样。 FWIW,&#34; ARTICLE_EDITOR&#34;是一个从context-root开始持有url的变量。