я могу обновить строку заголовка?

В предыдущем вопросе я спросил об обновлении строки меню. 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. Вполне может быть, что я не могу сделать то, о чем прошу, но мне нужно подтверждение, если это так.

Спасибо, Илан


person Ilan Tal    schedule 24.05.2012    source источник


Ответы (1)


Вы не можете обновить заголовок с помощью обновления JSF ajax просто потому, что <title> не является компонентом JSF. Вы также не можете помещать компоненты HTML или JSF в <title>, это незаконный синтаксис HTML.

Лучше всего вместо этого использовать JavaScript для обновления заголовка, назначив его document.title. Вы можете использовать RequestContext#execute() для этого.

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

Поскольку это данные, контролируемые пользователем, я бы использовал StringEscapeUtils#escapeJavaScript(), чтобы избежать потенциального Дыры для XSS-атак.

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.

person BalusC    schedule 24.05.2012
comment
Спасибо за Ваш ответ. Я не знал о незаконной проверке синтаксиса HTML. Я попробовал и получил 62 ошибки. Он собирал все специальные данные, связанные с простыми лицами, и помечал их как недопустимые. Со всеми ложными срабатываниями сложнее увидеть настоящие проблемы. - person Ilan Tal; 25.05.2012
comment
Я попробовал то, что вы предложили, и, очевидно, это сработало. Я хотел бы немного больше, если я могу спросить. Для многих страниц я хотел бы немного больше, чем имя, то есть имя + какое-то предположение, какую страницу он сейчас использует. Чтобы получить это, мне нужно либо перейти к моему ‹ui:define name=AreaTitle›, либо получить значение текущего имени страницы. - person Ilan Tal; 25.05.2012