Struts 2アプリケーションの作成 2
index.jsp
次に、index.jspを書いてみましょう。なお、本稿で作成するJSPファイルの文字コードは、「UTF-8」に統一することにします。あらかじめ、Eclipseの[設定]メニューのJSPファイルで、エンコードをUTF-8にしておいてください。
メニューの[ファイル]-[新規]-[その他...]で、JSPを選択して、ファイル名をindex.jspとします。ファイルの中身は次のようにします。
<%@ 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>Hello!Project</title> </head> <body> <a href="Hello.action">こんにちは</a> <br /> <s:property value="replyMsg"/> </body> </html>
簡単なJSPファイルで最初のページになります。また、単なる起動だけでなく、ページにある「こんにちは」のリンクをクリックした先の結果ページにも使われています。つまり、リンクをクリックすると、再びindex.jspがStruts 2に呼びだされて表示されるということです。
前述したように、ここでは結果ページの出力テンプレートとしてJSPを利用しています。注目していただきたいのは、結果ページのURL欄がindex.jspになっていないことです。先ほどのブラウザ表示の図で確認できるように、Hello.actionというページのままなのです。つまり、そのページは、index.jspファイルをテンプレートとして取り込んでいるということで、再びindex.jspにジャンプしているのではないことに注意してください。
ここでのもう1つのポイントは、カスタムタグです。
<%@ taglib prefix="s" uri="/struts-tags" %>
を宣言すると、Struts 2で提供されている独自のタグが使えるようになります。
<s:property value="replyMsg"/>
これがカスタムタグを利用しているところです。このタグが意味するところは、タグ名が示すように、プロパティの参照です。最終的なHTMLでは、このタグはreplyMsgという名のプロパティが示す文字列に置換されます。
ページの動きを思い出してください。最初のindex.jspの表示では、リンクだけの表示でしたね。最初は、このreplyMsgプロパティには何も入っていないので、文字が表示されていないのです。リンクをクリックすると、今度はreplyMsgに値がセットされ、下に文字が表示されました。つまり、リンク先の「Hello.action」がセットしたというわけです。
では、Hello.actionとは何でしょうか。また、replyMsgとはどこのプロパティなのでしょうか。
Actionクラス
Hello.actionの正体は、名前が示すようにActionクラスの実行です。拡張子の「.action」によって、Struts 2はリクエストがActionであることを認識します。この設定は、後述する設定ファイルにて変更可能ですので、Struts 1のように「.do」とすることもできます。
Hello.actionが実行されると、それに対応したActionクラスがStruts 2を通して呼び出されます。Actionクラスは前述のとおりアプリケーションのビジネスロジックを実装するクラスで、今回は、次のようにPOJOのシンプルなクラスです。(当然、POJOでない記述も可能で、Struts 2で用意されているクラスから継承することもできます。)
ここでは、パッケージをpart1として、/WEB-INF/src/part1/Hello.javaを作成しています。
package part1;
public class Hello {
private String replyMsg;
public String getReplyMsg() {
return replyMsg;
}
public void setReplyMsg(String message) {
this.replyMsg = message;
}
public String execute() throws Exception {
this.setReplyMsg( "Struts 2の世界へようこそ" );
return "success";
}
}
Helloクラスは、replyMsgというString型のメンバ変数と、その変数を設定・取得するセッターとゲッター、そしてexecute()というString型を返すメソッド、という構成です。これはすべてのActionクラスの基本構成となります。実はこれ、Struts 2のライブラリで用意されているActionインターフェースの実装とも言えるのですが、前述のようにActionクラスは、インターフェースをインプリメントせずに(Javaの文法的な意味で)、POJOとして作成可能となっています。
execute()メソッドでは、replyMsgに文字列を設定しています。つまり、Hello.actionが実行されると、このメソッドがStruts 2によって呼び出されるということです。デフォルトでは、executeという名前のメソッドを呼び出すことになっています。後述する設定ファイルで、String型を返す別のメソッドを指定することもできます。また、先ほどのプロパティとは、このActionクラスのreplyMsgを参照していることが分かると思います。ただし、メンバ変数を直接参照できないので、いわゆるゲッターが必要です。Struts 2が、value="replyMsg"で指定された値にgetをつけたメソッドを実行しているのです。
struts.xml
最後のファイル、struts.xmlは、アプリケーションの動作を定義しています。ここでは、リクエストURIとActionクラスの対応や、ページ遷移の設定を記述しており、Struts 2アプリケーションでは重要な設定ファイルとなっています。なお、このファイルは、実際にはクラスパスの直下に配置することになるのですが(つまり、「/WEB-INF/classes」フォルダ)、今回の開発環境では、/WEB-INF/src/struts.xmlに作成します。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="HelloProject" extends="struts-default"> <action name="Hello" class="part1.Hello"> <result name="success">/index.jsp</result> </action> </package> </struts>
これが最低限の設定になっています。<struts>タグがトップレベルの要素で、その配下の<package>タグ内にActionクラスの設定を定義していきます。packageといっても、Javaソースのパッケージとは関係なく、あくまでもStruts 2の設定で、複数のActionをグルーピングして管理できるようようにするものです。extends="struts-default"は、このpackageがデフォルトの設定ファイルを継承して標準の処理を行うという意味で、通常は変更する必要はありません。
<action>タグでは、name属性でリクエストURI、class属性で対応するActionクラスを定義します。また、method属性を設定すると、execute以外の指定したメソッドを呼び出すこともできます。
<result>タグは、Actionクラスの実行の次の処理を定義しています。name属性で、呼び出したActionクラスのメソッドの返値を指定します。今回の例では、戻り値が"success"の場合、index.jspを実行するという設定になっています。戻り値によって異なるページを表示したい場合は、<result>タグを複数並べることになります。なお、name属性のデフォルトは"success"なので、name属性の設定を省略すると、"success"を設定したことになります。
ちなみに、Actionの拡張子は、以下のタグを<struts>要素内に記述することで変更可能で、例えばStruts 1と同じ拡張子にするには以下の設定になります。位置は<package>要素の前後どちらでもかまいせん。
<constant name="struts.action.extension" value="do" />
上記以外にも多くの設定がありますが、それは次回以降で説明することにします。
実行
Tomcatプラグインなら、あらためてデプロイすることなく実行できます。EclipseのメニューからTomcatを起動し、ブラウザで「http://localhost:8080/HelloProject/」にアクセスしてみてください。web.xmlの<welcome-file-list>の設定に従って、index.jspが表示されます。
起動ページの「こんにちは」をクリックすると、Hello.actionが実行されます。Hello.actionは、replyMsgに文字列を設定します。その後、Struts 2がindex.jspを呼び出し、HTTPレスポンスを生成します。
なお、今回作成したアプリケーションをサーバ上に配置する場合は、以下の図のようになります。
<ContextRoot> ├ /WEB-INF │ ├ /classes │ │ ├ /part1 │ │ │ └ Hello.class │ │ └ struts.xml │ ├ /lib │ │ ├ commons-logging-1.0.4.jar │ │ ├ freemarker-2.3.8.jar │ │ ├ ognl-2.6.11.jar │ │ ├ struts2-core-2.0.11.jar │ │ └ xwork-2.0.4.jar │ └ web.xml └ index.jsp
まとめ
かんたんなWebアプリケーションの作成を通して、Struts 2の仕組みと構造を解説しました。Struts 2はとても洗練されたフレームワークであることが、お分かりいただけたでしょうか。
次回は、もうすこし実用的な入力フォームを持つアプリケーションと、バリデーションの仕組みなどを紹介したいと思います。
参考資料
- Apache Struts
- Struts 2 Tutorial
- Using Struts 2
- InfoQ: Struts アプリケーションの Struts 2 への移行
- 【特集】実践サンプルで学ぶStruts 2 - 生まれ変わった定番フレームワークを徹底解説:マイコミジャーナル
- Struts2を使ってみる
- Struts2 おぼえがき:それはBooks
- Struts2入門:「夜を告げるモノ。」
- Starting with Struts 2:Lulu.Com
- 「Struts2入門」(川崎克巳 著 、オンライン書籍)
- 「Practical Apache Struts 2 Web 2.0 Projects」(Ian Roughley 著、Apress、2007年11月)
- 「サーブレット&JSP逆引き大全650の極意 改訂第3版」(川崎克巳 著、秀和システム、2007年12月)


