【超初心者向け】Struts2超入門 - 2018年版

# はじめに

レガシーという人もいるかも知れませんが、Struts2の入門編の記事です。
最近ではクライアントサイドの新しい技術も発展し、Struts2はおろか、サーバサイドの技術そのものがレガシーという人もいるかも知れません。

しかしながら、現役で動いているものにぶつかってしまったときは、どうしても理解が必要なものです。
筆者は最近そんなパターンにぶつかって、頑張って勉強しました。

HelloWorldを作ろうとした時、中々すべてをカバーする文献が見つからず苦労したので、その時の備忘を兼ねて今回の記事を執筆します。

Struts2は、レガシーと言われても、割とバージョンアップが盛んなようで、まだ新しくなり続けています。
一旦、今回の記事執筆時点で最新のバージョンを使用して、Struts2の開発環境が構築できるものを、HelloWorldを通じて紹介していきたいと思います。

# 1. Strutsとは
Javaで実装するMVCモデルを採用したWebアプリケーションフレームワークです。
MVCモデルとは、Model(データ)、View(画面)、Controller(業務ロジック)を分離して実装しようという考え方です。
ただし、Struts2にはVとCを分離する機能はあっても、MをCから分離する機能は提供されていないので、そこは別にORマッパなどを導入して実現することが多いです。

## 1.1. Struts2の生い立ち
以前、Strutsというフレームワークが存在し、一世を風靡した時代がありましたが、Struts2は根本的には別物です。
元々の開発経緯も全く別物で、「WebWork2」という名称で開発されていて、Strutsのサポート終了とともに、その名称がStruts2に変更されたというもののようです。

Struts2は現在もまだサポートが続いており、新しいバージョンも割と頻繁にリリースされています。

## 1.2. Struts2導入のメリット
少し話がそれましたが、企業システムなど、大規模なWebアプリケーションにStruts2を導入することで飛躍的に生産性が向上できます。
また、Struts2に限ったことではありませんが、フレームワークを導入することで、開発者のクセによる実装方針の違いなどを吸収し、平準化すことができます。
ただ、導入に手間がかかるので、小規模の開発には向かないと筆者は考えています。

# 2. 開発環境構築
これから、Struts2でHelloWorldを実現するための、開発環境を構築していきます。
構築方法には、3通りあります。

1. 自力で構築
2. Mavenで構築
3. 公式の空プロジェクトを使用

今回は、自力で構築します。

2は、まずMavenを勉強する必要があることと、環境によっては使用できないこともあります。
3は、使おうとしても、デフォルトの状態からエラーで起動できないので、使うくらいなら自力で構築したほうが早いです。
※個人的にはちゃんとエラーのないものを提供してほしいと思ってます…

よって、手を動かして覚えることも兼ね、自力で構築しましょう！

## 2.1. Eclipseプロジェクトの作成
筆者は基本開発には統合開発環境を使用します。
Java系の開発では基本Eclipseを使用すると思いますが、今回もEclipseを使用します。

筆者が使用している環境は「Eclipse4.4(Luna)」です。
Eclipseのバージョンは同じでなくてもできますので、読者の方々は手近なものを使用してください。

