いまだにStrutsか、、というような風潮もあると思うのですが、社内用のWebアプリケーションとして未だに使っているので、その時々に発生する機能追加や修正があります。

いろいろ細々とした覚書をしておきます。

なおここでのStrutsとは、Struts1(Struts1.3.10)を指します。

Strutsには、リクエストに乗せて次のアクションなりページにメッセージを渡すために、ActionMessagesというクラスを使用します。

同じように、フォームの入力検証時のエラーを渡すためのActionErrorsというクラスもあり、使い方もほぼ同じなのですが、ここではActionMessagesについて、覚書をしておきます。

 

前提条件

次のような、メッセージリソールファイルが有ることを想定しています。

  • プロパティファイル1

/resources/messages/applicationMessages.properties

message.msg1=message1
message.msg2=message2
  • プロパティファイル2

/resources/messages/module2Messages.properties

warn.msg1=Warning!
info.msg1=Information
  • struts-config.xmlファイル

struts-config.xml

<message-resources parameter="resources.messages.applicationMessages" />
<message-resources parameter="resources.messages.module2Messages" key="module2" />

 

リクエストでメッセージを渡す(GLOBAL_MESSAGE)

SomeAction.java

public class SomeAction extends Action {

    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {    
            :
        ActionMessages messages = new ActionMessages();
        messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("message.msg1"));
        messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("message.msg2"));
        saveMessages(request, messages);
            :
        return mapping.findForward("show");
    }
}

使い方はActionクラス等で、ActionMessagesクラスのインスタンスを作成し、そこにActionMessageクラスをaddしていくだけです。
プロパティのActionMessages.GLOBAL_MESSAGEは、Strutsで用意されているメッセージを取り出すための共通プロパティ名です。

addメソッドの第一引数には、プロパティ、第二引数にActionMessageを指定しています。ここでは、ActionMessageにメッセージを取得するためのキー("message.msg1"等)のみを指定しています。

addされたActionMessagesオブジェクトを、saveMessages(request, messages)でリクエストに保存します。

someAction.jsp

<html:message id="msg" message="true">
    <bean:write name="msg"/>
</html:message>

JSPでのメッセージの取り出し。ActionErrorsと区別するために、message="true"を指定します。

<bean:write> の name属性は、<html:message> の id属性で指定した値になります。

 

メッセージを任意のプロパティで指定

ActionMessages messages = new ActionMessages();
messages.add("welcome", new ActionMessage("message.msg1"));
saveMessages(req, messages);

メッセージをaddするときに、任意のプロパティ名を指定することができます。

<html:message id="msg" message="true" property="welcome">
    <bean:write name="msg" ignore="true"/>
</html:message>

jspで取り出すときも、プロパティ名を指定するだけです。ここで、ignore="true"を指定すると、値がなくてもエラーになりません。

 

メッセージの前後に書式を設定する

<html:message id="msg" message="true" property="warn" bundle="zaiko" header="msg.header" footer="msg.footer">
    <bean:write name="msg"/>
</html:message>

メッセージの前後に書式を追加することが出来ます。

applicationMessages.properties

msg.header=<span class="infomation"><b>
msg.footer=</b></span>

メッセージリソースにこのようにプロパティを登録しておくことで、HTML上では、

<span class="information"><b>message1</b></sman>

というふうに出力されます。

 

メッセージのバンドルを切り替える

<html:message id="msg" message="true" property="warn" bundle="module2">
    <bean:write name="msg" ignore="true"/>
</html:message>

複数のメッセージリソースを用意している場合、bundle="key"のようにメッセージリソースのKey値を指定することで、使用するメッセージリソースを切り替えることが出来ませす。
このbundle=..が指定されていない場合は、共通のメッセージリソース(keyが指定されていないリソース)を使用します。

 

メッセージの存在を確認する

<logic:messagesPresent message="true">
    <html:message id="msg" message="true" property="warn">
        <bean:write name="msg" ignore="true"/>
    </html:message>
</logic:messegesPresent>

<!-- または、プロパティの指定をして -->

<logic:messagesPresent message="true" property="warn">
    <html:message id="msg" message="true" property="warn">
        <bean:write name="msg" ignore="true"/>
    </html:message>
</logic:messegesPresent>

logic:messagesPresetnを使用してメッセージの存在をチェックすることが出来ます。

このときもmessage=trueを指定する必要があります。

 

直接メッセージを指定する

messages.add("property", new ActionMessage("メッセージ", false));

ActionMessageのコンストラクタの第一引数に、メッセージの文字列を、第二引数にfalseを指定することで、メッセージリソースから取得するのではなく、ここで指定したメッセージの文字列を、直接出力できます。

 

ActionMessageが存在するかの確認

ActionMessages messages = new ActionMessages();
switch (cond) {
    case 1:
        messages.add("info", new ActionMessage("info.msg1"));
        break;
    case 2:
        messages.add("warn", new ActionMessage("warn.msg1"));
        break;
    default:
        break;
}

if (!messages.isEmpty()) {
    saveMessages(request, messages);
}

isEmpty メソッドでメッセージが追加されているかいないかを調べることができます。

size() メソッドでは、追加されているメッセージの数をintで取得できます。

カテゴリー: JavaJava 覚書

0件のコメント

コメントを残す

メールアドレスが公開されることはありません。