JSP页面变量缓存
我遇到了JSP页面服务器端缓存的问题 假设我有一个内部错误页面,它是一个自定义JSP,每次访问/请求时都会显示一个唯一的ID。此唯一ID也记录在服务器日志中以进行调试。但是,我注意到,如果我使用以下方法实现错误ID: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似乎被缓存在服务器端,并且相同的值不断弹出 奇怪的是,在同一页上,我还显示了遇到错误的时
<%!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帮助了我