java - 意外的 Servlet 缓存

标签 java tomcat servlets

我有一个 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/

相关文章:

java - 一元 "~"运算符 - 这里到底发生了什么?

java - 以斜杠结尾的 Spring 4 路径参数

tomcat - 如果 <context> 在 tomcat 中的 server.xml 之外定义,则应用程序未部署

java - 与 Jetty 和 Guice 集成良好的 Web 服务 Java 库?

java - Sevlet3 登录方法如何工作?

java - 无法在命令提示符下将Spring Boot应用程序作为可运行的jar运行

java - 无法替换字符串java中的空格

java - 使用Java Jest在Elasticsearch中按ID查找带有附加过滤器的文档

java - 如何创建 2 个新玩家并从 EditText 字段中获取名称

java - 在 webapp 中删除文件时 Tomcat 8.5.42 权限被拒绝