ラベル Struts2 の投稿を表示しています。 すべての投稿を表示
ラベル Struts2 の投稿を表示しています。 すべての投稿を表示

2012年2月11日土曜日

Struts2(Tiles その2 拡張)

こんにちは, 前回に引き続いて, Struts2 のtilesです。

Struts2(tiles) では, ライブラリや, 設定についてでした。今回は, テンプレートをつくって, 同じテンプレートを拡張して, 他のページをつくることについてです。


1. テンプレートの作成

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<!DOCTYPE html>
<html>
<head>
<title><tiles:insertAttribute name="title"/></title>
<tiles:insertAttribute name="script" />
</head>
<div id="container">
<div id="head">
<tiles:insertAttribute name="head" />
</div>
<div id="content">
<tiles:insertAttribute name="body" />
</div>
<div id="foot">
<tiles:insertAttribute name="footer" />
</div>
</div>
</html>

前回に引き続き, 1段組のレイアウトです。さらに JavaScript ようのtiles を入れました。

2. tiles.xml の設定


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd ">
<tiles-definitions>
<definition name="index" template="/WEB-INF/jsps/index.jsp">
<put-attribute name="title" value="Resource Editor"/>
<put-attribute name="script" value="/WEB-INF/jsps/scripts.jsp"/>
<put-attribute name="head" value="/WEB-INF/jsps/header.jsp"/>
<put-attribute name="body" value="/WEB-INF/jsps/main.jsp"/>
<put-attribute name="footer" value="/WEB-INF/jsps/footer.jsp"/>
    </definition>
   
    <definition name="product" extends="index">
<put-attribute name="script" value="/WEB-INF/jsps/product/scripts.jsp"/>
<put-attribute name="body" value="/WEB-INF/jsps/product/product.jsp"/>
</definition>

<definition name="files" extends="index">
<put-attribute name="script" value="/WEB-INF/jsps/files/scripts.jsp"/>
<put-attribute name="body" value="/WEB-INF/jsps/files/files.jsp"/>
</definition>
</tiles-definitions>

tiles の設定です。 今回, index というテンプレートをつくりました。その上で, そのindex のページ要素をりようしつつ. パーツを少し変更したものを使う  product と files というページを作りました。


<definition name="product" extends="index">  ここで, extends というキーワードを使い, index と
を拡張しますよという意味を加えます。

products では, index の要素を使いつつ, script と body のところは独自のものを使いたいという設定を書いています。

このように, Java のクラスの拡張のように, ページを作っておいて, 一部をoverride するようなことがtiles ではできるわけです。






















2012年2月5日日曜日

Struts2(Tiles)

こんにちは, 今回は, Struts2で, header, body, footer などにWebページを tile のようにわけて, 全体のレイアウトをつくり, そこへ各部分へ JSPを入れるという tiles プラグインを利用します。

以下のWebページがすばらしいサンプルを提供してくれています。
Struts2 Tiles Example


1. Tilesに必要なライブラリ
2. web.xmlの設定
3. struts.xmlの設定
4. tiles.xml の設定
5. jsp の準備
6. Actionの設定(再び struts.xml)


1.  Tiles に必要なライブラリ
Tilesを利用するのに, 追加すべき jar ファイルは以下です( Struts2.3.1 の場合)
struts2-core-2.3.1.2.jar
struts2-dojo-plugin-2.3.1.2.jar
struts2-tiles-plugin-2.3.1.2.jar
tiles-api-2.0.6.jar
tiles-jsp-2.0.6.jar
commons-beanutils-1.7.0.jar
commons-digester-2.0.jar


Struts2そのものにつきましては, 筆者のほかのブログGoogle App Engine(Struts2 との連携)
を参考にしてください

2. web.xmlの設定

tiles 用にListener を追加します


<listener> 
<listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
</listener>


3. struts.xmlの設定


tiles用に, result-type を追加します


<result-types>
<result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
</result-types>



4. tiles.xml の設定


tilesで利用するページの設定を書きます


WEB-INF  以下にtiles.xml というファイルを作ります


今回は, index.jsp という枠をつくり, その中に, title, header, body, footer という一段組みのレイアウトを作る例を紹介します



