Java 意外的Servlet缓存
我有一个Tomcat7Web应用程序,它由一个带有表单的HTML文件、一个Servlet和一个Javabean组成。HTML表单调用Servlet,Servlet接受请求参数,做一些准备,创建bean实例,并调用它的String doSearch(String arg1,int arg2)方法。每次调用Servlet时,它都将bean设置为null并创建一个新实例 问题在于,在每个会话中,前面的结果(由bean创建)保持可见(不应该出现)。我不使用任何静态变量或类 当我以Java程序的形式运行代码时,它会按预期工作。目前摆脱旧结果的唯一方法是重新启动Tomcat 非常感谢您的帮助 以下是我的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程序的形式运行代
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。了解。