我有几个 portlet,每个 portlet 在单个 Web 应用程序中使用汇集的 CSS 和 JS 文件的聚合。目前,每个 portlet 都会在 doHeaders() 中添加适当的头标记。然而,当同一页面上有多个 portlet 时,这会导致头部出现重复标记。
当前 portlet 部署在 eXo 上它在 GateIn 上运行。 eXo 有自己的 JS AMD 框架和 portlet 皮肤系统,但我们使用 doHeaders() 添加 head 元素,以尽可能与平台无关,以降低风险。
Head 元素按以下方式添加:
@Override
public void doHeaders(RenderRequest request, RenderResponse response)
{
Element element = response.createElement("link");
element.setAttribute("type", "text/css");
element.setAttribute("rel", "stylesheet");
element.setAttribute("href", request.getContextPath() + "/service/resource/themes/stylesheet.css");
response.addProperty(MimeResponse.MARKUP_HEAD_ELEMENT, element);
}
我需要从头部删除重复的条目或首先防止重复写入。
我正在尝试编写一个通用的 RenderFilter ,它可以去除重复的头元素。但我似乎无法从 RenderResponse 访问当前的元素属性。 ;我只能 setProperty() 或 addProperty()。
我还可以编写 RenderFilter 来替换每个单独的 portlet 的 doHeaders() 方法,并将整个 CSS 和 JS 池添加到头部。但我无法确保此逻辑仅在每个用户 session 页面渲染时运行。
最佳答案
我目前实现的解决方案是 RenderFilter,如果池尚未写入,它将整个 JS 和 CSS 资源池写入头部。这在某种程度上是次优的,因为我发现检测挂起的头元素并不是可以以独立于平台的方式完成的。然而,决定如何处理冗余头元素完全取决于平台委托(delegate),因为 JSR-286 没有规定在这种情况下应该做什么。
通过使用eXo的PortalRequestContext,可以获得待处理的头元素列表。通过添加一个meta元素来标识资源池,RenderFilter就可以决定资源池是否需要写入或者是否已经写入。
这是基本的检测逻辑:
boolean addHeaderElements = true;
if (Util.getPortalRequestContext() != null && Util.getPortalRequestContext().getExtraMarkupHeaders() != null)
{
for (Element markupHeaderElement : Util.getPortalRequestContext().getExtraMarkupHeaders())
{
if (markupHeaderElement.getTagName().equalsIgnoreCase("meta") &&
markupHeaderElement.getAttribute("name") != null &&
markupHeaderElement.getAttribute("name").equalsIgnoreCase("project-name"))
{
addHeaderElements = false;
break;
}
}
}
这也可以编写为基于文件进行操作,但我的 portlet 的资源池通常是共享的,以至于可以使用全有或全无的方法。
关于java - 从 doHeaders() 中删除重复的 header 条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19796203/