はじめまして。
>Henacat起動まではうまくできたのですが、掲示板のタイトル・ハンドル名
>・メッセージの内のどこかが
>未入力のままで送信を押すと、リスト3-17のServletServiceの28行目で
>java.lang.ArrayIndexOutOfBoundsExceptionが発生します。
>keyValue[0]に対するkeyValue[1]がない、ということだと思うんですが、
>これはどこかコードを写し間違えているでしょうか?
このケースでは、ServletServiceの20行目の param.split("=") のところで、
split()メソッドの仕様上、「a=」という文字列をparam.split("=")のように
split()すると、
・戻り値の配列の要素数は2で、[0]には「a」が、[1]には空文字が入る
のではなく、
・戻り値の配列の要素数は1で、[0]にだけ「a」が入る
という仕様になっているためですね。
https://docs.oracle.com/javase/jp/6/api/java/lang/String.html#split(java.lang.String)
(試していませんが)param.split("=", -1) とすればよいかと思います。
Henacatはあくまでサンプル実装なので、こういうエラーケース的なものの
対処が甘いのはご容赦ください、と言いたいところですが、これはちょっと
実用上問題がありすぎるので、後ほど正誤表に上げさせていただきます。
ご指摘ありがとうございました。
>あと、このstringToMapメソッド内のparameterMapに過去の投稿内容も
>保持しているという認識で合っているでしょうか?
>しかし毎回メソッドが呼ばれるたびにnewしていては過去の内容は
>保持できませんよね?
parameterMapは毎回メソッドが呼ばれるたびにnewしていて、
1回のリクエストごとに使い捨てです。
リスト3-17 ServletService.javaの76行目で、
info.servlet.service(req, resp);
としてサーブレットのservice()メソッドを呼んでいますが、
この呼び出しが、リスト3-26のHttpServlet.javaの13行目のservice()メソッドを
呼び出すことになり、この中で、メソッドがPOSTの場合は(サブクラスの)doPost()
メソッドを呼んでいますから(19行目)、これはつまりリスト3-6のPostBBS.javaの
doPost()メソッドを呼び出しています。
ここで、新たにMessageクラスのインスタンスをnewして、staticフィールドの
messageListにメッセージをつないでいます。