我正在尝试根据视图参数动态设置HTML标题元素的值(在h:head元素内)。我正在设置要在preRenderView系统事件中使用的值。我注意到在preRenderView事件被触发之前,正在评估获取标题的EL!为什么这样,我能做些什么?
如果我在页面中某处的h:outputText中获取生成的标题值,则会按预期显示。
的facelet:
<h:head>
<title>#{myBean.title}</title>
</h:head>
豆:
public void preRenderView(ComponentSystemEvent event) {
title = "Person: " + firstname " " + lastname;
}
答案 0 :(得分:4)
我无法在Mojarra 2.0.2~2.0.6和2.1.1上重现这一点。我使用了以下测试bean
@ManagedBean
@RequestScoped
public class Bean {
private String title = "default";
public void preRenderView(ComponentSystemEvent event) {
title = "newtitle";
}
public String getTitle() {
return title;
}
}
以下观点:
<!DOCTYPE html>
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
<f:event type="preRenderView" listener="#{bean.preRenderView}" />
<h:head>
<title>#{bean.title}</title>
</h:head>
<h:body>
<h1>Peek-a-boo</h1>
</h:body>
</html>
还有以下主模板
<!DOCTYPE html>
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
<f:event type="preRenderView" listener="#{bean.preRenderView}" />
<h:head>
<title><ui:insert name="title">Default title</ui:insert></title>
</h:head>
<h:body>
<ui:insert name="content">Default content</ui:insert>
</h:body>
</html>
有了这个定义
<ui:composition template="/template.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
<ui:define name="title">
#{bean.title}
</ui:define>
<ui:define name="content">
<h1>Peek-a-boo</h1>
</ui:define>
</ui:composition>
一切都同样好。在所有情况下,标题都变为newtitle
。 <f:event>
放置在模板中的位置也没关系。在头部,体内,主模板或模板定义之前。
可能问题在于您调用preRenderView
的方式。以上示例应该为您提供一个良好的开端,以进一步构建和实现您的实际问题。