///////////////////////////////////////////////////////////////////////////////
//  << sv161a.java >>
//
// サーブレット(6):応用(アクセスカウンタ)
//
//  アクセス回数をファイルに記録し保存する。
//    ファイルが削除されるまで、記録は保存される。
//
// ●起動法
//  (1)Javaファイル(sv161a.java)をコンパイルし、classファイル(sv161a.class)を
//       作成する。
//       ただし、Javaファイル(sv161a.java)は、
//       %CATALINA_HOME%\webapps\SV\WEB-INF\classes\sv161a.java
//     classファイル(sv161a.class)は、
//       %CATALINA_HOME%\webapps\SV\WEB-INF\classes\sv161a.class
//       に保存する。
//    (2)入力フォームで、
//         URL(http://localhost:8080/SV/servlet/sv161a)
//       を指定する。
//    (3)ファイル(sv161a.dat)は、
//       c:/temp/sv161a.dat
//       に保存する。
//
///////////////////////////////////////////////////////////////////////////////

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

public class sv161a extends HttpServlet {

  // doGetメソッドやdoPostメソッドは要求ごとにスレッドとして実行される。
  // したがって、複数のスレッドでアクセスされる変数countに対して同時に実行され
  // ないように、synchronized指定をしておく必要がある。

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

    int count=0; // アクセス回数を記録する変数。

    // synchronized指定。
    synchronized(this) {
      try {

        // 入力ストリームの作成。                          
        String fname = "c:/temp/sv161a.dat";
        File f = new File(fname);
        if( f.exists() ) {  
          FileReader fr = new FileReader(fname);     
          BufferedReader br = new BufferedReader(fr);        
          // 読込み。                                          
          String line = br.readLine();                       
          count = Integer.parseInt(line);
          count++;                    
          br.close();                                        
        } else {                             
          count = 1; 
        }                                        

        // 出力ストリームの作成。
        FileWriter fw = new FileWriter(fname);
        PrintWriter out = new PrintWriter(fw);
        out.println("" + count); 
        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/sv161a method=POST>"
        + "<input type=submit value=登録>"
        + "</form>"
        + "現在の値: " + count + "<br>"            
        + "</body>"
        + "</html>");
    pw.flush();
    pw.close();    
  }
}
入力フォーム
<form action=http://localhost:8080/SV/servlet/sv161a method=POST>
  <input type=submit value=実行>
</form>
実行結果

実行後


登録をクリック後


Webブラウザを閉じ、再度開き、実行をクリック後