K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]


新規投稿 | 開設者ホームページへ戻る | ヘルプ


[2142] Re:『Web開発入門』 Henacat ver0.1で掲示板を動かすについて
返信


投稿者:(ぱ)こと管理人
2018/09/26 01:51:19

Link:
はじめまして。

>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にメッセージをつないでいます。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[ より新しい投稿] [ より古い投稿]