K.Maebashi's BBS

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

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


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


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


投稿者:rhino
2018/09/23 19:43:53

Link:
Henacat起動まではうまくできたのですが、掲示板のタイトル・ハンドル名・メッセージの内のどこかが
未入力のままで送信を押すと、リスト3-17のServletServiceの28行目でjava.lang.ArrayIndexOutOfBoundsExceptionが発生します。
keyValue[0]に対するkeyValue[1]がない、ということだと思うんですが、これはどこかコードを写し間違えているでしょうか?

あと、このstringToMapメソッド内のparameterMapに過去の投稿内容も保持しているという認識で
合っているでしょうか?しかし毎回メソッドが呼ばれるたびにnewしていては過去の内容は保持できませんよね?

基本的なところかもしれませんが、どなたかわかる方、教えていただけますでしょうか。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



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



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


投稿者:rhino
2018/09/27 00:53:01

Link:
ご回答いただき、ありがとうございます。

>(試していませんが)param.split("=", -1) とすればよいかと思います。
>
試してみたところ、これでうまくいきました。

投稿内容の取得については、教えていただいた流れを追っていき、やっとわかりました。

stringToMapメソッドについて、まだ理解できていない点があるのですが、
リスト3-17の21行目でif(paramterMap.containsKey(keyValue[0]))が
trueになるケースはどんな場合でしょうか?本文P119の中頃に、『同一のパラメタが
複数存在し得る』とあるのですが、このパラメタとはtittle, handle, messageのことですよね。
1回のリクエストでこれらが複数になる場合というのがどうもよくわかりません。

教えていただければ幸いです。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



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


投稿者:(ぱ)こと管理人
2018/09/28 00:51:13

Link:
>リスト3-17の21行目でif(paramterMap.containsKey(keyValue[0]))が
>trueになるケースはどんな場合でしょうか?本文P119の中頃に、『同一のパラメタが
>複数存在し得る』とあるのですが、このパラメタとはtittle, handle, messageのことですよね。
>1回のリクエストでこれらが複数になる場合というのがどうもよくわかりません。

p.84のリスト3-3で、POSTのHTTPリクエストのサンプルを掲載していますが、
ここでcheck_nameという同一のパラメタが複数回登場しています。
つまり、チェックボックスを複数選択すると、この状況が発生します。
p.85の脚注にも書いたとおり、この仕様は使いにくいとは私も思うのですが。

[ この投稿を含むスレッドを表示] [ この投稿を削除]



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


投稿者:rhino
2018/09/28 23:00:12

Link:
>p.84のリスト3-3で、POSTのHTTPリクエストのサンプルを掲載していますが、
>ここでcheck_nameという同一のパラメタが複数回登場しています。
>つまり、チェックボックスを複数選択すると、この状況が発生します。
>p.85の脚注にも書いたとおり、この仕様は使いにくいとは私も思うのですが。
>
>
テスト掲示板だけでなく、前の入力フォームにも対応できるよう書かれていたのですね。
サーブレットコンテナを作っているのだから、こういう場合も想定しなければならないのに、
どうも頭が固かったみたいです。

お答えいただき、ありがとうございました。
また何かありましたら、よろしくお願いいたします。
[ この投稿を含むスレッドを表示] [ この投稿を削除]