Javaに関する様々な情報をご紹介します。

12アクション・クラス:LookupDispatchAction

Javaに関する様々な情報をご紹介します。

アクション・クラス:LookupDispatchAction

ここでは、Strutsのアクション・クラスの内、LookupDispatchActionクラスについて解説します。

実行環境
  • ・WindowsXP Home Edition
  • ・Tomcat 5.0.18
  • ・Tomcat 5.0.18
  • ・Struts 1.2.4

概要

LookupDispatchActionクラスはフォーム画面内で、submitボタンが複数ある場合に使用するアクション・クラスです。submitボタンごとそれぞれの処理を実行することができます。DispatchActionクラスもsubmitボタンが複数ある場合に使用するアクション・クラスですが、DispatchActionクラスはsubmitボタン名と処理するメソッド名が必ず同じでなければなりません。そのため、submitボタン名に日本語を使用することができません。

LookupDispatchActionクラスは処理するメソッドの情報を、Mapオブジェクト(メッセージ・リソースファイルのキーとメソッド名の組み合わせ)で保持します。submitボタン名はメッセージ・リソースファイルのキーに対する値になります。そのため、値に日本語を使用することで、submitボタン名に日本語を使用することができます。

LookupDispatchActionクラスの作成ポイント
  • アクション・クラスは、LookupDispatchActionクラスを継承して作成します。
  • アクション・クラスは、Mapオブジェクトを作成するためのgetKeyMethodMapメソッド、submitボタンごとの処理メソッドで構成されます。
  • submitボタンごとの処理メソッドは、Actionクラスのexecuteメソッドと同じ形式をとります。
  • メッセージ・リソースファイルのキーの値に日本語を使用する場合は、native2asciiコマンドでエンコードしておく必要があります。

使用例

フォーム画面にsubmitボタンを2つ作成し、submitボタンそれぞれの処理を実行するプログラムを例に、LookupDispatchActionクラスの使用方法について解説します。

【exLookupDispatch.jsp】submitボタンを複数持つ、フォーム画面です。

<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>

<html:html>
<head><title>exLookupDispatch.jsp</title></head>
<body>

<html:form action="/ExLookupDispatch">
    <%-- (1)property属性を指定 --%>
    <html:submit property="exeMethod">
        <%-- (2)メッセージ・リソースファイルの値を表示 --%>
        <bean:message key="submit.a"/>
    </html:submit>
    <br><br>
    <html:submit property="exeMethod">
        <bean:message key="submit.b"/>
    </html:submit>
</html:form>

</body>
</html:html>
  1. (1)property属性にstruts-config.xmlの<action>タグのparameter属性と同一の値を指定します。
  2. (2)<bean:message>タグを使用し、メッセージ・リソースファイルに記載されるsubmitボタン名を表示します。

【submitA.jsp】「送信A」ボタンをクリックした際に実行されるJSPプログラムです。

<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>

<html:html>
<head><title>submitA.jsp</title></head>
<body>

送信Aボタンをクリック。

</body>
</html:html>

【submitB.jsp】「送信B」ボタンをクリックした際に実行されるJSPプログラムです。

<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>

<html:html>
<head><title>submitB.jsp</title></head>
<body>

送信Bボタンをクリック。

</body>
</html:html>

【ExLookupDispatchForm.java】アクション・フォームBeanです。今回は何の処理も行いません。

package struts;

import org.apache.struts.action.*;

public final class ExLookupDispatchForm extends ActionForm {
}

【ExLookupDispatchAction.java】LookupDispatchActionクラスを継承したアクション・クラスです。

package struts;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.ServletContext;
import org.apache.struts.action.*;
//(1)該当パッケージをインポート
import org.apache.struts.actions.*;
import java.util.*;

//(2)LookupDispathcActionクラスを継承
public final class ExLookupDispatchAction
            extends LookupDispatchAction {
    //(3)getKeyMethodMapメソッドを宣言
    protected Map getKeyMethodMap() {
        Map map = new HashMap();
        map.put("submit.a", "methodA");
        map.put("submit.b", "methodB");
        return map;
    }

    //(4)「送信A」ボタンクリック時に実行されるmethodAメソッドを宣言
    public ActionForward methodA(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest req,
            HttpServletResponse res) {

        return (mapping.findForward("methodA"));

    }

    //(5)「送信B」ボタンクリック時に実行されるmethodBメソッドを宣言
    public ActionForward methodB(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest req,
            HttpServletResponse res) {

        return (mapping.findForward("methodB"));

    }
}
  1. (1)LookupDispatchActionクラスを継承したクラスを宣言するために、該当のパッケージをインポートします。
  2. (2)LookupDispatchActionクラスを継承したExLookupDispatchActionクラスを宣言します。
  3. (3)getKeyMethodMapメソッドで、メッセージ・リソースファイルのキーと処理するメソッドの組み合わせをMapオブジェクトに保持します。ここでは、メッセージ・リソースファイルの"submit.a"キーを参照するsubmitボタンがクリックされた時、methodAメソッドが実行されることを表します。
  4. (4)"submit.a"キーを参照する「送信A」ボタンがクリックされたときに実行されるmethodAを宣言します。書式は、Actionクラスのexecuteメソッドと同一です。ここでは、単にfindForward("methodA")メソッドを実行し、struts-config.xmlに指定したページに遷移する処理のみを行っています。
  5. (5)"submit.b"キーを参照する「送信B」ボタンがクリックされたときに実行されるmethodBを宣言します。

【struts-config.xml】アクション・フォームBean、アクション・クラスの振る舞いを指定します。

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE struts-config PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
    "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>

    <form-beans>
        <form-bean
                    name="ExLookupDispatch"
                    type="struts.ExLookupDispatchForm"/>
    </form-beans>

    <action-mappings>
        <!-- (1)アクション・クラスの振る舞いを定義 -->
        <action path="/ExLookupDispatch"
                    type="struts.ExLookupDispatchAction"
                    name="ExLookupDispatch"
                    parameter="exeMethod">
            <!-- (2)findForwardメソッド実行後の遷移先を指定 -->
            <forward name="methodA" path="/submitA.jsp"/>
            <forward name="methodB" path="/submitB.jsp"/>
        </action>
    </action-mappings>

    <!-- (3)メッセージ・リソースファイルを指定 -->
    <message-resources parameter="resources.application"/>

</struts-config>
  1. (1)<action>タグにアクション・クラスの振る舞いを定義します。parameter属性に、<html:submit>タグのproperty属性に指定された値を指定します。
  2. (2)<forward>タグにアクション・クラスのfindForwardメソッド実行後の遷移先を指定します。
  3. (3)メッセージ・リソースファイルを指定します。メッセージ・リソースファイルは\WEB-INF\classesディレクトリ配下に設置します。拡張子(.properties)は指定する必要はありません。

【application.properties】メッセージ・リソースファイルです。"submit.a"に送信A、"submit.b"に送信Bを指定し、native2asciiコマンドでエンコードしています。

submit.a=\u9001\u4fe1A
submit.b=\u9001\u4fe1B

【exLookupDispatch.jsp】submitボタンが複数あるフォーム画面です。

Struts実行結果_1

【submitA.jsp】「送信A」ボタンをクリックした実行結果です。

Struts実行結果_2

12アクション・クラス:LookupDispatchAction