【问题标题】:title in h:head rendered before render response phase?在渲染响应阶段之前渲染的 h:head 中的标题?
【发布时间】:2011-09-11 01:08:42
【问题描述】:

我正在尝试根据视图参数动态设置 HTML 标题元素(在 h:head 元素内)的值。我正在设置要在 preRenderView 系统事件中使用的值。我注意到在触发 preRenderView 事件之前正在评估获取标题的 EL!为什么会这样?有什么我可以做的吗?

如果我在页面某处的 h:outputText 中获取生成的标题值,它将按预期显示。

小脸:

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

豆子:

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

【问题讨论】:

  • 无法在 Mojarra 2.0.3 或 2.1.1 上重现您的问题。你使用的是什么 JSF impl/version?
  • 我使用的是 GlassFish 3.1,我认为 Mojarra 2.1 自带。
  • 我上面给出的例子是一种简化——我实际上是在使用一个模板,这样我的每个页面都可以有自己的动态标题:<insert> name="title" >插入></insert>。也许这很重要?
  • 也无法在 GF 3.1 上重现。你究竟是如何调用preRenderView
  • 啊……你刚刚回答了我的问题!我最近将 preRenderView 移动到了一个空组件上的 preRenderComponent,这样 ajax 请求就不会触发 preRenderView 事件。这打破了动态标题!谢谢。让我知道如何给你积分,因为我是 StackOverflow 的新手。

标签: jsf-2


【解决方案1】:

我无法在 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&lt;f:event&gt; 放在模板中的哪个位置也无关紧要。在 head 之前、body 内部、主模板或模板定义中。

问题可能在于您调用preRenderView 的方式。上面的例子应该给你一个很好的开端,以进一步建立和确定你的实际问题。

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 2023-02-23
    相关资源
    最近更新 更多