TOPページへ戻る

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

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

EclipseでStruts2

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

Struts2 サンプル作成4

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

ポイント

ファイルアップロードのサンプルです。
アップロードされたファイルは、C:\TMPフォルダへコピーします。
C:\TMPフォルダがない場合は作成します。

ソースコードを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. プロジェクトの作成
    新規アイコン→Web→動的Webプロジェクト
    プロジェクト名 test5と入力
    ターゲット・ランタイムをTomcat10(Java17)かTomcat10(Java21)にする。

  3. エクスプローラでコピー元のフォルダの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


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

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

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;

    import org.apache.struts2.ActionSupport;
    import org.apache.struts2.action.UploadedFilesAware;
    import org.apache.struts2.dispatcher.multipart.UploadedFile;

    /**
    * <code>Allows upload a file</code>
    */
    public class Upload extends ActionSupport implements UploadedFilesAware {

        private UploadedFile[] upload;
        private String[] uploadFileName;
        private String[] uploadContentType;
        private String  tmpPath = "c:/tmp/";

        public String execute() throws Exception {
          if (upload != null && upload.length > 0) {
            if (! new File(tmpPath).exists()) {
              if (! new File(tmpPath).mkdir()) {
                  throw new Exception("mkdir failed.");
              }
            }
             int i;
            for (i = 0; i<upload.length; i++) {
                 String fileFullPath = upload[i].getAbsolutePath();
                 //System.out.println(fileFullPath);
      
                 FileInputStream fileIn = new FileInputStream(fileFullPath);
                 FileOutputStream fileOut = new FileOutputStream(tmpPath + uploadFileName[i]);
      
                 // byte型の配列を宣言
                  byte[] buf = new byte[256];

                  int len;
                  // ファイルの終わりまで読み込む
                  while((len = fileIn.read(buf)) != -1){
                      fileOut.write(buf);    
                  }
          
                  //ファイルに内容を書き込む
                  fileOut.flush();
          
                  //ファイルの終了処理
                  fileOut.close();
                  fileIn.close();
               }
            }
             return INPUT;
         }


        public File[] getUpload() {
            return upload;
        }

        public void setUpload(File[] upload) throws Exception {
            this.upload = upload;
        }

        public String[] getUploadFileName() {
            return uploadFileName;
        }

        public void setUploadFileName(String[] uploadFileName) {
            this.uploadFileName = uploadFileName;
        }

        public String[] getUploadContentType() {
            return uploadContentType;
        }

        public void setUploadContentType(String[] uploadContentType) {
            this.uploadContentType = uploadContentType;
        }

        @Override
        public void withUploadedFiles(List uploadedFiles) {
            upload = new UploadedFile[uploadedFiles.size()];
            uploadFileName = new String[uploadedFiles.size()];
            uploadContentType = new String[uploadedFiles.size()];
            int i;
            for (i = 0; i<uploadedFiles.size(); i++) {
                this.upload[i] = uploadedFiles.get(i);
                this.uploadFileName[i] = upload[i].getOriginalName();
                this.uploadContentType[i] = upload[i].getContentType();
    //          this.Name = upload[i].getName();
    //          this.inputName = upload[i].getInputName();
            }
        }
    }

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

    以下のサンプルソースを作成
    upload.jsp
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>File upload</title>
    </head>

    <body>

    <s:form action="upload" method="post" enctype="multipart/form-data">
        <s:file name="upload1"/>
        <s:file name="upload2"/>
        <s:file name="upload3"/>
        <s:submit/>
    </s:form>

    <%--<s:iterator value="upload" var="u">
        <s:property value="u"/><br/>
    </s:iterator> --%>
    <s:iterator value="uploadContentType" var="ct">
        <s:property value="ct"/><br/>
    </s:iterator>
    <s:iterator value="uploadFileName" var="fn">
        <s:property value="fn"/><br/>
    </s:iterator>

    </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="test5.sample" />
        <constant name="struts.multipart.maxSize" value="10000000"/><!-- デフォルト2MB -->

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

            <default-action-ref name="index"/>
            
            <action name="index">
                <result type="redirectAction">
                    <param name="actionName">upload</param>
                </result>
            </action>

            <action name="upload" class="test5.sample.action.Upload">
                <interceptor-ref name="actionFileUpload">
                    <param name="maximumSize">5000000</param>
                    <param name="allowedTypes">image/jpeg,image/gif</param>
                </interceptor-ref>
                <result name="input">/upload.jsp</result>
            </action>

        </package>

        <!-- Add addition packages and configuration here. -->
    </struts>
    備考
    1. アップロードするファイルサイズの上限を変更するには、 struts.multipart.maxSize を修正します。
      この上限は、1つのファイルではなく1つのリクエスト(複数ファイル全て)の制限です。
      デフォルトは、2 MB です。
      struts.multipart.maxSize は、悪意のあるユーザが極端に大きなファイルをアップロードできないようにするという
      セキュリティ上の理由で設けられています。
      そのためこの設定値以上のファイルをアップロードした場合Actionクラスはエラーを返さず接続が切れます。
      上記のstruts.xmlの struts.multipart.maxSize の設定は、10 MBです。
    2. maximumSize の設定を越えた場合は、ファイルサイズが大きい旨のエラーが表示されます。
      上記のstruts.xmlの maximumSize の設定は、5 MBです。
    3. allowedTypes でアップロードを許可するMIMEタイプ(ファイルの種類)を設定することができます。
      カンマ区切りで複数設定できます。

    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="test5" 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>test5</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>

    4)propertiesファイル
    Upload.properties
    (プロジェクト名)\src\main\java\test5\sample\actionフォルダに以下の内容のファイルを作成する。

    struts.messages.error.file.too.large=Too Large! {0} {1} {2} {3} {4}
    struts.messages.error.content.type.not.allowed=not allowed Content-Type {0} {1} {2} {3}

    備考
    1. struts.xml の maximumSize を越えた場合や許可されたMIMEタイプ以外のファイルをアップロードされた場合に表示されるエラーメッセージを変更するためのpropertiesファイルです。
      エラーメッセージを変更しない場合は、必要ありません。
    2. ファイルサイズが大きい旨のエラーは、キーの struts.messages.error.file.too.large の値に表示させたい文字列を記述します。
      プレースホルダー「{0},{1},{2},{3},{4}」を使用できます。
      プレースホルダーには、ファイル名({1})、ファイルサイズ({3})などがあります。下の実行結果を参考にしてください。
    3. 許可されたMIMEタイプ以外のファイルがアップロードされた場合のエラーは、キーの struts.messages.error.content.type.not.allowedの値に表示させたい文字列を記述します。
      プレースホルダー「{0},{1},{2},{3}」を使用できます。
      プレースホルダーには、ファイル名({1})、MIMEタイプ({3})などがあります。下の実行結果を参考にしてください。
    4. propertiesファイルで日本語を使用したい場合は、Limy プロパティー・エディターを使用します。
      詳しい使用方法は、Struts 7.0.0のインストールとサンプル Part2の global_ja.properties ファイルの項目を参照してください。

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

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

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

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

    実行結果

    ファイルが大きい旨のデフォルトのエラー

    ファイルが大きい旨の変更したエラー

    ファイルが struts.multipart.maxSize より大きい場合のエラー

    許可されたMIMEタイプではない旨のデフォルトのエラー

    許可されたMIMEタイプではない旨の変更したエラー

    正常アップロード


    ファイルをアップロードしたらC:\TMPフォルダにコピーされたファイルがあるか確認します。
    サンプルを終了させたい場合、サーバービューでサーバーを停止ボタンをクリックしTomcatを終了させます

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

参考1

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