【问题标题】:Is it possible to evaluate a JSP only once per session, and cache it after that?是否可以在每个会话中只评估一次 JSP,然后将其缓存?
【发布时间】:2010-05-07 21:39:16
【问题描述】:

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

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

【问题讨论】:

  • 您使用的是哪个应用服务器?
  • JBoss 5. 更多字符

标签: jsp session servlets


【解决方案1】:

类似的方法,但使用 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"/>

【讨论】:

    【解决方案2】:

    这是一个 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>
    

    【讨论】:

    • 太棒了!这周一试试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多