Strutsにおけるフロントエンドとバックエンド間のパラメータ伝達手法

Strutsフレームワークでは、WebフロントエンドからバックエンドのActionクラスへパラメータを渡すための主要な2つのアプローチが存在します。

一つは、Actionクラス内に直接プロパティを宣言し、それに対応するセッター・ゲッターメソッドを用意する方法です。もう一つは、ActionクラスがModelDrivenインターフェースを実装し、Strutsが自動的にラップ(カプセル化)するためのPOJO(Plain Old Java Object)を提供する方法です。

1. プロパティ宣言によるパラメータ伝達

この方法では、Actionクラスに直接パラメータとなるフィールドを定義します。Strutsは、フォームのフィールド名と一致するプロパティに対して、自動的に値のマッピングを行います。

Actionクラスの例 (DirectParameterAction.java)


package com.example.struts.action;

import com.opensymphony.xwork2.ActionSupport;

/**
 * Actionクラスに直接プロパティを宣言してパラメータを受け取るAction.
 */
public class DirectParameterAction extends ActionSupport {

    private static final long serialVersionUID = 1L;

    private String userName; // フロントエンドから渡される名前
    private String userMessage; // フロントエンドから渡されるメッセージ
    private String responseMessage = ""; // フロントエンドへ返すメッセージ

    /**
     * Actionの実行メソッド.
     * @return 実行結果 ("success" または "error")
     */
    @Override
    public String execute() {
        responseMessage = "パラメータが指定されていません。";

        if (userName != null && userMessage != null) {
            responseMessage = "こんにちは、" + userName + "さん!メッセージ:「" + userMessage + "」";
        }

        System.out.println("応答メッセージ: " + responseMessage);
        return SUCCESS;
    }

    // userName, userMessage, responseMessage のセッター・ゲッターメソッドを省略

    public String getUserName() { return userName; }
    public void setUserName(String userName) { this.userName = userName; }
    public String getUserMessage() { return userMessage; }
    public void setUserMessage(String userMessage) { this.userMessage = userMessage; }
    public String getResponseMessage() { return responseMessage; }
    public void setResponseMessage(String responseMessage) { this.responseMessage = responseMessage; }
}

struts.xmlの設定例


<?xml version="1.0" encoding="UTF-8" ?>
<struts>
    <package name="example" namespace="/" extends="struts-default">
        <action name="directParamAction" class="com.example.struts.action.DirectParameterAction" method="execute">
            <result name="success">/WEB-INF/views/result.jsp</result>
            <result name="input">/WEB-INF/views/input.jsp</result>
        </action>
        <!-- ModelDrivenのAction設定は後述 -->
    </package>
</struts>

フロントエンド (input.jsp) の例

HTMLフォームを使用して、userNameuserMessageのパラメータをPOSTメソッドで送信します。


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>入力フォーム</title>
</head>
<body>
    <h2>Struts パラメータ送信デモ</h2>
    
    <!-- 注意: Strutsでのパラメータ送信にはPOSTメソッドを使用してください。GETでは文字化けが発生する可能性があります。 -->
    <form action="directParamAction" method="post" accept-charset="UTF-8">
        <label for="userName">お名前:</label><br>
        <input type="text" id="userName" name="userName" /><br><br>
        
        <label for="userMessage">メッセージ:</label><br>
        <input type="text" id="userMessage" name="userMessage" /><br><br>
        
        <input type="submit" value="送信" />
    </form>
</body>
</html>

重要: Strutsでパラメータを正しく受け渡すためには、formタグのmethod属性をpostに設定することが推奨されます。getメソッドを使用すると、文字エンコーディングの問題で文字化けが発生する可能性があります。

結果表示 (result.jsp) の例

JSP EL (Expression Language) を使用して、Actionから渡されたresponseMessageを表示します。


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>結果表示</title>
</head>
<body>
    <h1>${responseMessage}</h1>
</body>
</html>

2. ModelDrivenインターフェースによるパラメータ伝達

