JSP页面变量缓存

JSP页面变量缓存,jsp,caching,jakarta-ee,uuid,Jsp,Caching,Jakarta Ee,Uuid,我遇到了JSP页面服务器端缓存的问题 假设我有一个内部错误页面,它是一个自定义JSP,每次访问/请求时都会显示一个唯一的ID。此唯一ID也记录在服务器日志中以进行调试。但是,我注意到,如果我使用以下方法实现错误ID: <%!private String <b>abc</b> = UUID.randomUUID().toString();%> 在几个请求之后…变量abc似乎被缓存在服务器端,并且相同的值不断弹出 奇怪的是,在同一页上,我还显示了遇到错误的时

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

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

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

在几个请求之后…变量abc似乎被缓存在服务器端,并且相同的值不断弹出

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

XXXError encountered on <%=Calendar.getInstance().getTime().toString()%>
XXXError在上遇到
它永远不会缓存并始终显示当前时间

所以我做了一个小实验,我用

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

然后在屏幕上打印这个字符串,然后抓拍,几次调用后它就会被缓存


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

在查看生成的.java代码之后。结果

part声明为成员变量,因此仅在会话初始化时调用。因此,在会话初始化之后,它再也不会被调用


我决定通过将调用放在函数中并调用该函数来进行变通修复,看起来效果很好。请用更好的方法回答。

在查看生成的.java代码之后。结果

part声明为成员变量,因此仅在会话初始化时调用。因此,在会话初始化之后,它再也不会被调用


我决定通过将调用放在函数中并调用该函数来进行变通修复,看起来效果很好。请随意用更好的方法回答。

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

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

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

毕竟,您不应该在JSP页面中使用Scriptlet。Java代码属于真正的Java类。在这种特殊情况下,可以使用、或或

EL函数最终将如下所示:

<c:set var="uuid" value="${uuid:random()}" />
<p>UUID: ${uuid}</p>
public class UUIDBean {
    public String getRandom() {
        return UUID.randomUUID().toString();
    }
}
<p>UUID from servlet: ${uuid}</p>
它可以用作:

<jsp:useBean id="uuid" class="com.example.UUIDBean" />
<p>First UUID: ${uuid.random}</p>
<p>Next UUID: ${uuid.random}</p>
转发的JSP页面可以如下所示:

<c:set var="uuid" value="${uuid:random()}" />
<p>UUID: ${uuid}</p>
public class UUIDBean {
    public String getRandom() {
        return UUID.randomUUID().toString();
    }
}
<p>UUID from servlet: ${uuid}</p>
来自servlet的UUID:${UUID}

此外,最好按如下方式更换

<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" />

日期现在是:${now}
yyyy-MM-dd格式的日期:

它使代码更干净,更易于维护。

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

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

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

毕竟,您不应该在JSP页面中使用Scriptlet。Java代码属于真正的Java类。在这种特殊情况下,可以使用、或或

EL函数最终将如下所示:

<c:set var="uuid" value="${uuid:random()}" />
<p>UUID: ${uuid}</p>
public class UUIDBean {
    public String getRandom() {
        return UUID.randomUUID().toString();
    }
}
<p>UUID from servlet: ${uuid}</p>
它可以用作:

<jsp:useBean id="uuid" class="com.example.UUIDBean" />
<p>First UUID: ${uuid.random}</p>
<p>Next UUID: ${uuid.random}</p>
转发的JSP页面可以如下所示:

<c:set var="uuid" value="${uuid:random()}" />
<p>UUID: ${uuid}</p>
public class UUIDBean {
    public String getRandom() {
        return UUID.randomUUID().toString();
    }
}
<p>UUID from servlet: ${uuid}</p>
来自servlet的UUID:${UUID}

此外,最好按如下方式更换

<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" />

日期现在是:${now}
yyyy-MM-dd格式的日期:

它使代码更干净,更易于维护。

回答得很好,@BalusC你真的是一个jsp专家:)尤其是UUIBean帮助了我回答得很好,@BalusC你真的是一个jsp专家:)尤其是UUIBean帮助了我