2009年6月9日火曜日

Struts2.1を使ってみる。単純に表示するだけの例

http://struts.apache.org/2.1.2/index.html

struts2で検索すると、解説ページは出てくるんですが肝心のダウンロード先がすぐわからないんで、真っ先に書いておきますw
まず、本家のURLを提示してくれよ。解説はいいからさ。
現時点では2.1.6が最新のようですので、

http://struts.apache.org/download.cgi
こちらから
struts-2.1.6-all.zipをダウンロードします。
allなんでソースとかサンプルとかドキュメントとかいろいろ入ってると思います。

eclipseのwtpで一番単純な表示するだけの機能を作ってみました。

1 wtpの動的Webプロジェクトを作成。

とりあえずapp1という名前のプロジェクトを作成してみました。

2 必要ライブラリを配置。
app1/WebContent/WEB-INF/libにライブラリを配置します。解凍したファイルに入ってます。
とりあえ以下を入れてみます。今のところ使わなさそうなのも入ってますが。

commons-fileupload-1.2.1.jar
commons-loggin-1.0.4.jar
freemaker-2.3.13.jar
ognl-2.6.11.jar
struts2-convention-plugin-2.1.6.jar
struts2-core-2.1.6.jar
xwork-2.1.2.jar

ビルドパスの設定でこれらのライブラリを追加しておきます。

3 web.xmlの変更
app1/WebContent/WEB-INF/web.xmlを修正します。
以下を追加します。
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

struts2自体はfilterとして動くのでその設定ですね。
2.1からは
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

を使用するようなんですが、これ使うと日本語が文字化けしちゃうんですよね。無理やり文字化けしないようにも出来ないことはないですが面倒くさいのでorg.apache.struts2.dispatcher.FilterDispatcherを使ってます。2.1からは非推奨のようですが特段問題はありません。


4 struts.xmlの追加

設定の記述量が少なくなると言っても最低限の設定は必要ですので、struts.xmlを作成します。
app1/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>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
   
<constant name="struts.devMode" value="false" />
</struts>

struts.enable.DynamicMethodInvocationはアクション名!メソッドという形式のURLでのメソッド実行を有効にするかどうか。
struts.devModeは開発モードでtrueの場合はデバック用のインターセプターとかが有効になるようです。

5 アクションクラスの作成

srcにnet.ukauka.lab.action.test.HelloAction.javaを作成します。
こんな感じです。
package net.ukauka.lab.action.test;

public class HelloAction {
public String message;

private static final long serialVersionUID = 1L;

public String execute() throws Exception {
this.message = "<strong>こんにちは!</strong>";
return "success";
}
}

これで
http://localhost:8080/app1/test/hello.action というURLへのアクセスでこのアクションが実行されるようになります。
で呼ばれます。

これはパッケージ名から判断されます。actionという部分の下のパッケージ名が対応します。

action.test.HelloActionなので/test/hello.actionになります。

アクションクラス自体はPOJOってやつです。特になにも継承したりしません。
このサンプルでは単純にmessageという変数に値を設定して、リターンコードを返すだけです。このリターンコードに対応したviewが表示されます。

6 ビューの作成

ビューはとりあえずjspで作成します。(他にもfreemakerとかvelocityとかのテンプレートも使えるようですがよく知らないので。)

app1/WebContent/WEB-INF/content/test/hello.jsp を作成します。

WEB-INF/content/test以下が参照されるのはアクションクラスのパッケージ構造に対応しています。

WEB-INF/content 以下からビュー用のファイルを探すのがデフォルトになっています。

まぁ、この辺は設定で変えられるようですがこの構造で覚えときゃいいかなと思ってます。

hello.jspは以下のような感じです。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
<h1>単純に表示するだけ</h1>
1 <s:property value="message" /><br/>
2 ${message}
</body>
</html>

表示はs:propertyを使えば表示できます。これはhtmlエンコードをやってくれますんで、< を &lt;とかに変換してくれます。
${}の場合はそのまんま表示されます。

7 実行
サーバーを起動してhttp://localhost:8080/app1/test/hello.actionをブラウザで見てみると
<html>
<body>
<h1>単純に表示するだけ</h1>
1 &lt;strong&gt;こんにちは!&lt;/strong&gt;<br/>
2 <strong>こんにちは!</strong>
</body>
</html>

と表示されます。

hello.actionなのでhelloActionが実行されて、hello.jspが表示される。という流れになっています。アクションクラスでsuccessという文字コードを返してますがこいつで表示するビューを指定することが出来ます。ちょっとややこしいですが、ビューは以下のような感じで探すようです。

successがリターンコードの場合。

1 hello-success.jsp
2 hello.jsp
3 hello-success.vm
4 hello.vm
5 hello-success.ftl
6 hello.ftl

今回は1のファイルは用意されていないので2が採用されたってことになります。

0 件のコメント:

コメントを投稿