我可以更新标题栏吗?

问题描述:

在之前的question中,我询问了有关更新菜单栏的问题。 BalusC告诉我,我需要添加包含菜单栏的表单。我可以更新标题栏吗?

我想延长这个问题,问我是否可以更新标题中的文字。正在使用的模板和我使用填补值

<ui:define name="AreaTitle"> 
     #{viewBacking.current.firstName} #{viewBacking.current.surName} 
    </ui:define> 

该模板具有

<h:head> 
<title><ui:insert name="AreaTitle">Master template</ui:insert></title> 
<link href="style.css" rel="stylesheet" type="text/css" media="screen" /> 
</h:head> 

它似乎奇怪,以限定在所述报头中的表格,以便没有被定义。我在viewBacking.current中放置了一个断点,以便我可以看到它何时使用它。即使我点击刷新重新显示表格,它也不会再次触发中断点。只有当我访问不同内容的不同页面时,它才会再次触发转折点。刷新的是

public void refreshForm() { 
    RequestContext context = RequestContext.getCurrentInstance(); 
    context.update("menuForm:masterMenuBar"); 
    context.update("AreaTitle"); 
} 

这显示了BalusC在masterMenuBar上给出的以前的解决方案。很可能是因为我不能做我想要做的事情,但如果确实如此,我想要确认。

感谢, 宜兰

无法更新标题由JSF ajax的更新,只是因为<title>不是一个JSF组件。您也不能将HTML或JSF组件放入<title>,这是illegal HTML语法。

最好的办法是用JavaScript代替document.title来更新标题。您可以使用RequestContext#execute()

String fullName = current.getFirstName() + " " + current.getSurName(); 
context.execute("document.title='" + fullName + "'"); 

由于这似乎是用户控制的数据,我会用StringEscapeUtils#escapeJavaScript()逃避它,以防止潜在的XSS attack holes

String fullName = current.getFirstName() + " " + current.getSurName(); 
context.execute("document.title='" + StringEscapeUtils.escapeJavaScript(fullName) + "'"); 

一种替代方法是使用OmniFaces<o:onloadScript>

<o:onloadScript>document.title='#{of:escapeJS(viewBacking.current.firstName)} #{of:escapeJS(viewBacking.current.surName)}'</o:onloadScript> 

这将在每个ajax请求中重新执行。

+0

感谢您的回答。我不知道HTML语法的非法检查。我试了一下,得到了62个错误。它收集了与primefaces相关的所有特殊输入,并将它们全部标记为非法。有了所有的误报,就很难看到真正的问题。 –

+0

我尝试了你的建议,显然它工作。如果我可以问,我想多一点。对于许多页面,我希望稍微多于名称,即名称+他正在使用哪个页面的某种建议。为了得到我要么必须到我的或获取什么是当前页面名称的值。 –