ステップバイステップで学ぶ
初めてのWebアプリケーション・サーバ
本稿は初めてWebアプリケーション・サーバを学ぶ読者のために、無償で入手できる「WebSphere
V3.5開発者キットCD」を使ってWebSphereによるWebアプリケーション開発を学ぶ基礎講座です。(編集局)
|
|
第5回 MVCモデルでのWebアプリケーション作成
|
|
1.MVCモデルを使う理由 |
今回はMVCモデルに従ったWebアプリケーションのひな型を作っていきます。MVCモデルとは、オブジェクト指向プログラミング言語「Smalltalk」に使用されていたアプリケーション・アーキテクチャで、アプリケーションをModel(ロジック)、View(プレゼンテーション)、Controller(通信、制御)の3つの部分に分割してそれぞれを独立して開発していくものです。
|
図1 MVCモデル |
WebSphereではMVCモデルをWebアプリケーションに実装するため、Model、View、Controllerに、JavaBeansやEnterprise
JavaBeans、Servlet、JSP、Appletなどの独立したコンポーネントを配置してMVCの独立性を保ちつつ、100%ピュアJavaのWebアプリケーションを実現しています。それでは、MVCの各部分について説明していきましょう。
まずModelですが、ここにはJavaのコンポーネント技術であるJavaBeansが採用されています。WebアプリケーションはWebサーバ上で動作することを目的として作られていますが、JavaBeansにはアプリケーション・ロジックのみを記述してHTTPの通信部分や画面出力の部分を含めないように設計し、独立性を高めます。そうすることで、仮にViewとControllerにWeb以外の技術が使われていたとしてもModelの部分は再利用することができるようにします。また、最近ではRoseなどのモデリングツールを利用して設計したオブジェクトをそのままVisualAge
for Javaに取り込んでJavaオブジェクト化したり、逆にJavaオブジェクトを設計図に戻したりすることもできるようになってきました。ですから、今後はJavaBeansによるロジックの開発が主流となってくるでしょう。
次に、Viewですが、ここにはJavaServer Pages(JSP)を使います。JSPはHTMLファイルの中にJavaのソース・コードをそのまま書けるようにしたもので、従来のWebデザイナーがHTMLタグで開発してきたWebページとまったく同じものです。また、難しいプログラミングが必要とされるときは、プログラマーがあとからコードを埋め込んでいくこともできます。JSPの最大のメリットはWebSphere
StudioのPage Designerのようなツールを使って開発できることで、デザインを重視したWebアプリケーションの生産性が飛躍的に向上することです。
|
図2 Page Designer |
Page Designerは、JavaBeansを利用してダイナミックな表示を行うJSPの開発に最適化されたツールです。ですからPage
Designerを使ってJSPを開発するときは、ダイナミックな部分はすべてJavaBeansで実現するようにしてください。
最後に、Controllerについてです。ControllerにはServlet(サーブレット)を使います。サーブレットはもともとHTTPで通信するためのJavaのAPIセットとして作られたもので、Webアプリケーションサーバに必要とされる基本機能がすべてそろっています。ですから、ユーザーが新たにHTTP通信のための機能を開発する必要がありません。さらに、サーブレットはWebサーバのトラフィックを考慮した処理の流れをもっています。
|
図3 サーブレットの処理の流れ |
サーブレットは最初のHTTPリクエストによって初期化され、それ以降はメモリ上に常駐し、マルチスレッドでサービス処理のみを実行するようになります。そして、HTTPリクエストが来なくなると消滅処理が実行され、メモリ上から消滅します。ですから、たとえばデータベースとの接続を行う場合、初期化処理でデータベースへの接続を記述し、サービス処理ではSQLのみを実行して、最後の消滅処理にデータベースの切断を記述することができます。そうすることで、CGIのように毎回のリクエストに対して接続、切断を繰り返す必要がなくなり、大量のHTTPリクエストに対して最適な処理を行うことができます。
実は、JSPとサーブレットは技術的には同じもので、違いはその記述方法にあります。サーブレットは処理の流れを考えながらプログラミングできるのが特徴で、HTMLの出力には、
out.print("<img
src=\"/img/" + img.getName() + "\">");
|
のようにprint文を使用することができます。一方、JSPはデザインを中心にプログラミングできるのが特徴で、
<img src="/img/<%=
img.getName() %>"> |
のようにHTMLタグの中にJSPタグを埋め込んで画面のデザインを考えやすくすることができます。両者を比較すると、サーブレットはControllerに、JSPはViewに適したAPIであることがわかります。
サーブレットの例 |
//-------------------------------------------------------------
// Copyright 19xx Your Company
//
// Owner: Your Name
//
// Class: JavaServlet
//-------------------------------------------------------------
// Uncomment the next line if you want your Servlet in a package.
// package com.yourCompany.yourApp;
/**
* JavaDoc comment for this servlet
*/
public class JavaServlet extends javax.servlet.http.HttpServlet
{
/************************************************************
* Returns a string that contains information about the
servlet
*
* @return The servlet information
*/
public java.lang.String getServletInfo()
{
return "some useful information about
the servlet goes here";
}
/************************************************************
* Process incoming HTTP GET requests
*
* @param request Object that encapsulates the request
to the servlet
* @param response Object that encapsulates the response
from the servlet
*/
public void doGet(javax.servlet.http.HttpServletRequest
request, javax.servlet.http.HttpServletResponse response)
{
performTask(request,response);
}
/************************************************************
* Process incoming HTTP POST requests
*
* @param request Object that encapsulates the request
to the servlet
* @param response Object that encapsulates the response
from the servlet
*/
public void doPost(javax.servlet.http.HttpServletRequest
request, javax.servlet.http.HttpServletResponse response)
{
performTask(request,response);
}
/************************************************************
* Process incoming requests for information
*
* @param request Object that encapsulates the request
to the servlet
* @param response Object that encapsulates the response
from the servlet
*/
public void performTask(javax.servlet.http.HttpServletRequest
request, javax.servlet.http.HttpServletResponse response)
{
response.setContentType("text/plain");
try
{
// type the code for your useful
task here
javax.servlet.ServletOutputStream
out = response.getOutputStream();
out.println("Hello from the
World Wide Web.");
out.close();
}
catch (Exception e)
{
// This will show up in logs when
// ncf.jvm.stdoutlog.enabled=true
in jvm.properties
System.out.println("Sample
Servlet failed: ");
e.printStackTrace();
}
}
}
|
JSPの例 |
<!--
Sample JSP file -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 //EN">
<HTML>
<HEAD>
<TITLE>
Put Your Title Here
</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
Put your text here
</BODY>
</HTML> |
|
2.WebSphereとMVCモデル |
WebアプリケーションはどのようにしてMVCモデルを実装しているのでしょう。ここでは、銀行の残高照会を例にとり、WebSphere Application
Server(WAS)上で実行されるMVCモデルを説明します。
|
図4 MVCモデルの実装 |
● |
ブラウザからHTTPリクエストを送信 |
● |
サーブレットの実行 |
|
|
JavaBeanオブジェクトの生成 |
|
|
JavaBeanオブジェクトの参照をHTTPリクエストに追加 |
|
|
JSPの呼び出し |
● |
JSPの実行 |
|
|
HTTPリクエストからJavaBeanオブジェクトの参照を取得 |
|
|
JavaBeanオブジェクトのプロパティの表示 |
|
|
HTMLをブラウザに返信 |
● |
ブラウザが結果を表示 |
まず、ブラウザで「残高照会」のリンクをクリックします。すると、ブラウザからGETリクエストがWebサーバに送られ、WebサーバはそのリクエストをWASに渡します。WASではGETリクエストに対応したサーブレットが呼び出されdoGet()メソッドが実行されます。doGet()メソッドでは、残高を照会するためのJavaBeanオブジェクトの生成とそのオブジェクトの照会メソッド(select())を実行します。生成されたJavaBeanオブジェクトはメモリ上にあり、残高の照会結果もメモリ上に格納されています。サーブレットはそのJavaBeanオブジェクトの参照(アドレス)をGETリクエストに付加します。最後にJSPを呼び出し、JSPはサーブレットからGETリクエストを受け取って、メモリ上のJavaBeanオブジェクトのプロパティを参照してHTMLの中に残高照会の結果を埋めてブラウザにHTTPレスポンスを返します。ブラウザはその結果を表示します。
このようにMVCモデルで作られたWebアプリケーションはWAS上でHTTPリクエストを通じて連携し、サーブレットがその処理の流れを制御しているのです。次はいよいよこのMVCモデルを作っていきます。