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

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

[山田祥寛,@IT]
前のページへ 1|2       

ビジネスロジックを記述する(アクションクラス)

 アクションフォームBeansに格納したリクエストパラメータを基に、実際のビジネスロジックを実行するのがアクションクラスの役割です。本稿ではサンプルの簡潔性を重視してアクションクラス内にビジネスロジックを記述していますが、保守性などを鑑みた場合、ビジネスロジックはJavaBeansとして別個に記述することをお薦めします。

 アクションクラスは、処理結果に基づいて、次の遷移先(処理結果の出力先)に処理を引き継ぎます。

 以下のBeginProcessクラスは、アクションフォームBeansを取得し、その内容をリクエスト属性にセットするだけの、最も単純なアクションクラスです。

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

import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.struts.action.*;

public final class BeginProcess extends Action {
  public ActionForward execute
 (ActionMapping map, ActionForm frm,
 HttpServletRequest request, HttpServletResponse response) {
    BeginForm objFrm=(BeginForm)frm;
    request.setAttribute("objFrm",objFrm);
    return map.findForward("success");
  }
}

 アクションフォームBeansクラスが必ずorg.apache.struts.action.ActionFormを継承しなければならなかったのと同様、アクションクラスはorg.apache.struts.action.Actionクラスを継承する必要があります。実際のビジネスロジックはexecuteメソッドに記述します。executeメソッドでは、引数として渡されるActionFormクラスを介してアクションフォームBeansに格納されたリクエストパラメータの内容を参照することが可能です。ただし、使用に際しては必ず型のキャストを行わなければならない点に注意してください(渡されるのは、あくまでスーパークラスであるActionFormクラスなので、そのままではサブクラスで拡張されたアクセサメソッドにアクセスすることができません)。

 また、もう1つ注意しなければならない点は、アクションクラスの戻り値についてです。アクションクラス(executeメソッド)はそれ自体の処理結果を返しません。例えば、「1+2」という加算を行った場合に、アクションクラスの戻り値は「3」という結果ではありません。「1+2」という処理が成功したか失敗したかという「ステータス」(ここでは“success”)のみを返します。

 つまり、アクションクラスで処理された何らかの結果をJSPファイルに引き継ぎたいという場合には、executeメソッドの戻り値ではなく、リクエスト属性やセッション属性などの媒体を使用しなければならないということです。ここではリクエスト属性“objFrm”にアクションフォームBeansそのものをセットしていますが、この内容については、<bean:write>タグ(output.jsp)からアクセスすることが可能です。

 ちなみに、executeメソッドの戻り値である「ステータス」には、別になにかしら固定値が決まっているというわけではありません。慣例的には、“success”などの文字列を使用することが多いですが、後述するコンフィグレーションファイルの<forward>要素と整合してさえいれば、任意の文字列を指定することができます。

ファイルの関係を設定する(コンフィグレーションファイル)

 コンフィグレーションファイル(struts-config.xml)は、Strutsアプリケーションの画面遷移や、View−Model(つまり、「.jsp」ファイルとアクションフォームBeans、アクションクラス)を関連付ける一連の制御情報を記述するためのファイルです。

 冒頭でご紹介したように、Strutsにはあらかじめアクションサーブレットと呼ばれる、すべての入出力制御を行なうための基本クラスが提供されていますが、アクションサーブレットはこのstruts-config.xmlを参照することで、処理の分岐を判断しています。

 struts-config.xmlは第1回でも骨組みだけを用意しましたが、このスケルトンに、以上のJSPファイルやアクションフォームBeans、アクションクラスを動かすために必要な設定情報を追記してみることにしましょう(追記個所は赤字)。

struts-config.xml
<?xml version="1.0" encoding="Shift_JIS" ?>
<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
  <data-sources></data-sources>
  <form-beans>
   <form-bean name="BeginForm" type="struts.BeginForm" />
  </form-beans>
  <global-exceptions>
  </global-exceptions>
  <global-forwards>
  </global-forwards>
  <action-mappings>
   <action path="/BeginAction" type="struts.BeginProcess"
     name="BeginForm" scope="request">
      <forward name="success" path="/output.jsp" />
    </action>
  </action-mappings>