<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd ">
<tiles-definitions>
<definition name="index" template="/WEB-INF/jsps/index.jsp">
<put-attribute name="title" value="Resource Editor"/>
<put-attribute name="head" value="/WEB-INF/jsps/header.jsp"/>
<put-attribute name="body" value="/WEB-INF/jsps/main.jsp"/>
<put-attribute name="footer" value="/WEB-INF/jsps/footer.jsp"/>
    </definition>
</tiles-definitions>


ファイルでは, <tiles-definitions> のなかに, <definition> を, tile を1つ作るたびに増やします。
template というところに, 実際に使うテンプレート(JSPを挿入していく枠)をつくります。

ここでは, index.jsp が表示するページであり, 枠です。

その中に, <put-attribute> で, 挿入していくJSPを書いていきます。
これで, index.jsp には, header.jsp, main.jsp, footer.jsp を挿入できる準備ができました。

5. jsp の準備


4までで, 使う jsp の準備が整いました。しかし, 実際にテンプレートとなるところで, 挿入する位置を
指定しなければなりません。 それでは, まずテンプレートです。

ex ) index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<!DOCTYPE html>
<html>
<head>
<title><tiles:insertAttribute name="title"/></title>
<link rel="stylesheet" href="styles/index.css" type="text/css" />
</head>
<div id="container">
<div id="head">
<tiles:insertAttribute name="head" />
</div>
<div id="content">
<tiles:insertAttribute name="body" />
</div>
<div id="foot">
<tiles:insertAttribute name="footer" />
</div>
</div>
</html>


重要なところは, taglib で, tiles を利用するために設定をいれること
tiles.xml で定義したtile を tiles:insertAttribute でいれるところです。
これで1段組のレイアウトができました。(CSSは省略)

ex) header.jsp

<h1>
Header
</h1>

ex) footer.jsp

<hr>
<b>
Footer
</b>

ex) main.jsp



<div class="imglist">
<div class="imagecaption">
<a href="/index"><p><img src="img/product.png"/></p></a>
<p class="menu_title">Product</p>
</div>
<div class="imagecaption">
<a href="/index"><p><img src="img/file.png"/></p></a>
<p class="menu_title">File</p>
</div>
<div class="imagecaption">
<a href="/index"><p><img  src="img/pencil.png"/></p></a>
<p class="menu_title">Resources</p>
</div>
</div>


6. Actionの設定(再び struts.xml)

最後に, tilesを利用した場合に, index.jsp を表示させるための設定を struts.xml にします


<action name="index"
class="com.daiji110.resourceeditor.web.action.IndexAction">
<result name="index" type="tiles">index</result>
</action>


重要なところは, type に tilesというのを指定しています表示するjsp のところでは, tiles.xml で指定したtemplate の名前 index を入れている


これがActionです。 indexというターゲットに処理をお返ししています。


package com.daiji110.resourceeditor.web.action;

import com.opensymphony.xwork2.ActionSupport;

public class IndexAction extends ActionSupport
{
private static String RESULT = "index";

@Override
public String execute() throws Exception
{
return RESULT;
}

}


以上で終わりです。header, footer, menu など共通する部分をつくっておき, template, body を
ページごとに作るといった作業をしていくわけです。




















































2012年1月21日土曜日

Google App Engine(Struts2 との連携)

Google App Engine で, Struts2を利用する方法についてです。
調べましたところ, 以下の2つの記事が秀逸です。参考にさせていただきました。


http://knowledge.sorich.jp/?Google%20App%20Engine%2FStruts2%E3%81%AE%E9%80%A3%E6%90%BA

http://whyjava.wordpress.com/2009/08/30/creating-struts2-application-on-google-app-engine-gae/

●環境
-  Windows 7
-  Eclipse 3.7
-  Google App Engine
-  Struts2(2.3.1.1)

●手順
1.  Struts2のlib の準備
2.  web.xml の記述
3.  実際のプログラムを書く
4.  struts.xml の設定

今回のフォルダ構成です(一部省略)
Struts2AppEngine (プロジェクト名)
| - war
      | - WEB-INF
                | -  lib  :  ここにstruts2の必要な.jar を入れる
                | - classes   :   ここにclassや, struts.xml を入れる
ソースファイル
HelloAction.java
OgnlListener.java

※重要なのは, struts.xml を classes のところにいれることくらいです

