Servlet日記(1999/03/21)

本日の成果

 前回のservletを改造して、すでに入力してあるデータに対して、リプライを書けるようにしました。

 それぞれのデータに番号を付け、その番号の表示をリプライのためのリンクにしています。そのリンクを選択すると、元のデータのSubjectにRe: を付けたものを新しいSubject、元のデータのContentに区切り線を入れたものを新しいContentにして、入力フォームを表示します。そのフォームに入力してPostすると、普通に入力したときと同様に、一番下に追加されます。

 リプライのためのメッセージ番号は、QueryStringでURLに埋め込んであります。doGet()メソッドで、QueryStringを調べ、その番号がなければ今まで通りの処理を行い、番号が付いていれば、その番号のメッセージを取り出してフォームの中に表示しています。doPost()メソッドは、前回と同じなので、省略しました。

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

class bbsMsg {
    private static bbsMsg top = null;
    private static int nextMsgNo = 1;

    private bbsMsg next;
    private int msgNo;
    private String msgName;
    private String msgSubject;
    private String msgContent;
    private Date msgDate;

    public bbsMsg() {
        if (top == null) {
            top = this;
        } else {
            bbsMsg tail;
            for (tail = top; tail.next != null; tail = tail.next)
                ;
            tail.next = this;
        }
        next = null;
        msgNo = nextMsgNo++;
        msgName = null;
        msgSubject = null;
        msgContent = null;
        msgDate = new Date();
    }

    public bbsMsg(String nam, String subj, String cont) {
        this();
        setName(nam);
        setSubject(subj);
        setContent(cont);
    }

    public static String printMsg(String url) {
        String rtn = null;
        String s;

        for (bbsMsg msg = top; msg != null; msg = msg.next) {
            s = "No. <a href=\"" + url + "?msgno="
              + msg.getMsgNo() + "\">" + msg.getMsgNo() + "</a><br>"
              + "<dl><dt>Name:<dd>" + msg.getName()
              + "<dt>Subject:<dd>" + msg.getSubject()
              + "<dt>Date:<dd>" + msg.getDate()
              + "<dt>Content:<dd><pre>" + msg.getContent()
              + "</pre></dl><hr>";
            if (rtn == null)
                rtn = s;
            else
                rtn = rtn + s;
        }
        return rtn;
    }

    public static bbsMsg getMsg(int msgNo) {
        bbsMsg msg;

        for (msg = top; msg != null; msg = msg.next) {
            if (msg.getMsgNo() == msgNo)
                break;
        }
        return msg;
    }

    public String getName() {
        return msgName;
    }
    public void setName(String nam) {
        msgName = nam;
    }
    public String getSubject() {
        return msgSubject;
    }
    public void setSubject(String subj) {
        msgSubject = subj;
    }
    public String getContent() {
        return msgContent;
    }
    public void setContent(String cont) {
        msgContent = cont;
    }
    public Date getDate() {
        return msgDate;
    }
    public int getMsgNo() {
        return msgNo;
    }
}

public class Bbs02 extends HttpServlet {
    public void doGet(
        HttpServletRequest req,
        HttpServletResponse res
    ) throws ServletException, IOException
    {
        String msg;
        String msgNoStr = req.getParameter("msgno");
        bbsMsg refMsg;

        if (msgNoStr == null)
            refMsg = null;
        else
            refMsg = bbsMsg.getMsg(Integer.parseInt(msgNoStr));

        res.setContentType("text/html");
        PrintWriter out = res.getWriter();
        out.println("<html><head><title>BBS Servlet Ver.02</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 (refMsg != null)
            out.println(" value=\"Re: " + refMsg.getSubject() + "\"");
        out.println(">");
        out.println("<tr><th>content<td><textarea name=\"uContent\"rows=5 cols=40>");
        if (refMsg != null)
            out.println("\n----------\n" + refMsg.getContent());
        out.println("</textarea></table>");
        out.println("<input type=submit value=\"Post\"></form><hr>");
        msg = bbsMsg.printMsg(req.getRequestURI());
        if (msg != null)
            out.println(msg);
        out.println("</body></html>");
        out.close();
    }

本日の教訓

 だいたいの感じはつかめてきた気がします。もちろん、このプログラムでは、実用にならないのですが。servlet内にデータを保持できるので、こういうテストプログラムを作るのには簡単でいいですね。

Servlet日記(1999/03/14) Servlet日記の目次 Servlet日記(1999/04/03)