Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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_Xml_Servlets - Fatal编程技术网

Java 从Servlet写入文件

Java 从Servlet写入文件,java,xml,servlets,Java,Xml,Servlets,下面是我写的一段代码: public class ServletCounter extends HttpServlet { private final Object lock = new Object(); private int serviceCounter = 0; private FileOutputStream out; private boolean shuttingDown; @Override public void init(

下面是我写的一段代码:

public class ServletCounter extends HttpServlet {

    private final Object lock = new Object();

    private int serviceCounter = 0;
    private FileOutputStream out;
    private boolean shuttingDown;

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        super.init(servletConfig);
            }

     @Override
    protected void service(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
        enteringServiceMethod();
        try {
            super.service(httpServletRequest, httpServletResponse);
            out = new FileOutputStream("C:\\xampp\\tomcat\\webapps\\myapp\\WEB-INF\\lib\\counter.txt");

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        } 
        @Override
    protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
        if (!shuttingDown) {
            writeToFile("number of servlet access = " + serviceCounter );

        }
    }

    @Override
    public void destroy() {
        ...
    }
    private void enteringServiceMethod() {
        synchronized (lock) {
            serviceCounter++;
            writeToFile("method enteringServiceMethod serviceCounter =  " + serviceCounter);
        }
    }
    private int getNumServices() {
        synchronized (lock) {
            return serviceCounter;
        }
    }
    private void writeToFile(String text) {
        System.out.println(text);
        text += "\r\n";

        try {
            out.write(text.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    }

我需要的是,每次有人打开我的Servlet时,它都应该打开“counter.txt”文件并存储Servlet被打开的次数。例如,如果文件保留数字8,那么在有人访问servlet之后,它应该存储数字9并删除数字8。这有意义吗?有人能帮我重写writeToFile方法吗。我写的代码不完整,但我被卡住了,尝试了几件事,但似乎都不起作用。

如果你想计算页面命中率,那么
过滤器将是不错的方法


截取每个请求并在应用程序范围内获取一个
同步的
变量并增加它

hmmm,我想我不知道该怎么做。我尝试过使用过滤器,但我的writetoFile方法有问题。它确实可以编译,但在运行时,当我启动servlet时,它会抛出异常,我看不到它在工作。但是为什么要在每个请求中写入文件,您可以在内存中管理它,并且可能在某个时间间隔您可以将它写入文件/DBWell这就是我被要求做的:每次有权访问ServletConret,应该打开文件,记下条目数并关闭文件。如果您想这样做,请使用同步方法,它应该可以工作,如果不适合您,请告诉我们异常stacktrace hereexception`java.lang.NullPointerException ServletCounter.writeToFile(ServletCounter.java:80)ServletCounter.enteringServiceMethod(ServletCounter.java:67)ServletCounter.service(ServletCounter.java:25)javax.servlet.http.HttpServlet.service(HttpServlet.java:722)`。我认为直接编写不是一个好主意,因为您必须处理并发执行(在最好的情况下会延迟回答时间,在最坏的情况下会导致无效值)。发生这种情况时,请将消息放入队列,让单个实例处理消息并更新值。