我目前正在尝试将基本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源,而不是解析后的输出。像#{msg.title}这样的EL变量也会发生同样的情况。
如果我在“正常” webapp项目中使用相同的JSF设置,它也可以正常工作,因此在我眼中,一定有某些特定于Backbase的问题导致此问题。
我想知道是什么导致了这种情况的发生,是否可以解决或规避它,或者是否有人成功地在此特定版本的Backbase中成功实现了JSF。我知道实现JSF在Backbase 5.1中可以工作,但是对我来说,恢复到该版本不是一个选择。
编辑-根据请求添加了小部件的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中显示的内容不同。
最佳答案
这种方法的问题在于,当前不希望小部件定义包含动态内容。
我猜在您的情况下,* Border_Layout *容器是服务器端渲染(SSR)小部件。发生这种情况时,如果窗口小部件的src URL是相对的,则门户网站将仅从磁盘读取文件,并且将永远不会调用face servlet。这是正常现象,定义应该是静态的。但是有两种直接的解决方案:
首先,您可以切换到客户端渲染(CSR)。这将导致客户端向窗口小部件定义发出http请求,并通过face servlet对其进行访问。实现此目的的最简单方法是使用不包含<b:include>
标记的自定义页面模板。该解决方案确实意味着它在禁用JS的情况下将无法使用。
但是,如果您希望继续使用SSR,则可以为小部件的src属性使用绝对URL。这意味着服务器需要对窗口小部件发出http请求,从而通过faces servlet运行它。这里还有一个问题。由于Portal Server期望窗口小部件定义为静态,因此它将aggessivley对其进行缓存,因此您需要关闭窗口小部件缓存。
从长远来看,我不会真的推荐这两种解决方案。我建议您在单独的上下文中独立运行JSF应用程序,然后找到一种将其包含在小部件中的方法。您可以尝试使用Backbase Mashup Services进行设置,但是我推荐一种简单的iframe方法。如果需要,我可以为您提供更高级的iframe Backbase小部件,以创建无缝的iframe(无滚动条等)。
如果您需要更多支持,建议您登录https://my.backbase.com。 Backbase的新支持站点,您将在此获得更多专用的帮助,文档和代码示例。