ひぐぺん工房トップへ おかげさまで26周年!

ひぐぺん工房(松浦健一郎・司ゆき) - HigPen Works
Follow @higpenworks
・今までの仕事 ・書籍 ・最近の業務 ・対応可能言語 ・お見積

『基礎からのサーブレット/JSP 新版』 Q&A

以下の回答で問題が解決しなかった場合には、 こちらから ご連絡ください。

訂正

2018/10/12
Q.Product.java(p.228)
A.
掲載したProduct.javaについて、getNameメソッドとgetPriceメソッドの一部が欠けていました。申し訳ありません。以下が該当部分の正しいプログラムです。
public String getName() {
    return name;
}
public int getPrice() {
    return price;
}

2020/12/04
Q.練習問題(Request2.java)(p.177-178)
A.
ページに表示するメッセージに誤りがありました。申し訳ありません。以下が該当部分です。
誤:Query Sring
正:Query String

2022/01/25
プロパティとセッタ/ゲッタ(p.227)
A.
書式・本文・プログラム例に誤りがありました。申し訳ありません。以下が該当部分です。

補足

2018/10/12
Q.文字エンコーディングの指定(p.55)
A.
サーブレットやJSPの出力(レスポンス)が日本語を含む場合、以下のように文字エンコーディングの指定を行わないと、文字化けする場合があります。
本書では、フィルタ(p.144)を使ってこのような文字エンコーディングを指定を行うため、個々のサーブレットやJSPでは文字エンコーディングの指定を省略しています。しかし、フィルタが有効になっていない場合には文字エンコーディングの指定が働かないため、もし文字化けが起こる場合には、上記のような処理をサーブレットやJSPに追加してみてください。

2020/10/03(←2020/08/10)
Q.CHAPTER14以降のサンプルプログラムの動作(p.193)
A.
サンプルプログラムが動作しない場合、以下をお試しいただけましたら幸いです。
  1. 本書のダウンロードファイルに付属するJDKをお使いください。
  2. サンプルプログラムを打ち込んでいる場合には、一旦打ち込んだファイル一式をバックアップした後に、本書のダウンロードファイルをそのままお使いください。sample\bookフォルダを、tomcat\webapps\bookフォルダに上書きコピーして使います。
  3. CHAPTER14以降のサンプルプログラムでは、H2 Databaseを利用します。CHAPTER13の手順に沿ってH2 Databaseを起動し、データベースを作成しておいてください。H2 Databaseは起動したままにしてください。
  4. CHAPTER14以降のサンプルプログラムでは、CHAPTER10-3のフィルタを使います。p.146の手順に沿ってEncodingFilter.javaをコンパイルし、動作を確認しておいてください。
  5. 各プログラムを実行する際には、Tomcatを再起動してからURLをブラウザで開いてください。
例えばp.371のプログラム(CHAPTER23)を実行したときに、「/book/chapter23/Search.Action」「The requested resource is not available.」と表示される場合の原因は、Tomcatを再起動していない、ファイルの配置が違っている、ファイルの内容が違っている、などが考えられます。色々な可能性があるので、もし原因を調べる場合には、上記の手順で動作を確認していただいた後に、サンプルプログラムとの相違を調べてみてください。p.371のプログラムに関しては、上記の手順で動作することを確認しました。

2020/08/27
Q.FrontController.javaのコンパイル(p.365)
A.
本書のダウンロードファイルに付属するJDK以外で、FrontController.javaをコンパイルすると、以下のメッセージが表示されることがあります。

  注意:tool\FrontController.javaは推奨されないAPIを使用またはオーバーライドしています。
  注意:詳細は、-Xlint:deprecationオプションを指定して再コンパイルしてください。

以下のように-Xlint:deprecationオプションを付けてコンパイルすると、詳細なメッセージが表示されます。

  > javac -encoding utf-8 -Xlint:deprecation -d ..\classes -sourcepath . tool\FrontController.java
  tool\FrontController.java:19: 警告:[deprecation] ClassのnewInstance()は推奨されません
  Action action=(Action)Class.forName(name).newInstance();

上記の警告は、FrontController.javaを下記のように修正すれば解消されます。

  修正前:Action action=(Action)Class.forName(name).newInstance();
  修正後:Action action=(Action)Class.forName(name).getDeclaredConstructor().newInstance();

本書のサンプルプログラムは、本書のダウンロードファイルに付属するJDKを使って動作検証を行いました。他のJDKを用いた場合には、JDKの仕様変更による不具合が発生する可能性がありますので、本書に付属するJDKをお使いいただくことをおすすめします。

2022/02/01
Q.getAttributeとsetAttribute(p.405)
A.
CartAddAction.javaにおいて、変数cartを使ってカートを変更した際に、session.setAttribute("cart", cart)を呼び出さなくても、セッションにカートの変更が反映されます。仕組みは次の通りです。
  1. 初回にsession.setAttribute("cart", cart)を実行すると、セッションのcart属性がカートのArrayListオブジェクトを参照します。
    cart属性 ー参照→ ArrayListオブジェクト
  2. session.getAttribute("cart")の戻り値を変数cartに代入すると、セッションのcart属性と変数cartの両方が、同じArrayListオブジェクトを参照します。
    cart属性 ー参照→ ArrayListオブジェクト ←参照ー 変数cart
  3. 変数cartを通じてArrayListオブジェクトを変更します。
    cart属性 ー参照→ 変更されたArrayListオブジェクト ←参照ー 変数cart
  4. 上記のように、cart属性からも変更されたArrayListオブジェクトが見えるので、再度session.setAttribute("cart", cart)を実行する必要はありません。
ポイントは、setAttributeはセッションの属性にリストの内容をコピーするのではなく、参照をコピーするという点です。これは、オブジェクトを参照する変数を他の変数に代入すると、内容をコピーするのではなく参照をコピーするので、2つの変数が同じオブジェクトを参照するようになるのと似た動作です。例えば、
  a = オブジェクト;
  b = a;
とすると、
  a ー参照→ オブジェクト ←参照ー b という状態になります。この状態で、変数bからオブジェクトを変更すると、変数aからも変更後のオブジェクトが見えます。これは前述のcart属性と変数cartの関係と同様です。

2022/03/04
Q.Windows以外の環境における利用
A.
本書で学ぶサーブレット/JSPの知識やサンプルプログラムは、Windows以外の環境(例えばmacOSやLinuxなど)でも活用できます。一方、サンプルプログラムのコンパイルや実行に必要なJava、Tomcat、H2 Databaseなどのツールは、環境ごとに異なる方法でセットアップする必要があります。環境によっては、セットアップの作業が難しい場合や、本書とはツールのバージョンが違ってプログラムが動かない場合も予想されます。検討したのですが、色々な環境向けのダウンロードファイルを用意させていただくことは困難なので、Windows上で本書のダウンロードファイルをお使いいただくことをお願い申し上げます。


最終更新 2022/08/02
トップページへ
©ひぐぺん工房 禁無断転載
最新刊『 C言語[完全]入門 』
このサイトはリンクフリーです。
このサイトはChromeで動作検証しています。ブラウザにかかわらず表示に乱れがありましたらどうぞお知らせ下さい。メールを送る
s