|
サーバーサイドでJavaを効率的に利用するために策定されたコンポーネント仕様のことをサーブレット(Servlet)と呼びます。当然サーブレットの主機能はリクエストの処理とHTMLの生成にあります。またサーブレットの一種でJSPと呼ばれるHTMLの生成に特化した環境(スクリプト、ソリューションとも言える)も存在します。これらサーブレットは以下のようJava言語で記述されたコンテナを含むアプリケーションサーバー(J2EEサーバー)上に配置され稼動します。
サーブレットはサーブレットコンテナ(アプリケーションサーバー)に配置することで、サーバープログラムを作る上で必要なHTTPの解釈やURLのマッピングヘッダの解析などを気にかける必要はありません。つまり全てのサーバーサイドプログラムに共通して必要な手順やロジックの実装はコンテナが行い、各画面やアプリケーション独特のロジックを作るだけでよいのです。ではこのアプリケーションサーバにはどのような種類があるのでしょうか?有名なところではWebLogic(BEA)、WebSphereAS(IBM)、hpAS(HP)、SunONE(SunMicroSystems)など他にも多数の商用J2EE対応サーバーが存在します。これらは基本的には有償で、運用にも高度な知識が必要とされるため初心者には向きません。今回の学習のようにサーブレットコンテナだけでよければ無償であり、非常に高速に動作するJakartaプロジェクトのTomcatを利用するとよいでしょう。また同様にEJBコンテナも無償で利用したいと思う人はSunのJ2EE
SDK(注:実用不可、開発のみ)やJBOSSコンテナなどを検討してください。またJakarta TomcatなどはJ2EEサーバーでこそありませんが、J2EEを構成するServletAPIのリファレンス実装です。また、JBOSSなども近くJ2EEの互換性ロゴを取得するとの話です。
では具体的なサーブレットについて話をしましょう。下記にサーブレットによるHelloWorldを記述します。これはコンテナに配置されるとHelloWorldのHTMLを表示するサーブレットです。
|
例:サーブレットによるHelloWorld
|
| |
|
|
| |
import
java.io.*;
//サーブレットAPIのインポート
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {//抽象クラスであるHttpServletを継承
/**
HTTP命令のGETに対応するメソッドで、スーパークラスのdoGetを
オーバーライドしています。WEBサーバーに対してGETによって要
求があったときにdoGetが呼ばれます。
@param request HTTPリクエストされたときの情報等がカプセル化されたオブジェクト
@param response 一般的にブラウザ(リクエスト元)に対して応答する情報をカプセル化したオブジェクト
@exception ServletException サーブレット内部で発生した問題全般
@exception IOException Stream系の問題が発生したときなど
*/
public void doGet(HttpServletRequest request, HttpServletResponse
response)
throws IOException, ServletException
{
response.setContentType("text/html");//配信する情報のコンテンツタイプを指定
PrintWriter out = response.getWriter();//レスポンスに対するWriterを取得
//HTMLを書き出し
out.println("<html>");
out.println("<body>");
out.println("<head>");
out.println("<title>Hello World!</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello World!</h1>");
out.println("</body>");
out.println("</html>");
}
}
|
|
| |
|
|
|
まずインポート文を見て下さい。サーブレット関連のクラスを利用するためには、必ずjavax.servletパッケージとjavax.servlet.httpパッケージを取り込む必要があります。これらをのパッケージを総称してServletAPIと呼び、ServletAPIの実装クラスはサーブレットコンテナによって違います。クラス宣言の部分を見て下さいHelloWorldクラスはHttpServletを継承しています。このHttpServletクラスは下記のようなHTTPの命令に対応するそれぞれのメソッドを持っており、開発者はそれらのメソッドをオーバーライドすることによってサーブレットを作成します。通常ブラウザからURLを表示するさいのリクエストメソッドは「GET」で、送信ボタンなどによる情報の送信は「POST」となります。現在の一般的なWEBアプリケーションにおいて利用するのは、この2つのみです。今回はdoGetをオーバーライドしているのでGETリクエストの時に反応します。
| 表:HTTPプロトコルで定義されている命令 |
|
リクエスト・メソッド
|
定義されている振る舞い
|
| GET |
ファイルの要求や検索を要求 |
| HEAD |
ファイル属性などの情報を要求 |
| POST |
任意のデータをサーバーへ送る。検索などに利用 |
| DELETE |
ファイルなどを削除 |
| OPTION |
サポートしている機能を紹介 |
| PUT |
ファイルなどを更新 |
| TRACE |
要求パケット通過過程をトレース |
|
引数として渡されているHttpServletRequestとHttpServletResponseは、それぞれクライアントから来た要求とクライアントへ返す応答を表すクラスです。つまりブラウザから送信された情報はHttpServletRequestから取り出すことができ、ブラウザに返す情報(HTMLなど)はHttpServletResponseに書き出してやればよいと言うことです。今回はリクエストから取り出すべき情報はないので、レスポンスに対して配信するコンテンツのタイプとHTMLを書き出すためのWriterを取得しています。そしてコンパイルし、適切な場所に配置し、ブラウザーから閲覧すると「HelloWorld」という文字が見えるはずです。
このようにサーブレットではブラウザとの通信やHTTP要求の解析などの複雑な処理を行う必要はありません。それらの面倒な処理のほとんどはサーブレットコンテナが行い、サーブレットはオブジェクト化された要求と応答を利用して固有の処理を記述するだけでよいのです。つまりサーブレットコンテナ内においてサーブレットは下図のようにモジュール化された形で扱われています。
|