Как реализовать JSF в Backbase Portal 5.2.1.2?
В настоящее время я пытаюсь добавить базовую поддержку JSF (2.0) в Backbase Portal 5.2.1.2 для использования в моих пользовательских виджетах.
Кажется, это работает, когда я получаю доступ к своему виджету статическим способом (например, ".../portal/static/portal_name/widgets/widget_name/index.xhtml"), но когда я вижу свой виджет в контексте портала (.../portal/portals/portal_name/pages/index) мои теги JSF отображаются в исходном HTML-коде вместо проанализированного вывода. То же самое происходит с переменными EL, такими как #{msg.title}.
Если я использую ту же настройку JSF в "обычном" проекте веб-приложения, она тоже работает нормально, поэтому, на мой взгляд, должно быть что-то специфичное для Backbase, которое вызывает эту проблему.
Я хотел бы знать, что является причиной того, что это может произойти, если это может быть решено или обойдено, или если кому-то удалось внедрить JSF в этой конкретной версии Backbase. Я знаю, что реализация JSF работала в Backbase 5.1, но для меня это не вариант вернуться к этой версии.
Edit - добавлен index.xhtml виджета по запросу (мой фактический index.xhtml немного больше, но это тоже не получается):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xml:lang="en">
<h:head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>Help ribbon widget</title>
<link rel="stylesheet" type="text/css" href="css/style.css" />
</h:head>
<h:body>
<span class="left title">#{msg.help_title}</span>
<h:outputText value="TEST"/>
</h:body>
</html>
Кроме того, я использую Border_Layout для моего шаблона контейнера, если это поможет.
Когда я перехожу на вкладку сети инспектора Google Chrome и просматриваю запрос файла index.xhtml виджета, я вижу правильный вывод, но по какой-то причине это не то же самое, что показано в комбинированном html.
1 ответ
Проблема этого подхода заключается в том, что определения виджетов в настоящее время не содержат динамического содержимого.
Я предполагаю, что в вашем сценарии контейнер *Border_Layout* является серверным рендерингом (SSR) виджета. Когда это происходит, если URL src вашего виджета является относительным, портал просто прочитает файл с диска, а сервлет Face никогда не будет вызван. Это нормально, определение должно быть статичным. Но есть два немедленных решения:
Во-первых, вы можете переключиться на рендеринг на стороне клиента (CSR). Это приведет к тому, что клиент сделает http-запрос для определения виджета, и к нему будет получен доступ через сервлет Face. Самый простой способ добиться этого - использовать пользовательский шаблон страницы, который не содержит <b:include>
тег. Это решение означает, что оно не будет работать с отключенным JS.
Однако, если вы хотите продолжать использовать SSR, вы можете использовать абсолютный URL для свойства src вашего виджета. Это означает, что серверу нужно сделать http-запрос для виджета, тем самым пропустив его через сервлет Face. Здесь есть еще одна проблема; Так как сервер портала ожидает, что определения виджетов будут статичными, он будет агрегировать его, поэтому вам придется отключить кэширование виджетов.
Я бы не советовал оба эти решения, хотя в долгосрочной перспективе. Я бы порекомендовал вам запустить приложение JSF независимо в отдельном контексте, а затем найти способ включить его в виджет. Вы можете попробовать что-то настроить с помощью Backbase Mashup Services, но я бы порекомендовал простой подход iframe. Если вам потребуется, я могу предоставить вам более продвинутый виджет Backbase iframe для создания бесшовных iframe (без полос прокрутки и т. Д.).
Если вам нужна дополнительная поддержка, я рекомендую вам зарегистрироваться на https://my.backbase.com/. Новый сайт поддержки Backbase, где вы должны получить более специализированную помощь, документы и примеры кода.