Struts2入門(2023年最新版)

## はじめに
お疲れ様です！ @Keichan_15 です。

業務の関係上Struts2を勉強する機会があったんですが、導入に際して参考となる資料が古いモノばかりでかなり時間を要しました。 ~~レガシー is レガシー~~
今後Struts2を導入してWebアプリケーション開発を行う方々の助けになればと思い、こちらの記事執筆に至ります。


ちなみに、Struts2の導入でおそらく一番有名であろう記事は[こちら](https://qiita.com/tarosa0001/items/889faa2ab5853005f26b)ではないかなと。

https://qiita.com/tarosa0001/items/889faa2ab5853005f26b

実は私も参考にしてたのですが、何せ5年前の内容なので今のバージョンと比較すると所々違う箇所があるんですよね…。手探り状態で何とか導入できたのでその備忘録です。

という訳で `Hello World` を出力できるまでを目標に行っていきましょう！

## eclipse導入
今回使用する統合開発環境は **eclipse** になります。 ~~筆者はVSCodeしか勝たんニキ~~
お馴染みですね。Java好きには。

https://mergedoc.osdn.jp/

上記サイトより日本語版eclipseを導入します。
`Pleiades All in One ダウンロード` の **Eclipse 2023** を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/effd78f7-9d8e-643c-e207-0eeb2303daf8.png)

続いて今回はJavaを使用するため、JavaのEditionを選択してください。OSによってダウンロードボタンが異なりますのでそちらはご注意を。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/c353ebf8-f788-56e3-f03e-f26940436856.png)

exeがダウンロードできると思いますので、こちらはよしなにセットアップして頂ければ大丈夫です。

ちなみにexeはzip化された状態でダウンロードされます。そのままそのzipファイルを開くとeclipse側でzipファイルを解凍してくれます。
以下のような感じです。 ~~解凍直後に撮ったので中途半端~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/85692ee4-fa6a-02d6-4658-46456ca2c5aa.png)

解凍が完了したらeclipseを起動してください。以下の画面が出ればeclipseの導入は完了です！

ちなみに左上のタグ部分に `パッケージ・エクスプローラー` と `プロジェクト・エクスプローラー` が選択できる箇所があります。

これは **プロジェクト・エクスプローラー** にしておいてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/32e1f3f0-e2d1-d755-5849-6abe1ca1c3fa.png)

ちなみにeclipseのバージョンは `4.27.0` でした。ここは誤差の範囲なので気にしなくて大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/14f46267-6034-7417-5534-3d7f18a9e833.png)

## プロジェクトの作成
続いてプロジェクトを作成します。この流れに関しては冒頭で紹介した [こちら](https://qiita.com/tarosa0001/items/889faa2ab5853005f26b#21-eclipse%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90) の `2.1. Eclipseプロジェクトの作成` を確認して頂ければ特段問題有りません。 
動的Webプロジェクトの作成から始めて下さい。

ただ、進めていくと若干表記が異なる箇所が存在していると思います。
よってここからの説明は、上記の記事執筆当時のバージョン(4.4)と現バージョン(4.27.0)で **差異が起きている箇所のみ** 列挙していきます。

記事の本文を引用という形で記載し、その下に現バージョンでの画面表記・変更方法を記載しますので、比較しながら見進めていくことをおススメします。

### 2.1. Eclipseプロジェクトの作成

#### 差異①
> ③フォルダーの追加で「resources」フォルダを追加して次へ進みます。

記事中では `ビルド・パス上のソース・フォルダー`は `src` となっていますが、現バージョンでは **`src\main\java`** に表記が変わっています。現段階では特にこれといって変更する必要はありませんが念のため。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/8946dfe8-0ba6-c334-3e89-d2652c9795b9.png)

#### 差異②
> web.xmlデプロイメント記述子の生成にチェック入れ、完了します。


web.xmlデプロイメント記述子の生成にチェックを入れるのは変わらないのですが、おそらく `コンテンツ・ディレクトリー` のデフォルトは **`src/main/webapp`** になっていると思います。
私はここを `WebContent` に変更し、記事と同様のディレクトリ構成にしました。

ただこちらのディレクトリ構成はデフォルトのままでも問題無いです。Struts2の参考となる資料や記事のディレクトリ構成がこの `WebContent` のバージョンが多く、感覚的に分かりやすいといった話ですね。

