K.Maebashi's BBS

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

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

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

[2142] Re:『Web開発入門』 Henacat ver0.1で掲示板を動かすについて
投稿者:(ぱ)こと管理人
2018/09/26 01:51:19

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