Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 意外的Servlet缓存_Java_Tomcat_Servlets - Fatal编程技术网

Java 意外的Servlet缓存

Java 意外的Servlet缓存,java,tomcat,servlets,Java,Tomcat,Servlets,我有一个Tomcat7Web应用程序,它由一个带有表单的HTML文件、一个Servlet和一个Javabean组成。HTML表单调用Servlet,Servlet接受请求参数,做一些准备,创建bean实例,并调用它的String doSearch(String arg1,int arg2)方法。每次调用Servlet时,它都将bean设置为null并创建一个新实例 问题在于,在每个会话中,前面的结果(由bean创建)保持可见(不应该出现)。我不使用任何静态变量或类 当我以Java程序的形式运行代

我有一个Tomcat7Web应用程序,它由一个带有表单的HTML文件、一个Servlet和一个Javabean组成。HTML表单调用Servlet,Servlet接受请求参数,做一些准备,创建bean实例,并调用它的String doSearch(String arg1,int arg2)方法。每次调用Servlet时,它都将bean设置为null并创建一个新实例

问题在于,在每个会话中,前面的结果(由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;
}
公共类LingoServlet扩展了HttpServlet{
私有静态最终长serialVersionUID=1L;
/**
*@参见HttpServlet#HttpServlet()
*/
公共LingoServlet(){
超级();
}
字符串HTML_HEAD=“”+”+“+”+”+“”
+ ""
+ ""
+ ""
+“+”行话助手”
+ "" + "" + "";
String BODY=“结果:”;
字符串页脚=”;
//通过先销毁缓存来防止缓存。
LingoSearcher ls=null;
HttpServletRequest req=null;
HttpServletResponse res=null;
PrintWriter pw=null;
/**
*@参见HttpServlet#doGet(HttpServletRequest-req,HttpServletResponse-res)
*/
受保护的void doGet(HttpServletRequest-req,HttpServletResponse-res)抛出ServletException,IOException{
//PrintWriter pw=null;
LingoSearcher ls=null;
PrintWriter pw=res.getWriter();
字符串wl=req.getParameter(“wl”).trim();
字符串wc=req.getParameter(“wc”).trim().toLowerCase();
int-wlength=Integer.parseInt(wl);
LingoSearcher=新LingoSearcher();
试一试{
BODY=BODY+++++ls.doSearch(wc,wlength)+;
}捕获(例外e){
String msg=“发生错误。请检查输入的“+”参数,然后重试。
” +“如果问题仍然存在,请将错误“+”报告为122”; pw.println(msg); } 打印(HTML_头); 印刷品(正文); 打印(页脚); pw.flush(); 关闭(); res=null; req=null; }

}

使用JSP并声明一个作用域为“page”的bean来代替Servlet,从而解决了我的问题。无论如何都要避免使用servlet。JSP更简单,并且有很多选项。

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

//首先破坏缓存以防止缓存。
LingoSearcher ls=null;
HttpServletRequest req=null;
HttpServletResponse res=null;
PrintWriter pw=null;
有些东西告诉我,在发布代码之前,您已经更改了代码,因为这些类级别的成员从未被使用过。您已经在
doGet
方法中对它们进行了阴影处理,因此本地名称优先。如果您没有对它们进行阴影处理,也就是说,如果您使用了类级成员,那么您将保留对对象(尤其是请求和响应对象)的引用的时间比它们应该存在的时间长


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

您可以发布Servlet和HTML表单的代码吗?抱歉,它不适合。你能给我发电子邮件吗?我将把完整的代码作为zip分享到Google Drive,并在这里发布链接。war文件在这里,谢谢。请注意,.war中的代码是为Tomcat 7-1优化的,用于推荐使用JSP而不是servlet。了解。