WicketのHello World(id:tanamon:0080729:217322874)と比較するために、Struts2でもHello Worldを作ってみました。
そのままのサンプルは既にネット上にたくさんあるので、[http:/struts.apache.org/2.0.11.2/docs/zero-configuration.html:itle=Zero Configuration]な書き方にしてみました。記述量が減ってわかりやすいです。
Struts2ライブラリの取得
必要なライブラリをダウンロードしてきます。
ダウンロードしたファイルを解凍し、以下のファイルをEclipseプロジェクトにコピーします。
Struts 2.0.11.2
http:/struts.apache.org/download.cgi#struts20112
struts-2.0.11.2-lib.zip
- lib/commons-logging-1.0.4.jar
- lib/freemarker-2.3.8.jar
- lib/ognl-2.6.11.jar
- lib/struts2-codebehind-plugin-2.0.11.2.jar
- lib/struts2-core-2.0.11.2.jar
- lib/xwork-2.0.5.jar
コピー先
- Struts2HelloWorld/app/WEB-INF/lib
コピーしたら、Eclipseのビルドパスにライブラリを登録しておきます。
JSPの作成
Actionクラスの作成
app/WEB-INF/src/example/helloworld/HelloWorldAction.java
package example.helloworld; import com.opensymphony.xwork2.ActionSupport; public class HelloWorldAction extends ActionSupport { private static final long serialVersionUID = 1L; public String execute() { return SUCCESS; } public String getMessage() { return "Hello World!"; } }
Struts2ではActionクラスのクラス名の規則がそのままURLになります。デフォルトでは、HelloWorldActionにアクセスする場合、URLは/Struts2HelloWorld/helloWorld.actionという名前になります。
(ただし、今回は.actionを除いてアクセスできる設定にします。詳しくは後述)
中には2つのメソッドがありますが、そのうちexecute()は、今回は何もしないのでそのままreturnしています。ちなみに、何もしない場合記述を省略しても同じように動作をします。
execute()の戻り値にはSUCCESSという定数を指定していますが、この値が呼び出されるJSPのファイル名に関係してきます。基本的に、URL名 + "-" + 戻り値の値 + ".jsp"という規則のファイルを呼び出します。
さらに例外として、戻り値がSUCCESSの場合だけは"-success"を省略したものも呼び出すことができます。
そのため、helloWorld-success.jsp → helloWorld.jspの順番に見つけたものを呼び出す、という動作になります。
もう1つのgetMessage()メソッドは、JSPで
struts.xmlの作成
<?xml version="1.0"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http:/struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.ui.theme" value="simple" /> <constant name="struts.codebehind.pathPrefix" value="/WEB-INF/jsp/"/> <constant name="struts.action.extension" value=""/> </struts>
3つほど設定項目を定義しているので、それぞれ見ていきます。
struts.ui.theme
この値の指定が無いと、Struts2側で勝手にレイアウト用のタグ(tdタグなど)を埋めるようになります。見た目通りに動いて欲しい場合には、値を"simple"にしておく必要があります。テーマを予め自分で定義しておけば、フォーム用タグを使用するだけでレイアウトが整えられるので、便利な機能だとは思います。
struts.codebehind.pathPrefix
JSPの置き場所を指定しています。デフォルトだと外からアクセス出来る位置(WEB-INFと同列の位置)になるため、アクセスさせないようにWEB-INFの下に指定しています。
struts.action.extension
デフォルトではアクションへのアクセスに.actionという拡張子がつきますが、それを除いてアクセスするように指定しています。たとえば"do"と指定することで、Struts1系と同じようにもできます。
web.xmlの作成
<?xml version="1.0"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN" "http:/java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>Hello World</display-name> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> <init-param> <param-name>actionPackages</param-name> <param-value>example.helloworld</param-value> </init-param> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
Struts2はservletではなくfilterとして登録します。
このファイルで重要なのはactionPackagesの値です。ここにActionクラスがあるパッケージを指定することで、Actionごとの定義を省略することができます。
ちなみに、パッケージはカンマ区切りで複数指定することができます。