我正在生成以下内容的页面内容:
// index.jsp
<%
List<Horse> horses = database.getHorses();
for (Horse it : horses) {
%>
<div><%= it.getName() %></div>
<%
}
%>
是否可以在jsp文件的末尾获取整个页面内容,并将其转储到String中,如:
String page = this.getPrintWriter().toString();
我只是好奇这是否可能。我可能会尝试将页面缓存为String,但需要重写我的页面生成以在一个StringBuilder中构建所有内容,如:
StringBuilder sb = new StringBuilder();
sb.append("<div>"); sb.append(it.getName()); sb.append("</div>");
...
<%= sb.toString() %>
String cached = sb.toString();
由于
答案 0 :(得分:2)
由于它是特定于用户的数据,因此您无法使用GAE's memcache。它是一个应用程序范围的缓存。我只是将它存储在会话范围内。
HttpSession session = request.getSession();
List<Horse> horses = (List<Horse>) session.getAttribute("horses");
if (horses == null) {
horses = database.getHorses();
session.setAttribute("horses", horses);
}
尽管如此,尽量避免使用 scriptlets 。以上内容可以在Servlet类中完成,您可以使用JSTL c:forEach
显示它们,如下所示:
<c:forEach items="${horses}" var="horse">
<div>${horse.name}</div>
</c:forEach>
仅通过调用PrintWriter#toString()
无法捕获生成的页面内容。 StringBuilder
这个想法很有趣,但它确实不值得。如您所述,缓存动态内容对于目的而言几乎没有什么好处。
在这种情况下,关于页面缓存的最佳方法就是利用webbrowser的默认任务来缓存GET请求。
答案 1 :(得分:1)
我会创建一个HttpServlet,它只从真实页面(任何类型的页面,也包括JSP)中检索页面内容。然后缓存它。
下次用户发出相同的请求时,它会尝试从内存缓存中获取数据,如果存在,则只检索内存缓存内容。 当然你必须检查参数,用户ID,e.t.c。这将改变缓存页面上的内容。
这样你也可以完全控制缓存大小(你可以在PUT期间设置缓存过期,限制缓存页数e.t.c。)
BTW ..会话数据存储的answer将无效!!会话数据仅在单个服务器上保留。由于appengine正在一些非常大的集群(许多机器)上运行,它不能确保来自同一客户端的两个相同请求将由同一台机器提供服务 - 因此会话数据将无法访问!
当我尝试做进度条时,学到了很多东西;)
修改强> 似乎会话现在正在使用appengine,并在所有服务器上共享(谷歌表示他们正在使用内部存储器)