はじめに
新入社員研修において、Javaを用いたWebアプリケーションの開発を行ったので、そこで学んだことを簡単にまとめていきたいと思います。
間違い等も多くあると思いますので、ご指摘してくださると嬉しいです。
Webアプリケーションのサーバーサイドにおける処理の流れを中心に取り上げていきます。想定しているサンプルとしては、簡単な1件検索のサンプルになります。
サーバ間のやりとり
動的なWebページを実装する場合のクライアントとサーバー間における動的な情報のやりとりについて簡単に説明します。
まず、クライアントからWebサーバーにリクエストを送信します。このクライアントとWebサーバー間の送受信はHTTPプロトコルによって行われております。動的なWebページを表示する場合、Webサーバー側で何らかの処理(プログラム)を行う必要があります。その処理がWebアプリケーションであり、それをJavaやPHPなどのサーバーサイド言語で実装していくことになります。
今回はJavaでの実装を想定としています。
そのアプリケーションを実行するためには、Webサーバーとは別にアプリケーションサーバーを用意する必要があります。
( JavaのアプリケーションサーバーではTomcatが有名です。)
アプリケーションサーバーも、クライアントとWebサーバーの送受信と同様に、Webアプリケーションと送受信を行うには、あるプロトコルが必要になります。上記のようにアプリケーションサーバーにはTomcatを使用して、WebサーバーにはApatchを使用する場合、Apatchにmod_jkという連携用モジュールを拡張機能として実装します。
そのmod_jkのajp13というプロトコルを使用してアプリケーションサーバーとWebサーバーは送受信を行うことができます。
Tomcatは簡易的なWebサーバーを保有しているため、特に連携しなくても送受信は可能です。
Webアプリケーションの構造
では、そのサーバーサイドでどのようにWebアプリケーションが処理されているのかを見ていきます。
WebアプリケーションはMVCアーキテクチャをモデルとして設計されており、大きく分けて次の3つの階層に分けて設計されています。
・プレゼンテーション層
・ビジネス層
・インテグレーション層
それぞれの層に含まれるプログラムの役割は明確に分けられています。
次に、クライアントからのリクエスト情報を元にどのように処理がなされているのかを記します。
サーバーサイドにおけるアプリケーションの処理の流れ

リクエスト情報は、まずFrontControllerに渡されます。このFrontControllerはサーブレットであり、Webアプリケーションの処理を一元管理しています。
そのFrontControllerはリクエスト情報に応じて処理を振り分けます。(switch-case文が有効)
その中でActionを呼び出し、そのActionが入力値のチェックやセッション管理(セッションオブジェクトの生成や解放)、ビジネス層の業務Logicへの処理依頼を行います。
(余談ですが、セッション管理ではサーバリソースを有効に活用するために一定時間アクセスが途絶えたらセッションを無効化するなど、出来るだけ早く解放するほうが良いそうです)
そして、肝となる業務Logicでは業務処理を制御します。
業務処理に必要な情報は、データベースへのアクセスによって取得します。
データベースへアクセスするためにはConnectionManagerを用います。具体的には、ConnectionManagerのgetConnectionメソッドを用いてConnectionオブジェクト(データベースへの接続)を取得します。
そのConnectionオブジェクトをDAOのコンストラクタの引数に渡して、DAOオブジェクトを生成します。
そして、DAOのメソッドを呼び出し、Entityを用いて戻り値を受け取ります。
DAO内の戻り値の設定処理方法(1件検索の場合)
while(res.next())で検索結果がある場合に{}内の処理を行う。{}内ではres.get~を用いて戻り値を設定する
業務LogicがEntityのオブジェクトを受けとった後、定義したオブジェクトに格納し、戻り値に設定します。
Actionにおいて業務Logicを生成し、メソッドを呼び出します。その結果をスコープなどに設定します。
戻り値としては遷移ページ先を設定します。
FrontControllerにおいてActionから遷移ページ先を受け取り、フォワードします。
プレゼンテーション層におけるアプリケーションの動作
サーブレットとJSP
Webページを表示するHTMLファイルを生成するためにはサーブレットというプログラムが必要になります。サーブレットはTomcatなどのWebアプリケーションサーバーによって実行されます。
このサーブレット単体でもWebページは表示させることは可能なのですが、プログラムの記述が煩雑になってしまい、綺麗なプログラムではなくなってしまうので、HTMLにJavaコードを埋め込んだJSPにWebページの表示を依頼することになります。
また、Webページを遷移させていくためには、クライアントが送信したリクエストにパラメータを付加させる必要があります。
そのリクエストの送信方法としてはGETとPOSTの二種類があります。
GETとPOST
GETとPOSTのどちらの方法でも、任意の値をパラメータとして設定する必要があります。
GETオペレーションでは、パラメータに設定した任意の値がURLに組み込まれる形でWebサーバーに送信されます。
ゆえに、Webページを再度閲覧したいという場合は簡単にアクセスすることができます。
つまり、ブックマークはパラメータごとに保存がされているという状況になります。
デメリットとしてはパラメータの長さに制限があることや、上記のようにセキュリティ面が低いことが挙げられます。
一方、POSTオペレーションはパラメータに設定した任意の値はURLに組み込まれず、リクエストのメッセージボディに格納される形でWebサーバーに送信されます。
ゆえに、セキュリティ面ではGETオペレーションより高いです。また、パラメータの長さにも制限がなく、大量のデータを送信することができます。
アプリケーションでの処理ではユーザー定義サーブレットで、HttpServletにおいて定義されているdoGetメソッドとdoPostメソッドをオーバーライドする形で記述します。そのことによりHTTPの機能を使用することができます。
まとめ
今回はサーバーサイドにおけるWebアプリケーションの動作についてとプレゼンテーション層におけるアプリケーションの動作について簡単に解説しました。
これ以上は長くなってしまうので、ビジネス層とインテグレーション層に関しては別記事で解説できたらと思います。