TOPページへ戻る

Struts 7.0.0のインストールとサンプル Part5

ここでは、Javaでウェブアプリケーションの作成が行えるStruts 7.0.0のインストールとサンプルアプリケーションの作成と実行を行います。
RDBのMySQLと連携を行います。
    ※JDK、EclipseのインストールのページでEclipseがインストールされていることを前提にしています。
    ※Struts 7.0.0のインストールとサンプルのページを参照し、ある程度の知識があることを前提にしています。

EclipseでStruts2

Struts2は初期状態でインストールされていないためStrutsのサイトからダウンロードしインストールする必要がある。

MySQL

このページを記述した時点の最新版は、MySql Community バージョン 9.2.0である。

JDBCドライバとコネクションプーリング

JDBCドライバの最新版は、9.2.0である。
コネクションプーリングの最新版は、Apache Commons DBCP 2.13.0である。

Struts2 サンプル作成5

Struts 7.0.0のサンプルを作成する

ポイント

MySQL連携のサンプルです。
JDBCドライバとコネクションプーリングを使用して、MySQLにアクセスします。

ソースコードをzipファイルにしました。こちらもご利用ください。
  1. Downloadsにzipファイルをダウンロードし、そこでzipを7-Zipで解凍する。
    Strutsのサイトにアクセスし、以下のファイルをダウンロード
    https://struts.apache.org/download.cgi
    ダウンロードするファイル struts-7.0.0-all.zip
    ダウンロードするフォルダはデフォルト。(エクスプローラのDownloadsフォルダ)

    解凍するファイル
    C:\Users\(ユーザ名)\Downloads\struts-7.0.0-all.zip
    解凍するとできるフォルダ
    C:\Users\(ユーザ名)\Downloads\struts-7.0.0-all\struts-7.0.0

    さらにwarファイルを7-Zipで解凍する
    解凍するファイル
    C:\Users\(ユーザ名)\Downloads\struts-7.0.0-all\struts-7.0.0\apps\struts2-rest-showcase-7.0.0.war
    解凍するとできるフォルダ
    C:\Users\(ユーザ名)\Downloads\struts-7.0.0-all\struts-7.0.0\apps\struts2-rest-showcase-7.0.0

  2. DownloadsにJDBCドライバのzipファイルをダウンロードし、そこでzipを7-Zipで解凍する。
    https://dev.mysql.com/downloads/connector/j/
    ダウンロードするファイル mysql-connector-j-9.2.0.zip
    ダウンロードするフォルダはデフォルト。(エクスプローラのDownloadsフォルダ)
            ※Oracle Webアカウントを取得せずにダウンロードするには、「No thanks, just start my download.」のリンクをクリックする。
            ※Windowsのインストーラはないので Platform Independent を選択する

  3. Downloadsにコネクションプーリングのzipファイルをダウンロードし、そこでzipを7-Zipで解凍する。
    https://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi
    ダウンロードするファイル commons-dbcp2-2.13.0-bin.zip
    ダウンロードするフォルダはデフォルト。(エクスプローラのDownloadsフォルダ)

  4. DownloadsにMySQLのインストーラをダウンロード、実行する。
    https://dev.mysql.com/downloads/mysql/
    ダウンロードするファイル mysql-9.2.0-winx64.msi
    ダウンロードするフォルダはデフォルト。(エクスプローラのDownloadsフォルダ)
            ※Oracle Webアカウントを取得せずにダウンロードするには、「No thanks, just start my download.」のリンクをクリックする。
    インストールの際、Choose Setup TypeではCompleteでインストールする。
    Sample Databasesのところで、Create Sakila databaseにチェックを付ける。
    インストールの際、管理者のアカウントrootとは別にMySQLのユーザアカウント: testuser(パスワード: userpass)を作成する。

    インストール後以下を行います。
    1)MySQL 9.2 Command Line Clientを起動し、管理者でログインします。
    Enter Password: (管理者 root のパスワード)



    2)ログインしたら以下のSQLを実行します。
    grant all on sakila.* to testuser;  

    実行したら、exit を入力し終了します。


  5. プロジェクトの作成
    新規アイコン→Web→動的Webプロジェクト
    プロジェクト名 test6と入力
    ターゲット・ランタイムをTomcat10(Java17)かTomcat10(Java21)にする。

  6. エクスプローラでコピー元のフォルダのlibフォルダをコピー先へコピー
    strutsのjarファイルをコピー
    コピー元
    C:\Users\(ユーザ名)\Downloads\struts-7.0.0-all\struts-7.0.0\apps\struts2-rest-showcase-7.0.0\WEB-INF\lib\*
    コピー先
    C:\pleiades\2024-12\workspace\(プロジェクト名)\src\main\webapp\WEB-INF\lib
    (重要)コピー先から以下のjarファイルを削除
    struts2-rest-plugin-7.0.0.jar


    JDBCドライバのjarファイル mysql-connector-j-9.2.0.jar をコピー
    コピー元
    C:\Users\(ユーザ名)\Downloads\mysql-connector-j-9.2.0\mysql-connector-j-9.2.0
    コピー先
    C:\pleiades\2024-12\workspace\(プロジェクト名)\src\main\webapp\WEB-INF\lib

    コネクションプーリングのjarファイル commons-dbcp2-2.13.0.jar をコピー
    コピー元
    C:\Users\(ユーザ名)\Downloads\commons-dbcp2-2.13.0-bin\commons-dbcp2-2.13.0
    コピー先
    C:\pleiades\2024-12\workspace\(プロジェクト名)\src\main\webapp\WEB-INF\lib

  7. javaソースファイル、JSPファイル、XMLファイルの作成
    1)Javaソースの作成
    クラスの作成
    (プロジェクト名)\src\main\javaフォルダをクリックし以下を実行
    新規アイコン→Java→クラス
    パッケージにtest6.sample.modelを入力
    名前にActorを入力、完了をクリック。

    以下のサンプルソースを作成
    Actor.java
    package test6.sample.model;

    public class Actor {
      private String actorId;
      private String firstName;
      private String lastName;
      private String lastUpdate;

      public String getActorId() {
        return actorId;
      }
      public void setActorId(String actorId) {
        this.actorId = actorId;
      }
      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 getLastUpdate() {
        return lastUpdate;
      }
      public void setLastUpdate(String lastUpdate) {
        this.lastUpdate = lastUpdate;
      }
    }

    クラスの作成
    (プロジェクト名)\src\main\javaフォルダをクリックし以下を実行
    新規アイコン→Java→クラス
    パッケージにtest6.sample.daoを入力
    以下のサンプルソースを作成

    InitDataSource.java
    package test6.sample.dao;

    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.sql.DataSource;

    public class InitDataSource {
        private static Context context = null;
        private static DataSource ds = null;

        public static DataSource getInstance() throws Exception {
          if (context == null) {
            context = new InitialContext();
          }
          if (ds == null) {
            ds = (DataSource)context.lookup("java:comp/env/sakila");
          }
          return ds;
        }

    }

    クラスの作成
    (プロジェクト名)\src\main\javaフォルダをクリックし以下を実行
    新規アイコン→Java→クラス
    パッケージにtest6.sample.daoを入力
    名前にActorDAOを入力、完了をクリック。

    以下のサンプルソースを作成
    ActorDAO.java
    package test6.sample.dao;

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.List;

    import javax.sql.DataSource;

    import test6.sample.model.Actor;

    public class ActorDAO {
        DataSource ds;

        public ActorDAO() throws Exception {
          ds = InitDataSource.getInstance();
        }

        public List<Object> selectActor() throws Exception {

          PreparedStatement ps = null;
          ResultSet rs = null;
          List<Object> actorList = new ArrayList<>();

          Connection conn = ds.getConnection();
          SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

          String SQL = "SELECT ACTOR_ID,FIRST_NAME,LAST_NAME,LAST_UPDATE FROM ACTOR";

          try {
            ps = conn.prepareStatement(SQL);
            rs = ps.executeQuery();
            while(rs.next()){
              Integer actor_id = rs.getInt("actor_id");
              String first_name = rs.getString("first_name");
              String last_name = rs.getString("last_name");
              String last_update = sdf.format(rs.getTimestamp("last_update"));

              Actor actor = new Actor();
              actor.setActorId((String)actor_id.toString());
              actor.setFirstName(first_name);
              actor.setLastName(last_name);
              actor.setLastUpdate(last_update);

              actorList.add(actor);
            }
          }
          finally {
            ps.close();
            rs.close();
            conn.close();
          }

          return actorList;
        }
    }

    ActorListAction.javaの作成
    クラスの作成
    (プロジェクト名)\src\main\javaフォルダをクリックし以下を実行
    新規アイコン→Java→クラス
    パッケージにtest6.sample.actionを入力
    名前にActorListActionを入力、完了をクリック。

    以下のサンプルソースを作成
    ActorListAction.java
    package test6.sample.action;

    import java.util.ArrayList;
    import java.util.List;

    import org.apache.struts2.ActionSupport;

    import test6.sample.dao.ActorDAO;

    public class ActorListAction extends ActionSupport {
      private static final long serialVersionUID = 1L;

      private List<Object> actorList = new ArrayList<>();

      public String execute() throws Exception {

        ActorDAO dao = new ActorDAO();
        actorList = dao.selectActor();

        return SUCCESS;
      }
      
      public List<Object> getActorList() {
        return actorList;
      }

      public void setActorList(List<Object> actorList) {
        this.actorList = actorList;
      }

    }

    2)JSPファイルの作成
    (プロジェクト名)\webapp直下に作成
    webappフォルダをクリックし以下を実行
    新規アイコン→Web→JSPファイル
    ファイル名にactorList.jspと入力。
    新規JSPファイル(html5)を選択し、完了をクリック。

    以下のサンプルソースを作成
    actorList.jsp
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Actor List</title>
    </head>
    <body>
    <table>
        <tr>
            <td>actorId</td>
            <td>firstName</td>
            <td>lastName</td>
            <td>lastUpdate</td>
        </tr>
        <s:iterator value="actorList">
            <tr>
                <td><s:property value="actorId"/></td>
                <td><s:property value="firstName"/></td>
                <td><s:property value="lastName"/></td>
                <td><s:property value="lastUpdate"/></td>
            </tr>
        </s:iterator>
    </table>
    </body>
    </html>

    3)XMLファイル
    struts.xmlファイル
    (プロジェクト名)\src\main\javaフォルダの下に作成
    ファイル名にstruts.xmlと入力し、完了をクリック。
    以下のXMLファイルを作成。
    struts.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
            "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
            "https://struts.apache.org/dtds/struts-2.5.dtd">
    <struts>
        <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
        <constant name="struts.devMode" value="true"/>
        <constant name="struts.allowlist.packageNames" value="test6.sample" />

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

            <action name="dbtest" class="test6.sample.action.ActorListAction" method="execute">
                <result name="success">/actorList.jsp</result>
            </action>

        </package>

        <!-- Add addition packages and configuration here. -->
    </struts>

    log4j2.xmlファイル
    (プロジェクト名)\src\main\javaフォルダの下に作成
    同様に以下のXMLファイルを作成。
    log4j2.xmlファイル
    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    /*
    * Licensed to the Apache Software Foundation (ASF) under one
    * or more contributor license agreements.  See the NOTICE file
    * distributed with this work for additional information
    * regarding copyright ownership.  The ASF licenses this file
    * to you under the Apache License, Version 2.0 (the
    * "License"); you may not use this file except in compliance
    * with the License.  You may obtain a copy of the License at
    *
    *  http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing,
    * software distributed under the License is distributed on an
    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    * KIND, either express or implied.  See the License for the
    * specific language governing permissions and limitations
    * under the License.
    */
    -->
    <Configuration>
        <Appenders>
            <Console name="STDOUT" target="SYSTEM_OUT">
                <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
            </Console>
        </Appenders>
        <Loggers>
            <Logger name="org.apache.struts2" level="info"/>
            <Logger name="test6" level="debug"/>
            <Root level="warn">
                <AppenderRef ref="STDOUT"/>
            </Root>
        </Loggers>
    </Configuration>

    web.xmlファイル
    (プロジェクト名)\src\main\webapp\WEB-INFフォルダの下に作成
    以下のXMLファイルを編集。
    web.xmlファイル
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app>

      <display-name>test6</display-name>
      <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>

      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.jsp</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>index</welcome-file>
      </welcome-file-list>

    </web-app>

    context.xmlファイル
    (プロジェクト名)\src\main\webapp\META-INFフォルダの下に作成
    以下のXMLファイルを作成。
    context.xmlファイル
    <?xml version="1.0" encoding="UTF-8"?>
    <Context reloadable="true">
      <Resource
        name="sakila"
        auth="Container"
        type="javax.sql.DataSource"
        driverClassName="com.mysql.cj.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/sakila"
        connectionProperties="allowPublicKeyRetrieval=true;autoReconnect=true;verifyServerCertificate=false;useSSL=false;requireSSL=false;useUnicode=true;characterEncoding=UTF-8;"
        username="testuser"
        password="userpass"
        validationQuery="select 1"/>
    </Context>

    4)htmlファイル
    (プロジェクト名)\src\main\webappフォルダをクリックし以下を実行
    新規アイコン→Web→HTMLファイル
    名前にindex.htmlを入力、完了をクリック。

    index.html
    <!DOCTYPE html>
    <html>
    <head>
        <META HTTP-EQUIV="Refresh" CONTENT="0;URL=dbtest">
    </head>

    <body>
    <p>Loading ...</p>
    </body>
    </html>

  8. ビルドが終了したら、プロジェクトのトップにマウスカーソルを移動、実行ボタンをクリックしTomcatを起動する
    以下にブラウザでアクセス(自動でブラウザが起動しアクセスする)
    http://localhost:8080/test6/

    実行結果


    サンプルを終了させたい場合、サーバービューでサーバーを停止ボタンをクリックしTomcatを終了させます

  9. プロジェクトが必要なくなったら、閉じておきます。
    Serversのプロジェクトは、Tomcatのことなので閉じてはいけません。

参考1 コネクションプーリングの接続について

コネクションプーリングは、参考3のApache Commons DBCPのページを確認すると、デフォルトで初期接続数が0、最大接続数が8である。
接続数を確認するには、MySQLをインストールした際一緒にインストールした「MySQL 9.2 Command Line Client」を使用する。
システム管理者(root)でログインし、以下のSQLを実行する。
use sys;
select conn_id, user, db, state from session;  

testuserの接続数が1あり、コネクションプーリングが行われていることが確認できる。

参考2 getter/setterについて

modelで、setメソッドやgetメソッド(getter/setter)を作成する場合、Eclipseに簡単に作成する機能があります。
  1. 変数を定義する

  2. 右クリックで「ソース」の「getterおよびsetterの生成」をクリック

  3. 作成するgetterおよびsetterを選択し、「生成」ボタンをクリック
    このとき「メソッド・コメントの生成」をチェックしておくと、コメントも合わせて生成されます。

  4. 実行例

参考3

Javadoc(API)やチュートリアルなど参考URLを紹介します
以上