java - servlet 被调用的次数随着它收到的请求数的增加而增加

标签 java jsp tomcat servlets

我有以下代码,

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"),它会打印两次“hello”。当我发出第三个请求时,它打印了 3 次并继续!我曾经转发的调度员中是否缺少某些内容?我到处都试过了,没有任何地方报告过类似甚至接近这个的问题。

最佳答案

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

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

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

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

关于java - servlet 被调用的次数随着它收到的请求数的增加而增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22384128/

相关文章:

ubuntu - Netbeans 不会部署在 apache webapps 目录中

java - 是否可以在 ubuntu 上的 apache-tomcat-7.0.54 中配置代理设置?

maven - 如何在远程Tomcat上部署war

java - 无法获取 WhitePages.com 的 XPath?

java - 在java中将一个列表插入另一个列表?

javascript - 我在 jsp 服务器中收到了来自 Android 应用程序的 HTTP POST,如何将该数据传递到 Javascript 函数中

security - 使用 c :out to prevent XSS 的替代方法

java - Hibernate 查询 - 复杂

java - 如何正确转换存储库 @Query 的结果?

java - 无法使用超链接实现 Struts 2 token 拦截器