gpt4 book ai didi

java - 从 doHeaders() 中删除重复的标题条目

转载 作者:行者123 更新时间:2023-11-30 09:15:42 24 4
gpt4 key购买 nike

我有几个 portlet,每个 portlet 在单个 Web 应用程序中使用合并的 CSS 和 JS 文件。目前每个 portlet 都会在 doHeaders() 中添加适当的 head 标签。但是,当同一页面上有多个 portlet 时,这会导致头部出现重复标记。

目前 portlet 部署在 eXo 上在 GateIn 上运行。 eXo 有它自己的 JS AMD 框架和 portlet 皮肤系统,但我们使用 doHeaders() 添加头部元素以尽可能与平台无关以减轻风险。

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,它可以去除重复的 head 元素。但我似乎无法从 RenderResponse 访问当前元素属性;我只能 setProperty() 或 addProperty()。

我还可以编写 RenderFilter 来替换每个单独的 portlet 的 doHeaders() 方法,并将整个 CSS 和 JS 池添加到头部。但我无法确保此逻辑仅在每次用户 session 页面呈现时运行。

最佳答案

我目前实现的一个解决方案是 RenderFilter,如果尚未写入池,它会将整个 JS 和 CSS 资源池写入头部。这有点次优,因为我发现检测挂起的头元素不是可以以独立于平台的方式完成的事情。然而,决定如何处理冗余的 head 元素完全取决于平台委托(delegate),因为 JSR-286 没有规定在这种情况下应该做什么。

通过使用 eXo 的 PortalRequestContext,可以获得待定头元素的列表。通过添加一个元元素来标识资源池,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() 中删除重复的标题条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19796203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com