「Java+MySQL+Tomcatで始めるサーバアプリケーション開発入門」 正誤表+補遺(たくさんあってすみません) #言い訳:ゲラ刷りに赤ペンで校正した際に(手書きのため)大量のミスが混入して しまいました(もちろんそれだけではありませんが)。次の著作からデータ上で校正 するように改めました。 ご意見ご質問はtakegata@veltec.co.jp宛てにメールをお送りいただくか、 または掲示板(http://jamy.to/jamyto2/bbs/)へお願いします。 ------------------------------------------------------------ No.1 P43 価を返すメソッド 価を返すメソッド→値を返すメソッド(1行に2か所もあります)。 ------------------------------------------------------------ No.2 P51 UsePerson.javaのコード 次の2行がヌケてました。 class UsePerson{ public static void main(String[] args){ //←ヌケ Person p1=new Person(); p1.age=55; Person p2=p1; p1.age=66; System.out.println(p2.age); } //← ヌケ } ------------------------------------------------------------ No.3 P52 Person p2=p1 UsePerson2.javaの7行目 Person p2=p1; とありますが、 p2=p1; の間違い(Personが余計)です。 スリーエーソフトの金澤様にご指摘いただきました。 ありがとうございます。 ------------------------------------------------------------ No.4 P53 文字列型 この項は、かなり強烈な嘘を書いてしまいました。中村学さんから以下のような指摘をいただき、転載の許可をもらったのでコピペーします。 x = "a" + 4 + "c" は x = new StringBuffer().append("a").append(4).append("c").toString() と同等なコードとしてコンパイルされると説明があります. http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/StringBuffer.html #全て定数なので,コンパイル時に解決されてしまうでしょうけど…. よって, message += "したぜ"; は message = new String(message.toString() + "したぜ"); ではなく, message = new StringBuffer().append(message).append("したぜ").toString(); (もしくは, message = new StringBuffer(message).append("したぜ").toString(); ?)と同等なコードとしてコンパイルされるのではないかと思います. また, String str = "abc"; は char data[] = {'a', 'b', 'c'}; String str = new String(data); と同じであると説明があります. http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/String.html しかし, message = "代入"; は message = new String("代入"); ではないと思います.Java の String クラスには 1 つの String オブジェク トを引数とする(コピー)コンストラクタが用意されています. http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/String.html#String(java.lang.String) ちなみに,Java の String オブジェクトは不変なのでこのコンストラクは不 要であり,不必要な String オブジェクトが生成されるため, message = new String("代入"); などは好ましくない表記であると『Effective Java』の項目 4 で説明があり ます. http://java.sun.com/docs/books/effective/ 思いこみで書いた上に検証を怠りました。激しく反省。 実はまだ良く分かっていない所があるので、勉強してから訂正を掲載します。 ------------------------------------------------------------ No.5 P78 Employee→Employee1 「このクラスを拡張してEmployeeを作ってみよう。」の部分 Employee→Employee1(次のページにも、もう1か所) ------------------------------------------------------------ No.6 P78,P80 Person.java P78とP80の Person.javaソースの2行目 private static int count; は不要です。 スリーエーソフトの金澤さんにご指摘いただきました。ありがとうございます。 ------------------------------------------------------------ No.7 P79 TestEmployee1.javaのコード class TestEmployee1{ public static void main(String args[]){ Employee1 e1 = new Employee1(); e1.setName("南野 是志紀"); System.out.println(e1.getName()); System.out.println(Employee.getCount()); //←削除 } } 石田さんありがとう(他にも指摘多数)。 ------------------------------------------------------------ No.8 P79 TestEmploee2.java TestEmploee2.javaの8行目 System.out.println(Employee.getCount()); は不要です。 スリーエーソフトの金澤さんにご指摘いただきました。ありがとうございます。 ------------------------------------------------------------ No.9 P95 UsePerson3.java 4行目のコメントを表す//が抜けていました。 誤:Person3(){ デフォルトのコンストラクタ 正:Person3(){ //デフォルトのコンストラクタ ------------------------------------------------------------ No.10 P96 super()を「明示的に呼び出す必要がある」 Lady.javaのソースでsuper()を「明示的に呼び出す必要がある」と書いたが、これは間違い。 引数の無いデフォルトコンストラクタだけは自動的に呼び出されるので明示的に呼び出す必要は ない。ただし、引数を取るコンストラクタは明示的に呼び出す必要がある。 イイガのスーパープログラマー三宅さんにご指摘いただきました。 ------------------------------------------------------------ No.11 P104 /CD-ROM//SRC/1.13/TestThrow1.java /CD-ROM//SRC/1.13/TestThrow1.java →/CD-ROM//SRC/1.13/TestThrow.java (ファイル名が違っていました) ------------------------------------------------------------ No.12 P105 TestThrow3 tt = new TestThrow() 1行目 TestThrow3 tt = new TestThrow() →TestThrow3 tt = new TestThrow3() コンストラクタ呼び出しの"3"が抜けてました。 ------------------------------------------------------------ No.13 P106 UseGetYouE.javaのコメント ソース中のコメント 誤:引数が無い場合は空文字をstrに入れる 正:引数が無い場合はstrは空のまま ------------------------------------------------------------ No.14 P106 ttg.repry()→gy.get() UseGetYouE.javaの直後の説明で、本文中にttg.repry()とあるのはgy.get()の間違いです。 ------------------------------------------------------------ No.15 P115 「2.2 MySQLのインストールと起動」 mysqlのデフォルトキャラクタセットを指定しておかないと文字が化けることがある 設定ファイルに次のような行を追加する。 Shift_JISの場合--------------------------- [mysqld] default-character-set=sjis EUCの場合-------------------------------- [mysqld] default-character-set=ujis MySQLの設定ファイルは windowsの場合はシステムディレクトリ(winnt)の下のmy.iniファイル LinuxやMacOSの場合は/etc/my.conf ------------------------------------------------------------ No.16 P122 「MySQLのインストールと起動・・・Mac OSの場合」 Mac OSのターミナルでrootユーザを有効にする方法については付録Dを参照してください。 ------------------------------------------------------------ No.17 P122 「MySQLのインストールと起動・・・Mac OSの場合」 set path ($path /usr/local/mysql/bin) とあるのは set path = ($path /usr/local/mysql/bin) の間違い(=が抜けています)。 ------------------------------------------------------------ No.18 P122 「MySQLのインストールと起動・・・Mac OSの場合」 MacOSのターミナルで日本語を入力するにはホームディレクトリに.inputrcという ファイルを作り、次の行を追加する。 set convert-meta off set meta-flag on set output-meta on 記述漏れを指摘してくれた野村さん、ありがとーっ。 ------------------------------------------------------------ No.19 P132 「)」が余分 「('糸居五郎')」の後に「)」が余分についています。 ------------------------------------------------------------ No.20 P136 のSQL文 select * from person orde by kana; とありますが、EUCの環境などでは select * from person order by binary kana; としなければ正しくソートされないことがあることが分かりました。これはどうも アルファベットの大文字と小文字を同一視するロジックの副作用らしく、日本語の 検索やソートで問題がある場合はbinaryをつけることで解決することがあるようです。 ------------------------------------------------------------ No.21 P157 「test」データベースをdrop 「test」データベースをdrop、とあるのは「jamyto」データベースの間違い。 ------------------------------------------------------------ No.22 P165 他 Shift_JIS→sjis P165,172,173,174,315,321,322,323,325,326,328,330,333,336,339,343,384,397,439,467 すごい間違いです。 String strConn="jdbc:mysql://localhost/jamyto" +"?user=Mulder&password=TrustNo1" +"&useUnicode=true&characterEncoding=Shift_JIS"; の最後の"Shift_JIS"は間違いで正しくは"sjis"または"SJIS"です。 設定ファイル(my.ini等)に [mysqld] default-character-set=sjis を指定しておけばShift_JISの文字列を保存しても化けないので、そういうものだと ばかり思っていましたが、実はこの指定がなくてもJDBCドライバで正しく指定すれ ばよかったのです。 mmatsubaraさんにご指摘いただきました。 ありがとうございます。 ------------------------------------------------------------ No.23 p.174 DbInsertTest.java サンプルコードのファイル名が「DbInsertTest.java」になっているのは「DbDeleteTest.java」の間違い。 ------------------------------------------------------------ No.24 p.183 「4.2 Tomcatのインストール」 Tomcatを手動で起動する場合の操作 shell> $CATALINA_HOME/startup.sh は shell> $CATALINA_HOME/bin/startup.sh の間違い。同様に shell> $CATALINA_HOME/shutdown.sh は shell> $CATALINA_HOME/bin/shutdown.sh の間違い(どちらも $CATALINA_HOMEの後に/binが抜けている)。 ------------------------------------------------------------ No.25 p.185 「4.2 Tomcatのインストール」 shell>export JAVA_HOME=/Library/Java/Home shell>export CATALINA_HOME=/usr/local/tomcat4 shell>$CATALINA_HOME/bin/startup.sh とあるが、MacOSXのデフォルトのシェルはtcshなので、これでは動かない。 bash と入力してから上記を実行するか、またはsetenvを使って次のように する。 shell>setenv JAVA_HOME /Library/Java/Home shell>setenv CATALINA_HOME /usr/local/tomcat4 shell>$CATALINA_HOME/bin/startup.sh #江原さんにご指摘いただきました。 ------------------------------------------------------------ No.26 P193のあたり P193のあたりの説明が少し足りてないようで、本書の記述通りに動かないという 問い合わせがありました。 次のようにして試してみてください。 まずP189-P190の要領でc:\jamyto に置いたファイルが http://localhost:8080/jamyto/ というURLで見えるように設定します。 次にc:\jamyto ディレクトリにinput.htmlとoutput.jspをコピーします。 ブラウザのアドレスバーで http://localhost:8080/jamyto/input.html を指定して開きます。 この手順で表示されたフォームに入力して[行け]をクリックします。 ------------------------------------------------------------ No.27 P193 「4.4 JSP」 5.サーバでdisplay.jspが呼び出され →output.jspの間違い。 ------------------------------------------------------------ No.28 P196 「4.4JSP」 JSPの書式で「宣言」というのを書くのを忘れた。 <%! ・・・・ %> の中にフィールドやメソッドを書くことができる。階層構造を表示するために再帰呼び 出しを行う場合などは、この書式を使う必要がある。 ------------------------------------------------------------ No.29 P202 コメントの綴り abouveって何だ?aboveの間違いじゃ(恥)。 ------------------------------------------------------------ No.30 P205 2行目 Output3の最初のOは大文字が正しい。 ------------------------------------------------------------ No.31 p.209 「)」がひとつ多い パスワードのところの文字を取り出す方法の式 ("passwd"));で「)」がひとつ多い。 ------------------------------------------------------------ No.32 P211 ラジオボタン 誤:3つのタグはいずれもname属性が"selection"となっている。 正:3つのタグはいずれもname属性が"item"となっている。 松戸の遠藤さんにご指摘いただきました。 ありがとうございます。 ------------------------------------------------------------ No.33 p.227 addcookie.jsp addcookie.jspソースの下から3行目 getCookie.jsp は getcookie.jsp の間違い。もしくは getcookie.jspのファイル名をgetCookie.jspにすべきでした。 ------------------------------------------------------------ No.34 P239 上から3行目 誤: 入力フォームに戻る 正: 入力フォームに戻る 長崎の原さんにご指摘いただきました。ありがとうございます。 ------------------------------------------------------------ No.35 P248 keytool windowsの場合、keytoolを実行した後に次の操作が必要です。 Document and Settings ディレクトリの中の自分(keytoolを実行したユーザ) のホームディレクトリに .keystore というファイルができているので、それ Document and Settings\Default User の下に移動する。 thanks 加藤さん。 ------------------------------------------------------------ No.36 P291 ソース の後にが必要。 ------------------------------------------------------------ No.56 P439 ソースコード while(rs.next()){ strAddress=rs.getString("pref")+rs.getString("city")+rs.getString("address"); } の後に rs.close(); stmt.close(); conn.close(); を追加。 ------------------------------------------------------------ No.57 P447 ソースコード の後にを追加。 ------------------------------------------------------------ No.58 P447 ソースコード お買上明細
の下のは下から3行目にあるのが正しい。 ※埼玉県の加藤幸男さんには8章のサンプルコードの間違いをたくさん指摘していただきました。 ありがとうございました。 ------------------------------------------------------------ No.59 P447 ソースコード “送り先の確認
”の2行上 Sani.tizer2( は不要です。 山本さんにご指摘いただきました。 ------------------------------------------------------------ No.60 奥付(P510の次のページ) 私が学校を卒業して会社を作ったのは1988年でした。 ------------------------------------------------------------ No.61 P344 /CD-ROM//SRC/6.04/load_persons.jsp の personのsは不要で正しくは /CD-ROM//SRC/6.04/load_person.jsp 天野 仁さんにご指摘いただきました。 天野さんには、本正誤表の誤りについても多数ご指摘をいただきました。 ありがとうございます。