Allegro!

JavaやIT系小ネタ、趣味の話まで。

Javaと愉快な仲間たち②Javaが住む世界。Webアプリケーションの仕組み

こんにちは、管理人のPaZooです。
皆さんご存知かと思いますが、JavaではWebアプリケーションの作成ができます。
しかし、恥ずかしながらそもそもJavaを使ったWebアプリケーションの仕組みを理解しておらず「???」の状態で今に至ります。

そんな時に、天から与えられしチャンスなのかスキルアップのための学習会がありWebアプリケーションについて調べる機会がありましたので、気になったところをまとめてみました。

※スライドにまとめていますので出来次第、いつものspeakerdeckにあげようと思います!

① WebクライアントとWebサーバー

まずはじめに、現在あなたがブラウザ上で見ているWebページはWebクライアントとWebサーバーというコンピュータにより実現されています。

f:id:PaZoo:20200329141737p:plain

Webクライアント:Webサーバーに保管してあるWebページにアクセスして利用できるもの。(例:GoogleChromeIEfirefoxなど)
Webサーバー:Webクライアントからのアクセスに応じるもの。
(例:Apacheやnginxなど)

 

②Webページを表示する流れ

では、どのようにWebページを表示させているのでしょうか。
例えば、あなたが「○○について調べたい!」と思った時に、インターネットを使って検索しますよね。
例えばGoogleであれば、Googleにアクセスして一瞬でWebページが表示されます。
では、WebクライアントとWebサーバー間でどんな処理が行われているか見てみましょう。

f:id:PaZoo:20200329152107p:plain

ここで送受信しているメッセージは、「HTTP(またはHTTPS)」というプロトコルでやりとりを行っています。

プロトコル

それでは、プロトコルについて説明します。
プロトコルとは、簡単にいうとコンピュータ同士がやりとりをする時に守らなくちゃいけないルールのようなものです。
WebクライアントとWebサーバーがやりとりをする際に、HTTPというプロトコル で送受信を行います。

そうすることで、クライアント側ではWebページを閲覧することができているのです。
しかし、単なるWebサーバーのみだと静的Webページを表示させることしか出来ず、動的なWebページを表示させるためには処理を実行させるためのソフトウェアが必要となります。

また、クライアントがWebサーバーに送るRequestメッセージとして

  • GET
  • POST

上記2種類の送信方法があり、この2つを上手く使い分けて動的なWebページを実現させていく必要があります。

それでは次に、静的コンテンツと動的コンテンツを比較してみましょう。

④静的コンテンツと動的コンテンツ

静的なWebページ

静的なWebページを表示する場合、WebクライアントがWebサーバーへ要求したWebページをそのまま応答としてWebクライアントへ返しています。
つまり、Webサーバーに予め保管してあるHTMLファイルをそのままクライアントに返すようなイメージ。

動的なWebページ

動的なWebページを表示する場合は、静的なWebページと何が違うのでしょうか。

それは、WebクライアントがWebサーバーへ要求し何らかの処理を行ってからWebページをWebクライアントへ返します。
つまり、Webサーバー側でプログラムが処理を行い、処理結果をもとにHTMLテキストを生成しているイメージです。

動的なページを作る上では、何らかの処理(プログラム)が必要で、その処理を実行させるためにプログラムを実行するソフトウェアが必要となります。

この何らかの処理(プログラム)というのを、プログラミング言語で実装していくことになります。

 ⑤動的なWebページを表示する流れ

Webサーバー内でアプリケーションを実行する場合

例としてWebページをPHPで実装した場合をイメージしてください。

WebサーバーにはPHPファイルを実行するモジュールがありません。
そのため、PHP実行用モジュールをWebサーバーに組み込んでWebサーバーを拡張させます。

WebサーバーがApacheを使用している場合は、PHP実行用モジュールを組み込んでPHPスクリプトを実行します。つまり、下記のような流れになります。

  1. WebクライアントがWebサーバーにRequestメッセージを送信
  2. Requestメッセージをもとに、Webサーバーに組み込まれたモジュールでアプリケーションを実行
  3. 実行されたアプリケーションがHTMLテキストを生成
  4. WebサーバーがWebクライアントにResponseメッセージを送信しWebページが表示

f:id:PaZoo:20200329154346p:plain

アプリケーションサーバーでアプリケーションを実行