1.  Struts2のlib の準備
以下のlib を /war/WEB-INF/lib 以下に加え,
Build Pathに追加する

commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
commons-lang-2.5.jar
commons-logging-1.1.1.jar
freemarker-2.3.18.jar
javassist-3.11.0.GA.jar
ognl-3.0.3.jar
struts2-core-2.3.1.1.jar
struts2-dojo-plugin-2.3.1.1.jar
xwork-core-2.3.1.1jar

2. web.xml の記述

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">

   <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
   </filter>
   
   <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
   </filter-mapping>


   <listener>
<listener-class>com.appspot.struts2.listener.OgnlListener</listener-class>
   </listener>
</web-app>


上の方に書いてあるのが, struts2用の設定です。
さて重要なので, 下のやつ, OgnlListner という  リスナを追加しています。リスナの説明は後程

3.  実際のプログラム


ex) Action クラス
package com.appspot.struts2.action;

import com.opensymphony.xwork2.ActionSupport;

public class HelloAction extends ActionSupport
{
private static String HELLO = "hello";

public String execute()
{
return HELLO;
}
}


Struts2のAction です。  ActionSupport を拡張して, ただ単に, hello というresult に返すだけです。

ex)  リスナ

package com.appspot.struts2.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import ognl.OgnlRuntime;

public class OgnlListener implements ServletContextListener
{

@Override
public void contextDestroyed(ServletContextEvent arg0)
{

}

@Override
public void contextInitialized(ServletContextEvent arg0)
{
OgnlRuntime.setSecurityManager(null);
}

}

このリスナは, セキュリティマネジャーをOFFにする設定を書いています。
サーブレットが立ち上がる時に, このセキュリティマネジャーをOFFにする必要が
あります。App Engine ではこれが必要になります。

ex)  結果表示用

<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head><title>Hello</title></head>
<body>
<h1>Hello!</h1>
</body>
</html>

4.  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">

<!-- START SNIPPET: xworkSample -->
<struts>

<package name="default" extends="struts-default">
<action name="hello"
           class="com.appspot.struts2.action.HelloAction">
            <result name="hello">/WEB-INF/success.jsp</result>
        </action>
</package>
</struts>

とくに普通のstrurts2の設定と変わりません。


これで設定は終了です。
このアプリケーションを立ち上げて

http://localhost:8888/hello   にアクセスすると, Hello! というタイトルが出ます。

特殊な部分は, リスナを使って, セキュリティマネジャーをOFFにするという操作が必要なだけですね。

2012年1月19日木曜日

Struts2(BeanとActionの分離)

Struts1 では, Action に相当するクラスと, データであるBean をActionFormのimplements で実装し, struts-config.xml に<form-bean>として定義しました。

Struts2 では,  ActionSupport の拡張クラスつまり, Actionの中に, Beanも定義できました。
しかし, データとActionは別のクラスとして, 実装しておいた方が, 見やすいといったこともあるでしょう。

Struts2のWebページには, そのようなサンプルがのっています。それを動作サンプルとして構成してみました。

簡単なフォルダ構成です
- Struts2Sample
| - web
|      | -  nameform.jsp   :   入力用フォーム
| - WEB-INF
       | -  classes
       |        | - struts.xml
       | - jsp
             | - person.jsp   :   結果の表示

ソースファイルなどのパスは省略
PersonAction.java       :   Action用
Person.java                 :   Form の Bean用

用意するもの
-  設定ファイル
-  Actionクラス
-  Bean(Formのデータを入れる)
-  入力フォーム JSP
-  結果の出力 JSP


●設定ファイル struts.xml   Action の登録をします

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts SYSTEM "http://struts.apache.org/dtds/struts-2.0.dtd" PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN">
<struts>
<package name="default" extends="struts-default">
  <action name="registerbean" class="com.atmarkplant.struts2.action.PersonAction"> <result name="success">/WEB-INF/jsp/person.jsp</result>
  </action>
   </package>
</struts>

●Action(PersonAction.java)
ActionSupport を拡張します。 PersonクラスというBeanのインスタンスを
入れておきます。変数はこれだけです。getter/setterも用意します。
  

package com.atmarkplant.struts2.action;

