1

我遇到了 JSP 页面服务器端缓存的问题。

假设我有一个内部错误页面,它是一个自定义 JSP,每次访问/请求时都会显示一个唯一 ID。此唯一 ID 也会记录在服务器日志中以进行调试。但是,我注意到如果我使用以下方法实现错误 ID:

<%!private String <b>abc</b> = UUID.randomUUID().toString();%>

经过几次请求......变量abc似乎被缓存在服务器端,并且不断弹出相同的值。

奇怪的是,在同一页面上,我还显示了遇到错误的时间

XXXError encountered on <%=Calendar.getInstance().getTime().toString()%>

它永远不会被缓存并始终显示当前时间。

所以我做了一个小实验,而不是使用上面的显示时间,我使用

<%!private String etime = Calendar.getInstance().getTime().toString();%>

并在屏幕上打印该字符串和 SNAP,它在几次调用后被缓存。

所以我的问题是,如何阻止服务器缓存这些变量?

4

2 回答 2

4

粗略翻译,这被声明为JSP 页面最终编译到的 servlet 类的实例变量。例如

public class pagename_jsp_servlet extends HttpServlet {
    private String abc = UUID.randomUUID().toString();

    protected void service(HttpServletRequest ...

由于 JSP 通常只在启动期间编译一次(或者在更改之后,如果启用了服务器上的热部署),所有请求之间将共享相同的 servlet 实例!你不想那样做。

毕竟,您不应该在 JSP 页面中使用scriptlet 。Java 代码属于真正的 Java 类。在这种特殊情况下,您可以使用EL 函数bean 类servlet 类

EL 函数最终看起来像这样:

<c:set var="uuid" value="${uuid:random()}" />
<p>UUID: ${uuid}</p>

一个 bean 类看起来像这样:

public class UUIDBean {
    public String getRandom() {
        return UUID.randomUUID().toString();
    }
}

可以用作:

<jsp:useBean id="uuid" class="com.example.UUIDBean" />
<p>First UUID: ${uuid.random}</p>
<p>Next UUID: ${uuid.random}</p>

servlet 类应该映射到url-pattern覆盖 JSP 页面(反之亦然)上,并且应该doGet()在 JSP 页面中显示数据之前实现预处理请求的方法:

UUID uuid = UUID.randomUUID().toString();
request.setAttribute("uuid", uuid);
request.getRequestDispatcher("page.jsp").forward(request, response);

转发的 JSP 页面可能如下所示:

<p>UUID from servlet: ${uuid}</p>

此外,<%=Calendar.getInstance().getTime().toString()%>最好更换如下:

<jsp:useBean id="now" class="java.util.Date" />
<p>The date is now: ${now}
<p>The date in yyyy-MM-dd format: <fmt:formatDate value="${now}" pattern="yyyy-MM-dd" />

它使代码更清晰,更易于维护。

于 2010-02-03T11:37:07.900 回答
0

查看生成的 .java 代码后。原来

part 被声明为成员变量,因此仅在会话初始化时调用。因此,在会话初始化后,它永远不会真正被再次调用。

我决定通过将调用放在函数中并调用该函数来解决问题,似乎工作正常。请随时用更好的方法回答。

于 2010-02-03T06:59:28.300 回答