如何在JSP中访问Liferay中的部分Web内容

时间:2013-06-24 22:23:04

标签: jsp liferay

简短版

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

我正在寻找完全服务器端的东西,理想情况下完全在JSP中完成(即没有自定义控制器逻辑,没有Javascript)。我可以使用少量的servlet代码和/或奇怪的JSTL。

版本较长

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

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

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

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

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

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

我对可能提供的任何替代方案感兴趣。我显然可以将整个内容发布到隐藏元素中,然后使用Javascript将相关部分移动到聚光灯下 - 但作为前端开发者,这会冒犯我对基本文档预编写的最低准确性的敏感性。 / p>

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

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

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:1)

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

您可以只使用一个模板并在该模板中编码逻辑(要显示的字段/内容),而不是您的portlet。这可能会或可能不是将可维护条件纳入的好点,但在我能想到的所有情况下,我更喜欢这种操作模式。这样做很容易取决于您对所选模板语言的体验以及该环境的强大功能(您使用xsl,velocity还是freemarker?)

如果你的决定不同,一篇文章基本上就是一个xml文档 - 所以,给定文章,你总是可以得到xml内容并显示/转换它或访问部分(例如xpath)。你可能想要逃避内容 - 但这取决于你。

另外,正如您所提到的,在6.0.2之前忽略了templateId并且您正在使用6.0 EE:请确保6.0.2早于6.0 EE,因此 - 根据引用的语句 - {{1 被忽略,你应该没事,不需要悲伤。