Zero Configuration
それでは、Struts2での最初のアプリケーションを作成してみたいと思います。
Struts2の特徴の一つに”Zero Configuration”があります。
これは、Struts1で、xml地獄と呼ばれた、一連のアクションを実行するため、
各コンポーネントを連携するために必要な設定を、xmlの設定ファイルで記述し、
その設定ファイルが膨大になってしまいがちになる短所を改善するための機構
です。
Struts1で、JSP-ActionForm-Action-JSPの連携を全てstruts-config.xmlで設定
していたものを、Struts2では、JSP-POJO-JSPの最小構成で、連携の設定を
記述することなく動作させることができます。
では具体例を見ていきましょう。
Hello World!!
例の如く、簡単なHello World!!アプリケーションを作成していきます。
ポイントを絞って説明しますので不足点あればコメント欄で質問ください。
(環境)
eclipse3.4.1(tomcatPlugin)
jdk1.6.0_02
tomcat-6.0.14
struts2.0.14
プロジェクトの作成
“動的Webプロジェクト”を選択しプロジェクトを作成します。
注)デフォルトの、classesディレクトリがWEB-INFの外にあり、そこに後述の
struts.xmlを配置しても認識されなかったので、classesは、WEB-INFの下に
設定してください。
ライブラリを配置します。struts2のファイルの中から以下をlibに配置します。
・commons-logging-1.0.4.jar
・freemarker-2.3.8.jar
・ognl-2.6.11.jar
・struts2-codebehind-plugin-2.0.14.jar
・struts2-core-2.0.14.jar
・xwork-2.0.7.jar
※codebehindプラグインが、Zero Configurationのミソで、JSPが配置されている
ディレクトリとアクション名より自動的にアクションクラス(POJOでも可)を探します。
またアクションクラス名と戻り値にて自動的にJSPファイルを探します。
Web.xml
ポイントは、Struts1と同様、フィルターおよびパターンにてリクエストをStruts2で処理
できるように設定を書いている点と、またまたZero Configurationの肝になる、
actionPackagesというパラメータ設定です。ここにパッケージ名を記述しますが、
指定したパッケージが、Webアプリケーションのトップディレクトリと同じ階層となり
JSPとアクションの自動での紐づけの対象となります。
例えば、/webapp/index.jsp の中で、”index.action”を呼び出すと、
(actionPackages).IndexAction クラスの execute メソッドを実行しようとします。
下の私の例では、com.pg2se.sample.action を指定していますので、
com.pg2se.sample.action.IndexAction#executeメソッドが呼び出されます。
※何も設定していなければ”execute”メソッドが呼び出されます。
<?xml version=”1.0″ encoding=”UTF-8″?>
<web-app id=”WebApp_ID” version=”2.4″ xmlns=”http://java.sun.com/xml/ns/j2ee” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd”>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<init-param>
<param-name>actionPackages</param-name>
<param-value>com.pg2se.sample.action</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
Struts.xml
Struts.xmlは、classesの直下に置くことで認識されます。冒頭で書いたように、
WEB-INF以下に配置しないとうまく動作しませんでしたので適宜設定を変更
してください。
※Zero Configurationで作成するため、記述は最低限の以下だけでOKです。
<?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>
<constant name=”struts.enable.DynamicMethodInvocation” value=”true” />
<constant name=”struts.devMode” value=”false” />
</struts>
index.jsp
今回は、Webアプリケーションのトップディレクトリのindex.jspにアクセスし、ボタンを
押すと、”Hello World!!”のメッセージが表示される簡単なアプリケーションにしています。
ポイントは、Struts2のタグライブラリ(プレフィックス:s)の宣言をしている点と、
Formのアクション設定に”index.action”を設定している点、プロパティ”message”を
表示している点です。最初に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>Struts2</title>
</head>
<body>
<s:form action=”index.action” theme=”simple”>
<s:property value=”message”/><br/>
<s:submit value=”メッセージ”/>
</s:form>
</body>
</html>
IndexAction.java
ここでのポイントは、パッケージの設定を、actionPackagesパラメータに
合わせている点と、Actionの実行設定をしていない際のデフォルトで実行
される、executeメソッドを実装している点と、ActionFormが無くなった
代わりに、このクラスにプロパティを設定し、executeメソッドで、プロパティ
に値をセットしている点、そしてクラスがPOJOである点です。
ここまでの設定が正しければ、JSPよりボタンが押されると、execute
メソッドが実行されるはずです。
package com.pg2se.sample.action;
public class IndexAction {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String execute() {
message = “hello world!!”;
return “success”;
}
}
最後に
Actionが実行した最後に”success”を戻り値で返していますが、今回の場合、
index-success.jspが優先で呼ばれるのですが、ファイルが存在しない場合は、
次にindex.jspが呼ばれます。(結果的に再度呼び出し元のJSPが実行される
ことになります)
この際に、今度はActionでmessageプロパティが設定されていますので、その
内容が、JSPの、
<s:property value=”message”/>
の部分で表示されます。
以上で、超簡単Struts2アプリが完成しました。
次回は、より実践的にシンプルな掲示板アプリを作成して見たいと