では次に、WebページをJavaで実装する場合はどうなるかみていきましょう。
WebページをJavaで実装する場合、アプリケーションサーバーを用意します。
アプリケーションサーバーはアプリケーションを実行するためのソフトウェアです。
Javaアプリケーションサーバーで代表的な例として、TomcatやJettyなどがあります。
注意点として、アプリケーションサーバーはWebサーバーとは別物なので簡単にやりとりは出来ません。
そこで、Webサーバーとアプリケーションサーバー間もやりとりをできるように何らかのプロトコルが必要になります。

WebサーバーをApacheアプリケーションサーバーをTomcatとした場合を説明すると、Apacheにはmod_jkと呼ばれる連携用モジュールが提供されています。これをApache拡張機能として組み込みます。

そして、連携用モジュールmod_jkがajp13というプロトコルを使用することでWebサーバーとアプリケーションサーバー間でのやりとりを実現させています。

ちなみにアプリケーションサーバーで紹介したTomcatは、簡易的なWebサーバーを持っているため連携しなくても動的なWebページを表示出来ます。

これは開発をスムーズに行えるよう、簡易的なWebサーバー機能が「おまけ」としてついています。
しかし、あくまでもおまけなので、多くの人が利用するような本番環境では大量のアクセスには耐えきれません。
APサーバーにあるWebサーバー機能はあくまでも補助機能なものと理解しておきましょう。

つまり、アプリケーションサーバーでアプリケーションを実行する流れは下記の通りです。

  1. WebクライアントがWebサーバーへHTTPプロトコルでRequestメッセージを送信
  2. Webサーバーがアプリケーションサーバー(Tomcat)へajp13プロトコルでRequestメッセージを送信
  3. Requestメッセージをもとに、アプリケーションサーバーがアプリケーションを実行
  4. 実行されたアプリケーションがHTMLテキストを生成
  5. アプリケーションサーバーがWebサーバーへajp13プロトコルでResponseメッセージを送信
  6. WebサーバーがWebクライアントへHTTPプロトコルでResponseメッセージを送信し、Webページが表示される

 

 

f:id:PaZoo:20200329160220p:plain

 ⑥サーブレット(Servlet)/JSP

サーブレット(Servlet)とは

JavaでWebアプリケーションを作る際、多くの場合はサーバーソフトウェアとして「Servletコンテナ」を使います。

Servletコンテナは自分で作るものではなく、既に開発され配布されているソフトウェアを使います。

開発者はServletコンテナ上で動作するプログラムを開発します。

サーブレットの利点

Webアプリケーションは「手軽に作れる」というイメージがあるかもしれませんが、Webサーバー機能が必要になります。

新しいWebアプリケーションを作る時に、Webサーバー部分を毎回作っていては時間がかかってしまいますよね。
また、そもそもWebサーバーを開発するには高度な知識と技術が必要になります。

そこで、Webサーバー部分は製品を使うのが主流です。
Webサーバーの仕様に合わせたプログラムを書くことでWebアプリケーションを作成します。
こうすることで、難しい部分を再開発することなく手軽にWebアプリケーションを作ることができるというわけです。

Javaにおいては、

という関係になっています。

ちなみにサーブレットTomcatなどのアプリケーションサーバーによって実行されます。

JSPとは

Servletが出てきたからには切り離せないのが「JSP(Java Server Pages)」です。JSPServletの弱点を補うとても大事な役割を持っています。

実は、ServletプログラムはJavaのプログラムそのものです。
ですので、データベースアクセスや計算処理のようなロジックを書くのには適していますがHTMLを書くのにはとても不向きです。

そこでJSPは、HTMLの中にJavaプログラムが埋め込めるようになっていて必要に応じてServletからJSPに処理を移せるようになっています。

役割分担としては

  •  Servletの役割:データベースや計算処理のようなロジックを書き、JSPにデータを渡しつつ呼び出す
  • JSPの役割Servletからデータを受け取り、HTMLに動的に出力する

サーブレットJSPについて説明しましたが、機能不足になりがちなので近年ではフレームワークを導入するのが一般的になってきています。フレームワークについては、下記の記事をご参考ください。

pazoo.hatenablog.com

 

サーブレットJSPにてどんな役割かを簡単に紹介しましたが、処理担当のサーブレットと表示担当のJSPで役割を分けることで開発しやすくなります。

 しかし、何らかのデータ保存や管理をしながらWebアプリケーションを行いたい場合は単にJSPサーブレットを分けるだけでは効率良く開発は出来ません。

また大量のデータを保存・管理することができるサーバーが必要となってきます。そんな時に役に立つのが、データベースサーバーです。

MySQLOracle DataBase 、SQLserverなどが有名なデータベースサーバーソフトウェアです。

