tanamonの稀に良く書く日記

KEEP CALM AND DRINK BEER

Struts2でHello World

WicketHello World(id:tanamon:0080729:217322874)と比較するために、Struts2でもHello Worldを作ってみました。

そのままのサンプルは既にネット上にたくさんあるので、[http:/struts.apache.org/2.0.11.2/docs/zero-configuration.html:itle=Zero Configuration]な書き方にしてみました。記述量が減ってわかりやすいです。

Eclipseプロジェクトの作成

Eclipse上でTomcatプロジェクトを作成します。

  • プロジェクト名:Struts2Sample
  • コンテキスト名:/Struts2Sample
  • Webアプリケーション・ルートとするサブディレクトリー:/app

Wicketの例ではJavaプロジェクトとして作成して、後で設定を変えていましたが、こちらの方法のほうが簡単です)

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の作成

app/WEB-INF/jsp/helloWorld.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="Shift_JIS"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
<s:roperty value="message"/>
</body>
</html>

ほとんど素のJSPですが、Struts2のtaglibを使用しています。
の部分にメッセージを差し込みます。

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>

Struts2servletではなくfilterとして登録します。
このファイルで重要なのはactionPackagesの値です。ここにActionクラスがあるパッケージを指定することで、Actionごとの定義を省略することができます。
ちなみに、パッケージはカンマ区切りで複数指定することができます。

実行

Tomcatを起動し、http:/localhost:080/Struts2Sample/helloWorldにアクセスすると、画面に

Hello World!

と表示されます。