Визуализировать весь заголовок калитки в теле

Я рендеринг своих страниц калитки (версия 6.x) в PortletContainer - который работает на самом деле хорошо (с некоторыми ограничениями).

Одним из них является то, что я не могу использовать ajax, потому что моя HTML-разметка не имеет HTML и head тег, это просто содержание body пометить, что я рендеринг.

Я пытался использовать HeaderResponseContainer который работает - пока есть head тег в разметке. Когда нет IHeaderResponseDecorator не будет установлен в RequestCycle,

Я не уверен, что это лучший способ сделать все, что будет сделано в head тег в какой-то контейнер в body даже если нет head тег.

Есть идеи как обойти это?

1 ответ

Решение

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

В противном случае это может помочь в подобных случаях:

В вашем классе приложений:

@Override
protected WebResponse newWebResponse(WebRequest webRequest,
        HttpServletResponse httpServletResponse) {
    return new MyWebResponse((ServletWebRequest) webRequest,
            httpServletResponse);
}

Реализация MyWebResponse:

public class MyWebResponse extends ServletWebResponse {
    static Pattern bodyContentPattern = Pattern.compile("<body[^>]*>((?s).*)</body>");
    static Pattern headContentPattern = Pattern.compile("<head[^>]*>((?s).*)</head>");

    public MyWebResponse(ServletWebRequest webRequest,
            HttpServletResponse httpServletResponse) {
        super(webRequest, httpServletResponse);
    }

    @Override
    public void write(CharSequence sequence) {
        String string = sequence.toString();
        // if there is a html tag, take the body content, append the header content in
        // a div tag and write it to the output stream
        if (string.contains("</html>")) {
            StringBuilder sb = new StringBuilder();
            sb.append(findContent(string, bodyContentPattern));

            String headContent = findContent(string, headContentPattern);
            if (headContent != null && headContent.length() > 0) {
                sb.append("<div class=\"head\">");
                sb.append(headContent);
                sb.append("</div>");
            }
            super.write(sb.toString());
        } else {
            super.write(sequence);
        }
    }

    private String findContent(String sequence, Pattern p) {
        Matcher m = p.matcher(sequence);
        if (m.find()) {
            return m.group(1);
        }
        return sequence;
    }
}
Другие вопросы по тегам