2011-06-08 64 views
2

我想基於視圖參數動態地設置HTML標題元素(在h:head元素內)的值。我正在設置要在preRenderView系統事件中使用的值。我注意到,在preRenderView事件被觸發之前,正在評估獲取標題的EL!爲什麼是這樣,有什麼我可以做的?h:渲染響應階段之前呈現的標題?

如果我在頁面某處的h:outputText中抓取生成的標題值,它將按預期顯示。

的facelet:

<h:head> 
    <title>#{myBean.title}</title> 
</h:head> 

豆:

public void preRenderView(ComponentSystemEvent event) { 
    title = "Person: " + firstname " " + lastname; 
} 
+0

無法在Mojarra 2.0.3或2.1.1上重現您的問題。您使用的是JSF impl/version? – BalusC 2011-06-08 16:42:40

+0

我使用的是GlassFish 3.1,我認爲它與Mojarra 2.1一起提供。 – Ryan 2011-06-08 16:45:39

+1

我上面給出的例子是一個簡化 - 我實際上使用了一個模板,這樣我的每個頁面都可以擁有自己的動態標題:<ui:insert> name =「title」></ui:insert>。也許這很重要? – Ryan 2011-06-08 16:47:54

回答

4

我不能鑽嘴魚科2.0.2〜2.0.6和2.1.1重現此。我用下面的測試豆

@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。上面的例子應該給你一個良好的開端,以進一步建立和實踐你的實際問題。

+0

是的,我錯誤地調用了preRenderView。謝謝。 – Ryan 2011-06-08 17:04:47