2010-02-03 87 views
1

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

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

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

几个请求后...变量ABC似乎在服务器端进行缓存和相同的值保持坡平了。

奇怪的是,在同一页上,我也显示其与

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

永远也不会被高速缓存,并且总是显示当前的时间遇到​​错误的时间。

所以,我做了一个小实验,而不是使用上面显示的时间,我使用的字符串,SNAP,它越来越之后打了几个电话缓存

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

和打印在屏幕上。

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

回答

4

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

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

    protected void service(HttpServletRequest ... 

由于JSP页面通常会得到启动期间编译只有一次(或更改后,如果启用hotdeploy在服务器),非常相同 servlet实例将所有请求共享!你不想这样做。

毕竟,您不应该在JSP页面中使用脚本。 Java代码属于真正的Java类。在这种情况下,您可以使用EL functionbean classservlet class

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类应该映射到覆盖JSP页面的url-pattern(反之亦然),并且应该有012在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" /> 

它使代码更清洁,更好的维护。

+0

很好的答案,@BalusC 你真是个jsp高手:) 尤其是那个UUIDBean帮了我 – MartinL 2017-05-03 16:14:01

0

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

部分被声明作为成员变量,因此仅称为会话初始化。所以它在会话初始化之后永远不会再被调用。

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