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フォームを使用して、userNameとuserMessageのパラメータを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に自動的に設定します。