代码之家  ›  专栏  ›  技术社区  ›  Matt Ball

是否可以在每个会话中只对JSP求值一次,然后缓存它?

  •  2
  • Matt Ball  · 技术社区  · 15 年前

    我的站点有一个nav菜单,它是作为一个单独的JSP动态构建的,并且包含在大多数页面中 <jsp:include /> . 菜单的内容和样式取决于用户可以访问哪些页面和不能访问哪些页面。

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

    2 回复  |  直到 15 年前
        1
  •  3
  •   davioooh    11 年前

    <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"/>
    
        2
  •  1
  •   Will Hartung    15 年前

    <%@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>