Кэширование содержимого страницы? - PullRequest
1 голос
/ 10 июля 2010

Я генерирую содержимое страницы, например:

// index.jsp
<%
    List<Horse> horses = database.getHorses();
    for (Horse it : horses) {
        %>
        <div><%= it.getName() %></div>
       <%
    }
%>

возможно ли получить весь контент страницы в конце файла jsp и вывести его в строку, например:

String page = this.getPrintWriter().toString();

Мне просто любопытно, возможно ли это. Я мог бы попробовать кэшировать страницу как строку, но мне нужно было бы переписать генерацию моей страницы, чтобы собрать все в одном StringBuilder, например:

StringBuilder sb = new StringBuilder();
sb.append("<div>"); sb.append(it.getName()); sb.append("</div>");
...
<%= sb.toString() %>
String cached = sb.toString();

Спасибо

Ответы [ 2 ]

2 голосов
/ 10 июля 2010

Так как это пользовательские данные, вы не можете использовать memcache GAE для этого. Это кеш приложения. Я бы просто сохранил его в области видимости сеанса.

HttpSession session = request.getSession();
List<Horse> horses = (List<Horse>) session.getAttribute("horses");
if (horses == null) {
    horses = database.getHorses();
    session.setAttribute("horses", horses);
}

Тем не менее, старайтесь избегать использования скриптлетов в максимально возможной степени. Вышесказанное можно прекрасно выполнить в классе сервлетов, и вы можете отобразить их с помощью JSTL c:forEach следующим образом:

<c:forEach items="${horses}" var="horse">
    <div>${horse.name}</div>
</c:forEach>

Захват сгенерированного содержимого страницы невозможно выполнить простым вызовом PrintWriter#toString(). Идея StringBuilder забавная, но она того не стоит. Как вы упомянули, кэширование динамического контента дает очень мало преимуществ.

Лучшее, что вы в этом случае можете сделать в отношении кэширования страниц, - это просто использовать задачу по умолчанию веб-браузера для кэширования GET-запросов.

Смотри также

1 голос
/ 10 января 2012

Я бы создал HttpServlet, который просто получает содержимое страницы с реальной страницы (любой тип страницы, в том числе JSP).Затем кэшируйте его.

В следующий раз, когда пользователь сделает тот же запрос, он попытается получить данные из memcache и, если он есть, получить только содержимое кэша mem.Конечно, вы должны проверить параметры, идентификатор пользователя и т. Д., Которые могли бы изменить содержимое кэшированной страницы.

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

Кстати ... ответ с хранением данных сеанса не будет работать !!Данные сеанса сохраняются только на одном сервере.Так как appengine работает на каком-то очень большом кластере (много-много машин), он не гарантирует, что два одинаковых запроса от одного и того же клиента будут обслуживаться одной и той же машиной - поэтому данные сеанса не будут доступны!

Изучил этот трудный путь, когда я пытался выполнять индикаторы выполнения;)

РЕДАКТИРОВАТЬ Похоже, что сеансы теперь работают с appengine и распределяются между всеми серверами (как утверждает Google, онивнутренне используют memcache)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...