連載
» 2004年02月13日 00時00分 公開

Strutsフレームワークの「枠組み」を学ぶStrutsを使うWebアプリケーション構築術(2)(1/2 ページ)

[山田祥寛,@IT]

 Strutsアプリケーションを理解する第一歩は、決して小難しいロジックやクラスライブラリの仕様を学ぶことではありません。Strutsフレームワークがどのように構成されており、どのファイルがどのように関連して1個のアプリケーションを形成しているか、すなわち、マクロ的な視点でファイル間の関連や分担を理解する点にこそあります。フレームワークの機能像をいかに理解するのか、それがポイントなのです。

 今回は、第1回「Strutsプログラミングの準備」で行った、環境構築の成否を確認するための簡単なアプリケーションを実際に動かしてみるなかで、Strutsを構成する各モジュールの役割を概観します。

 個々の記述にあまりとらわれないでください。今回の目標は、

  1. Strutsアプリケーションを自分の環境で実際に動かしてみること
  2. Strutsを構成するモジュールの機能と役割分担を知ること

 の2点だけです。

Strutsアプリケーションの流れを学ぶ

 Strutsアプリケーションでは「アクションサーブレット」が大切な役割を果たします。アクションサーブレットはコンフィグレーションファイル(struts-config.xml)への記述内容を参照して、画面間のデータの受け渡しやロジックの実行を制御するための、Strutsのコアエンジンともいうべきクラスです。あらかじめstruts.jarに含まれているので、開発者が自分でコーディングする必要はありません(アクションサーブレットを継承してサブクラスを作成することもありますが、本稿ではそこまでは考えないことにします)。

アクションサーブレットの役割 アクションサーブレットの役割

 つまり、開発者がStrutsアプリケーションを構築するに際して意識する必要があるのは、JSPファイル、アクションフォームBeans、アクションクラス、コンフィグレーションファイル、JavaBeansの5点であるということです。

 以下では、これらの点について、順に解説していくこととしましょう。

ユーザーインターフェイスを作成する(JSPファイル)

 まずはStrutsにおけるUI部分であるJSPファイルを作成してみましょう(注)。主にクライアントによる入力フォームの提供やバックエンドにおける処理結果の出力などを担当します。

注:Strutsは「サーブレット」ベースのフレームワークですが、ユーザーインターフェイスを実現する手段としてJSP(JavaServer Pages)を利用することは強制しません。VelocityやJSF(JavaServer Faces)など、そのほかのテンプレートエンジンを利用することも可能です。ただし、本稿では執筆現時点で最も普及度が高く、資料・参考文献としても充実しているJSPを採用することにします。

 JSPには宣言部やスクリプトレット、式構文(Expression)など、それ自身の中にビジネスロジックを記述するためのしくみが用意されていますが、ロジックとレイアウトの分離を目的とするStrutsでは極力、これらの要素は使用する“べきではありません”。ビジネスロジックは原則としてモデル(Model)であるJavaBeansに任せてしまうべきですし、繰り返し項目や選択表示のようなUIを制御するうえでどうしても必要な動的要素も、Strutsではカスタムタグライブラリ(「<html:〜」「<logic:〜」「<bean:〜」など)で補うのが通例です。

 Strutsアプリケーションを始めて最初のうちは、どうしても手なれたスクリプトレットや式構文に頼ってしまいがちですが、せっかくフレームワークを使うことで明確に機能を分担しようとしているのに、中途半端にスクリプトレットを混在させてしまっては、Strutsを利用する意味が半減してしまいます。スクリプトレットを使いたくなったら、まずはそれがカスタムタグで代替できないのか、JavaBeansなどに委ねられないのかを吟味するようにしてください。

 さて、以下のコードと実行画面を見てください。入力部分をつかさどるinput.jspと出力部をつかさどるoutput.jspです。input.jspで入力された名前を受けて、output.jspで「Hello, Mr./Ms.<名前>」という文字列を表示します。

 以下がコードです。

input.jsp
<%@ page contentType="text/html;charset=Shift_JIS" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<html:html>
  <head>
    <title>Strutsアプリケーションの基本</title>
  </head>
  <body>
    <h1>Strutsアプリケーションの基本</h1>
    <html:form action="/BeginAction">
      What is your name?<br />
      <html:text property="name" size="20" maxlength="50" />
      <html:submit property="submit" value="表示" />
    </html:form>
  </body>
</html:html>

output.jsp
<%@ page contentType="text/html;charset=Shift_JIS" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<html:html>
  <head>
    <title>Strutsアプリケーションの基本</title>
  </head>
  <body>
    <h1>Strutsアプリケーションの基本</h1>
    Hello, Mr./Ms.<bean:write name="objFrm" property="name" />!
  </body>
</html:html>

 上記のコードの実行結果が以下になります。

input.jspで入力された内容が…… input.jspで入力された内容が……
input.jspで入力された内容が…… output.jspで出力される

