【Struts2】Struts2 + Maven + Tomcat でWebアプリ入門

Struts2

Struts2 + Mavenの導入

今回はMavenプロジェクトでStruts2を導入するやり方を紹介します。Mavenなしの動的WebプロジェクトからStruts2を導入する方法やSturts2に関しての前段は以下の記事を参照ください。

MavenプロジェクトでStruts2を使用したやり方としては、プロジェクト自体の作成方法が以下のコマンドラインからmvnを利用して作成する方法と、エディター(IDE)を利用して作成する方法があります。

  1. MavenのmvnコマンドでStruts2のArchetypeを選択する
  2. EclipseでMavenプロジェクトを作成してStruts2を導入する
  3. VSCodeの拡張機能 Extension Pack for Java に含まれるMavenを利用する

今回は変則的ですがVSCodeでプロジェクト自体は作成後、Eclipse にインポートします。理由はSturts2を含んだMavenプロジェクト簡単に作成できる(もちろんコマンドでも可能)であることと、開発環境としてはEclipseなど統合環境の方が機能が整っている、実務で使用しているためです。(もちろんVSCodeの拡張機能でも軽量なアプリなら十分に可能)

Archetypeですが struts2-archetype-starter を使用します。どれを選んでも良いのですが、初めはなるべくシンプルなアーキタイプを選択するのが良いかと思います。

機能については、Struts 2 Maven Archetypes のThe Starter Archetype (struts2-archetype-starter) に記載がありますが、特徴として sitemesh のライブラリを使用して、ウェブアプリケーション内で共通のレイアウトやテンプレートを効率的に管理できます。たとえば、ヘッダーやフッター、ナビゲーションメニューなどの共通のコンポーネントをメインのコンポーネントと分離することで、サイト全体で一貫性のあるデザインや構造で管理できます。

プロジェクトの作成

VSCodeのコマンドパレットからMavenのプロジェクトを作成するために拡張機能 Extension Pack for Java を導入すると一通りJavaの開発に便利なツールが利用できます。

command + shift + p でコマンドパレットを開いて、「>Java: Create Java Project…」「Maven create from archtype」「More…」「Struts2-archetype-starter」を順番に実行します。

archetypeのバージョンは2.5.22、グループID、アーティファクトIDはとりあえずデフォルトで進めても大丈夫ですが、goupIdは「jp.co.example」「struts2-todo」で進めてます。グループIDはJavaのパッケージのような役割で基本的にドメインの逆順、アーティファクトIDはアプリ固有の名称です。

VSCode でなくても以下のコマンドでmavenがインストールされていれば、プロジェクトを作成できます。

mvn org.apache.maven.plugins:maven-archetype-plugin:3.1.2:generate -DarchetypeArtifactId="struts2-archetype-starter" -DarchetypeGroupId="org.apache.struts" -DarchetypeVersion="2.5.22" -DgroupId="jp.co.example" -DartifactId="struts2-todo"

Eclipseに作成したプロジェクトを取り込む

Eclipseのツールバーからファイル > ファイル・システムからプロジェクトを開く…を選択して、作成したプロジェクトをEclipseにインポートします。次に重要なのがJavaのビルド・パスの設定です。サーバーの設定を追加します。

サーバーはTomcat8を使用するため、Javaのビルド・パスからライブラリの追加… からサーバー・ランタイムを選択してTomcat8を追加します。(Tomcatのバージョンはサーブレットのバージョンに対応させるようにします。こちらも前段の記事をご参照ください。)

プロジェクトを追加すると環境によっては以下のエラーが出る場合があります。

pom.xml に以下のエラーが出た場合は
(OSなのか、Eclipseの環境なのか出る場合と出ない場合がありました)

Could not initialize class org.apache.maven.plugin.war.util.WebappStructureSerializer

そのときは、pom.xml に以下を追加してください。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.3.1</version>
</plugin>

参照: Could not initialize class org.apache.maven.plugin.war.util.WebappStructureSerializer -Maven Configuration Problem Any solution?

maven でビルドを行う

デバッグから「4 Maven clean」「5 Maven generate-sources」「6 Maven install」を実行して、targetフォルダに成果物を作成します。

Webアプリを起動させる

Tomcat8 にプロジェクトをデプロイします。サーバーのタブがなければ、ツールバーのウィンドウ > ビューの表示 > その他 > サーバー > サーバーを選択します。デプロイするには対象のサーバーを右クリックして、追加および除去…を選択します。(ポート番号やタイムアウトを変更する場合は、対象のサーバーをクリックして概要から変更します。)

デバッグボタン(虫のアイコン)を押して、Tomcatを起動させてコンソールの最後に以下のようなログが表示されます。(ログが長すぎるので末尾の一部です)

