是否有可能每个会话仅评估一次JSP,并在此之后缓存它?

时间:2010-05-07 21:39:17

标签: jsp session servlets

我的网站有一个导航菜单,它是作为单独的JSP动态构建的,并且通过<jsp:include />包含在大多数页面中。菜单的内容和样式由用户执行和无权访问的页面确定。

当用户登录时,而不是在会话过程中,从数据库中检索可访问页面集。因此,每次用户请求页面时,都无需重新评估导航菜单代码。是否有一种简单的方法可以在每个会话中仅从JSP生成一次标记,并在会话期间缓存/重用它?

2 个答案:

答案 0 :(得分:3)

类似的方法,但使用JSTL而不是scriptlet代码:

<c:if test="${empty menuContents}">
  <c:set var="menuContents" scope="session">
    Render the menu here...
  </c:set>
</c:if>
<c:out value="${menuContents}" escapeXml="false"/>

答案 1 :(得分:1)

这是一个JSP标记文件,应该做你想要的,未经测试的。

<%@tag description="Caches the named content once per session" pageEncoding="UTF-8"%>

<%@attribute name="name"%>

<%
String value = (String)request.getSession().getAttribute(name);

if (value == null) {
%>
<jsp:doBody var="jspBody"/>
<%
    value = jspContext.getAttribute("jspBody", PageContext.PAGE_SCOPE);
    request.getSession().setAttribute(name, value);
}
jspContext.setAttribute("value", value);
%>
${value}

要使用它,您可以执行以下操作:

<t:doonce name="navigation">
    <jsp:include page="nav.jsp"/>
</t:doonce>