ファイルの解説
struts.xml
先ほどの画面遷移をもとにすると、struts.xmlは次のような設定になります。今回もstruts.xmlにて設定を記述する方法で解説します。設定ファイルを省略する方法は次回以降に紹介する予定です。
struts.xmlには、以下のようにpackageタグ配下に新たな定義を追加します。
<action name="Research" class="part2.Research"> <result name="success">/part2/research.jsp</result> </action> <action name="ResearchConfirm" method="confirm" class="part2.Research"> <result name="success">/part2/confirm.jsp</result> </action>
ここでは2つのActionの定義をしています。最初のResearchアクションの定義は、Researchクラスのexecute()メソッドを実行し、戻り値が"success"の場合には、/part2/research.jspという入力ページを表示するものです。
次のResearchConfirmアクションは、確認ボタンをsubmitしたときに呼び出されるActionで、method属性にて同じResearchクラスのconfirm()というメソッドを割り当てています。confirm()メソッドが"success"を返すと、/part2/confirm.jspを通して結果を表示します。
index.jsp
トップページのindex.jspには、入力画面を表示するResearchアクションへのリンクを追加します。
<a href="Research.action"> アンケート </a><br />
research.jsp
Research.actionの実行後に表示するJSPファイルは、/part2/research.jspとし、次のようになります。携帯CMに関するアンケートという感じのページにしました。<s:form>、<s:textfield>、<s:radio>、<s:submit>がカスタムタグです。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html><head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>アンケート</title></head> <body> <s:form action="Research"> <s:textfield label="名前" name="name" /> <s:textfield label="メールアドレス" name="email" /> <s:textfield label="年齢" name="age" /> <s:radio label="どの携帯のCMが好き?" name="career" list="#{'1':'ドコモ', '2':'au', '3':'ソフトバンク'}"/> <s:submit value="確認" action="ResearchConfirm" /> </s:form> </body> </html>
<s:form>のaction属性で、submit時に実行するActionクラスを指定します。submitが複数ある場合には、submitごとに異なるActionを設定することもできます。今回はsubmitにResearchConfirmアクションを設定しています。
<s:radio>では、ラジオボタンの選択肢をOGNL式で記述したMapオブジェクトとしてlist属性で設定しています。OGNL(Object Graph Navigation Language) とは、オブジェクトを操作するためのJavaと似たような式言語のことです(参考資料のOGNLガイドが詳しいです)。
その他の設定できる属性などカスタムタグの詳細については、Struts 2のタグリファレンスを参照してください。
ブラウザで表示された入力ページのソースを見て確かめてみると、テーブルタグが追加されているはずです。Struts 2では、カスタムタグの表示をあらかじめ決められたテンプレート(テーマ)にもとづいてレンダリングするようになっており、デフォルトでは「xhtml」というテーマが適用されます。このテーマは、テーブルレイアウト、検証用のメッセージ表示、ラベル表示、必須入力表示などが自動で行われます。これ以外のテーマは、
- simple(最低限のレイアウトを行うテンプレート)
- css_xhtmlテーマ(テーブルレイアウトの代わりにCSSでのレイアウトを適用)
- ajaxテーマ(Struts 2が提供するAjax機能を使う場合)
なお、適用するテーマの設定は、<s:form>等のタグでのtheme属性を用いて個別に指定するか、または、struts.xmlに以下のような<constant>タグを追加してアプリケーション単位に指定する方法があります。
<constant name="struts.ui.theme" value="simple" />
confirm.jsp
次の/part2/confirm.jspは、確認のための入力値表示ページです。前回同様、プロパティを表示するタグ<s:property>を使っています。
<head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>確認</title> </head> <body> 名前:<s:property value="name"/><br /> メールアドレス:<s:property value="email"/><br /> 年齢:<s:property value="age"/><br /> キャリア:<s:property value="career"/><br /> </body>
Research.java
Actionクラスは、Research.classの1つだけです。ソースファイルは、/WEB-INF/src/part2/Research.javaとなり、内容は以下のようになります。
package part2; import com.opensymphony.xwork2.ActionSupport; public class Research extends ActionSupport { private static final long serialVersionUID = 1L; // 入力フィールドに対応したメンバ変数 private String name; private String email; private int age; private String career; public String getName(){ return name; } public void setName(String name){ this.name = name; } public String getEmail(){ return email; } public void setEmail(String email){ this.email = email; } public int getAge(){ return age; } public void setAge(int age){ this.age = age; } public String getCareer(){ return career; } public void setCareer(String career){ this.career = career; } // デフォルトのActionメソッド public String execute() throws Exception { return "success"; } // submit時のActionメソッド public String confirm() throws Exception { return "success"; } }
パッケージはpart2にしています。入力フォームの項目に対応したメンバ変数と、そのアクセッサ(getter/setterメソッド)、そして、Actionメソッドのexecute()とconfirm()です。
Struts 2では、フォームに入力された値は対応するActionクラスのメンバ変数にsetterメソッドを介して自動的にセットされます。フォームに対応した変数として数値型が使えることに注目してください。Struts 2により自動的に型変換が行われます。数値のほかに、日付を入力したい場合にはDate型を使うこともできます。
前回のクラスと異なるのは、confirm()というメソッドがあることと、ActionSupportクラスを継承していることです。ActionSupportクラスとは、その名のとおり、Actionクラスをサポートするクラスです。今回は次項で説明するバリデーション機能を使うために継承しています。なおActionSupportクラスは、Strust 2のライブラリ内のクラスですので、利用するには参照ライブラリの設定が必要です。プロジェクトのプロパティにある「Javaのビルドパス」のライブラリで、「外部JARの追加」を選び、/WEB-INF/libにコピーしたStruts 2のJARファイル群を追加しておいてください。
Actionクラスは、デフォルトでexecute()というメソッドを実行することを前回説明しました。execute()以外のメソッドもActionとして実行するメソッドにでき、今回のResearchクラスでは前述のstruts.xmlの設定のとおり、confirm()メソッドを確認ボタンがクリックされた時に呼び出されるActionメソッドとしています。実態は単に"success"を返すだけです。