3

我目前正在尝试将基本的 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})也会发生同样的情况。

如果我在“普通”webapp 项目中使用相同的 JSF 设置,它也可以正常工作,所以在我看来,一定是 Backbase 特定的东西导致了这个问题。

我想知道是什么导致了这种情况发生,是否可以解决或规避,或者是否有人成功地在这个特定版本的 Backbase 中实现了 JSF。我知道在 Backbase 5.1 中实现 JSF 是可行的,但对我来说,恢复到该版本不是一个选项。

编辑 - 按请求添加了小部件的 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 中显示的内容不同。

4

1 回答 1

4

这种方法的问题是当前不希望小部件定义包含动态内容。

我猜在您的场景中, *Border_Layout* 容器是服务器端渲染 (SSR) 小部件。发生这种情况时,如果您的小部件的src URL 是相对的,则门户将简单地从磁盘读取文件,并且永远不会调用 faces servlet。这是正常的,定义应该是静态的。但是有两个直接的解决方案:

首先,您可以切换到客户端渲染 (CSR)。这将导致客户端对小部件定义发出 http 请求,并通过 faces servlet 访问它。实现这一点的最简单方法是使用不包含<b:include>标签的自定义页面模板。此解决方案确实意味着它不适用于禁用 JS。

但是,如果您希望继续使用 SSR,则可以为小部件的src属性使用绝对 url。这意味着服务器需要对小部件发出 http 请求,从而通过 faces servlet 运行它。这里还有一个问题;由于 Portal Server 期望小部件定义是静态的,它会积极缓存它,因此您需要关闭小部件缓存。

从长远来看,我不会真的推荐这两种解决方案。我建议您在单独的上下文中独立运行您的 JSF 应用程序,然后找到一种方法将其包含在小部件中。您可以尝试使用 Backbase Mashup Services 进行设置,但我推荐了一种简单的 iframe 方法。如果您需要,我可以为您提供更高级的 iframe Backbase 小部件,用于创建无缝 iframe(无滚动条等)。

如果您需要更多支持,我鼓励您在https://my.backbase.com注册。Backbase 的新支持站点,您应该在其中收到更多专门的帮助、文档和代码示例。

于 2012-09-20T10:50:18.163 回答