我的网站有一个导航菜单,它是作为单独的JSP动态构建的,并且通过<jsp:include />
包含在大多数页面中。菜单的内容和样式由用户执行和无权访问的页面确定。
当用户登录时,而不是在会话过程中,从数据库中检索可访问页面集。因此,每次用户请求页面时,都无需重新评估导航菜单代码。是否有一种简单的方法可以在每个会话中仅从JSP生成一次标记,并在会话期间缓存/重用它?
答案 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>