import com.atmarkplant.struts2.bean.Person;
import com.opensymphony.xwork2.ActionSupport;

public class PersonAction extends ActionSupport
{
private Person personBean;

       @Override
public String execute() throws Exception
{
return "success";
}
public Person getPersonBean()
{
return personBean;
}
public void setPersonBean(Person personBean)
{
this.personBean = personBean;
}

}


● Bean  (Person.java)
必要なデータをここで定義します。Formから得られる値を格納するためのものです
ここでもgetter/setterを用意しました。

package com.atmarkplant.struts2.bean;

import java.io.Serializable;

public class Person implements Serializable
{
private static final long serialVersionUID = -4873617641500115092L;

private String firstName;

private String lastName;

private String email;

private int age;

public String getFirstName()
{
return firstName;
}

public void setFirstName(String firstName)
{
this.firstName = firstName;
}

public String getLastName()
{
return lastName;
}

public void setLastName(String lastName)
{
this.lastName = lastName;
}

public String getEmail()
{
return email;
}

public void setEmail(String email)
{
this.email = email;
}

public int getAge()
{
return age;
}

public void setAge(int age)
{
this.age = age;
}

public String toString()
{
return "First Name: " + getFirstName() + " Last Name: " + getLastName() +
" Email: " + getEmail() + " Age: " + getAge();
}
}


●入力フォーム JSP(nameform.jsp)
普通のJSPです。ただし, name 属性のところにActionで使う変数名.Beanのフィールド名
という形でいれておきます。これでForm に値をいれて, Actionに飛ばすと, Actionの中のBean
のフィールドに1つ1つ入っていくわけです。(もちろん型を合わせなければなりません)


<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Register</title>
</head>
<body>
<h1>Register for a prize by completing this form</h1>
<s:form action="registerbean">
  <s:textfield name="personBean.firstName" label="First name" />
  <s:textfield name="personBean.lastName" label="Last name" />
  <s:textfield name="personBean.email" label="Email" />
  <s:textfield name="personBean.age" label="Age" />
  <s:submit value="Submit"/>
</s:form>
</body>
</html>


● 結果の出力 JSP(person.jsp)
<s:property> タグで取り出します。Actionで定義した名前でそのまま出力されます
(toString()のoverrideをしたので, それが表示されます)


<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Person Results</title>
</head>
<body>
<h1>Thank you for registering for a prize.</h1>
<p>Your registration information: <s:property value="personBean" /></p>
</body>
</html>


※このように, Formで得られた値をBean へ放り込むことができます。













2011年11月27日日曜日

Struts2 ActionSupport

Struts2の開発用メモです。Strtus2を現在学習中....

※以下のサンプルは,  Struts2.2.3.1で検証しております

Struts2では,  Action が普通のクラスで実装できますが, Struts2では便利な関数などをそろえている ActionSupport というクラスがあります。それを使って簡単に様々な機能を実装することができます

Topic
• ActionSupport をextends してActionクラスをつくる
• Struts2のタグを使う
• validate()を実装して, 入力項目を検証する
• propertiesファイルを使って, エラーメッセージを表示する

まず,  ActionSupportクラスですが,   これは以下のinterface を実装しているそうです
- Action
- Validatable
- ValidationAware
- TextProvider
- LocaleProvider
- Serializable

このActionSupport をextends しても execute()で Actionを実装することに変わりありません。

public class LoginAction extends ActionSupport

早速サンプルを見ていきましょう。
今回のプロジェクトの構成は以下のとおりです。

Struts2Sample
| - src -   以下省略  LoginAction.java
| - web
|       | - login.jsp      :  入力用
|
| - WEB-INF
        | - jsp
        |      | - loginresults.jsp  :  結果表示用
        | - classes
                | - struts.xml
                | - message.properties
       
※これはあくまでサンプルなので, 実際のWebアプリのフォルダ構成ではありません。

まず入力用の JSPです。
ex) login.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Login Form</title>
</head>
<body>
<s:form action="loginForm">
  <s:textfield name="userName" label="Your name" />
  <s:password name="password" label="Password" size="10" maxlength="10"/>
  <s:submit value="Submit"/>
