Визуализировать весь заголовок калитки в теле
Я рендеринг своих страниц калитки (версия 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;
}
}