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

15メッセージ処理

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

メッセージ処理

ここでは、Strutsでのメッセージ管理メッセージ処理方法について解説します。

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

基本処理

Strutsでは、ActionMessages、ActionMessageといったクラスを利用してメッセージ処理を行います。

  1. ActionMessagesクラスは複数のメッセージを管理するクラスです。
  2. ActionMessageクラスは単一のメッセージを管理するクラスです。ActionMessageオブジェクトをActionMessagesオブジェクトに追加することによりメッセージ管理を行います。
  3. saveMessages、saveErrorsメソッドを使用し、ActionMessagesオブジェクトをrequestスコープに登録します。requestスコープに登録することによりメッセージをJSPから参照できるようになります。
  4. JSPでは、<html:messages>タグを利用してメッセージを表示します。

アクション・クラスで生成したメッセージを表示するプログラムを例に、Strutsのメッセージ処理について解説します。

【exMessage.jsp】「送信」ボタンを一つだけもち、アクション・クラスへ処理を遷移させるJSPプログラムです。今回は何の処理も行いません。

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

<html:html>
<head><title>メッセージ処理</title></head>
<body>

<html:form action="/ExMessage">
    <html:submit property="submit" value="送信"/>
</html:form>

</body>
</html:html>

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

package struts;

import org.apache.struts.action.*;

public final class ExMessageForm extends ActionForm {
}

【ExMessageAction.java】アクション・クラスです。メッセージの生成、管理を行います。

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.*;

public final class ExMessageAction extends Action {
    public ActionForward execute(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest req,
            HttpServletResponse res) {
        String name = "java";

        //(1)ActionMessagesオブジェクトの生成
        ActionMessages ams_success = new ActionMessages();
        //(2)ActionMessageオブジェクトの生成
        ActionMessage am_success1 =
            new ActionMessage("success.msg1", name);
        ActionMessage am_success2 =
            new ActionMessage("success.msg2", name);
        //(3)ActionMessageオブジェクトの登録
        ams_success.add(ActionMessages.GLOBAL_MESSAGE, am_success1);
        ams_success.add(ActionMessages.GLOBAL_MESSAGE, am_success2);
        //(4)ActionMessagesオブジェクトをメッセージとして登録
        saveMessages(req, ams_success);

        //(5)ActionMessagesオブジェクトの生成
        ActionMessages ams_error = new ActionMessages();
        //(6)ActionMessageオブジェクトの生成
        ActionMessage am_error1 =
            new ActionMessage("error.msg1", name);
        //(7)ActionMessageオブジェクトの登録
        ams_error.add(ActionMessages.GLOBAL_MESSAGE, am_error1);
        //(8)ActionMessagesオブジェクトをエラーメッセージとして登録
        saveErrors(req, ams_error);

        return (mapping.findForward("info"));
    }
}
  1. (1)ActionMessagesオブジェクトams_successを生成します。
  2. (2)ActionMessageオブジェクトam_success1、am_success2を生成します。コンストラクタの引数にメッセージ・リソースファイルのキーと可変置き換え文字を指定します。
  3. (3)addメソッドを使用し、ActionMessagesオブジェクトにActionMessageオブジェクトを登録します。第一引数にはメッセージをグルーピングする際に使用するプロパティを指定します。ActionMessages.GLOBAL_MESSAGEは標準のプロパティです。第二引数に登録するActionMessageオブジェクトを指定します。
  4. (4)メッセージをJSPプログラムで使用するためにsaveMessagesメソッドを使用して、ActionMessagesオブジェクトをrequestスコープに登録します。saveMessagesはメッセージを通常のメッセージとして登録することを意味します。
  5. (5)ActionMessagesオブジェクトams_errorを生成します。
  6. (6)ActionMessageオブジェクトam_error1を生成します。
  7. (7)addメソッドを使用し、ActionMessagesオブジェクトにActionMessageオブジェクトを登録します。
  8. (8)メッセージをJSPプログラムで使用するためにsaveErrorsメソッドを使用して、ActionMessagesオブジェクトをrequestスコープに登録します。saveErrorsはメッセージをエラーメッセージとして登録する際に使用します。