</s:form>
<s:if test="getFieldErrors().get('error.username') != null">
<s:property value="getFieldErrors().get('error.username')[0]"/>
</s:if>
<s:if test="getFieldErrors().get('error.password') != null">
<s:property value="getFieldErrors().get('error.password')[0]"/>
</s:if>
</body>
</html>

Struts2のタグを利用しています。1でもhtml タグがありましたね。それです。

<%@ taglib prefix="s" uri="/struts-tags" %>


Form を作っています。 textfield と passwordのフィールドをつくっています。
name属性が重要です。Struts1でも一緒でしたね。

<s:form action="loginForm">
  <s:textfield name="userName" label="Your name" />
  <s:password name="password" label="Password" size="10" maxlength="10"/>
  <s:submit value="Submit"/>
</s:form>


検証後のエラー表示用です。Actionが返してくれるエラーメッセージをここで表示させます
検証で失敗の場合この画面が再び表示されこの部分でエラーメッセージを表示させます

s:if test="getFieldErrors().get('error.username') != null">
<s:property value="getFieldErrors().get('error.username')[0]"/>
</s:if>
<s:if test="getFieldErrors().get('error.password') != null">
<s:property value="getFieldErrors().get('error.password')[0]"/>
</s:if>


ex)  LoginAction.java

package com.atmarkplant.struts2.action;

import org.apache.commons.lang.StringUtils;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport
{
private String userName;

private String password;

@Override
public String execute() throws Exception
{
return "success";
}

@Override
public void validate()
{
if ( StringUtils.isBlank(userName) )
{
addFieldError("error.username", getText("error.username"));
}
if ( StringUtils.isBlank(password) )
{
addFieldError("error.password", getText("error.password"));
}
}

public String getUserName()
{
return userName;
}

public void setUserName(String userName)
{
this.userName = userName;
}

public String getPassword()
{
return password;
}

public void setPassword(String password)
{
this.password = password;
}
}

Actionのプログラムです。Struts1では Action と ActionFormと別クラスで実装して, 動作部分とBean の部分を分離させていましたが, Strtus2では一緒になっていますね。←まだ学習でわかっていません。
先ほどのJSPで定義した入力項目のタグのname属性通りの名前でAction クラスに変数を追加します。

ActionSupport を実装しています。
executeにActionを実装しています。(sucessを返しただけです。)
name属性通りの名前で変数をつくりgetter/setterを実装しています

validate()  に, 検証項目を実装します。
今回は空欄の場合にエラーメッセージを返すようにしました。
addFieldError("error.username", getText("error.username"));

ここで, addFiledError で key(第一引数) value(第二引数)  で入力JSPに返すメッセージの定義をしました  key はJSPで取り出すときのkey, valueは 実際に表示に使うための値です。
要は,  Map にkey, value を入れているイメージです。

getText("")  ですが,  これは ResourceBundle を使ったメッセージを扱うための関数です。

ex) message.properties

error.username=User name is blank
error.password=Password is blank


リソースです

ex) 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">

<!-- START SNIPPET: xworkSample -->
<struts>
<constant name="struts.custom.i18n.resources" value="message"/>

        <package name="default" extends="struts-default">

        <action name="loginForm"
           class="com.atmarkplant.struts2.action.LoginAction">
            <result name="success">/WEB-INF/jsp/loginresults.jsp</result>
            <result name="input">/web/login.jsp</result>
        </action> 
</package>
</struts>

 設定ファイルですが, これがかなり重要な要素を含んでいます。
まず, Globalで利用する propertiesファイルの定義を書いています。
<constant name="struts.custom.i18n.resources" value="message"/>
これで message.propertiesがGlobalのリソースとして登録されました

Actionの設定では class,  success という結果表示用と
入力検証用の input というのを定義しています。

ex)  loginresults.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Login</title>
</head>
<body>
<h1>Welcome to Atmarkplant World!</h1>
User : <s:property value="userName"/>
Password: <s:property value="password"/>
</body>
</html>


 検証に成功した場合に表示されるsuccess 画面です。
<s:property> を使って, Actionクラスで使用した変数を取り出して表示しています。

プログラムの説明は以上です。
propertiesの読み込みやタグの使い方をマスターせねば。









2011年11月20日日曜日

Struts2 何もしないAction

