Servlet日記(1999/08/01)

本日の成果

 前回作成したものを基に、データのロード・セーブができるようにしてみました。といっても、セーブするオブジェクトについてSerializableを実装すると宣言して(マーカなので、宣言するだけで何も実装しませんが)、後は掲示板の板のオブジェクトをセーブするだけです。それにつながるメッセージのオブジェクトも根こそぎセーブされるので、とっても便利です。いや、これは、本当に便利です。

 ロードも、板のオブジェクトをロードすると、メッセージのオブジェクトもロードされるので、楽ちんです。ロードし損ねたら、新しい板のオブジェクトを作るようにしました。

 というわけで、簡単にロード・セーブを実現できたのですが、一つ問題が。本当は、destroy()メソッドでセーブして、init()メソッドでロードするのだと思いますが、JSDK2.0のservletrunnerを実行するバッチファイルを^Cで止めているためか、destroy()メソッドが呼ばれません。しかたなく、doPost()メソッド内で毎回セーブしています。

 ところで、LIME CAFEの山根さんからリンクしました、とのお知らせが。拝見してみると、おそれ多いことに、大御所に並んで私のサイトが。ううむ、まぁ、ピンからキリまで、ということで。

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

class MsgBoard implements Serializable {
        内容は、前回と同じなので、省略
}

class BbsMsg implements Serializable {
        内容は、前回と同じなので、省略
}

public class Bbs07 extends HttpServlet {
        private MsgBoard mb;

        public void init(ServletConfig config) throws ServletException {
                super.init(config);
                try {
                        FileInputStream fis = new FileInputStream("c:/BbsData");
                        ObjectInputStream ois = new ObjectInputStream(fis);
                        mb = (MsgBoard)ois.readObject();
                        fis.close();
                } catch (Exception e) {
                        log("read BbsData failed. creating new BbsData...");
                        mb = new MsgBoard();
                }
        }

        public void doGet(
                内容は、前回と同じなので、省略
        }

        private void saveData()
        {
                try {
                        FileOutputStream fos = new FileOutputStream("c:/BbsData");
                        ObjectOutputStream oos = new ObjectOutputStream(fos);
                        oos.writeObject(mb);
                        oos.flush();
                        fos.close();
                } catch (Exception e) {
                        log("write BbsData failed");
                }
        }

        public void doPost(
                HttpServletRequest req,
                HttpServletResponse res
        ) throws ServletException, IOException
        {
                BbsMsg msg = new BbsMsg(
                        req.getParameter("uName"),
                        req.getParameter("uSubject"),
                        req.getParameter("uContent")
                );
                mb.appendMsg(msg);
                saveData();     //destroy()メソッドが呼ばれないので

                doGet(req, res);
        }

// destroy()メソッドが呼ばれないので、doPost()メソッドで処理している。
//      public void destroy() {
//              saveData();
//      }

        public String getServletInfo() {
                return "BBS Servlet Ver 0.7";
        }
}

本日の教訓

 Servletの状態をロード・セーブするには、destroy()でセーブして、init()でロードしよう。ただし、destroy()が本当に呼ばれるか、確認すること。それにしても、Serializationは便利。

Servlet日記(1999/07/23) Servlet日記の目次 Servlet日記(1999/08/28)