ちなみに、コンテキスト・ルートが `Struts2` となっていますが、これはプロジェクト作成時の名前を `Struts2` に **オリジナルで命名** したからです。記事通りであれば ``Struts2HelloWorld`` になっているはず。。 ~~シンプルに名前が長かったので省略した~~

- 変更前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/fcc9e40a-8fa9-19c3-e8c9-4de670470791.png)
- 変更後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/21deb065-8024-66fb-0e74-bed8deecd35e.png)

これでプロジェクト作成は完了です！次にStrutsの導入をしていきます。

## Strutsの導入
[こちら](https://struts.apache.org/download.cgi) からStrutsをダウンロードできます。

https://struts.apache.org/download.cgi

本記事執筆時点での最新版は **``2.5.30``** でした。
ちなみに一番上に `6.1.2` とあり、説明にも、
> Struts 6.1.2 is the "best available" version of Struts in the 2.5 series.

と書いているのですが、 **今回は選びません。** **2.5.30** を選んでください。別途調査はする予定。動くなら安定版の方が良いとは思うんですけど。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/ac5c6025-cf03-4339-f764-029da38d0229.png)

``Struts 2.5.30`` の `struts-2.5.30-all.zip` を選択してStrutsをダウンロードすれば、後の流れは記事と同様です。おそらく [ここ](https://qiita.com/tarosa0001/items/889faa2ab5853005f26b#221-struts2%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89) 辺りからがStruts導入の章だと思います。

ちなみにここに関しても記事と現バージョンで差異あります。ありまくりです。
同様に以下列挙していきます。

### 2.2.1. Struts2のダウンロード
#### 差異①
> 「log4j-core-2.9.1.jar」を別にダウンロードしておいてください。

**これはどこからダウンロードするのか問題** 。そうなんです。書いてないんですよね（笑）

結論、**Maven repositoryから引っ張ってこれる** ようです。リンクは [こちら](https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core/2.12.4) です。

まず、`log4j-core-○.○.○.jar` についてですが、本記事で紹介したStruts2.5.30をダウンロードした場合、`lib`に格納されている log4j-apiのjarのバージョンは **``2.12.4``** になるはずです。
ここまでくるとシンプルで、後は`log4j-core-○.○.○.jar`の○の部分に2.12.4を入れて検索すると、Maven Repoちゃんが出てきてくれるって内容ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/f6ab155b-acc6-a12b-9eef-70dbc8ea0f73.png)

こちらのサイト内にある表の真ん中あたりに `Files` という項目があると思います。こちらのjarファイルをダウンロードすればOKです。

ダウンロードした `log4j-core-○.○.○.jar` がlibの `log4j-api-○.○.○.jar` の数字と一致しているかどうかを確認してください。

以下、Struts2.5.30をダウンロードした場合のjarファイルを表にまとめておきました。不足のjarファイルはMaven repositoryのリンクを備考に添付しています。ご参照ください。

後は元記事同様、以下のjarファイルを `WebContent/WEB-INF/lib` にぶち込みます。