Strutsでは,  HTML, JSP上の<form> や <a> などでaction名を設定し, そのActionを実行させるわけですが, ただのJSPファイルへのアクセスを Action経由で(しかもActionは何もしない) アクセスしたい
場合もあります。

●Struts
struts-config.xml の設定で

<action path="/actionTest"
             type="org.apache.struts.actions.ForwardAction"
            parameter="actionTest"
/>

というように, action タグの type に ForwardActionを設定することで, 何もしないActionを経由して,
JSPファイルへのアクセスを通していました。


●Struts2
struts.xmlで

<action name="simple">
    <result>/WEB-INF/jsp/simple.jsp</result>
</action>

といったように, JSPファイルへのパスをresultとして設定するだけで,  ForwardActionと同じ役割を
果たします。

これで,
http://localhost/<アプリケーション名>/simple.action

で simple.jspにアクセスできます ULRは, 上のようになっており, Action経由していることがわかります。

2011年11月13日日曜日

Struts2 スタート

最近 Struts の学習を始めました。Strutsを使ったWebアプリケーションを構築するためのメモを残しておきたいと思います。

Struts2のサンプルをつくる手順をまとめます。

環境 
Mac OS X  
Eclipse 3.7
Struts 2.2.3.1
Tomcat 7.0.21
です

1.  Struts2 をdownload   する
http://struts.apache.org
より, 最新版をダウンロードしてください いろいろ種類がありますが個人的には
Full Distribution  をお勧めします(サンプルなどいっぱいついていますので)

2. Tomcat  プロジェクトの作成
Tomcatの設定ですが筆者の別のブログTomcat7 + Eclipse をご参照ください。

3.  lib の設定
/WEB-INF/lib の中にStruts2に必要なライブラリを入れて, Build Pathに通します。
今回のサンプルに必要なライブラリは以下の通りです。(バージョンは省略します)
(いろいろWebサイトを読みましたが, それに加えていくつか必要でした)
commons-fileupload.jar
commons-io.jar
commons-lang.jar  
commons-logging.jar
freemaker.jar
javassist.jar
ognl.jar
struts2-core.jar
xwork-core.jar

これらはすべてダウンロードしたStrutsのlib 内にあります。

※Struts1 のときと違ってStrutsのlib内には大量のjar が入っています。
これらの大半はプラグインとして利用するものなので必要あるものだけを
パスに通した方がよいと考えております。

4.  web.xml  の記述(/WEB-INF/web.xml)
サーブレットの設定を書くわけですがここでは,
Strutsのフロントコントローラとして動作するフィルタ
(フィルタでリクエストをさばきます)


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0"> 
   <filter>
   <filter-name>struts2</filter-name>
   <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
   </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>


赤字の部分が必要な設定です。後はServletの設定やサンプル用のWelcomeファイルの
設定を書いただけです。

※Strtus1系ではServletでリクエストをさばいていましたが, 2系からは
フィルタでさばくようです

5.   Action  を作ります。
package com.atmarkplant.struts2.action;

public class HelloAction 
{
       public String execute()
       {
          return "hello";
       }
} 

Actionは, POJO でいいのです。Struts1系のときは Action クラスを
extend  したはず。
このプログラムは"hello" という識別子を返しているだけです
次にリクエストの結果を表示するための設定ファイルを書きます

6. 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">

<!-- START SNIPPET: xworkSample -->
<struts>
<package name="default" extends="struts-default">
<action name="hello"
           class="com.atmarkplant.struts2.action.HelloAction">
            <result name="hello">/WEB-INF/jsp/success.jsp</result>
        </action>
</package>
</struts>


これを/WEB-INF/classes 以下に配置します 名前は struts.xml です
赤字が重要な部分です。
package には適当な名前をつけておきましょう。
action タグのところに name  これは先ほど Action のクラスの完全修飾名です。
result  タグでforward するjspファイルの設定を書きます。

※Struts1系では /WEB-INF 以下でしたが 2系では, classes以下に配置します

7. 結果表示用  /WEB-INF/jsp/success.jsp の作成
とりあえず今回は何もしないので簡単なJSPにしておきましょう


<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head><title>Hello</title></head>
<body>
<h1>Hello!</h1>
</body>
</html>


これで 完成です。
http://localhost/<ProjectName>/hello.action
で表示されます(<ProjectName>  は自分のWebアプリの名前)