Servletの雛形が自動生成される。
クラス定義の前行にある @WebServlet("/TestServlet") アノテーションにより、
クライアントからのリクエストURLとServletクラスの対応付けが行われる。
(古いバージョンでは、すべてのServletとURLの対応をWEB-INF/web.xml内にXML形式で記述していた。)
クライアントが
http://localhost:8080/WebTestApplication/TestServlet
にアクセスした場合、URLに含まれる"/TestServlet"という文字列が@WebServletアノテーションの引数に一致するため、
TestServletクラスの処理が呼び出される。
クライアントからのアクセス時、通常はdoGet()が呼び出される。この中に、リクエストに応じたJavaの処理を呼び出すコードを記述する。
doPost()は、入力フォームやスクリプトなどで、クライアントからデータが送信されてくる際に使われることが多い。
doPut(),doDelete(),doOption()なども用意されているが、通常のWebアプリケーションではあまり使用されない。(RESTfulAPIを実装する場合や、HTTP上でファイル共有を行うWebDAVなどで使用される)
クライアントからのリクエストに関する情報は引数requestに入っている。
引数responseに対し情報を書き込むと、その内容がクライアントに送り返され、表示される。
Servletをサーバ上で実行し、表示を確認してみる。
HTML文字列をクライアントに送り返すように、doGet()メソッドの内容を作成する。
Servletが出力したHTML文字列がブラウザに送信され、次のように表示される。(ブラウザのメニューの「ソースの表示」で、どのような内容がサーバから送られてきたか確認するとよい)
Javaの処理はServlet内で行うほうが良いが、長いHTML文字列をServlet内で構築するのは困難である。
結果のHTMLの作成はJSP(またはその他のテンプレート)を利用したほうが良い。
それを実現するためには、Servletの処理の最後に、別途用意した表示用JSPへのForwardを行う。
Servletで行われた処理の結果をJSPが受け取り、HTML文書の一部として埋め込み、クライアントに表示される。
TestServlet.doGet() の内容を以下のように変更する。
この例ではクライアントからの入力パラメータを受け取り、それを加工する処理を行っている(ユーザからの入力を表すParameterと、Servletで値を生成しJSPに渡す際に使用されるAttributeの違いに注意)。
表示用 TestView.jsp を新規に作成する。
ここで、JSPはあくまでも出力されるHTMLのテンプレート(ひな形)であり、JSP内に表示処理以外のロジックを記述してはならない。
クライアントからサーバにパラメータを渡す場合、URLの後ろに"?パラメータ名1=値1&パラメータ名2=値2"のように追加する(GETの場合)。
今回は http://localhost:8080/WebTestApplication/TestServlet?NAME=SOFMATE&AGE=30 としてアクセスしてみる。
クライアントが必須パラメータが渡さなかった場合、エラーコードを返す。(が、再度入力画面に戻るような設計のほうが親切である)
http://localhost:8080/WebTestApplication/TestServlet としてパラメータなしでアクセスしてみる。
入力フォームを作成する。新規でTestForm.jspを作成し、以下の様に内容を記述する。
action="TestServlet"(相対URL)となっているので、フォームを送信すると、入力された内容をパラメータとし、TestServletが呼び出される。
method="post"としているため、ServletのdoPost()が呼び出されることになる。(getにしても動作するが、フォームの入力内容がURL欄に表示されてしまう)
実行すると以下のような入力フォームが表示される。
フォーム内のinput要素のtype="number"による文字種制限や、requiredによる入力必須チェックは、古いブラウザだと対応していないことがある。
送信をクリックするとTestServletに処理が移り、渡されたパラメータが正しく表示される。