将元标记添加到Websphere门户中的JSR 286 portlet的head元素

时间:2011-10-21 05:33:15

标签: java websphere portlet jsr286

我们开发了JSR 286 portlet。在IE8中加载JSP页面时,我们遇到了一些对齐问题,因为我们的屏幕没有正确加载。

我们可以弄清楚,这是因为IE 8的兼容性问题。默认情况下,页面在IE8中以Quirks模式加载。如果我们将模式更改为IE8 Standard,我们可以看到页面加载没有任何问题。我发现我们可以设置一个元<meta http-equiv='X-UA-Compatible' content='IE=EmulateIE8' />"来从JSP启用IE8标准模式。

但是如何将元标记添加到portlet页面的head元素中?由于我的Web应用程序中没有<html><head><body>标记,并且它将从portlet容器生成,如何将元标记添加到head元素?< / p>

我尝试覆盖doHeader方法,如下所示

protected void doHeaders(RenderRequest request, RenderResponse response) {
    Element metaKeywords = response.createElement("meta");
    metaKeywords.setAttribute("http-equiv", "X-UA-Compatible");
    metaKeywords.setAttribute("content", "IE=EmulateIE8");
    // response.addProperty(MimeResponse.MARKUP_HEAD_ELEMENT, ""); - I tried this option   also
   //response.addProperty(MimeResponse.MARKUP_HEAD_ELEMENT, metaKeywords); - I tried this option also
}

但没有成功。

我们的应用程序在WAS 7.0上运行。

有人可以提供一些指示吗?

1 个答案:

答案 0 :(得分:0)

好的,这对OP来说不再有用了,但这是答案。

人们可以在portlet的“渲染生命周期阶段”做到这一点 - 用更普通的术语来说,可以通过覆盖GenericPortlet.doHeaders()来实现:

public class MyPortlet extends GenericPortlet {

    @Override
    public void doHeaders(RenderRequest req, RenderResponse res)
    throws PortletException {
        Element meta = response.createElement("meta");

        meta.setAttribute("http-equiv", "X-UA-Compatible");
        meta.setAttribute("content", "IE=EmulateIE8");

        response.addProperty(MimeResponse.MARKUP_HEAD_ELEMENT, meta);
    }
}

如果您的门户网站是流媒体门户网站,则可能必须在portlet.xml上设置容器运行时选项:

<portlet>
    <container-runtime-option>
        <name>javax.portlet.renderHeaders</name>
        <value>true</value>
    </container-runtime-option>
</portlet>

(有关流式传输与缓冲门户的更多信息,以及一个很好的代码示例,here。)

另外,请注意门户网站可以自由地忽略您的元素,如果它认为这是一个安全风险,但直到现在我都没有遇到任何问题。

我没有测试过这个特定的代码,但是做了类似的事情(至少在冥王星上)并且它有效。所以,那些可以是很好的起点。

注意:JSR-362(Portlet 3.0)将拥有整个portlet生命周期阶段HEADER_PHASE。在这种情况下,只需要实现renderHeaders(HeaderRequest, HeaderResponse)。但是这个规范还是草案。