カスタムタグライブラリを宣言する

 <html:html>や<html:form>、<bean:write>などは、すべてStrutsで用意されたカスタムタグライブラリです。第1回でもご紹介したように、Strutsの主要タグライブラリは大きく5つに分類されますが「<html:html>」や「<html:form>」「<bean:write>」などの「<html:〜>」で始まるタグは「HTMLタグライブラリ」に、「<bean:〜>」で始まるタグは「Beansタグライブラリ」に、それぞれ属します。

 これらタグライブラリを使用するためには、あらかじめページの先頭で宣言を行う必要があります。input.jspの2行目、またはoutput.jspの2〜3行目に注目してみてください。

<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>

 @taglibディレクティブはJSPページ内で使用するカスタムタグライブラリを有効にするためのものです。各JSPページに記述する必要があります。uri属性の値は、第1回で紹介したデプロイメントディスクリプタ(web.xml)内で設定した<taglib><taglib-uri>要素の値と対応する必要があります。prefix属性の値は使用するタグライブラリに応じて固定だと思っておけばよいでしょう。

HTMLタグライブラリ

 HTMLタグライブラリは主にテキストボックスやコンボボックスのようなフォーム部品や、画像、アンカーなどを生成するためのタグを提供します。タグ名やオプション名を見ても、HTMLとの対応関係が容易に想像がつくものが多く、初めてStrutsに触れる皆さんにも比較的親しみやすいはずです。

 Strutsでは、このHTMLタグライブラリを介することで、後述するアクションフォームBeansへのデータの引き渡しや、エラー発生時のエラーメッセージのフィードバック、デフォルト値の動的な設定などを実現しています。これらの具体的な例については、順を追ってご紹介していくことにしましょう。

 ここでは、取りあえず以下の点に注目してください。

  1. Strutsにおいては、JSPファイルのルート要素は<html:html>タグであること
  2. <html:form>タグのactionオプションは、後述するコンフィグレーションファイルの設定値と対応していること
  3. <html:text>タグのproperty属性は、後述するアクションフォームBeansのフィールド名と対応していること

 これによって、JSPファイルから入力された値をアクションフォームBeansの該当するフィールド(メンバ変数)に自動的に格納することが可能になります。

Beansタグライブラリ

 ここで登場する、もう1つのStrutsカスタムタグ――それがBeansタグライブラリです。Strutsにおいては、ファイル間のデータ授受を主にJavaBeansクラスを介してやりとりしますが、BeansタグライブラリはそのJavaBeansを操作するための手段を提供します。

 output.jspで登場する<bean:write>タグは、アクションクラスから渡されたJavaBeans(アクションフォームBeans)の対応するメンバ(プロパティ)の値を出力します。name属性は後述するアクションクラスで設定された(リクエスト)属性名と、property属性はアクションフォームBeansのフィールド名(変数名)と、それぞれ対応している必要があります。

リクエストパラメータを格納する(アクションフォームBeans)

 JSPファイルから送信されたリクエスト情報(ここではinput.jspからの入力値)を受け取り、保持する役割を持つのがアクションフォームBeansの役割です。

 アクションフォームBeansはデータを保持するためのプライベート変数とプライベート変数への読み書きを行うsetter/getterメソッドメソッドを含むJavaBeansクラスと思っていただければよいでしょう。

 Strutsでは、JSPファイルからの入力値をいったんこのアクションフォームBeansに格納したうえで処理を行います。アクションフォームBeansに格納された値は、後述するアクションクラス(ビジネスロジック)から参照することが可能です。

 なお、アクションフォームBeansは単にリクエスト情報を保持するだけではなく、入力データの妥当性を検証したり、HTMLカスタムタグに対してデフォルト値をセットしたりといった役割も担います。

 以下に、input.jspから入力されたテキストボックスの値を格納するアクションフォームBeansクラスBeginFormを作成してみることにしましょう。BeginFormクラスは、テキストボックスnameの内容を保持するためのクラスですが、もしも複数のフォーム情報を受け取りたいという場合には、同じ形式でプライベート変数とアクセサメソッドを併述することもできます。

BeginForm.java (コンパイル結果は「/WEB-INF/classes/struts」に保存)
package struts;

import org.apache.struts.action.*;

public final class BeginForm extends ActionForm {
  private String name;
  public void setName(String name) {this.name=name;}
  public String getName() {return name;}
}

 アクションフォームBeansは、必ずorg.apache.struts.action.ActionFormクラスを継承(extends)する必要がありますが、そのほか本当に単なるメンバ変数とアクセサメソッドの集合体だということがお分かりになるでしょう。

 アクションフォームBeansには、そのほかにもHTMLフォームのデフォルト値をセットするresetメソッドや検証ロジックを記述するvalidateメソッドなどを記述することもできますが、これらについては次回以降ご紹介していくことにします。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。