ステップバイステップで学ぶ

初めてのWebアプリケーション・サーバ



本稿は初めてWebアプリケーション・サーバを学ぶ読者のために、無償で入手できる「WebSphere V3.5開発者キットCD」を使ってWebSphereによるWebアプリケーション開発を学ぶ基礎講座です。(編集局)
小野真樹
日本アイ・ビー・エム
2001/8/21

第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モデルを作っていきます。


3.MVCモデルとWebSphere Studioウィザード

初めてのWebアプリケーション・サーバ(第5回)
1.MVCモデルを使う理由
2.WebSphereとMVCモデル
  3.MVCモデルとWebSphere Studioウィザード
  4.サーブレット構成ファイル
5.データ・ソースの登録
6.アプリケーション・サーバのサポートレベル

7.ServletModelとJSPModel

8.MarkupLanguage(マークアップ言語)


連載記事一覧




Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間