| File Name | 備考 |
|:-:|:-:|
|commons-fileupload-1.4.jar|   |
|commons-io-2.6.jar|   |
|commons-lang-2.4.jar|   |
|commons-lang3-3.8.1.jar|   |
|commons-logging-1.2.jar|   |
|freemarker-2.3.31.jar|   |
|javassist-3.20.0-GA.jar|   |
|log4j-api-2.12.4.jar|   |
|log4j-core-2.12.4.jar| [repository link](https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core/2.12.4)|
|ognl-3.1.29.jar|   |
|struts2-core-2.5.30.jar|   |
|xmlpull-1.1.3.1.jar|   |
|xpp3_min-1.1.4c.jar|[repository link](https://mvnrepository.com/artifact/xpp3/xpp3_min/1.1.4c)|
|xstream-1.4.17.jar	||

ライブラリの配置が完了したら、次は設定ファイルの配置に移りましょう。

## 設定ファイル配置
`struts.xml`と`log4j2.xml`の記載は[元記事](https://qiita.com/tarosa0001/items/889faa2ab5853005f26b#223-%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E9%85%8D%E7%BD%AE)と同様です。コピペ用に以下に各ファイルのコードを記載します。

```xml: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>
    <package name="default" extends="struts-default">
        <action name="hello" class="sample.HelloWorldAction" method="execute">
            <result name="success">/view/sample/HelloWorld.jsp</result>
        </action>
    </package>
</struts>
```
```xml:log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<Configuration status="off">
    <Appenders>
        <Console name="STDOUT" target="SYSTEM_OUT">
            <PatternLayout>
                <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}], %-5p, %t, %c, %m%n</pattern>
            </PatternLayout>
        </Console>
        <RollingFile name="FILE" fileName="./log/appLog.log" filePattern="appLog-%d{yyyy-MM-dd}-%i.log">
            <TimeBasedTriggeringPolicy />
<!--            <SizeBasedTriggeringPolicy size="100MB" /> -->
            <DefaultRolloverStrategy max="3"/>
        </RollingFile>
    </Appenders>

    <Loggers>
        <Root level="DEBUG">
            <AppenderRef ref="STDOUT" level="INFO"/>
<!--            <AppenderRef ref="FILE" /> -->
        </Root>
    </Loggers>
</Configuration>
```
また、元記事では軽く触れている以下の `struts.properties` についても掲載しておきます。
>これは必要ありませんが、「struts.properties」というファイルを同フォルダに配置し、「struts.ui.theme=simple」と記載しておくとStruts2による自動スタイルシートタグ生成が抑制できるので便利です。

```properties:struts.properties
struts.ui.theme=simple
```

### 構成(現時点)

```
★Application root(Struts2)
├─.settings
├─build
│  └─classes ※resourcesに作成したものが自動生成される
│          log4j2.xml
│          struts.properties
│          struts.xml
│
├─resources
│      log4j2.xml
│      struts.properties
│      struts.xml
│
├─src
│  └─main
│      └─java
│
└─WebContent
    ├─META-INF
    │     MANIFEST.MF
    │
    ├─WEB-INF
    │  │  web.xml
    │  │ 
    │  └─lib
    │            commons-fileupload-1.4.jar	
    │            commons-io-2.6.jar	
    │            commons-lang-2.4.jar	
    │            commons-lang3-3.8.1.jar	
    │            commons-logging-1.2.jar	
    │            freemarker-2.3.31.jar	
    │            javassist-3.20.0-GA.jar	
    │            log4j-api-2.12.4.jar	
    │            log4j-core-2.12.4.jar
    │            ognl-3.1.29.jar	
    │            xmlpull-1.1.3.1.jar	
    │            xpp3_min-1.1.4c.jar
    │            xstream-1.4.17.jar
    │
    │  .classpath
    │  .project
```

## Topページ作成 & Action実装
Topページである `index.jsp` については[元記事]()通りに進めていけば問題無いです。

```jsp:index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Struts2でHelloWorld</title>
    </head>
    <body>
        <s:form action="hello">
            <s:textfield name="name" />
            <s:submit value="HelloWorldページへ行く" />
        </s:form>
    </body>
</html>
```
問題は次のAction実装です。
元記事では `src` 配下に `HelloWorldAction` を置くと書いていますが、現行バージョンでクラスファイルを作成すると以下のような画面が表示されます。
ソース・フォルダのデフォルト参照先が `Application root/src/main/java` になっているんですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/aabfeefa-5414-e11d-19b9-7c96e14b561f.png)

ここで僕は躓きました。
記事であれば `Application root/src` になっているので、クラスファイルの配置先を `src` 配下に置くようにソース・フォルダーを弄ったんですよね。これが間違いで一生アクションを呼び出せない現象に陥りました。

ここは **デフォルトのソースフォルダーで問題無し** `Application root/src/main/java` です！
以下のような感じ～。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/6f5f5d14-f561-f3a8-fe93-c22d987b91f2.png)

作成に成功すると `build/classes/sample` に `HelloWorldAction.class` が生成されます。

ちなみに ``HelloWorldAction.java`` は元記事と記述に差異はありません。

```java:HelloWorldAction.java
package sample;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class HelloWorldAction {

    private Logger logger = LogManager.getLogger(HelloWorldAction.class);
    private String name;

    public String execute() {
        logger.info("入力されたパラメータは「{}」です。", name);
        return "success";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
```

