精简版
我已经定义了一个自定义的 Web 内容结构;现在我只想访问和发出自定义 portlet 的基于 JSP 的 View 中的结构定义的字段之一。
我正在寻找完全在服务器端的东西,最好完全在 JSP 中完成(即没有自定义 Controller 逻辑,没有 Javascript)。我可以接受少量的 servlet 代码和/或奇怪的 JSTL。
较长的版本
我正在构建一个显示一些用户数据的自定义 portlet。如果给定用户 没有数据可显示,我想改为显示一些静态内容。实际上有一些特殊的场景,而不是正常的数据显示,我想显示一些静态内容中的一个。
为了便于维护,我将这些静态内容片段作为 portlet 实例配置的一部分。因为我预计 portlet 会得到广泛使用,并且希望在一个地方管理这些静态片段,所以我打算创建一个新的 Web 内容结构来为每个静态场景捕获单独的、命名的 HTML blob。然后 portlet 实例将被配置为通过 ID 依赖于那部分 Web 内容。结果是站点维护人员将能够更新单个 Web 内容,站点中的所有 portlet 实例将自动反射(reflect)该更改。
在其他 portlet 中,我使用了 <liferay-ui:journal-article>
标记以发出 Web 内容的全部内容(在 portlet 实例配置中标识),例如:
<liferay-ui:journal-article
groupId="${_config_templateGroupId}"
articleId="${_config_templateArticleId}"
/>
但是,在这种情况下,我希望只发出结构定义的一个字段。
The official wiki提到 journal-article 标签接受可选的 templateId
属性。我想我可以通过为每个场景定义单独的模板来完成这项工作,每个场景只从结构中发出所需的字段。但是,wiki 还指出 templateId
在 6.0.2 版本之前被忽略——我使用的是 6.0 EE; Sadface 少校。
我对任何可用的替代方案感兴趣。我显然可以将整个内容发送到隐藏元素中,然后使用 Javascript 将相关部分移动到聚光灯下——但作为前端开发人员,这冒犯了我对基本文档预脚本的最低准确性的敏感度。
因此:没有基于 Javascript 或 CSS 的技巧(又名 smoke-and-mirrors)。只有可以完全在相对普通的 JSP 中实现的 100% 基于服务器的解决方案才会被接受。
伟大而可怕的互联网啊,实现我的愿望吧!
最佳答案
如果我没有错误地理解您的简短版本
,那么这可能是您正在寻找的解决方案。
这是我们为实现类似要求而编写的代码
的摘录。
您可以参数化 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();
}
关于jsp - 如何在 JSP 中访问 Liferay 中的部分 Web 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17286150/