2011-06-08 62 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