## 遷移先実装
こちらも元記事と… (以下略
```jsp:HelloWorld.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Hello Struts2 world!</title>
    </head>
    <body>
        Hello Struts2 world, <s:property value="name" />さん
    </body>
</html>
```

## アプリケーション設定更新
この辺りも特に差異有りません。
```xml:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    id="WebApp_ID" version="3.1">
    <display-name>Struts2HelloWorld</display-name>
    
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
```

## 最終ツリー
最終的なディレクトリ構造は以下になります。
まあまあ変わってる…？これは分からん。

```
★Application root(Struts2)
├─.settings
├─build
│  └─classes ※resourcesに作成したものが自動生成される
│      │    log4j2.xml
│      │    struts.properties
│      │    struts.xml
│      │
│      └─sample ※src/main/javaで作成されたものが自動生成される
│            HelloWorldAction.class
│
├─resources
│      log4j2.xml
│      struts.properties
│      struts.xml
│
├─src
│  └─main
│      └─java
│          └─sample
│                HelloWorldAction.java
│
└─WebContent
    ├─META-INF
    │     MANIFEST.MF
    │
    ├─WEB-INF
    │  │  web.xml
    │  │ 
    │  └─lib
    │            commons-fileupload-1.4.jar	
    │            commons-io-2.6.jar	
    │            commons-lang-2.4.jar	
    │            commons-lang3-3.8.1.jar	
    │            commons-logging-1.2.jar	
    │            freemarker-2.3.31.jar	
    │            javassist-3.20.0-GA.jar	
    │            log4j-api-2.12.4.jar	
    │            log4j-core-2.12.4.jar
    │            ognl-3.1.29.jar	
    │            xmlpull-1.1.3.1.jar	
    │            xpp3_min-1.1.4c.jar
    │            xstream-1.4.17.jar
    │
    │  index.jsp
    │  .classpath
    │  .project
```

これで実装と各種諸々の設定が終わりました。お疲れ様です。

## Tomcat導入
サーブレットコンテナであるTomcatのPluginを導入します。今回はEclipseマーケットプレースからぶち込みます。
`ヘルプ > Eclipseマーケットプレース` を選択します。

検索欄に `tomcat` と入力すると、 `Eclipse Tomcat Plugin 9.1.4` が出てきます。
こちらをインストールしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/e370f647-ce16-8de6-da0c-43dc103fb079.png)

ライセンスに同意して `完了` をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/942d744d-1aea-7684-2d6e-47a86bf8ad33.png)

再起動が入るので `今すぐ再起動` をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/981f4052-f4ff-d8a6-a8a9-ebb14bc2df98.png)

これで導入が完了しました。続きは [元記事](https://qiita.com/tarosa0001/items/889faa2ab5853005f26b#41-tomcat%E3%81%AE%E6%BA%96%E5%82%99) 通りに進めていけばOKなのですが、以下の点だけ現バージョンと違いがあるので補足します。

> ②表示されたサーバー・ビューの余白を右クリック ＞ 新規 ＞ サーバーを選択し、新規サーバーダイアログを表示します。
「Tomcat v8.0 サーバー」を選択し、次へ進みます。

まずは手順通り、サーバービューの余白 右クリック ＞ 新規を選択すると、以下の画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/d2eb0ee0-0d1d-4e88-e511-1297bcef6b91.png)

数あるフォルダの内、Tomcatサーバーが格納されているフォルダは `Apache` になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/47cf064c-a068-a702-af06-8f8e10a37034.png)

次に、記事中では `Tomcat v8.0` を選択していますが、v8.0は元記事のようなリソース遷移画面では無くなっており、以下のような画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/e8accced-4d33-5c03-005a-eb049dfa4b32.png)

色々試してみたところ、 **v8.5** を選択すると記事のようなリソース遷移画面が表示される & 問題無くTomcatが起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/83662e7a-a92a-71f2-37ed-4e68c07a4a39.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/047c9f62-8b27-aa5c-bd9d-fc1220209245.png)

以下のように `localhostのTomcat8(Java8)` が追加されていると完璧です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/ece5e57b-49e0-a62c-b342-a61ad3d43d71.png)

あとは起動確認して頂ければ…！
`http://localhost:8080/Struts2/`(自分の場合) に接続して以下のような画面が表示されればOKです！お疲れ様でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/89ab89a7-f0a0-6dbc-609c-e5eb0043f6fd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/520b41a6-d495-3068-ac2c-3e7ebc7c108c.png)

## 参考資料

https://qiita.com/tarosa0001/items/889faa2ab5853005f26b

## おわりに
参考資料が少な過ぎて難を極めたStruts2導入でした。
せっかくなのでSpring frameworkも触りたいですね。
それではまた！！:v: