まずは手始めに 「HelloServlet」 と表示するプログラムを作成してみましょう!
そこそこの手順を踏みますが、 覚えてしまえば簡単です!
Step1: プロジェクトの作成
メニューの《ファイル》 《新規》 《その他》 を選択します。
《web》→《動的webプロジェクト》 を選択します。
プロジェクト名を 「HelloServlet」 にして 「次へ」ボタンを押します。
次は、デフォルトのまま次へボタンをクリックします。
「web.xml デプロイメント記述子の生成」にチェックを入れて完了を押しましょう。
Step2: パッケージの作成
今までもパッケージを作成していましたが、 作る場所が少し変わります。
《HelloServlet》 《src》 で右クリックをします。
《新規》→《パッケージ》 を選択します。
パッケージ名は「helloPackage」としましょう。
Step3: クラス (Javaファイル) の作成
これは今までもやってましたね。
「HelloServlet」 クラスを作成しましょう。
Step4: HelloServlet.java [HelloServlet] と表示するロジックを記述

Step5: web.xmlの編集
このままでは入力されたURLと実行されるファイルとの紐付けができないので、紐づけるための処理を書いていきます。
(HelloServlet) → (webapp) → WEB-INF)) → (web.xml))
の一番下に、下記のロジックを追記しましょう。
(※「ここから〜ここまで」の内容を追記してください。

Step6: 実行
それでは実行してみましょう!
動作確認を行います。
プロジェクトを右クリックし、「実行」→「サーバーで実行」を選択します。
既存のサーバーから、 作成したサーバーを選択します。
実行したいリソースが構成済みに入っていることを確認します。
内部WebブラウザビューもしくはChormeが自動で開きます。
内部Webブラウザビュー
Chorme
URLの末にURLのパターン名(ここでは 「 sample 」)を入力し、 (http://localhost:8080/HelloServlet/sample)とします。
内部Webブラウザビュー >
Chorme
サーバーが起動している間は、Eclipseの内部Webブラウザでないブラウザでも表示可能です。
(ChromeやIE(Internet Explorer) Firefox などで開いてみましょう! )
サーブレットプログラムもクラスライブラリを利用します。
今回のクラスは HttpServletクラスです。
今までと違うのは HttpServletクラスを継承し、必ず「doxxx()」メソッドをオーバーライドして利用するところです。
「doxxx()」メソッドは、全部で7種類ありますが、Webサーバ(HTTPサーバ)とやり取りするものが
ブラウザの場合は、doGet() メソッドとdoPost() メソッドの2つのみです。
上記のプログラムの例では、 doGet()メソッドを使っています。
(extends しているHttpServletクラスのdoGet()メソッドをオーバーライドしています)
次に、 doGet のメソッドと、 中身の処理について簡単に見ていきます!
- 第1引数の HttpServletRequestインタフェースは、 HTTPリクエストに対応
- 第2引数の HttpServletResponseインタフェースは、 HTTPレスポンスに対応
■1行目: response.setContentType(“text/html; charset=Windows-31J”);
setContentType() メソッドでレスポンスのMIMEタイプを指定します。
この値は、そのままHTTPヘッダーの 「 Content-Type 」 の値として指定されます。
・Content-Type と MIMEタイプ
テキストや画像、オーディオファイルなど、拡張子だけでは転送先のブラウザ上で判別が難しい情報を伝えるための設になります。
”text/html; charset=Windows-31J” までが Content-Type としての扱いになります。
一部ですが、以下のような組み合わせになります。
などがよく見受けられます! (上記はほんの一部ですが、 記述形式はどれも同様です。)
また「charset=XXX 」の部分は、ここで指定された文字コードに変換されてページを表示します。
サンプルでは Windows-31J を指定していますが、日本語のページを表示する場合には、文字コードを 「Windows-31J」又は「EUCJP」 に指定する必要があります。
試しに 「~ (大文字の波線)」を utf-8 で出力してみると、「 ?」と表示されてしまいます。
(想定していない文字になったり、文字化けが発生したりした場合には、文字コードの設定を確認しましょう!
■2行目: PrintWriter out = response.getWriter();
responseより呼び出した getWriter() メソッドで、PrintWrtierクラスのインスタンス (out)を生成します。
■3行目: out.println(“<body> HelloServlet</body>”);
PrintWrtierクラスでは、print() や println() が利用できます。
今までの標準出力(コンソール)に表示する System.out.print() と同様の感覚で、PrintWrtierクラスのprint()メソッドやprintln()メソッドを扱うことができます。
今回の出力内容は <html> 内で頻出の <body> ですね。
web.xmlについて
・web.xml
Webアプリケーションに関する様々な設定をxml形式で定義します。
・アクセスされたURLに対して呼び出すクラス
・エラー時に実行する処理の指定
などの設定をします。
・配置箇所
web.xmlは「WEB-INF」 ディレクトリ直下に配置し、 Webアプリケーション毎に作成します。
(※「web.xml デプロイメント記述子の生成」にチェックして作成した場合は、 デフォルトで作成されます。)
・読み込みのタイミング
Webサーバ(HTTPサーバ) の起動時にWebアプリケーション毎にweb.xmlが読み込まれます。
・web.xmlの基本構造
「 XML宣言」、「DTD宣言」「本体」の順で構成されています。
【テンプレート】
web.xmlは、Webサーバの起動時に読み込まれ構文チェックが行われます。
正しく記述されてない場合は、「致命的エラー」 扱いとなりそのコンテナは動きません。
正しく記述されていれば、 どのような 「URL」 で、 どのサーブレットを動かすかという定義が 「本体」に必要となります。 (※サーブレットが上手く機能しない場合は、web.xmlの設定や書き方に間違いがないかチェックしましょう)
・<web-app> タグ
サーブレットの命名には 「任意の名前」を付与 (※日本語は付けられません )
・命名規則
<servlet>タグ内と <servlet-mapping> タグ内の2つで実施し、上記2つのタグにおけるサーブレットの命名は同一でなくてはなりません。
<servlet> タグには、 <servlet-class> タグがあり、動かしたいサーブレット名を記述します。
(パッケージ化されている場合は、helloPackage.HelloServlet のようにパッケージ込みのサーブレット名を記述します)
・<servlet-mapping> タグと <url-pattern> タグ
このタグ内に記述された文字列で、 ブラウザのURL (アドレス) などで指定した場合、先ほどの動かしたいサーブレットが動作する仕組みとなります。
上記 <servlet-mapping> における設定は、必須となり、この設定をサーブレットマッピングと呼びます。
初めのうちは数多くあるタグの組み合わせに慣れないかもしれませんが、何度も作成して練習しましょう!
マッピングは「sample」 などよりも、可読性とサーブレットの紐づけの親和性が高まるようなその機能に合った意味を持つ文言を記述するようにしましょう!
エラーが表示される場合
サーバー実行時にエラーが表示される場合があります。
前述で「致命的なエラー」のように表現していますが、具体的にどのような場合に発生するか見ていきましょう。
【web.xml: 記述ミスなし】
ユーザー情報を返すようなサーブレットと仮定しましょう。
上記の場合は、サーバーは正常に起動します。
しかし、記述ミスが存在する場合は、画像のようなエラーが表示され、 サーバーの起動に失敗してしまいます。
【web.xml: 記述ミスありその1】
【web.xml: 記述ミスありその2】
起動エラー
NG パターン
・servlet-name が合致しない
○ そもそも文字が異なる
○ 小文字と大文字で異なる
・url-pattern に記述ミス
○ アクセス先URIを記述しているが、 接頭の(スラッシュ) が漏れている
例に記述したuserinfo と userInfo ですが、パッと見なかなか気づけないかもしれません。
また、url-pattern もパスの記述ミスがあると同様のエラーダイアログが表示されます。
マッピングするサーブレット情報が1、 2つくらいならまだいいのですが、増えていくほどに探し当てるのは困難になります。
コンパイルエラーが出力されない分、 こういった細かなミスを探すのは骨が折れますので、記述内容はしっかり見直すように心がけましょう!
