【问题标题】:number of times the servlet is getting called increases with the number of requests its gettingservlet 被调用的次数随着它获得的请求数的增加而增加
【发布时间】:2014-04-18 12:17:41
【问题描述】:

我有以下代码,

public class HttpAdapter extends HttpServlet {
    private static final long serialVersionUID = 1L;
    static Logger l = Logger.getLogger(HttpAdapter.class.getName());

    public HttpAdapter() {
        super();     
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try{
            Layout ll = new SimpleLayout();
            Appender a = new FileAppender();
            a = new FileAppender(ll,"C:\\Users\\Vasanth\\Desktop\\JDlogs\\my.txt");
            l.info(request.getRemoteHost());
            l.addAppender(a); 

            String loc = DTO.findMyLocation();      
            l.info(loc);

            l.info(this.getClass()+" >>>>>>>>>>>>>>task complete");
            l.info(request.getRemoteHost());

        }catch(Exception e){
            e.printStackTrace();        
        }finally{
            getServletContext().getRequestDispatcher("/JSP/done.jsp").forward(request, response);
        }

    }
    //F:\\home\\WorkSpace\\Jdfront1\\webapps\\JSP\\

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
}

这是不寻常的事情:每当我从浏览器通过一个看起来像这样的 jsp 页面向这个 servlet 发出请求时,

<!DOCTYPE html>
<html>
 <head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>jdHome</title>
</head>
<body>
<header>hello!!</header>
<section>
<form action="http://192.168.1.101:90/Jdfront1/hello">
<label>Topic :</label><input type="text" name="topic"/><br>
<label>Number of pages :</label><input type="text" name="Nopages"/><br>
<label>URL :</label><input type="text" name="link"/><br>
<label>isRange :</label><input type="text" name="range"/><br>
<input type="submit">

</form>
</section>

当第一次发出请求时,它运行良好,日志也只出现一次, 但是当我从 jsp 向同一个 servlet 发出第二次请求时,整个程序会运行两次。日志来了两次,就像我有一个System.out.println("hello"),它会打印两次“你好”。当我提出第三个请求时,它会打印 3 次并继续!我曾经转发过的调度程序中是否缺少某些内容?我到处都试过了,没有任何地方报告过类似甚至接近这个的问题。

【问题讨论】:

    标签: java jsp tomcat servlets


    【解决方案1】:

    为什么要在 doGet() 方法中配置记录器?

    正如您所指出的,此方法在每个请求上执行。

    但是,您可能只想配置您的记录器和它的附加程序一次。此逻辑的更好位置是在 Servlet 的 init 方法中(此逻辑的最佳位置是在外部 XML 或属性文件中)。

    您看到日志行的多个副本的原因是,当您收到第四个请求时,您已经向记录器添加了四个附加程序。 logger 框架不知道这些 appender 是相互重复的,并将日志消息发送给每个。

    【讨论】:

    • 感谢您的回答。和wolaaaa!惊人的!!先生,它奏效了!多谢。我在谷歌上搜索了 init 和 destroy 方法并了解了它们的作用。但是仍然存在一个疑问,当一个请求来自一个 IP 的 servlet 时,servlet 会加载,并且一旦该 servlet 执行结束,它应该会自动卸载 na???为什么还呆在那里??我的意思是说,当第一个请求到来时,它应该创建加载附加程序,最后将取消附加程序,不?所以nxt请求来了,一个新的appender创建了na?我得到了 servlet 生命周期 wrng 吗?
    猜你喜欢
    • 1970-01-01
    • 2018-01-29
    • 2014-03-18
    • 2021-02-08
    • 2017-05-27
    • 2023-03-30
    • 2021-05-31
    • 2020-08-10
    • 1970-01-01
    相关资源
    最近更新 更多