【exMessage2.jsp】メッセージ、エラーメッセージを表示するJSPプログラムです。

<%@ 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>メッセージ処理</title></head>
<body>

・メッセージ
<br>
<%-- (1)メッセージを表示します。 --%>
<html:messages id="msg" message="true">
    <bean:write name="msg" ignore="true"/>
</html:messages>
<br><br>

・エラーメッセージ
<br>
<%-- (2)エラーメッセージを表示します。 --%>
<html:messages id="msg" message="false">
    <bean:write name="msg" ignore="true"/>
</html:messages>

</body>
</html:html>
  1. (1)<html:messages>タグで、ActionMessagesオブジェクトに登録されたメッセージを表示します。message属性がtrueの場合はsaveMessagesメソッドで登録されたメッセージを表示します。<bean:write>タグのignore属性をtrueにしている場合は、メッセージがない場合は何も表示されません。
  2. (2)<html:messages>タグのmessage属性がfalseの場合はsaveErrorsメソッドで登録されたエラーメッセージを表示します。<bean:write>タグのignore属性をtrueにしている場合は、エラーメッセージがない場合は何も表示されません。

【application.properties】メッセージ・リソースファイルです。

success.msg1={0} Congratulation!
success.msg2=Thank you for registration!

error.msg1={0} I'm sorry.

【struts-config.xml】struts-config.xmlファイルです。

<?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="ExMessage"
                    type="struts.ExMessageForm" />
    </form-beans>

    <action-mappings>
        <action path="/ExMessage"
                    type="struts.ExMessageAction"
                    name="ExMessage"
                    scope="request">
            <forward name="info" path="/exMessage2.jsp"/>
        </action>
    </action-mappings>

    <message-resources parameter="resources.application"/>

</struts-config>

【実行例】プログラムの実行例です。通常のメッセージとエラーメッセージが表示されていることがわかります。

Struts実行結果

応用処理

1. メッセージに可変置き換え文字を使用

メッセージに可変置き換え文字を使用する場合は、ActionMessageオブジェクトにメッセージを登録する際にコンストラクタの引数に可変置き換え文字を指定します。可変置き換え文字は4つまで指定することができます。また、可変置き換え文字を配列で指定することもできます。置き換えられるメッセージはメッセージ・リソースファイルの{0}~[3}で指定します。

【ActionMessageオブジェクトにメッセージを登録】

String id = "12345";String name = "java";

//メッセージ・リソースファイルのキー"success.msg"
//の可変置き換え文字として、id、nameを登録
ActionMessage am = new ActionMessage("success.msg", id, name);

【メッセージ・リソースファイル】デフォルトのメッセージ・リソースファイルです。

#メッセージが置き換えられる部分として{0}, {1}を指定
success.msg=Your data is {0}, {1} .

2. メッセージをグループ化

addメソッドを使用してActionMessageを登録する際に第一引数に、グループを識別するプロパティを指定することで、メッセージをグループ化して管理することができます。指定したプロパティを<html:message>タグのproperty属性に指定することで、該当のグループに属するメッセージのみを表示することができます。標準のグループはActionMessages.GLOBAL_MESSAGEです。

【addメソッドでActionMessageオブジェクトを登録】

//ActionMessageオブジェクトamに登録されているメッセージを
//GROUP1_MESSAGEグループに属するメッセージとして登録
ams.add(GROUP1_MESSAGE, am);

【グループを指定してメッセージを表示】

<%-- GROUP1_MESSAGEグループに属するメッセージのみを表示 --%>
<html:messages id="msg" message="true" property="GROUP1_MESSAGE">
    <bean:write name="msg" ignore="true"/>
</html:messages>

3. sessionスコープにメッセージを登録

saveMessagesメソッドを使用してメッセージをsessionスコープで登録することができます。エラーメッセージをsessionスコープで登録することはできません。

【メッセージをsessionスコープで登録】

//saveMessagesメソッドの引数にSessionオブジェクトを指定して
//メッセージをsessionスコープで登録
saveMessages(req.getSession(), ams);

15メッセージ処理