///////////////////////////////////////////////////////////////////////////////
//  << sv162.java >>
//
// サーブレット(6):応用(アクセス記録)
//
//  一週間分のアクセス記録と、総数を記録する。
//  ファイルを使って、アクセス記録を作る。
//
//  ファイルの設計
//    直前のアクセス時刻
//    0日前のアクセス数
//    1日前のアクセス数
//    2日前のアクセス数
//    3日前のアクセス数
//    4日前のアクセス数
//    5日前のアクセス数
//    6日前のアクセス数
//    7日前のアクセス数
//    アクセス総数
//
// ●起動法
//  (1)Javaファイル(sv162.java)をコンパイルし、classファイル(sv162.class)を
//       作成する。
//       ただし、Javaファイル(sv162.java)は、
//       %CATALINA_HOME%\webapps\SV\WEB-INF\classes\sv162.java
//     classファイル(sv162.class)は、
//       %CATALINA_HOME%\webapps\SV\WEB-INF\classes\sv162.class
//       に保存する。
//    (2)入力フォームで、
//         URL(http://localhost:8080/SV/servlet/sv162)
//       を指定する。
//    (3)ファイル(sv162.dat)は、
//         c:/temp/sv162.dat
//       に保存する。
//
///////////////////////////////////////////////////////////////////////////////

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

public class sv162 extends HttpServlet {
  public void doPost(HttpServletRequest request, HttpServletResponse response)
                     throws ServletException,IOException {

    long t0=1000*60*60*24, // 1日をミリ秒(1000*60*60*24)で表す。
         t1=0, // 前回のアクセス時刻。
         t2=0; // 今回のアクセス時刻。
    String s[] = new String[9]; // s[i]はi(0≦i≦7)日前のアクセス数。
                                // s[8]はアクセス総数。

    synchronized(this) {
      try { 

        // 入力ストリームの作成。                          
        String fname = "c:/temp/sv162.dat";
        File f = new File(fname);
        if( f.exists() ) {  
          FileReader fr = new FileReader(fname);     
          BufferedReader br = new BufferedReader(fr);        
          // 読込み。                                          
          String line = br.readLine();                       
          t1 = Long.parseLong(line);
          for( int i=0; i<=8; i++ ) { s[i] = br.readLine(); }
          br.close();                                        
        } else {                             
          t1 = 0; for( int i=0; i<=8; i++ ) { s[i] = "0"; }
        }                                        

        // 記録処理。
        t2 = (new Date()).getTime(); // 単位はミリ秒。

        // 今日(0日前)のアクセス回数更新。
        if( t1/t0 == t2/t0 ) { // 日付が同じ。
          int n = Integer.parseInt(s[0]) + 1;
          s[0] = "" + n;
        } else { // 日付が異なる。
          for( int i=6; i>=0; i-- ) { s[i+1] = s[i]; }
          s[0] = "1";
        } 

        // アクセス総数更新。
        int n = Integer.parseInt(s[8]) + 1;
        s[8] = "" + n;

        // 出力ストリームの作成。
        FileWriter fw = new FileWriter(fname);
        PrintWriter out = new PrintWriter(fw);
        out.println(t2);
        for( int i=0; i<=8; i++ ) { out.println(s[i]); } 
        out.close();
      } catch( Exception e ) { 
        System.out.println(e);
      }
    }

    // コンテンツタイプの指定。
    response.setContentType("text/html; charset=Shift_JIS");

    // HTML文書を送信。
    PrintWriter pw = response.getWriter();
    pw.println("<html>"                                    
        + "<head><title>サーブレット</title></head>"  
        + "<body>"
        + "<h2>アクセス記録</h2>"
        + "<form action=http://localhost:8080/SV/servlet/sv162 method=POST>"
        + "<input type=submit value=登録>"
        + "</form>"
        + "アクセス総数:" + s[8] + "(現在:" + s[0] + ")<br>"            
        + "1日前:" + s[1] + " 2日前:" + s[2] + " 3日前:" + s[3]    
        + " 4日前:" + s[4] + " 5日前:" + s[5] + " 6日前:" + s[6]    
        + " 7日前:" + s[7] + "<br>"    
        + "</body>"
        + "</html>");
    pw.flush();
    pw.close();    
  }
}
入力フォーム
<form action=http://localhost:8080/SV/servlet/sv162 method=POST>
  <input type=submit value=実行>
</form>
実行結果

実行後


登録をクリック後