Добавление метатега в элемент заголовка портлета JSR 286 на портале Webspehere

Мы разработали портлет JSR 286. При загрузке страницы JSP в IE8 мы сталкиваемся с некоторыми проблемами выравнивания, из-за которых наш экран не загружается должным образом.

Мы могли догадаться, что это из-за проблемы совместимости с IE 8. По умолчанию страница загружается в режиме совместимости в IE8. Если мы изменим режим на IE8 Standard, мы сможем видеть загрузку страницы без каких-либо проблем. Я обнаружил, что мы можем установить мета <meta http-equiv='X-UA-Compatible' content='IE=EmulateIE8' />" для включения стандартного режима IE8 из JSP.

Но как добавить метатег в элемент заголовка страницы портлета? Поскольку в моем веб-приложении нет тегов <html>, <head> и <body> и он будет сгенерирован из контейнера портлета, как я могу добавить метатег к элементу заголовка?

Я попытался переопределить метод 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.

Может кто подскажет?


person Aneesh Kunjuveettil    schedule 21.10.2011    source источник


Ответы (1)


Хорошо, это больше не будет полезно для OP, но вот ответ.

Это можно сделать на «фазе жизненного цикла рендеринга» портлета - проще говоря, это можно сделать, переопределив 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>

(Подробнее о потоковой передаче и буферизации порталов и хороший пример кода см. здесь.)

Также обратите внимание, что портал может игнорировать ваш элемент, если он считает это угрозой безопасности, но до сих пор у меня не было проблем с этим.

Я не тестировал этот конкретный код, но сделал что-то подобное (по крайней мере, на Плутоне), и это сработало. Так что это может быть хорошей отправной точкой.

ПРИМЕЧАНИЕ: JSR-362 (Portlet 3.0) будет иметь для этого полную фазу жизненного цикла портлета, HEADER_PHASE. В этом случае достаточно реализовать renderHeaders(HeaderRequest, HeaderResponse). Но это пока черновик.

person brandizzi    schedule 07.07.2016