第1回:Struts入門編
|
![]() |


【 目次 】![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | ||||||
![]() | ||||||
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の主なアクションタグをまとめると、簡単にまとめると以下のようになります。
|
これらは、後述のフォーム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>タグの屬性の意味は以下のようになります。
|
次に<action-mappings>タグの中で<action>タグを使いパスとフォームBean?アクションクラスの対応付けを行います。
8行目から11行目の<action>タグで/loginというパスに対してjp.co.itboost.struts.LoginActionクラスをアクションクラスとして利用し、4行目で登録したloginFormという名前のフォームBeanにパラメータの値をセットします。
また、ここでは使用していませんが、scope屬性でフォームBeanをどのスコープに保存するかを指定することもできます。scope屬性を指定しない場合、デフォルトでsessionスコープが指定されます。
<action>タグで使用する屬性の意味は以下のようになります。
|
9行目で<forward>タグを使用して「success」という名前に対して「/loginSuccess.jsp」というJSPへのパスを登録しています。これは、アクションクラスの戻り値を返している部分のfindForward( )メソッドの引數に対応します。
つまり、
return mapping.findForward("success"); |
のようにした場合、/jsp/loginSuccess.jspへ、
return mapping.findForward("error"); |
のようにした場合は/jsp/loginForm.jspへフォワードされます。
<forward>タグで使用する屬性は以下のような意味になります。
|
|
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プロパティが出力されます。
10.まとめ
今回はStrutsを用いたWebアプリケーションの簡単な作り方を見てきました。今回見てきましたフォームBeanの定義、アクションクラスの定義、struts-config.xmlの編集、Viewの作成の組み合わせで最低限の開発は行うことができます。しかし、Strutsには他にもフォームBeanでの入力値の検証やさらに便利なアクションタグなどさまざまな便利な機能があります。これらを次回以降の記事で紹介していきたいと思います。
posted on 2005-11-07 16:35 上海灘拾貝 閱讀(1806) 評論(0) 編輯 收藏 所屬分類: Struts相關