Добавление метатега к элементу head портлета JSR 286 на портале Webspehere - PullRequest
2 голосов
/ 21 октября 2011

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

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

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

Я попытался переопределить метод 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 голосов
/ 07 июля 2016

Хорошо, это больше не будет полезным для ОП, но вот ответ.

Это можно сделать на «фазе рендеринга жизненного цикла» портлета - в более обыденных терминах это можно сделать, переопределив 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 (портлет 3.0) будет фаза полного жизненного цикла портлета HEADER_PHASE. В этом случае нужно просто реализовать renderHeaders(HeaderRequest, HeaderResponse). Но эта спецификация еще не закончена.

...