3

短版

我已经定义了一个自定义的 Web 内容结构;现在我想在我的自定义 portlet 的基于 JSP 的视图中访问和发出结构定义的字段之一。

我正在寻找完全是服务器端的东西,最好完全在 JSP 内完成(即没有自定义控制器逻辑,没有 Javascript)。我可以接受少量的 servlet 代码和/或奇怪的 JSTL。

更长的版本

我正在构建一个显示一些用户数据的自定义 portlet。如果给定用户没有要显示的数据,我想展示一些静态内容。实际上有一些特殊的场景,而不是正常的数据显示,我想显示一些静态内容之一。

为了便于维护,我将这些静态内容作为 portlet-instance 配置的一部分。由于我预计 Portlet 的广泛使用以及在一个地方管理这些静态片段的愿望,我打算创建一个新的 Web 内容结构来为每个静态场景捕获单独的、命名的 HTML blob。然后,portlet 实例将被配置为通过 ID 依赖那段 Web 内容。结果是站点维护者将能够更新单个 Web 内容,并且站点上的所有 portlet 实例将自动反映该更改。

在其他 portlet 中,我使用<liferay-ui:journal-article>标签来发出 Web 内容的全部内容(在 portlet-instance 配置中标识),例如:

<liferay-ui:journal-article
    groupId="${_config_templateGroupId}"
    articleId="${_config_templateArticleId}"
/>

但是,在这种情况下,我希望只发出结构定义的字段之一。

官方 wiki提到 journal-article 标签接受一个可选templateId属性。我想我可以通过为每个场景定义单独的模板来完成这项工作,每个场景只从结构中发出所需的字段。但是,wiki 还指出templateId在 6.0.2 版本之前被忽略了——我使用的是 6.0 EE;悲伤脸少校。

我对任何可用的替代品感兴趣。我显然可以将整个内容发送到一个隐藏元素中,然后使用 Javascript 将相关部分移到聚光灯下——但是作为前端开发人员,这冒犯了我对基本文档预脚本的最低准确性的敏感性。

所以:没有基于 Javascript 或 CSS 的技巧(又名Smoke-and-mirrors)。只有 100% 可以完全在相对普通的 JSP 中实现的基于服务器的解决方案才会被接受。

实现我的愿望,伟大而可怕的互联网!

4

2 回答 2

2

如果我不理解您的Short version错误,那么这可能是您正在寻找的解决方案。

Code这是我们为实现类似要求而编写的摘录。

您可以参数化Xpath并从中制作tag出来

public static final String DYNAMIC_ELEMENT_NAME = "/root/dynamic-element[@name='";
public static final String NEWS_IMAGE_URL = "imageUrl";
public static final String DYNAMIC_CONTENT = "']/dynamic-content";       

journalArticle = JournalArticleLocalServiceUtil.getArticle(Long.valueOf(journalArticleId));
Document document = SAXReaderUtil.read(journalArticle.getContent());
String xpathExpression = Constants.DYNAMIC_ELEMENT_NAME + Constants.NEWS_IMAGE_URL + Constants.DYNAMIC_CONTENT;
if (document.selectSingleNode(xpathExpression) != null) {
    String imageUrl = document.selectSingleNode(xpathExpression).getText();
}
于 2013-06-26T21:08:44.313 回答
1

由于这 8 个小时没有回答,让我给你一个粗略的(不精确的)答案,你可能想要遵循一些选项:

您可以只使用一个模板并在该模板中编码逻辑(要显示的字段/内容),而不是您的 portlet。这可能是也可能不是将可维护条件放入其中的好点,但在我能想到的所有场景中,我更喜欢这种操作模式。执行此操作的难易程度可能取决于您对所选模板语言的经验以及该环境的能力(您使用 xsl、velocity 还是 freemarker?)

如果您有不同的决定,一篇文章基本上是一个 xml 文档 - 因此,给定文章,您始终可以获取 xml 内容并显示/转换它或访问部分(例如 xpath)。您可能想转义内容 - 但这取决于您。

此外,正如您提到templateId的在 6.0.2 之前被忽略并且您正在使用 6.0 EE:请确保 6.0.2 早于 6.0 EE,因此 - 根据引用的声明 -不会templateId被忽略,您应该没问题,不需要为难过。

于 2013-06-25T07:32:32.663 回答