gpt4 book ai didi

java - 意外的 Servlet 缓存

转载 作者:行者123 更新时间:2023-11-28 22:33:43 41 4
gpt4 key购买 nike

我有一个 Tomcat7 网络应用程序,它包含一个带有表单的 HTML 文件,以及一个 Servlet 和一个 Java bean。 HTML 表单调用 Servlet,它接受请求参数,做一些准备工作,创建 bean 实例并调用它的 String doSearch(String arg1, int arg2) 方法。每次调用 Servlet 时,它都会将 bean 设置为 null 并创建一个新实例。

问题是在每个 session 中,前一个结果(由 bean 创建)保持可见(不应出现)。我不使用任何静态变量或类。

当我将代码作为 Java 程序运行时,它按预期工作。目前摆脱旧结果的唯一方法是重新启动 Tomcat

非常感谢任何帮助。

这是我的 servlet 的代码:

public class LingoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
* @see HttpServlet#HttpServlet()
*/
public LingoServlet() {
super();
}

String HTML_HEAD = "" + "<!DOCTYPE HTML PUBLIC \"" + "-//W3C//DTD HTML " + "4.01 Transitional//EN\" "
+ "\"http://www.w3.org/TR/html4/loose.dtd\">" + "<html>" + "<head><link rel=\"stylesheet\" "
+ "type=\"text/css\" href=\"default.css\">" + "<meta http-equiv=\"cache-control\" content=\"max-age=0\" />"
+ "<meta http-equiv=\"cache-control\" content=\"no-cache\" />"
+ "<meta http-equiv=\"expires\" content=\"0\" />"
+ "<meta http-equiv=\"expires\" content=\"Tue, 01 Jan 1980 1:00:00 GMT\" />"
+ "<meta http-equiv=\"pragma\" content=\"no-cache\" />" + "<title>Lingo Helper</title>"
+ "<meta http-equiv=\"Content-Type\" " + "content=\"text/html; charset=UTF-8\">" + "</head>" + "<body>";
String BODY = "<h1>Results:</h1>";
String FOOTER = "</html>";

// Prevent caching by destroying it first.
LingoSearcher ls = null;

HttpServletRequest req = null;
HttpServletResponse res = null;
PrintWriter pw = null;

/**
* @see HttpServlet#doGet(HttpServletRequest req, HttpServletResponse res)
*/

protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
// PrintWriter pw = null;
LingoSearcher ls = null;
PrintWriter pw = res.getWriter();

String wl = req.getParameter("wl").trim();
String wc = req.getParameter("wc").trim().toLowerCase();

int wlength = Integer.parseInt(wl);

LingoSearcher searcher = new LingoSearcher();

try {
BODY = BODY + "<div id=\"scroll\">" + "<pre>" + ls.doSearch(wc, wlength) + "</pre></div>";

} catch (Exception e) {
String msg = "An error occured. Please check your input" + " parameters and try again.<br/>"
+ "If the prblem persists please report the error" + "as 122";
pw.println(msg);
}
pw.print(HTML_HEAD);
pw.print(BODY);
pw.print(FOOTER);
pw.flush();
pw.close();
res = null;
req = null;
}

最佳答案

你的代码实际上看起来还不错(尽管它有很多架构问题和潜在的 NPE 等),除了这部分:

// Prevent caching by destroying it first.
LingoSearcher ls = null;

HttpServletRequest req = null;
HttpServletResponse res = null;
PrintWriter pw = null;

有些东西告诉我你在发布之前更改了代码,因为那些类级成员从未使用过。您在 doGet 方法中隐藏了它们,因此本地名称优先。如果您没有隐藏它们——也就是说,如果您如果使用了类级成员,那么您保留对对象(尤其是请求和响应对象)的引用的时间会比它们应该存在的时间更长。

在 Web 应用程序中,servlet(通常)是一次性创建的,并且在应用程序的整个生命周期内都存在(直到它被取消部署)。您的 servlet 应该完全没有类级成员,除非它们是适当的线程安全的。

关于java - 意外的 Servlet 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40390201/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com