Servletを実行する
Servletを実行するにはアプリケーションサーバを起動する必要があります。NetBeansの場合、HTMLかServletクラスを右クリックし[ファイルを実行]を選択するとアプリケーションサーバが起動します。今回は最初HTMLからServletを呼び出す作りになっているため図16のようにHTMLで実行してください。図17はNetBeansの[出力]タブです。GlassFishが起動されたり、ClassLoaderが呼び出されていることが分かります。図18がServletを呼び出すための画面です。
図18の画面のテキストフィールドに100と入力して[実行]ボタンをクリックします(図19)。その結果画面が図20です。次に別ブラウザを立ち上げます。URLにhttp://localhost:8080/ServletThreadsTest/AddNumber.htmlと入力すると、最初起動したときと同じ画面(図21)が表示されます。テキストフィールドに200と入力し[実行]ボタンをクリックした結果の画面が図22です。合計が300となっています。この時点で入力した人は驚いてしまいます。次に最初の画面に戻り300と入力します(図23)。図24が結果画面です。入力した人は400になると思っていたはずですが600と表示されています。これは先述したとおり、両者が同じメモリを共有しているために起きます。これ以降の図では同じブラウザ内でタブを切り替えて操作していますが、実際には別ブラウザでの実行をお願いします。
どのようにすればクライアント毎の値を保持できるかは次回のJSPを含めたWebアプリケーションの作り方で説明します。スレッドが値を保持できないことは悪いことではなく、意図して設計されていることに注意してください。冒頭の説明では、Servletにリクエストが届くたびにスレッドが生成されるようなことを書きましたが、実際にはスレッドプールと呼ばれる、あらかじめ生成されたスレッド群の中から、クライアントの要求に応えるスレッドをあてがう作りになっています。この場合、スレッドに値を保持しているとかえって面倒になることを想像することはたやすいでしょう。無色透明であるからこそ、スレッドをプールしておくことが可能になるのです。プーリングという考え方はJavaに慣れるにつれよく出てきます。効果的に使用すると非常に便利なものです。
スレッドがメモリを共有化する問題を回避するために、ServletがSingleThreadModelを実装すること薦めているサイトや書籍がありますが、根本的な問題解決にはならず、Servlet 2.4からはdeprecateになったことを考えると使用すべきではありません。









