h中的标题:渲染响应阶段之前渲染的头部?

时间:2011-06-08 16:32:25

标签: jsf-2

我正在尝试根据视图参数动态设置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; 
}

1 个答案:

答案 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的方式。以上示例应该为您提供一个良好的开端,以进一步构建和实现您的实际问题。