①ファイル ＞ 新規 ＞ その他 ＞ Web ＞ 動的Webプロジェクトを選択し次へ進みます。
![p1.jpg](https://qiita-image-store.s3.amazonaws.com/0/189344/a8971760-a0ca-f207-f707-3a13f63916d3.jpeg)

②次の情報を入力して次へ進みます。

|設定項目|設定値|
|:-------|:-----|
|プロジェクト名|Struts2HelloWorld<br>※プロジェクト名は自由に決めていただいて構いません|
|ターゲット・ランタイム|Tomcat8 (Java8)|
|動的webモジュールバージョン|3.1|
|構成|Tomcat8 (Java8)デフォルト構成|
![p2.jpg](https://qiita-image-store.s3.amazonaws.com/0/189344/e37dc0a3-67e5-d585-ae3d-808b98407d33.jpeg)

③フォルダーの追加で「resources」フォルダを追加して次へ進みます。
![p3.jpg](https://qiita-image-store.s3.amazonaws.com/0/189344/8ba14eae-65b6-e586-3a39-bd1b79c66c76.jpeg)

④web.xmlデプロイメント記述子の生成にチェック入れ、完了します。
![p4.jpg](https://qiita-image-store.s3.amazonaws.com/0/189344/a425a2ed-71ac-8b5f-5d4d-da4425188dbc.jpeg)

⑤次の画像のようにプロジェクトができれば、プロジェクト作成完了です。
![p5.JPG](https://qiita-image-store.s3.amazonaws.com/0/189344/71b57e53-8ffb-fc34-d1fa-7ab3f2328876.jpeg)

## 2.2. Struts2の導入
作成したプロジェクトにStruts2を導入します。

### 2.2.1. Struts2のダウンロード
[こちら](https://struts.apache.org/download.cgi)からStruts2をダウンロードします。
本記事執筆時点で最新は、「2.5.14.1」のようです。
HelloWorldでは使用しませんが、サンプルアプリケーション付きの「struts-2.5.14.1-all.zip」をダウンロードします。
また、後で必要になるので、「log4j-core-2.9.1.jar」を別にダウンロードしておいてください。
こちらでダウンロードするjarファイルは、log4j-apiとバージョンを合わせておいてください。
![p6.jpg](https://qiita-image-store.s3.amazonaws.com/0/189344/c721cb3d-646e-67b3-1b9a-056f81dbfd44.jpeg)

「struts-2.5.14.1-min-lib.zip」は最少構成でのStruts2の空プロジェクトです。
筆者の環境では、最初からエラーで起動できませんでした。
解決するのも面倒くさかったので、筆者は最初から自力で構築しましたが、こちらをうまく使えるようにできたというかたは、コメントいただけると幸いです。

### 2.2.2. 必要ライブラリの配置
プロジェクトにStruts2を導入します。
ダウンロードしたstruts-2.5.14.1-all.zipを解凍し、libフォルダから以下のjarファイルを「プロジェクトルート/Struts2HelloWorld/WebContent/WEB-INF/lib」フォルダにコピーします。

|ファイル名|備考|
|:---------|:---|
|commons-fileupload-1.3.3.jar|
|commons-io-2.5.jar|
|commons-lang-2.4.jar|
|commons-lang3-3.6.jar|
|commons-logging-1.1.3.jar|
|freemarker-2.3.26-incubating.jar|
|javassist-3.20.0-GA.jar|
|log4j-api-2.9.1.jar|
|log4j-core-2.9.1.jar|別にダウンロードしたjarファイルです。<br>log4j-apiとバージョンを合わせてください。|
|ognl-3.1.15.jar|
|struts2-core-2.5.14.1.jar|
|xmlpull-1.1.3.1.jar|
|xpp3_min-1.1.4c.jar|
|xstream-1.4.10.jar|

こちらがStruts2を動かす上での最少ライブラリ構成です。
![p7.JPG](https://qiita-image-store.s3.amazonaws.com/0/189344/377516c0-7053-4e8a-c1df-2e43f5199094.jpeg)

### 2.2.3. 設定ファイルの配置
「/Struts2HelloWorld/resources」にStruts2の設定ファイルである、「struts.xml」を作成します。

余談ですがStruts2では、ゼロコンフィギュレーションと言って、XMLによる設定ファイルはなくてもアプリケーションを実装できます。
しかし、開発者はXMLが好きなのかStruts2を導入していても、筆者が見てきたケースは大体XMLが書いてあります。
アプリケーションの設定が、このファイルだけみれば分かるという利点はあるものの、わざわざ設定ファイルを書く手間を考えれば、ないものはないに越したことはないと筆者は考えています。

特にStruts2では、冒頭でも述べたとおり、SpringやORマッパといったほかのフレームワークと組み合わせて使うことが多く、フレームワークごとにXMLによる設定ファイルが必要なので、管理すべきXMLがむちゃくちゃ増えます。
そのXML地獄から開発者を解放してくれるためのゼロコンフィギュレーションのはずですが、なぜか利用されてません(笑)

長くなりましたが、今回はより多くのケースに合わせ、設定ファイルも一緒に書きます。
コメントも一緒に記載していますが、今のところは読み飛ばしてください。
```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">
		<!-- Hello worldのサンプルアクション -->
		<action name="hello" class="sample.HelloWorldAction" method="execute">
			<result name="success">/view/sample/HelloWorld.jsp</result>
		</action>
	</package>
</struts>
```
もう一つ、ログ出力ライブラリである「log4j2」の設定ファイル「log4j2.xml」を配置します。

```xml:log4j2.xmlの記載内容(コメントの部分は任意に復活させてください)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<Configuration status="off">
	<!-- ログに使用するAppenderの設定 -->
	<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.ui.theme=simple」と記載しておくとStruts2による自動スタイルシートタグ生成が抑制できるので便利です。

## 2.3 構成の確認
ここまでで、Struts2の導入が完了しました。
結構な量の作業をしたので、構成したプロジェクトのツリーを記載します。
プロジェクトが以下のツリーになっていれば開発環境の構築は完了です。

```:プロジェクトのツリー構成
アプリケーションルート
├─src
├─resources
│      log4j2.xml
│      struts.properties
│      struts.xml
│
├─build
│  └─classes    ※ここにはソース・フォルダに配置した資材と同じものが自動で生成されます
│          log4j2.xml
│          struts.properties
│          struts.xml
└─WebContent
    ├─META-INF
    │      MANIFEST.MF
    │
    └─WEB-INF
        │  web.xml
        │
        └─lib
                commons-fileupload-1.3.3.jar
                commons-io-2.5.jar
                commons-lang-2.4.jar
                commons-lang3-3.6.jar
                commons-logging-1.1.3.jar
                freemarker-2.3.26-incubating.jar
                javassist-3.20.0-GA.jar
                log4j-api-2.9.1.jar
                log4j-core-2.9.1.jar
                ognl-3.1.15.jar
                struts2-core-2.5.14.1.jar
                xmlpull-1.1.3.1.jar
                xpp3_min-1.1.4c.jar
                xstream-1.4.10.jar
```
# 3. アプリケーションの実装
開発環境の構築ができましたので、ここからはアプリケーション本体の実装に入っていきます。

## 3.1. トップページの準備
アプリケーションアクセス時のトップページを準備します。
今回はJSPを使って実装します。

WebContentを右クリック ＞ 新規 ＞ JSPでダイアログを開きます。
ファイル名に「index.jsp」と入力して完了します。
![p8.jpg](https://qiita-image-store.s3.amazonaws.com/0/189344/ae0cdbe7-56f7-4f47-3ecb-e75ce3f5d642.jpeg)

```jsp:index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- Struts2のタグライブラリを使用可能にする -->
<%@ taglib prefix="s" uri="/struts-tags"%>
<!-- タイプ宣言はHTML5のものを使用する -->
<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Struts2でHelloWorld</title>
	</head>
	<body>
		<!-- 入力フォームはStruts2のタグを使用します -->
		<s:form action="hello">
			<s:textfield name="name" />
			<s:submit value="HelloWorldページへ行く" />
		</s:form>
	</body>
</html>
```
## 3.2. Actionの実装
Struts2において、JSPからサブミットされた際など、Webアプリケーションの処理を担うクラスをActionと呼びます。
Actionや、遷移先のページは、struts.xmlに定義しているのですが、その説明は後程行うので、現時点では、下記の通り実装してください。

srcフォルダを右クリック ＞ 新規 ＞ クラスから、次の情報を入力して完了してください。

|入力項目|入力値|
|:-------|:-----|
|パッケージ|sample|
|名前|HelloWorldAction|

![p9.jpg](https://qiita-image-store.s3.amazonaws.com/0/189344/cd06f569-89c9-dd9a-5a00-eb14c7ee6b87.jpeg)

```java:HelloWorldAction
package sample;

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

/**
 * [HelloWorldのアクションクラス]<br>
 * <br>
 * @author tarosa0001
 */
public class HelloWorldAction {
	/** ロガー */
	private Logger logger = LogManager.getLogger(HelloWorldAction.class);

	/** 名前 */
	private String name;

	/**
	 * [アクション実行処理]<br>
	 * HelloWorldを出力する処理を実行する。<br>
	 * 実行するメソッドは、struts.xmlで指定したメソッド名を使用して実装する。<br>
	 * Struts2ではアクションの処理結果でページの遷移先を決定するが、
	 * 今回は"success"の固定文字列を返却する。<br>
	 * <br>
	 * @return
	 */
	public String execute() {
		logger.info("入力されたパラメータは「{}」です。", name);
		return "success";
	}

	/**
	 * [名前取得処理]<br>
	 * 名前を取得します。<br>
	 * Struts2がフォームに入力された値をパラメータとしてする際、
	 * getterを使用するため、パラメータとして使用したい情報は、
	 * Actionクラスのプロパティとして宣言しておき、getterを用意する。
	 * <br>
	 * @return 名前
	 */
	public String getName() {
		return name;
	}

	/**
	 * [名前設定処理]<br>
	 * 名前を設定します。<br>
	 * getter同様、ページ間で受け渡したい値はsetterを用意しておく。<br>
	 * <br>
	 * @param name 名前
	 */
	public void setName(String name) {
		this.name = name;
	}
}
```
## 3.3. 遷移先の実装
トップページのボタンを押した際の遷移先を実装します。
WebContentディレクトリ内にview/sampleフォルダを作成し、そちらに遷移先ページを配置します。
配置ディレクトリ自体はWebContent内であればどこでもいいのですが、今回は上記ディレクトリとします。
トップページと同様の手順でsampleフォルダ内に「HelloWorld.jsp」を追加してください。

```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>
```
## 3.4. アプリケーション設定の更新
ここまでで、アプリケーションの処理自体は実装完了です。
最後に、実装したアプリケーションがStruts2アプリケーションとして動作するための設定を行います。

プロジェクトのWEB-INF内に存在している「web.xml」を次のように変更してください。
Struts2というよりは、Webアプリケーション自体の基礎知識になるので、web.xml自体の説明は省略します。

```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>
		<!-- アプリケーションルートであクセした時の表示ファイル設定 -->
		<!-- 必要はありませんが、今回はURLの入力間違いも防ぐため、index.jspのみとします。 -->
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>

	<!-- Struts2のサーブレットフィルタ -->
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>

	<!-- URLに対して使用するフィルタの設定 -->
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>
```
## 3.5. 実装の完了
web.xmlの設定も更新し、いよいよStruts2アプリケーションの実装完了です。
確認のため、最終的なツリーを記載します。

```:完成したプロジェクトのツリー
プロジェクト・ルート
├─src
│  └─sample
│          HelloWorldAction.java
│
├─resources
│      log4j2.xml
│      struts.properties
│      struts.xml
│
├─build
│  └─classes
│      │  log4j2.xml
│      │  struts.properties
│      │  struts.xml
│      │
│      └─sample
│              HelloWorldAction.class
│
└─WebContent
    │  index.jsp
    │
    ├─META-INF
    │      MANIFEST.MF
    │
    ├─view
    │  └─sample
    │          HelloWorld.jsp
    │
    └─WEB-INF
        │  web.xml
        │
        └─lib
                commons-fileupload-1.3.3.jar
                commons-io-2.5.jar
                commons-lang-2.4.jar
                commons-lang3-3.6.jar
                commons-logging-1.1.3.jar
                freemarker-2.3.26-incubating.jar
                javassist-3.20.0-GA.jar
                log4j-api-2.9.1.jar
                log4j-core-2.9.1.jar
                ognl-3.1.15.jar
                struts2-core-2.5.14.1.jar
                xmlpull-1.1.3.1.jar
                xpp3_min-1.1.4c.jar
                xstream-1.4.10.jar
```
# 4. 実行
さて、ここまでで実装と設定が完了しました。
いよいよ、実装したアプリケーションを動かします。

## 4.1. Tomcatの準備
Webアプリケーションを動作させるためのサーブレットコンテナを準備します。
今回は、Tomcatをサーブレットコンテナとして使用します。

①ウィンドウ ＞ ビューの表示 ＞ その他 ＞ サーバを選択し、サービューを表示してください。
![p10.jpg](https://qiita-image-store.s3.amazonaws.com/0/189344/85194334-17c2-42d8-a948-07046747306c.jpeg)

②表示されたサーバー・ビューの余白を右クリック ＞ 新規 ＞ サーバーを選択し、新規サーバーダイアログを表示します。
「Tomcat v8.0 サーバー」を選択し、次へ進みます。
![p11.jpg](https://qiita-image-store.s3.amazonaws.com/0/189344/7f9d0c59-9921-fd44-c2d9-fdfdfcad098a.jpeg)

③Struts2HelloWorldを追加して完了します
![p12.jpg](https://qiita-image-store.s3.amazonaws.com/0/189344/b67d289a-c698-6e15-1b33-3db62a2c38a7.jpeg)
※Struts2HelloWorldが追加できない場合、プロジェクトの作成に失敗している可能性があります。
プロジェクトの構成がTomcat8に対応しているか確認してください。

## 4.2. Tomcatの起動
Tomcatを起動します。
サーバー・ビューに追加されたTomcatを右クリックし、開始してください。
![p13.jpg](https://qiita-image-store.s3.amazonaws.com/0/189344/003f2b34-3ebc-ee0c-f078-b5cf92b3ea27.jpeg)

以下のような文字列がコンソールに出力されます。
赤字で出てきますが、エラーではありません。

```:コンソールの出力内容	※警告は無視してください。
警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:Struts2HelloWorld' did not find a matching property. [火 2 13 00:39:25 JST 2018]
情報: Server version:        Apache Tomcat/8.0.20 [火 2 13 00:39:25 JST 2018]
情報: Server built:          Feb 15 2015 18:10:42 UTC [火 2 13 00:39:25 JST 2018]
情報: Server number:         8.0.20.0 [火 2 13 00:39:25 JST 2018]
情報: OS Name:               Windows 7 [火 2 13 00:39:25 JST 2018]
情報: OS Version:            6.1 [火 2 13 00:39:25 JST 2018]
情報: Architecture:          amd64 [火 2 13 00:39:25 JST 2018]
情報: Java Home:             C:\Users\Nakajima\Desktop\Personal\スキルアップ\pleiades\eclipse\jre\jre [火 2 13 00:39:25 JST 2018]
情報: JVM Version:           1.8.0_40-b25 [火 2 13 00:39:25 JST 2018]
情報: JVM Vendor:            Oracle Corporation [火 2 13 00:39:25 JST 2018]
情報: CATALINA_BASE:         C:\Users\Nakajima\Desktop\Personal\スキルアップ\pleiades\sample\.metadata\.plugins\org.eclipse.wst.server.core\tmp0 [火 2 13 00:39:25 JST 2018]
情報: CATALINA_HOME:         C:\Users\Nakajima\Desktop\Personal\スキルアップ\pleiades\tomcat\8 [火 2 13 00:39:25 JST 2018]
情報: Command line argument: -Dcatalina.base=C:\Users\Nakajima\Desktop\Personal\スキルアップ\pleiades\sample\.metadata\.plugins\org.eclipse.wst.server.core\tmp0 [火 2 13 00:39:25 JST 2018]
情報: Command line argument: -Dcatalina.home=C:\Users\Nakajima\Desktop\Personal\スキルアップ\pleiades\tomcat\8 [火 2 13 00:39:26 JST 2018]
情報: Command line argument: -Dwtp.deploy=C:\Users\Nakajima\Desktop\Personal\スキルアップ\pleiades\sample\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps [火 2 13 00:39:26 JST 2018]
情報: Command line argument: -Djava.endorsed.dirs=C:\Users\Nakajima\Desktop\Personal\スキルアップ\pleiades\tomcat\8\endorsed [火 2 13 00:39:26 JST 2018]
情報: Command line argument: -Dfile.encoding=UTF-8 [火 2 13 00:39:26 JST 2018]
情報: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Users\Nakajima\Desktop\Personal\スキルアップ\pleiades\eclipse\jre\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:/Users/Nakajima/Desktop/Personal/スキルアップ/pleiades/eclipse/jre/bin/../jre/bin/server;C:/Users/Nakajima/Desktop/Personal/スキルアップ/pleiades/eclipse/jre/bin/../jre/bin;C:/Users/Nakajima/Desktop/Personal/スキルアップ/pleiades/eclipse/jre/bin/../jre/lib/amd64;C:\Users\Nakajima\Desktop\Personal\スキルアップ\pleiades\java\8\bin;C:\gradle-4.0\bin;C:\app\Nakajima\product\11.2.0\dbhome_1\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\WIDCOMM\Bluetooth Software\;C:\Program Files\WIDCOMM\Bluetooth Software\syswow64;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files (x86)\Justsystems\JSLIB32\;C:\Program Files (x86)\Sony\VAIO Startup Setting Tool;C:\Program Files (x86)\Common Files\Sony Shared\FeliCaLibrary;C:\Program Files\Common Files\Sony Shared\FeliCaLibrary;C:\Program Files (x86)\Common Files\Sony Shared\FeliCaNFCLibrary;C:\Program Files\Common Files\Sony Shared\FeliCaNFCLibrary;C:\Program Files (x86)\GtkSharp\2.12\bin;C:\maven\bin;C:\Program Files\nodejs\v6.10.2\;C:\cygwin64\bin;C:\Users\Nakajima\AppData\Roaming\npm;C:\ProgramData\Oracle\Java\javapath;;C:\Users\Nakajima\Desktop\Personal\スキルアップ\pleiades\eclipse;;. [火 2 13 00:39:26 JST 2018]
情報: Initializing ProtocolHandler ["http-nio-8080"] [火 2 13 00:39:26 JST 2018]
情報: Using a shared selector for servlet write/read [火 2 13 00:39:26 JST 2018]
情報: Initializing ProtocolHandler ["ajp-nio-8009"] [火 2 13 00:39:26 JST 2018]
情報: Using a shared selector for servlet write/read [火 2 13 00:39:26 JST 2018]
情報: Initialization processed in 951 ms [火 2 13 00:39:26 JST 2018]
情報: サービス Catalina を起動します [火 2 13 00:39:26 JST 2018]
情報: Starting Servlet Engine: Apache Tomcat/8.0.20 [火 2 13 00:39:26 JST 2018]
情報: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [117] milliseconds. [火 2 13 00:39:26 JST 2018]
情報: Starting ProtocolHandler ["http-nio-8080"] [火 2 13 00:39:30 JST 2018]
情報: Starting ProtocolHandler ["ajp-nio-8009"] [火 2 13 00:39:30 JST 2018]
情報: Server startup in 4438 ms [火 2 13 00:39:30 JST 2018]
```
「Server startup～」と出れば起動完了です。

## 4.3. アプリケーションにアクセス
ブラウザを起動し、以下のURLを入力し、Webアプリケーションにアクセスします。
「http://localhost:8080/Struts2HelloWorld」

すると、実装したindex.jspの内容が表示されます。
![p14.jpg](https://qiita-image-store.s3.amazonaws.com/0/189344/9dffcdec-a57a-7aef-c743-92c8c0bdcf91.jpeg)

## 4.4. HelloWorldページに遷移
では、ここまで長々と実装してきたHelloWorldを実行します。
テキストボックスに任意の値を入力し、「HelloWorldページへ行く」をクリックしましょう。

おめでとうございます！テキストボックスの入力値が受け継がれ、HelloWorldが表示できました！
![p15.jpg](https://qiita-image-store.s3.amazonaws.com/0/189344/797045f0-f1c9-2c7b-69a0-1a7bf14f837f.jpeg)

Actionにログを出力する処理を実装しているので、受け渡したデータはコンソールに出力しているログで確認できます。

# 5. アプリケーションの説明
皆様、お疲れ様でした。
ここまでで、HelloWorldの実装が完了しました。
ここからは、アプリケーションの説明をしていきます。

## 5.1. JSPとアクション
Struts2では、MVCモデルを採用しています。
多くの場合、View(画面)は、JSPを用いて実装し、JSPの各フォームやリンクなどの処理は、Javaを用いたクラスで実装します。

### 5.1.1. Action
Actionとは、Struts2での業務処理を行うクラスです。
JSPのフォームをサブミットしたとき、Struts2の機能により、Actionが呼び出されます。
どのフォームでどんなActionを行うかは、formタグとStruts.xmlに定義します。

今回、HelloWorldのActionは、ここで設定しています。
```jsp:
<!-- formタグのaction属性で実行するActionを指定します。 -->
<s:form action="hello">
```
Struts2では、JSPで使用できるタグライブラリが提供されており、Struts2を使用してアプリケーションを実装する場合、多くはこのStruts2提供のタグライブラリを使用します。
formをサブミットした時に使用するActionは、\<s:form>タグの、action属性に指定し、Actionの具体的な設定は、Struts.xmlに記載します。
Struts.xmlについては、後述しますので、そちらで詳しく説明します。

### 5.1.2. 受け渡すデータ
画面上で入力したフォームなど、次の画面やActionクラスで使用するデータは、Actionクラスにプロパティとして保持します。
JSP上のタグに設定したname属性と一致する名称のプロパティを設定しておくと、Struts2の機能でフォームに対応したプロパティに値が設定されます。

今回はindex.jspで入力した名前しか受け渡していませんが、ページが大きくなると受け渡すデータが増えます。
そんな場合に、データを塊として保持するクラスが作りたい場合も出てくるでしょう。
そんな場合は、name属性に「.(ドット)」をつけて「クラス名.プロパティ名」の形式で記載します。
```jsp:例:LoginInfoクラスのnameに値を設定する場合
<s:textfield name="LoginInfo.name" />
```
## 5.2. Struts.xml
Struts.xmlは、Struts2の動きを制御する設定ファイルです。
こちらには、先ほど説明したformタグでのActionの設定や、アプリケーションで使用する定数などを定義します。
定数については、少ししか触れていませんが、struts.propertiesにまとめて記載することも出来ます。

他にもいろんな設定がありますが、ここでではHelloWorldで使用したActionのみ説明します。
Struts.xml中、HelloWorldのActionの設定はここです。

```java:HelloWorldのアクション設定箇所
<!-- Hello worldのサンプルアクション -->
<action name="hello" class="sample.HelloWorldAction" method="execute">
	<result name="success">/view/sample/HelloWorld.jsp</result>
</action>
```
Struts2では、Actionの名前、使用するクラス、メソッドを設定します。
定義したAction内に、Actionクラスからの戻り値によって、次の遷移先を定義します。
今回は、戻り値が"success"の場合しか定義していませんが、Action内の処理の結果によって遷移先を分けたい場合は、戻り値ごとに\<result>タグを記載します。

遷移先のJSPは、WebContentをルート(/)として、それ以降のツリーを記載します。
遷移元のJSPからの相対パスでも設定できますが、ずれたりすることもあるので、アプリケーションルートからの絶対パスで記載する方がよいでしょう。

## 5.3. web.xml
web.xmlとは、Webアプリケーションの設定を記載するファイルですが、Struts2を使用する場合、Struts2用のサーブレットフィルタとマッピングを定義する必要があります。
こちらは特に変わったことをしない限り、上述したweb.xmlの内容から変わることはありません。

# 最後に
ここまでで、Struts2を使用したWebアプリケーションのサンプルと、アプリケーションの説明はすべてです。
今回はあくまでサンプルですので、本当に最少構成で実装しました。
新規で一からStruts2アプリケーションを構築することは中々ないかもしれませんが、他にもいろんな機能があるので、興味がある方は是非試してみてください。

# EX. 参考Web
今回の記事を執筆するに当たり、以下に掲載するWebページを参考にさせていただきました。

・2014年度版 Eclipse + Struts2 による Java Web アプリ開発入門
http://www.cyokodog.net/blog/first-struts2/