INFO: Root WebApplicationContext: initialization completed in 504 ms
2023-09-23 11:39:46,419 INFO  [localhost-startStop-1] spring.StrutsSpringObjectFactory (StrutsSpringObjectFactory.java:73) - Initializing Struts-Spring integration...
2023-09-23 11:39:46,439 INFO  [localhost-startStop-1] spring.SpringObjectFactory (SpringObjectFactory.java:104) - Setting autowire strategy to name
2023-09-23 11:39:46,440 INFO  [localhost-startStop-1] spring.StrutsSpringObjectFactory (StrutsSpringObjectFactory.java:139) - ... initialized Struts-Spring integration successfully
Sep 23, 2023 11:39:47 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8080"]
Sep 23, 2023 11:39:47 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in 5273 ms

「http://localhost:8080/struts2-archetype-starter/」のURLにアクセスして、以下の画面が表示されたら成功です。

URLのコンテキスト・パスを変更する

「http://localhost:8080/struts2-archetype-starter/」から「http://localhost:8080/struts2-todo/」へコンテキスト・パスを変更する場合は以下の手順を行います。

  1. パッケージ・エクスプローラーからプロジェクト(struts2-todo)を右クリックで「プロパティー」を選択して、「Web プロジェクトの設定」からコンテキスト・ルートを struts2-archetype-starter から struts2-todo に変更。
  2. ツールバーの検索から struts2-archetype-starter で検索して、org.eclipse.wst.common.component と pom.xml でヒットしたところを struts2-todo に置換します。
  3. Tomcat8のサーバーから一回リソースを除去して、再度リソースを追加します。(Tomcatサーバーのserver.xmlのコンテキストパスを変更することを目的にしていますが、もしかしたらこの作業はサーバーを再起動することで不要かもしれません。)

EclipseのXMLファイルの参照エラーについて

dwr.xml と web.xml で以下のエラーが出る場合で、基本的にはアプリケーションの起動について影響はないので放置しても良いのですが、気にはなるだろうということでエラーを解消します。

dwr.xml は以下のエラーです。

参照ファイルにエラーが含まれています (http://www.getahead.ltd.uk/dwr/dwr10.dtd)。 For more information, right click on the message in 
 the Problems View and select "Show Details..."

正しいやり方ではないのかもしれませんが、以下でエラー自体の解消はできます。

  1. <!DOCTYPE> の部分を削除する
  2. バージョンの部分を書き換える(1.0→2.0、dwr10.dtd→dwr20.dtd)

web.xml は以下のエラーです。バージョン2.4というのはサーブレットのバージョンなのでTomcat8に合わせたバージョンに書き換えたほうが良いです。

こちらも正しいやり方ではないのかもしれませんが、以下でエラー自体の解消はできます。

  1. バージョンの部分を書き換える(2.4→2.5)おそらくこのやり方はあまりよろしくないはず。
  2. web_appのバージョンを書き換える場合は以下のように記載します。
<web-app id="WebApp_ID" version="3.1" 
         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">

今回はTomtcat8ですが、Tomcat10に対応するJSPは3.0でサーブレットのバージョンは5.0なので以下のように記載するのが良いです。詳しい対応関係は Apache Tomcat Versions の「Apache Tomcat Version」と「Servlet Spec」を参照ください。

<?xml version="1.0" encoding="UTF-8"?>
<web-app
    xmlns="https://jakarta.ee/xml/ns/jakartaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
    https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
    version="5.0">

今回「EclipseのXMLエディタ一行目でDTDエラー「参照ファイルにエラーが含まれています」」を参照した同じ手順で確認もしてみました。デベロッパーツールを開いて、「http://checkstyle.sourceforge.net/dtds/configuration_1_3.dtd」にアクセスし、ネットワークタブで確認します。

DTDのURLにブラウザでアクセスすると正しい.dtdファイルがダウンロードされるという前提の話ですが、今回のdwrに至ってはURLにアクセスしてもすでに存在せずにdtdを取得できないということで、代替の手法を取りました。

まとめ

だいぶ簡略しましたがStruts2とMavenを利用したWebアプリの立ち上げはご紹介しました。今回はStruts2にMavenを導入しましたが、実務で使用しているその学習も兼ねてと言う場合はその環境に合わせるのが良いと思います。

Struts2に限らないですがJavaをベースにしたWebアプリを学習する際のポイントは、使用しているエディターでJavaのビルド・パスと、サーバー(おそらくほとんどがTomcat8)の設定、Srtuts2のタグは押さえておきたいところです。

タイトルとURLをコピーしました