いまだに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
で取得できます。
1件のコメント
Javaフレームワークの種類と定番なフレームワーク4選 - フリーランスとマネープログラミング · 2024年11月2日 10:56 AM
[…] 引用:いまさらながらStruts Struts(Apache Struts)は、古くから使われているWebアプリケーションの開発でも有名なフレームワークです。 […]