最近ではStrutsフレームワークを用いたWebアプリケーション開発が非常に注目されています。この記事ではWebアプリケーションを作成したことがある方を対象に、Strutsフレームワークの基本的な仕組みからStrutsを用いたWebアプリケーションの開発の流れまでを紹介します。 |
流郷俊彦 株式会社アイティーブースト 2004/6/14 | |
|
| |
|
【 目次 】 1.はじめに 2.フレームワークとは 3.Strutsの処理の流れ 4.Strutsアプリケーションの作成 5.入力用JSPの準備 6.フォームBeanの定義 7.アクションクラスの定義 8.struts-config.xmlの設定 9.出力用JSPの定義 10.まとめ
|
|
【実行環境】
OS WindowsXP JDK JDK1.4.2 WebコンテナTomcat5.0.24 Struts Struts1.1 | |
1.はじめに Strutsを用いたWebアプリケーション開発というのは現在では至るところで行われています。Java関連の書籍を見るといたるところで「Struts」という言葉を目にすることからStrutsが今世の中で非常に注目されていることがわかります。StrutsはJakartaプロジェクトで開発されたMVCアーキテクチャのController部分を提供してくれるフレームワークです。Strutsを使用して開発を行うことにより、開発効率が向上することや用意されたアクションタグを用いることにより、JSP内でスクリプトを使わずに動的なページを生成することもできます。また、アプリケーションの作成の手順が統一化されるので、機能変更や機能追加なども容易に行えるようになります。これらの理由からもStrutsが注目されているということがわかります。本記事では「Strutsって何?」という方を対象にフレームワークという言葉からStrutsの概要について紹介いたします。
2.フレームワークとは StrutsはMVCアーキテクチャのController部分を提供してくれるフレームワークです。そもそもフレームワークとは何なのでしょうか?フレームワークは同種類のアプリケーションにおいて共通している部分を抜き出し、その共通部分を提供してくれるものです。つまり、フレームワークを使ってアプリケーションを開発するということは、アプリケーションの土台となる部分にフレームワークが提供する機能を利用し、アプリケーション固有のプログラム(部品)のみを作成するということです。
| |
3.Strutsの処理の流れ
では、
Strutsを使ったアプリケーションの処理の流れを見ていきたいと思います。
Strutsを用いた
Webアプリケーションは主にActionServlet、フォームBean、アクションクラスの3つで構成されます。また、処理の制御を行う設定ファイルがあり、それが
struts-config.xmlです。以下はこれらの関係を図にしたものです。
図中の番号は以下のようなことを行っています。
(1) |
~.doという形式のリクエストがActionServletに対して送られます。 |
(2) |
ActionServletはstruts-config.xmlを参照し、~.doの「~」の部分に対応するフォームBean、アクションクラスを決定します。 |
(3) |
リクエストパラメータを対応するフォームBeanにセットします。また必要であれば入力値のチェックも行います。 |
(4) |
アクションクラスのexecute( )メソッドが呼び出されます。この中でリクエスト毎に固有の処理が実行されます。 |
(5) |
再度struts-config.xmlを参照し、適切な出力用Viewへ移動します。 |
Webアプリケーションで処理の流れとしてよくある、単一のコントローラでリクエストを受け取り、専用のコントローラに処理を振り分ける、パラメータの値をModelにセットする、処理した結果に応じた適切なViewにフォワードするといった
Webアプリケーションとしての基本的な処理を行ってくれるのが
Strutsです。つまり、
Strutsでは要所要所で具体的な処理の内容を定義するだけで
Webアプリケーションが作成できます。
以降では簡単なアプリケーションを作成しこれらの流れを抑えていきましょう。
4.Strutsアプリケーションの作成
http://jakarta.apache.org/から
Struts1.1をダウンロードします。ダウンロードしたファイルを展開すると中にjakarta-
struts-1.1\webapps\
struts-blank.warというファイルがあります。このファイルはzip形式で圧縮されたファイルなので拡張子を.zipに変更することで解凍することができます(JARコマンドを使用すれば拡張子を変更する必要はありません)。
このwarファイルは
Strutsを用いた
Webアプリケーションのテンプレートになっています。解凍すると、
Strutsアプリケーションを作成するために必要なJARファイルや設定ファイルなどが既に適切な位置に配置されています。あとは、この中にクラスやJSPを配置していけば
Strutsアプリケーションが作成できます。
今回はこの中に簡単なユーザ認証を行うアプリケーションを作成していきます。
なお、今回作成するサンプルプログラムの階層は以下のようになります。
5.入力用JSPの準備
まず、入力用のJSPから見ていきます。これは以下のようなJSPになります。
【loginForm.jsp】
1: <%@ page contentType="text/html; charset=Windows-31J" %> 2: <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> 3: <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> 4: <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> 5: 6: <html:html> 7: <head><title>ログイン画面</title> 8: <body> 9: <html:form action="/login"> 10: <table border="0"> 11: <tr> 12: <td>名前</td><td><html:text property="name" /></td> 13: </tr> 14: <tr> 15: <td>パスワード</td><td><html:password property="password" /></td> 16: </tr> 17: <tr> 18: <td colspan="2"><html:submit value="ログイン" /></td> 19: </tr> 20: </table> 21: </html:form> 22: </body> 23: </html:html> |
2行目から4行目が
Strutsのタグライブラリを使用するためのtaglibディレクティブです。
StrutsではHTMLの出力や条件分岐・繰り返し処理などのロジック処理の多くをアクションタグを用いて実行することができます。
今回出てきた
Strutsの主なアクションタグをまとめると、簡単にまとめると以下のようになります。
タグ |
意味 |
<html:html> |
HTMLの<html>タグに対応します。 |
<html:form> |
HTMLの<form>タグになります。method属性は省略しても自動的にPOSTで送られます。 |
<html:text> |
HTMLの<input type="text">に対応します。property属性が<input>タグのname属性に対応します。 |
<html:password> |
HTMLの<input type="password">に対応します。property属性が<input>タグのname属性に対応します。 |
<html:submit> |
HTMLの<input type="submit">に対応します。 | |
これらは、後述のフォームBeanにセットされている値をデフォルト値としてくれたり、自動的にフォーカスを移動したりといった機能があります。
6.フォームBeanの定義
フォームBeanはリクエストパラメータの値を格納するためのクラスになります。フォームBeanはActionFormクラスを継承したクラスでなければならず、フォームから送られてくる値を受け取るために同名のプロパティを定義しなければなりません。今回であれば、loginForm.jspから nameとpasswordという2つのパラメータが送られてくるので、それをプロパティとして定義します。具体的には以下のようになります。
【LoginForm.java】
1: package jp.co.itboost.struts; 2: 3: import org.apache.struts.action.ActionForm; 4: import org.apache.struts.action.ActionMapping; 5: 6: public class LoginForm extends ActionForm { 7: private String name; 8: private String password; 9: //nameプロパティ 開始 10: public String getName() { 11: return name; 12: } 13: 14: public void setName(String name) { 15: this.name = name; 16: } 17: 18: public String getPassword() { 19: return password; 20: } //nameプロパティ 終了 //passwordプロパティ 開始 21: 22: public void setPassword(String password) { 23: this.password = password; 24: } //passwordプロパティ 終了 25: } |
6行目でクラス定義の際、ActionFormを継承しています。
10行目から16行目がnameプロパティの定義です。
18行目から24行目がpasswordプロパティの定義です。
このようなクラスを定義すると、リクエストパラメータとして送られてきたnameとpasswordの値がそれぞれnameプロパティ、passwordプロパティにセットされます。
7.アクションクラスの定義
アクションクラスはリクエストパラメータがフォームBeanにセットされたあと実行されるクラスです。アクションクラスの定義はActionクラスを継承し、execute( )メソッドを定義することにより行えます。execute( )メソッドは戻り値にActionForwardオブジェクトを返しますが、これは
struts-config.xmlで定義した移動先にフォワードすることを意味します。
今回のログイン処理を行うアクションクラスであれば、以下のようになります。
【LoginAction.java】
1: package jp.co.itboost.struts; 2: 3: import org.apache.struts.action.Action; 4: import org.apache.struts.action.ActionForm; 5: import org.apache.struts.action.ActionForward; 6: import org.apache.struts.action.ActionMapping; 7: import javax.servlet.http.*; 8: 9: public class LoginAction extends Action { 10: public ActionForward execute(ActionMapping mapping, ActionForm form, 11: HttpServletRequest request, HttpServletResponse response) { 12: LoginForm loginForm = (LoginForm)form; 13: 14: // ログイン認証 15: if ("user".equals( loginForm.getName() ) && "itboost".equals( loginForm.getPassword() )) { 16: // ログイン成功 17: return mapping.findForward("success"); 18: } else { 19: // ログイン失敗 20: return mapping.findForward("error"); 21: } 22: } 23: } |
9行目でActionクラスを継承しています。
12行目は引数のActionFormオブジェクトをLoginForm型にキャストしています。今回はフォームBeanにLoginFormクラスが使われるように設定されているため、LoginForm型にキャストします。
17行目は15行目のif文の条件式がtrueになる場合、つまり、ログインが成功した場合に戻り値としてActionForwardオブジェクトを返している部分です。引数のActionMappingオブジェクトのfindForward( )メソッドを呼び出すことで、ActionForwardオブジェクトを作成することができます。引数に文字列を指定していますが、これはフォワード先を識別するための情報です。実際の移動先は
struts-config.xml(後述)で指定します。
20行目も同様にログインに失敗した場合は「error」という名前の移動先にフォワードします。
8.struts-config.xmlの設定
ここまでで、フォームBeanとアクションクラスの定義を見てきました。
struts-config.xmlはあるリクエストに対して、どのフォームBeanとどのアクションクラスを使うのか、また、最終的にどこにフォワードするのかという処理の流れを定義する設定ファイルです。WEB-INFの中に
struts-config.xmlがあります。大きく分けると以下のような定義になります。
【struts-config.xml】
1: <struts-config> 2: : <!-- フォームBeanの登録 開始 --> 3: <form-beans> 4: <form-bean name="loginForm" type="jp.co.itboost.struts.LoginForm" /> 5: </form-beans> <!-- フォームBeanの登録 終了 --> 6: : <!-- アクションクラスの登録 開始 --> 7: <action-mappings> 8: <action path="/login" type="jp.co.itboost.struts.LoginAction" name="loginForm"> 9: <forward name="success" path="/jsp/loginSuccess.jsp" /> 10: <forward name="error" path="/jsp/loginForm.jsp" /> 11: </action> 12: </action-mappings> <!-- アクションクラスの登録 終了 --> 13: : 14: </struts-config> |
struts-config.xmlには他にもいろいろと定義しますが、ここでは特に重要な<form-beans>タグと<action-mappings>タグの内容について紹介します。
まず、4行目ではloginFormという名前でjp.co.itboost.
struts.LoginFormクラスを登録しています。
<form-beans>タグの中で<form-bean>タグを使い
Strutsで使用するフォームBeanを登録します。<form-bean>タグの属性の意味は以下のようになります。
属性 |
意味 |
name |
フォームBeanの名前(自由に指定してよい) |
type |
登録するフォームBeanのクラス(FQCNで指定) | |
次に<action-mappings>タグの中で<action>タグを使いパスとフォームBean・アクションクラスの対応付けを行います。
8行目から11行目の<action>タグで/loginというパスに対してjp.co.itboost.
struts.LoginActionクラスをアクションクラスとして利用し、4行目で登録したloginFormという名前のフォームBeanにパラメータの値をセットします。
また、ここでは使用していませんが、scope属性でフォームBeanをどのスコープに保存するかを指定することもできます。scope属性を指定しない場合、デフォルトでsessionスコープが指定されます。
<action>タグで使用する属性の意味は以下のようになります。
属性 |
意味 |
path |
リクエスト時のパスの名前(「~.do」の「~」の部分) |
type |
実行するアクションクラスのクラス名(FQCNで指定) |
name |
使用するフォームBeanの名前 |
scope |
フォームBeanを保存するスコープ(application,session,request,pageのいずれか) | |
9行目で<forward>タグを使用して「success」という名前に対して「/loginSuccess.jsp」というJSPへのパスを登録しています。これは、アクションクラスの戻り値を返している部分のfindForward( )メソッドの引数に対応します。
つまり、
return mapping.findForward("success"); |
のようにした場合、/jsp/loginSuccess.jspへ、
return mapping.findForward("error"); |
のようにした場合は/jsp/loginForm.jspへフォワードされます。
<forward>タグで使用する属性は以下のような意味になります。
属性 |
意味 |
name |
フォワード先の名前(findForward( )メソッドの引数で指定する値) |
path |
実際のフォワード先へのパス | |
9.出力用JSPの定義
では、最後に出力用のJSPを作成してみます。入力用JSPと同様に
Strutsのアクションタグを使用しますが、ここでは、新たに<bean:write>というタグが出てきます。これは、<jsp: getProperty>と似た動きをします。<bean:write>タグはスコープ内のオブジェクトもしくはオブジェクトのプロパティを出力します。スコープ内のオブジェクトのプロパティを出力するアクションタグに<jsp:getProperty>タグがありますが、 <jsp:getProperty>タグとの違いは「<」や「>」といったHTMLにおける特殊な記号を自動的にエスケープ (「<」や「>」など)してくれるところです。ログイン成功時の画面を出力するJSPは以下のようになります。
【loginSuccess.jsp】
1: <%@ page contentType="text/html; charset=Windows-31J" %> 2: <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> 3: <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> 4: <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> 5: 6: <html:html> 7: <head><title>ログイン成功画面</title> 8: <body> 9: <bean:write name="loginForm" property="name" />さん、ようこそ 10: </body> 11: </html:html> |
9行目が<bean:write>タグを使用し、loginFormのnameプロパティを出力している部分です。loginFormは今回使用したフォームBeanですが、
struts-config.xmlの部分でも説明したとおり、フォームBeanは何らかのスコープに保存されます。今回は
struts-config.xml ではどのスコープも指定していないので、sessionスコープに保存されているloginFormという名前のフォームBeanが対象となります。 property属性でnameという値を指定しているので、loginFormのnameプロパティが出力されます。
今回は
Strutsを用いた
Webアプリケーションの簡単な作り方を見てきました。
今回見てきましたフォームBeanの定義、アクションクラスの定義、
struts-config.xmlの編集、Viewの作成の組み合わせで最低限の開発は行うことができます。しかし、
Strutsには他にもフォームBeanでの入力値の検証やさらに便利なアクションタグなどさまざまな便利な機能があります。これらを次回以降の記事で紹介していきたいと思います。