</struts-config>

 基本的なStrutsアプリケーションを動作させる場合、最低限必要なのは、“<form-bean>”と“<action>(<forward>)”要素です。以下に主な属性の意味をまとめておくことにします。<form-bean>要素は<form-beans>要素の配下に、<action>要素は<action-mappings>要素の配下に、いくつでも列記することができます。今後、本連載でもいくつかのページを作成しますが、その際には、今回追加した“<form-bean>”と“<action>”要素と並列に新規要素を追加してください。不適切な箇所に要素が追加された場合、Strutsアプリケーション全体が動作しなくなってしまうので、要注意です。

コンフィグレーションファイルにおける主な要素と属性
要素 属性 概要
<form-bean> name ActionFormBeansの論理名(アプリケーション内で一意であり、かつ、<action>要素のname属性と合致している必要があります)
type アクションフォームBeansの完全修飾名
<action> path 呼び出し時のURL(今回であれば、<html:form>タグのaction属性と一致している必要があります)
type アクションクラスの完全修飾名
name アクションクラスで使用するアクションフォームBeansの論理名
scope アクションフォームBeansのスコープ(有効範囲)
<forward> name ステータス名(任意の文字列)
path ステータスに対応する遷移先のパス

Strutsアプリケーションを起動する

 さあ、これで必要なファイルの準備は完了です。ブラウザから以下のURLを入力してみましょう。アプリケーション名は、第1回で設定したように「struts」とします。

http://localhost:8080/struts/input.jsp

 input.jspから入力した名前(例えば、「Y.Yamada」)に対して、Strutsが「Hello, Mr./Ms. Y.Yamada!」と応答すれば成功です。ちなみに、今回はまだ日本語の入力には対応していません。日本語を入力した場合には文字化けの原因となりますので、注意してください。

 また、そもそもページへのアクセス以前に、アクションフォームBeansやアクションクラスがコンパイルできないという場合には、Strutsの関係「.jar」ファイルにクラスパスが通っていない可能性があります。その場合には、いま一度、第1回の設定内容を見直してみてください。

Strutsアプリケーションの処理の流れをおさらいする

 無事、初めてのStrutsアプリケーションが動作したところで、最後にいま一度、関係するモジュールの関連性をおさらいしてみることにしましょう。

 繰り返しですが、Strutsを理解する第一歩は、まず関連するクラスのつながり――(1)どのようにデータが流れ、(2)何をキーにファイルがマッピングされているのか、を確実に理解することです。後々の学習をスムーズに進めていくためにも、この部分だけはしっかりと理解しておいてください。

 今回のサンプルの処理の流れを図に示します。

今回のサンプルにおける処理の流れ (クリックすると拡大します)
今回のサンプルにおける処理の流れ
No. 処理概要
1 「http://localhost:8080/struts/input.jsp」をリクエスト
2 名前を入力後、[表示]ボタンをクリック。リクエストパス「/BeginAction」に対してデータ送信が行われる(実際にはパスの指定にかかわらず、アクションサーブレットが起動)
3 リクエストデータを受け取ったアクションサーブレットが「/BeginAction」をキーにコンフィグレーションファイル配下の<action>要素を検索。リクエスト処理に使われるアクションフォームBeansとアクションクラスを特定する
4 リクエストデータの内容をアクションフォームBeansにセット。この際、HTMLタグライブラリにおけるproperty属性の値をキーに、アクションフォームBeansの対応するアクセサメソッドが呼び出される
5 3で特定されたアクションクラスを起動。executeメソッドをコールし、ビジネスロジックを実行する
6 アクションフォームBeans(BeginFormクラス)の内容をリクエスト属性“objFrm”にセット
7 処理結果ステータス“success”をキーとして、コンフィグレーションファイルの<action>/<forward>要素を検索。対応するパス(path属性)に処理を転送する
8 最終的な遷移先output.jspで、引き継がれたリクエスト属性(アクションフォームBeans)の値を取得し、クライアントに応答する

 以上、これで、Strutsの基本的な構成は一通りご理解いただけたことと思います。もちろん、これだけで実践的なアプリケーションが即座に組めるようになるというものではありませんが、Strutsを構成する大きな骨格を知ることが、今後の学習の一助となれば幸いです。

 次回は、より実践的なアプリケーション構築の足掛かりを見据え、Strutsを利用したデータベース連携の方法を学習してみることにします。データベースから動的に取り出した値をコンボボックスに設定したり、あるいは、入力内容をデータベースに保存してみたり。アプリケーションにはつきものの、入出力の基本的な操作を中心に、Strutsアプリケーションのイメージをつかんでみることにしましょう。どうぞお楽しみに。


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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