Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 h中的标题:在渲染响应阶段之前渲染的头部?_Jsf 2 - Fatal编程技术网

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

Jsf 2 h中的标题:在渲染响应阶段之前渲染的头部?,jsf-2,Jsf 2,我试图根据视图参数动态设置HTML标题元素(在h:head元素中)的值。我正在设置要在preRenderView系统事件中使用的值。我注意到,在触发preRenderView事件之前,正在评估获取标题的EL!这是为什么?我能做些什么吗 如果我在页面的某个地方获取h:outputText中生成的标题值,它将按预期显示 Facelet: <h:head> <title>#{myBean.title}</title> </h:head> 我无法

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

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

Facelet:

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

我无法在Mojarra 2.0.2~2.0.6和2.1.1上重现这一点。我使用了以下测试bean

@ManagedBean
@请求范围
公共类Bean{
私有字符串title=“default”;
公共无效预渲染视图(组件系统事件){
title=“newtitle”;
}
公共字符串getTitle(){
返回标题;
}
}
以及以下观点:

<!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>

#{bean.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><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>

#{bean.title}
偷偷摸摸
一切都一样好。在所有情况下,标题都变为
newtitle
。将
放在模板中的什么位置也无关紧要。头部之前、身体内部、主模板或模板定义中


问题可能在于如何调用
preRenderView
。上面的例子应该会给你一个很好的开端,让你进一步了解并解决你的实际问题。

无法在Mojarra 2.0.3或2.1.1上重现你的问题。您使用的是什么JSF impl/版本?我使用的是GlassFish 3.1,我认为这是Mojarra 2.1附带的。我上面给出的示例是一个简化-我实际上使用了一个模板,这样我的每个页面都可以有自己的动态标题:name=“title”>。也许这很重要?也不能在GF 3.1上复制。您究竟是如何调用
预渲染视图的。。。你刚才回答了我的问题!我最近将preRenderView移动到空组件上的preRenderComponent,这样ajax请求就不会触发preRenderView事件。这打破了动态标题!谢谢让我知道如何给你分数,因为我是StackOverflow的新手。
<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>