討論區: 公開討論 (Thread #21369)

【Web版】actionでBLogicResultにセットしたメッセージについて (2009-01-19 19:53 by 匿名 #41314)

画面のaction処理は一番目のactionをコールした後に、
二番目のaction.doをコール可能性が高いです。

二番目のactionに、「BLogicResult result = new BLogicResult();」を使って新しいBLogicResultを生成します。
一番目のactionでBLogicResultへセットしたメッセージは二番目のactionの時はなくなりました。

結果は、画面にメッセージは表示できなくなりました。
画面にメッセージを表示したいですが、どうすればよろしいでしょうか。助けていただけませんか。

回覆 #41314×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 【Web版】actionでBLogicResultにセットしたメッセージについて (2009-01-20 16:07 by kimuraku #41329)

BLogicの処理において、BLogicResultにセットしたメッセージは、デフォルトでは
リクエストスコープに保存されます。
BLogicActionを連続して呼び出した場合であっても、それが同一リクエスト内でチェーン
している(=リダイレクトしていない)のであれば、各BLogicでセットしたメッセージは
同一リクエストに蓄積されるはずです。

例えば、
BLogic1(1度目):
 BLogicMessages errors = new BLogicMessages();
 messages.add("key1, new BLogicMessage("テスト1", false));
 blogicResult.setErrors(errors);

BLogic2(2度目):
 BLogicMessages errors = new BLogicMessages();
 messages.add("key2, new BLogicMessage("テスト2", false));
 blogicResult.setErrors(errors);
 
のようにエラーメッセージをセットした場合、2度目のBLogicActionの処理後には
リクエスト内のメッセージは以下のように格納されているはずです。

HttpServletRequest#attribute
 └Globals.ERROR_KEY
   ├"key1"
   │ └BLogicMessage("テスト1")
   └"key2"
      └BLogicMessage("テスト2")

1度目のBLogicAction内でセットしたはずのメッセージが画面に出力されないということは、
以下の点を確認してみてください。

・2度目のBLogicActionのアクションパスにリダイレクト送信しているかどうか。
・独自アクションではなく、TERASOLUNAのAbstractBLogicActionもしくはBLogicActionを
 使用してBLogicを呼び出しているかどうか。
・デバッグモードで起動し、本来存在していなければならない1つ目の
 メッセージがどのタイミングでリクエストアトリビュートから消滅しているか。
 
もし解決できない場合は、以下の情報を教えて下さい。

・1度目、2度目のBLogic内でメッセージをセットしている部分のソースコード
・1度目、2度目のBLogicを呼び出しているActionクラス名
・メッセージを表示させる部分のJSPのコード(<html:errors>や<html:messages>など)
回覆: #41314

回覆 #41329×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 【Web版】actionでBLogicResultにセットしたメッセージについて (2009-01-20 19:53 by 匿名 #41335)

ご返事誠にありがとうございます。

・2度目のBLogicActionのアクションパスにリダイレクト送信しているかどうか。
⇒二度目のBLogicActionのStruts-configの設定は下記の通りです。
<action path="/sectionMstListInit" name="sectionMstEditForm"
scope="request" validate="false">
<forward name="success" path="/sectionMstListInitSCR.do" />
</action>
<action path="/sectionMstListInitSCR"
name="sectionMstEditForm" scope="request" validate="false"
parameter="/jsp/master/SectionMstList.jsp" />

・独自アクションではなく、TERASOLUNAのAbstractBLogicActionもしくはBLogicActionを
 使用してBLogicを呼び出しているかどうか。
⇒はい、今使っているのはAbstractBLogicActionです。

・デバッグモードで起動し、本来存在していなければならない1つ目の
 メッセージがどのタイミングでリクエストアトリビュートから消滅しているか。
⇒下記の通りに、Actionでデバッグでも、sessionの内容も見えません。
public final BLogicResult doExecuteBLogic(final Map<String, String> map)
throws Exception {


私の考え方から、聞きたいことがあります。
Actionの上記メソッドに、各々のactionで新しいBLogicResult result = new BLogicResult();
をnewして返却して、それでもrequestで取得できますか。

・1度目、2度目のBLogic内でメッセージをセットしている部分のソースコード
⇒一度目のセットしている部分
BLogicResult result = new BLogicResult();
BLogicMessages messages = new BLogicMessages();
messages.add("INVALID_REFERENCE_DATA", new BLogicMessage("INVALID_REFERENCE_DATA"));
result.setMessages(messages);
result.setResultString("success");
return result;
⇒二度目のセットしている部分
BLogicResult result = new BLogicResult();
BLogicMessages messages = new BLogicMessages();
messages.add("NO_TARGET_FOR_SEARCHING", new BLogicMessage(
"NO_TARGET_FOR_SEARCHING"));
result.setMessages(messages);
result.setResultString("success");
return result;

・1度目、2度目のBLogicを呼び出しているActionクラス名
⇒一度目のactionクラス名:
    public class SectionMstListDeleteAction extends
AbstractBLogicAction<Map<String, Object>> {
⇒二度目のactionクラス名:
    public class SectionMstListSearchAction extends
AbstractBLogicAction<Map<String, String>> {

・メッセージを表示させる部分のJSPのコード(<html:errors>や<html:messages>など)
⇒下記の通り書いています。
<logic:messagesPresent>
<tr>
<td colspan="4">
<html:messages id="message" message="true">
<bean:write name="message"/>
</html:messages>
</td>
</tr>
</logic:messagesPresent>


ご確認してください。よろしくお願いいたします。
回覆: #41314

回覆 #41335×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 【Web版】actionでBLogicResultにセットしたメッセージについて (2009-01-20 22:11 by kimuraku #41344)

恐らく原因は、JSPの<logic:messagesPresent>タグの使い方ではないでしょうか。

<logic:messagesPresent>タグのmessage属性を省略すると、デフォルトでは
Globals.ERROR_KEY属性がリクエストやセッションスコープに存在するかどうかを
判定してしまいます。

ご提示のソースコードでは、AbstractBLogicAction拡張クラスのdoExecuteBLogic()内で
メッセージをBLogicResultにセットしていますが、その際setErrors()ではなく
setMessages()でセットしているので、リクエストにはGlobals.MESSAGE_KEYで
格納されることになります。(Strutsの仕様)

従って、明示的に<logic:messagesPresent message="true"> と指定することで、
Globals.MESSAGE_KEY属性が存在するかどうか(=setMessages()でセットしたメッセージが
存在するかどうか)を判定するようになり、うまく表示できるかと思われます。

----
また、
>Actionの上記メソッドに、各々のactionで新しい
>BLogicResult result = new BLogicResult();
>をnewして返却して、それでもrequestで取得できますか。
に対する回答ですが、結論から申しますと取得できます。

しかしActionはあくまでBLogicを呼び出すコントローラの役割なので、
業務的なロジックおよびメッセージの格納、遷移先文字列の設定、
BLogicResultの生成などの一連の処理は、全てActionから呼び出される
BLogic内に集約した方が望ましいです。

----
ちなみに、
<action path="/sectionMstListInitSCR"
 name="sectionMstEditForm" scope="request" validate="false"
 parameter="/jsp/master/SectionMstList.jsp" />
 
の部分(2度目のBLogicコール部分)は、遷移先のjspの指定にparameter属性を
利用していますが、ForwardActionではなくAbstractBLogicActionを利用しているのであれば、

<action path="/sectionMstListInitSCR"
 name="sectionMstEditForm" scope="request" validate="false" >
 <forward name="success" path="/jsp/master/SectionMstList.jsp"/>
</action>

と設定しなければ正常に遷移できないと思われます。
(業務ロジックコードでBLogicResult#setResultString("success"); をセットしているため)
この部分に関してはAbstractBLogicAction#doExecute()あたりを拡張することで
対応されているのでしょうか。

以上ご確認下さい。
回覆: #41335

回覆 #41344×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 【Web版】actionでBLogicResultにセットしたメッセージについて (2009-01-21 21:10 by 匿名 #41377)

ご解答ありがとうございます。
もう試して解消しました。

ちなみに、前回ご指摘したactionの配置について、二番目は直接JSPへ遷移するなので、特に問題なしと思います。もう実現しました。ご指摘ありがとうございます。
回覆: #41314

回覆 #41377×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入