Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从doHeaders()中删除重复的头条目_Java_Jsp_Portlet_Jsr286 - Fatal编程技术网

Java 从doHeaders()中删除重复的头条目

Java 从doHeaders()中删除重复的头条目,java,jsp,portlet,jsr286,Java,Jsp,Portlet,Jsr286,我有几个Portlet,每个Portlet都使用单个web应用程序中汇集的CSS和JS文件的聚合。当前,每个portlet将在doHeaders()中添加适当的head标记。但是,当多个portlet位于同一页面上时,这会导致头部中出现重复标记 当前部署了在GateIn上运行的portlet。eXo有自己的JS AMD框架和portlet皮肤系统,但我们使用doHeaders()添加了head元素,以尽可能不依赖于平台,从而降低风险 头部元素按以下方式添加: @Override public v

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

当前部署了在GateIn上运行的portlet。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元素。但我似乎无法从中访问当前元素属性;我只能设置属性()或添加属性()


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

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

通过使用eXo的PortalRequestContext,可以获得挂起的head元素列表。通过添加一个元元素来标识资源池,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;
        }
    }
}

这也可以编写为在文件基础上操作,但my portlet的资源池通常是共享的,可以使用全有或全无的方法。

您使用的是什么portlet容器?Liferay中“头”文件的配置方式有所不同。在您的系统中呈现公共页面的是什么?我们目前正在Tomcat服务器上使用。如果需要支持其他平台或迁移,我们将web应用程序代码库定制为尽可能通用的风险管理。这就是为什么目前所有的头引用都是通过doHeaders()完成的,尽管eXo有自己的JS AMD框架和portlet皮肤系统。但是我相信您可以通过一种通用的方式来实现这一点,方法是将已经添加的资源保存在一个列表中(在一个定制服务中,或者在具有应用程序范围的portlet会话中,或者在一个线程本地中,…),然后仅当资源不在该列表中时才调用addProperty。当然,您必须注意为每个http请求正确重置此列表。嗨,托马斯!在做了一些grep工作之后,我真的觉得我有了新的想法。尽管它不是一个独立于平台的解决方案,但它在允许使用doHeaders()而无需重复元素方面看起来很有希望。我正在考虑使用Util.getPortalRequestContext().getExtraMarkupReaders()来检测已经添加的内容。今天晚些时候我会在这方面取得一些进展,但它看起来很有希望。是的,Util.getPortalRequestContext().GetExtraMarkupReaders()包含所有标记头,因此您应该可以轻松实现您想要做的事情。但正如你所说,它不是平台不可知论;)