Strutsのメッセージ処理を行うActionMessage?の機能について見ていきたいと思います。
ActionMessage?とはActionクラスで発生したエラー情報をJSPに伝達するための機構です。Actionクラスで発生したエラーをActionMessage?というインスタンスに格納してJSP側で参照することができます。この機構ででてくるモジュールは以下の通りです。
実際の使い方ですがアクションクラス内で
ActionMessages messages = new ActionMessages(); <-messageを格納するリストを作成 messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("メッセージ0",false));
としてActionMessage?を格納したActionMessages?を作成し、
saveMessages(request, messages);
としてリクエストスコープにActionMessages?を格納します。実際に受け渡したいメッセージ文言は直接ソースコードで指定することもできる*2し、指定したキー値でリソースファイル内を検索して文言を取得する事もできます。
さて上でリクエストスコープに格納されたActionMessage?のリストは、JSP側では
<ul> <html:messages id="message" message="true" > <li><bean:write name="message" /></li> </html:messages> </ul>
とすることで画面に表示することができます。上の例だとWEBブラウザには
<ul> <li>メッセージ0</li> </ul>
というhtmlが返却されます。
実際にアクションクラスで情報を設定し、JSPで表示してみたいと思います。
package nu.mine.kino.strutsexamples.actions; public class MessageAction extends Action { private static final Logger logger = Logger.getLogger(MessageAction.class); public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { ActionForward forward = new ActionForward(); ActionMessages messages = new ActionMessages(); <-messageを格納するリストを作成 // まずは、propertiesからでなく、ココで指定した文字列をそのまま画面表示するパタン。 messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("メッセージ0", false));// リソースフラグをfalseにする。 指定しない場合デフォルトはtrue // 次はpropertiesから文字列を取得するパタン。"msg.message1"というキー値でpropertiesを検索し、 // 画面表示。"メッセージ1"は可変文字列で、properties内の // msg.message1={0} <-ココが置換される。 messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( "msg.message1", "メッセージ1")); // 可変パラメタは配列もOK。そのばあい // msg.message2= {0},{1} などと複数プレースホルダをかける。 messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( "msg.message2", new String[] { "メッセージ2の1", "メッセージ2の2" })); // ActionMessages.GLOBAL_MESSAGEというのはグループのIDになっていて、独自のIDを渡すこともできる。 // Messageを表示するJSP側で、タグの指定にグループIDを指定すれば、そのチラのIDのメッセージを表示可能。 // 詳細はJSP側で。 messages.add("HogeGroup", new ActionMessage("別グループのメッセージ", false)); // saveMessageすることで、 // request.setAttribute(Globals.MESSAGE_KEY, messages); // という処理が行われる。 saveMessages(request, messages); return mapping.findForward("success"); } }
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <%@ page language="java" contentType="text/html; charset=UTF-8" %> <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %> <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %> <%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %> <%@page import="org.apache.struts.action.ActionMessages"%> <html:html xhtml="true" lang="true"> <head> <title>ActionMessage系のサンプル</title> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> <html:base /> </head> <body> <ul> <html:messages id="message" message="true" > <li><bean:write name="message" /></li> </html:messages> </ul> ↑デフォルトでは、別グループのメッセージは除外しないみたい。 <ul> <html:messages id="message" message="true" property="HogeGroup"> <li><bean:write name="message" /></li> </html:messages> </ul> <ul> <html:messages id="message" message="true" property="<%=ActionMessages.GLOBAL_MESSAGE%>"> <li><bean:write name="message" /></li> </html:messages> </ul> ↑別グループのメッセージの除外は、明示的にValueを指定すればいい、、、。 </body> </html:html>
上JSPを表示すると以下のようなhtmlが表示されます。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"> <head> <title>ActionMessage系のサンプル</title> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> <base href="http://localhost:8080/strutsExamples/WEB-INF/jsp/message.jsp" /> </head> <body> <ul> <li>メッセージ0</li> <li>メッセージ1</li> <li>修飾もできる メッセージ2の1,メッセージ2の2</li> <li>別グループのメッセージ</li> </ul> ↑デフォルトでは、別グループのメッセージは除外しないみたい。 <ul> <li>別グループのメッセージ</li> </ul> <ul> <li>メッセージ0</li> <li>メッセージ1</li> <li>修飾もできる メッセージ2の1,メッセージ2の2</li> </ul> ↑別グループのメッセージの除外は、明示的にValueを指定すればいい、、、。 </body> </html>
messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("メッセージ0", false));// リソースフラグをfalseにする。 指定しない場合デフォルトはtrue
ActionMessage?のコンストラクタでfalseを指定すると、コンストラクタで指定したStringをそのまま画面に表示することができます。
saveMessages(request, messages);
このsaveMessagesを実行すると、ActionMessages?がリクエストやセッションスコープにGlobals.MESSAGE_KEYという文字列で格納されます。自前でこの文字列をキーにしてJSP側で描画してもよいですが、以下のようにStrutsのタグライブラリを使って描画するのがスマートです。
<ul> <html:messages id="message" message="true" > <li><bean:write name="message" /></li> </html:messages> </ul>
とするとActionMessages?からActionMessage?を順番に取り出して画面に描画していきます。
<html:messages id="message" message="true" >
のmessage属性は、エラーかメッセージかを指定するフラグで、trueの場合は
saveMessages(request, messages);
で渡されたインスタンスで画面を描画します。falseの場合は後述のエラーメッセージ
saveErrors(request, messages);
で渡されたインスタンスで画面を描画します。
ActionMessages?.GLOBAL_MESSAGEについてはメッセージのグルーピング指定なのですが、後述します。
リソースファイルから固定的な文字列を取得するだけでなく、プレースホルダを用いてメッセージを可変にすることも可能です。
// 次はpropertiesから文字列を取得するパタン。"msg.message1"というキー値でpropertiesを検索し、 // 画面表示。"メッセージ1"は可変文字列で、properties内の // msg.message1={0} <-ココが置換される。 messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( "msg.message1", "メッセージ1")); // 可変パラメタは配列もOK。そのばあい // msg.message2= {0},{1} などと複数プレースホルダをかける。 messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( "msg.message2", new String[] { "メッセージ2の1", "メッセージ2の2" })); // ActionMessages.GLOBAL_MESSAGEというのはグループのIDになっていて、独自のIDを渡すこともできる。 // Messageを表示するJSP側で、タグの指定にグループIDを指定すれば、そのチラのIDのメッセージを表示可能。 // 詳細はJSP側で。 messages.add("HogeGroup", new ActionMessage("別グループのメッセージ", false)); // saveMessageすることで、 // request.setAttribute(Globals.MESSAGE_KEY, messages); // という処理が行われる。 saveMessages(request, messages); return mapping.findForward("success");
この記事は
現在のアクセス:58364