Servlet日記(1999/07/17)

本日の成果

 これまで、よろこんでクラス変数やクラスメソッドを使っていましたが、よくよく考えてみると、そうしている部分は掲示板の板の部分にあたりそうです。そこで、板とメッセージを分離して別々のクラスにしてみました。相変わらず、機能的には変化がなく、使い物にはなりませんよ。

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

class MsgBoard {
        private Vector msgVec;

        MsgBoard() {
                msgVec = new Vector();
        }

        synchronized void appendMsg(BbsMsg msg) {
                msgVec.addElement(msg);
        }

        synchronized void deleteMsg(int msgNo) {
                msgVec.removeElementAt(msgNo);
        }

        BbsMsg getMsg(int msgNo) {
                return (BbsMsg)msgVec.elementAt(msgNo);
        }

        Enumeration getAllMsgs() {
                return msgVec.elements();
        }

        int getMsgNo(BbsMsg msg) {
                return msgVec.indexOf(msg);
        }
}

class BbsMsg {
        private String msgName;
        private String msgSubject;
        private String msgContent;
        private Date msgDate;

        BbsMsg(String nam, String subj, String cont) {
                setName(nam);
                setSubject(subj);
                setContent(cont);
                msgDate = new Date();
        }

        private void setName(String nam) {
                msgName = nam;
        }
        private void setSubject(String subj) {
                msgSubject = subj;
        }
        private void setContent(String cont) {
                msgContent = cont;
        }

        String getName() {
                return msgName;
        }
        String getSubject() {
                return msgSubject;
        }
        String getContent() {
                return msgContent;
        }
        Date getDate() {
                return msgDate;
        }
        String printMsg() {
                return
                    "<dl><dt>Name:<dd>" + getName()
                  + "<dt>Subject:<dd>" + getSubject()
                  + "<dt>Date:<dd>" + getDate()
                  + "<dt>Content:<dd><pre>" + getContent()
                  + "</pre></dl>";
        }
}

public class Bbs05 extends HttpServlet {
        private MsgBoard mb;

        public void init(ServletConfig config) throws ServletException
        {
                mb = new MsgBoard();
        }

        public void doGet(
                HttpServletRequest req,
                HttpServletResponse res
        ) throws ServletException, IOException
        {
                String cmd = req.getParameter("cmd");
                String msgNoStr = req.getParameter("msgno");
                String url;
                BbsMsg msg;
                BbsMsg refMsg;
                int msgNo;

                refMsg = null;
                if ("delete".equals(cmd))
                        mb.deleteMsg(Integer.parseInt(msgNoStr));
                else if ("reply".equals(cmd))
                        refMsg = mb.getMsg(Integer.parseInt(msgNoStr));

                res.setContentType("text/html");
                PrintWriter out = res.getWriter();
                out.println("<html><head><title>BBS Servlet Ver 0.5</title></head>");
                out.println("<body><form method=post action=\"" + req.getRequestURI() + "\">");
                out.println("<table><tr><th>name<td><input type=text name=\"uName\">");
                out.println("<tr><th>subject<td><input type=text name=\"uSubject\"");
                if ("reply".equals(cmd))
                        out.println(" value=\"Re: " + refMsg.getSubject() + "\"");
                out.println(">");
                out.println("<tr><th>content<td><textarea name=\"uContent\"rows=5 cols=40>");
                if ("reply".equals(cmd))
                        out.println("\n----------\n" + refMsg.getContent());
                out.println("</textarea></table>");
                out.println("<input type=submit value=\"Post\"></form><hr>");

                url = req.getRequestURI();
                Enumeration e = mb.getAllMsgs();
                while (e.hasMoreElements()) {
                        msg = (BbsMsg)e.nextElement();
                        msgNo = mb.getMsgNo(msg);
                        out.println(
                            "No. " + msgNo
                          + " <a href=\"" + url + "?cmd=reply&msgno="  + msgNo + "\">reply</a>"
                          + " <a href=\"" + url + "?cmd=delete&msgno=" + msgNo + "\">delete</a><br>"
                          + msg.printMsg()
                          + "<hr>"
                        );
                }

                out.println("</body></html>");
                out.close();
        }

        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);

                doGet(req, res);
        }

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

本日の教訓

 板とメッセージを分離して、拡張しやすくなったような気がします。が、本当にどこまでまじめに拡張するのか、ということになるわけですが・・・^^;

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