このアプローチでは、ActionクラスがModelDrivenインターフェースを実装します。このインターフェースは、Strutsがフォームデータを受け取るためのPOJOオブジェクトを返すgetModel()メソッドを提供します。これにより、関連する複数のパラメータを一つのオブジェクトとしてまとめて扱うことができます。

フロントエンドのJSPファイル(input.jsp)とstruts.xmlの設定は、前述の「1. プロパティ宣言によるパラメータ伝達」の場合と同じものを使用します。Actionクラスのみを変更します。

Actionクラスの例 (ModelDrivenParameterAction.java)


package com.example.struts.action;

import com.example.struts.pojo.UserInfo; // POJOクラス
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

/**
 * ModelDrivenインターフェースを使用してパラメータを受け取るAction.
 */
public class ModelDrivenParameterAction extends ActionSupport implements ModelDriven<UserInfo> {

    private static final long serialVersionUID = 1L;

    // StrutsがフォームデータをラップするためのUserInfoオブジェクト
    // このオブジェクトのフィールド(name, message)は、フォームのinput要素のname属性と一致させる必要がある
    private UserInfo userInfoModel = new UserInfo();

    private String responseMessage = ""; // フロントエンドへ返すメッセージ

    /**
     * ModelDrivenインターフェースの実装メソッド.
     * Strutsはこのメソッドを呼び出して、フォームデータを格納するためのオブジェクトを取得する.
     * @return UserInfoオブジェクト
     */
    @Override
    public UserInfo getModel() {
        return userInfoModel;
    }

    /**
     * Actionの実行メソッド.
     * @return 実行結果 ("success" または "error")
     */
    @Override
    public String execute() {
        responseMessage = "パラメータが指定されていません。";

        // getModel()で取得したUserInfoオブジェクトから値を取得
        if (userInfoModel != null) {
            String name = userInfoModel.getUserName();
            String message = userInfoModel.getUserMessage();

            if (name != null && message != null) {
                responseMessage = "こんにちは、" + name + "さん!メッセージ:「" + message + "」";
            }
        }

        System.out.println("応答メッセージ: " + responseMessage);
        return SUCCESS;
    }

    // responseMessage のセッター・ゲッターメソッドを省略

    public String getResponseMessage() { return responseMessage; }
    public void setResponseMessage(String responseMessage) { this.responseMessage = responseMessage; }

    // userInfoModelのゲッターメソッドも必要に応じて追加(Strutsが内部で使用するため)
    public UserInfo getUserInfoModel() { return userInfoModel; }
    // public void setUserInfoModel(UserInfo userInfoModel) { this.userInfoModel = userInfoModel; } // 通常は不要
}

このActionクラスでは、ModelDriven<UserInfo>を実装し、userInfoModelという名前でUserInfoクラスのインスタンスを保持しています。getModel()メソッドは、このuserInfoModelインスタンスを返します。

注意点: userInfoModelフィールドは、必ずnew UserInfo()のようにインスタンス化しておく必要があります。インスタンス化されていない場合、Strutsはフォームデータをマッピングできません。

POJOクラス (UserInfo.java)

ModelDrivenアプローチで使用する、パラメータを格納するためのシンプルなPOJOクラスです。


package com.example.struts.pojo;

import java.io.Serializable;

/**
 * フロントエンドから渡されるパラメータを保持するPOJOクラス.
 */
public class UserInfo implements Serializable {

    private static final long serialVersionUID = 1L;

    private String userName; // 名前
    private String userMessage; // メッセージ

    // userName, userMessage のセッター・ゲッターメソッドを省略

    public String getUserName() { return userName; }
    public void setUserName(String userName) { this.userName = userName; }
    public String getUserMessage() { return userMessage; }
    public void setUserMessage(String userMessage) { this.userMessage = userMessage; }
}

このPOJOクラスでは、フロントエンドのフォーム要素のname属性(例: userName, userMessage)と一致するフィールド名を持ち、それに対応するセッター・ゲッターメソッドを提供します。Strutsはこれらのセッターメソッドを利用して、フォームから送信されたデータをPOJOに自動的に設定します。

タグ: Struts Java Web開発 パラメータ伝達 ModelDriven

8月18日 09:29 投稿