///////////////////////////////////////////////////////////////////////////////
//  << sv164.java >>
//
// サーブレット(6):応用(掲示板)
//
//  掲示板への登録、削除(一定時間後に自動的に行う)、表示を行う。
//  ファイルを使って、記録する。
//
//  1件のレコードは3個のデータから構成される。
//   (1)名前
//   (2)メッセージ
//   (3)登録時刻
//
// ●起動法
//  (1)Javaファイル(sv164.java)をコンパイルし、classファイル(sv164.class)を
//       作成する。
//       ただし、Javaファイル(sv164.java)は、
//       %CATALINA_HOME%\webapps\SV\WEB-INF\classes\sv164.java
//     classファイル(sv164.class)は、
//       %CATALINA_HOME%\webapps\SV\WEB-INF\classes\sv164.class
//       に保存する。
//    (2)入力フォームで、
//         URL(http://localhost:8080/SV/servlet/sv164)
//       を指定する。
//
///////////////////////////////////////////////////////////////////////////////

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

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

    // コンテンツタイプの指定。
    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/sv164 method=POST>"
        + "名前:<input type=text size=30 name=f1><br>"
        + "メッセージ:<input type=text size=50 name=f2><br>"
        + "<input type=submit name=g1 value=登録>"
        + "<input type=submit name=g1 value=表示>"
        + "</form>");
 
    synchronized(this) {

      ArrayList a = new ArrayList();

      /////////////////////////////
      // フォームのデータを取得。//
      /////////////////////////////
      request.setCharacterEncoding("JISAutoDetect");
      String s1 = request.getParameter("f1");
      String s2 = request.getParameter("f2");
      String t1 = request.getParameter("g1");

      /////////////////////////////
      // 掲示板データ読込み処理。//
      /////////////////////////////
      try { 
        // 入力ストリームを生成。                          
        String fname = "c:/temp/sv164.dat";
        File f = new File(fname);
        if( f.exists() ) {  
          FileReader fr = new FileReader(fname);     
          BufferedReader br = new BufferedReader(fr);        
          // 読込み。                                          
          String line;
          while( (line = br.readLine()) != null ) { a.add(line); } 
          br.close();                                        
        }                 

        // 一定時間経過した投稿は削除。
        long u0 = (new Date()).getTime(); // 単位はミリ秒。
        int j = 0;
        while( j < a.size() ) {
          long u1 = Long.parseLong((String)a.get(j+2));
          if( u0-u1 > 60*1000 ) { // 経過時間1分を超えたものは削除。
            a.remove(j); a.remove(j); a.remove(j);
          } else {
            j = j + 3;
          }
        }  

        ///////////////
        // 登録処理。//
        ///////////////
        if( "登録".equals(t1) ) {
          a.add(s1); a.add(s2); a.add(""+u0);
          // 出力ストリームを生成。
          FileWriter w = new FileWriter(fname);
          PrintWriter out = new PrintWriter(w);
          for( int i=0; i<a.size(); i++ ) { out.println(a.get(i)); } 
          out.close();
          // HTML文書を送信。
          pw.println("登録しました<br>");
        } 

        ///////////////
        // 表示処理。//
        ///////////////
        if( "表示".equals(t1) ) {
          if( a.size() > 0 ) {
            // HTML文書を送信。
            pw.println("<hr>");
            for( int i=0; i<a.size(); i=i+3 ) {
              // HTML文書を送信。
              long u2 = Long.parseLong((String)a.get(i+2));
              pw.println("登録番号[" + (i/3+1) + "] 登録時刻:"
                  + (new Date(u2)) + "<br>"
                  + "投稿者:" + (String)a.get(i) + "<br>"
                  + "メッセージ:" + (String)a.get(i+1) + "<br>"
                  + "<hr>");
            }
          }

          // HTML文書を送信。
          pw.println("投稿数:" + a.size()/3 + "<br>");
        }
      } catch( Exception e ) {  
        System.out.println(e);
      }
    }

    // HTML文書を送信。
    pw.println("</body>"
            + "</html>");
    pw.flush();
    pw.close();    
  }
}
入力フォーム
<form action=http://localhost:8080/SV/servlet/sv164 method=POST>
  <input type=submit value=実行>
</form>
実行結果

実行後




登録をクリック後


表示をクリック後


1分経過、表示をクリック後