「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」正誤表


このページは、拙著「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」の正誤表のページです。

あまり増えないことを祈ります。

日付順のインデックス


p.44 リスト1-16 Modoki01.java 59行目

誤)

  if (line == "")
      break;

正)

  if (line.equals(""))
      break;

Javaで文字列を==で比較するという、初心者のようなミスをしてしまいました……(長いこと会社ではC#を使っているせいでしょうか……)

このケースでは、lineを取得するreadLine()メソッドが、空文字を返す時は文字列リテラルの""を返す実装になっており、Javaでは文字列リテラル同士であれば==による比較は可能なので一応動作はします。しかし、別のメソッドの中まで見ないと正しさを確認できないようなプログラムは問題ですので正誤表に載せておきます。


p.50 リスト1-18 ServerThread.java 83行目

誤)

  if (line == "")
      break;

正)

  if (line.equals(""))
      break;

p.44と同様。


p.67 リスト2-9 ServerThread.java 22行目

誤)

  if (line == "")
      break;

正)

  if (line.equals(""))
      break;

p.44と同様。


p.95 リスト3-5 ShowBBS.java 20行目

誤)

out.println("<head>");

正)

out.println("</head>");

p.108 最後の行

誤)

このメソッドはTestBBS.javaでは使用していません。

正)

このメソッドは、このサンプル掲示板では使用していません。

本書のベースとなったWeb記事

http://kmaebashi.com/programmer/webserver/henacat.html

では、ShowBBS.javaとPostBBS.javaをまとめてTestBBS.javaというひとつのソースに置いていました。

Javaの流儀では1クラス1ファイルですので書籍化の際に分離したのですが、ここを直し忘れたようです。


p.101 リスト3-9 showbbs.jsp 37行目

<form>要素の閉じタグとして</form>がありますが、18行目の<form>は23行目で閉じているので、不要です。


p.111 リスト3-14 ServerThread.java 36行目

誤)

  if (line == "")
      break;

正)

  if (line.equals(""))
      break;

p.44と同様。


p.112 リスト3-14 ServerThread.java 52行目

誤)

String reqUri = MyURLDecoder.decode(requestLine.split(" ")[1],
                                    "UTF-8");
String[] pathAndQuery = reqUri.split("\\?");
String path = pathAndQuery[0];
if (pathAndQuery.length > 1) {
    query = pathAndQuery[1];
}

正)

String reqUri = requestLine.split(" ")[1];
String[] pathAndQuery = reqUri.split("\\?");
String path = MyURLDecoder.decode(pathAndQuery[0], "UTF-8");
String query = null;
if (pathAndQuery.length > 1) {
    query = pathAndQuery[1];
}

GETパラメタのエンコードはHttpServletRequestのsetCharacterEncoding()で指定するのに、この時点でURL全体をURLデコードしたら二重デコードになってしまいます。ここではクエリストリング部分はデコードしないようにする必要があります。


p.116 リスト3-17 ServletService.java 20行目

誤)

String[] keyValue = param.split("=");

正)

String[] keyValue = param.split("=", -1);

JavaのString#split()は、「a=」という文字列をparam.split("=")のようにsplit()すると、「戻り値の配列の要素数は2で、[0]には「a」が、[1]には空文字が入る」のではなく、「戻り値の配列の要素数は1で、[0]にだけ「a」が入る」という挙動になっています。そのため、このままでは、テスト掲示板でフォームのいずれかの入力欄に何も入れずにPOSTすると、ArrayIndexOutOfBoundsExceptionで落ちてしまいます。


p.140 リスト4-3 showbbs.jsp 35行目

16行目の「<!--」で開いたコメントが閉じていません。

今時「JavaScript未対応のブラウザのために中身をコメントアウトしておく」という対策自体時代遅れですし、JavaScript対応ブラウザなら<script>内に「-->」を書いてもどうせ無視されるのですが……


p.141 リスト4-3 showbbs.jsp 59行目

<form>要素の閉じタグとして</form>がありますが、40行目の<form>は45行目で閉じているので、不要です。


p.153 リスト4-9 ServletService.java 20行目

p.116と同じです。


p.220 リスト6-11 testform3.html 51行目

誤)

<thead>

正)

</thead>

p.241 リスト7-3 MultiPartParser.java 24行目

誤)

  if (line == "") {
      break;

正)

  if (line.equals(""))
      break;

p.44と同様。


p.248 リスト7-8 FileDownloader.java 5行目

誤)

TARGET_ADDRESS = "http://localhost/downloadtest/file.mp4;

正)

TARGET_ADDRESS = "http://localhost/downloadtest/file.mp4";

p.44と同様。


p.256 リストA-2 ServerThread.java 25行目

誤)

  if (line == "")
      break;

正)

  if (line.equals(""))
      break;

p.44と同様。


p.257 リストA-2 ServerThread.java 41行目

誤)

String reqUri = MyURLDecoder.decode(requestLine.split(" ")[1],
                                    "UTF-8");
String[] pathAndQuery = reqUri.split("\\?");
String path = pathAndQuery[0];
if (pathAndQuery.length > 1) {
    query = pathAndQuery[1];
}

正)

String reqUri = requestLine.split(" ")[1];
String[] pathAndQuery = reqUri.split("\\?");
String path = MyURLDecoder.decode(pathAndQuery[0], "UTF-8");
String query = null;
if (pathAndQuery.length > 1) {
    query = pathAndQuery[1];
}

p.112と同様。


p.263 リスト4-9 ServletService.java 20行目

p.116と同じです。


p.268 リストA-13 HttpServletRequestImpl.java 61行目

誤)

  decoded[i] = new String(data[0], this.characterEncoding);

正)

  decoded[i] = new String(data[i], this.characterEncoding);

p.277 リストA-19 MultiPartParser.java 24行目

誤)

  if (line == "") {
      break;

正)

  if (line.equals(""))
      break;

p.44と同様。


著者のWebページトップはこちら

ご意見、ご質問、不具合連絡等は掲示板にお願いいたします。