在上一个问题中,我问过有关更新菜单栏的问题。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上给我的先前解决方案。很可能我无法完成我要求做的事情,但是我想确认是否是这种情况。
谢谢
您不能仅仅通过JSFajax更新来更新标题,因为<title>它不是JSF组件。您也不能将HTML或JSF组件放入中<title>,这是非法的 HTML语法。
<title>
最好的选择是使用JavaScript而不是通过将标题分配给来更新标题document.title。您可以使用RequestContext#execute()它。
document.title
RequestContext#execute()
String fullName = current.getFirstName() + " " + current.getSurName(); context.execute("document.title='" + fullName + "'");
由于这似乎是用户控制的数据,因此我将对其StringEscapeUtils#escapeJavaScript()进行转义以防止潜在的XSS攻击漏洞。
StringEscapeUtils#escapeJavaScript()
String fullName = current.getFirstName() + " " + current.getSurName(); context.execute("document.title='" + StringEscapeUtils.escapeJavaScript(fullName) + "'");
另一种方法是使用OmniFaces <o:onloadScript>。
<o:onloadScript>
<o:onloadScript>document.title='#{of:escapeJS(viewBacking.current.firstName)} #{of:escapeJS(viewBacking.current.surName)}'</o:onloadScript>
这将在每个ajax请求上重新执行。