このようなデータベースサーバーを用いることでWebアプリケーションを通じて大量のデータを管理することが可能となります。

そして、大量のデータベースを扱ってWebアプリケーションを開発する場合、MVCモデルという開発手法を用いることでより大規模な開発を効率よく行うことが出来ます。

 

MVCモデル

MVCモデルとは、アプリケーションソフトウェアをModel、View、Controller の3つの役割に分けて開発していく手法です。簡単に説明していきます。

Model

モデルはアプリケーションの処理を担当します。

例えば、データの管理やデータベースへのアクセスやメソッドの管理について行います。コントローラーからの指示により処理を実行します。一般的なJavaファイルがモデルにあたります。 

View

ビューは、アプリケーションの表示を担当します。コントローラーから出力結果を渡されます。HTML形式に書かれているJSPファイルがビューにあたります。

Controller

コントローラーは、ビューからの情報入力を受け、モデルを呼び出し、ビューへの結果への出力を担当します。

つまり、一つのコントローラーにビューに対する処理や特定の処理の流れが書かれています。サーブレットクラスがコントローラーにあたります。

MVCモデルの流れ

MVCモデルの流れは下記のイメージです。

  1. クライアントがサーバーへRequestメッセージを送信
  2. アプリケーション内のControllerがRequestメッセージをもとに実行され、Modelの処理を呼び出し
  3. Controllerから呼び出されたModelがDBへアクセスもしくは処理実行
  4. Modelが処理結果をもとにControllerがViewへの出力指示(HTMLテキストの生成)
  5. サーバーがクライアントへResponseメッセージを送信し、Webページが表

 

f:id:PaZoo:20200329171832p:plain

これがMVCモデルの簡単な流れですが、MVC2やMVVMなど様々な種類があり開発するアプリケーションによって手法が変わりますのでご注意ください。

 

⑧GETとPOST

それでは次に、動的なWebページのように表示内容をどのように変更しているかみていきましょう。

Webページの流れで見たように、WebクライアントはWebサーバーへ情報を送る方法として「Requestメッセージを送信すること」しか出来ません。

つまり、Webページの表示内容を変更させるにはRequestメッセージにパラメータを持たせて送信する必要があります。

そこで、Requestメッセージの送信方法として2種類の送信方法が存在します。それが、「GET」と「POST」です。

それぞれの違いについて、見ていきましょう。

GET

GETという送信方法を用いた場合、送信したパラメータはURLに組み込まれて、Webサーバーに届きます。
この場合のinputTextはキーで、入力した値はそのキーに対する値となります。

POST

POSTという送信方法を用いた場合、送信したパラメータをURLに組み込まずにRequestメッセージ内に組み込まれてWebサーバーに届きます。

 

GETとPOSTの使い分け

GETで送信する場合は、あとでページを見たいという時にブックマークしたりできるので再度簡単にアクセスすることが出来ます。

逆に、POSTは人に見られてはいけない内容を送信してアクセスする場合やデータベースを書き換えたりする場合に使用されます。2つの違いを簡単にまとめてみました。

違い GETリクエス POSTリクエス
利用するメソッド GET POST
パラメータの格納場所 URL メッセージボディ
セキュリティ 低い 比較的高い
パラメータの長さ 古いソフトウェアでは255文字以内 制限なし
パラメータの保存・再現 しやすい しにくい

 

JavaによるWebアプリケーションの全体像

以上を踏まえ、JavaによるWebアプリケーションの全体の仕組みは以下のようになります。

f:id:PaZoo:20200329173756p:plain



クライアントサイドとしてはもちろん、Webクライアントが存在しサーバーサイドにはWebサーバーやアプリケーションサーバー、データベースサーバーがあります。

サーバーを構築する場合、Webサーバー、アプリケーションサーバー、データベースサーバーなどをインストールし、それぞれ実行することでWebアプリケーションにアクセスした際、正常に動作することが出来ます。

また、新しくアプリケーションを追加する場合もアプリケーションサーバーをインストールし実行すれば拡張させていくことが可能です。

まとめ

今回参考にした本書は、

  • 小森 裕介 (2010/4/10)『「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか』技術評論社
  • 山本 陽平(2010/4/8)『Webを支える技術 -HTTP、URI、HTML、そしてREST』WEB+DB PRESS plus

上記の本書です。初学者やある程度経験はあるがWebの知識に自信がない方はぜひご一読してみてください。とてもオススメです〜!

次回はTomcatについて書けたらいいな〜〜;;