- PR -

ActionからActionを呼び出す方法

投稿者投稿内容
マシェ
会議室デビュー日: 2005/10/12
投稿数: 13
投稿日時: 2005-11-18 04:24
マシェと申します。
StrutsでActionからActionを呼び出す方法についての質問です。
通常のActionを呼び出すことはできそうなのですが、LookupDispatchActionを使用した
場合、Parameter属性の値(ボタン名)を呼び出し元のActionの中のメソッドで変更する必要があると
思うのですが方法がわかりません。どなたかご存知でしたら助言お願い致します。
プログラムは以下のようなイメージです。
【struts-config.xml】
<action
 path="/SampleAc"
 type="Sample.SampleAc"
 parameter="method"
 name="SampleFm"
 scope="request">
 <forward name="entry" path="/pages/SampleEntry.jsp" />
 <forward name="return" path="/Sample/SampleAc.do" />
</action>


【SampleAc.java(ActionBean)】
public class IMasterAc extends LookupDispatchAction {

 protected Map getKeyMethodMap() {
  Map map = new HashMap();
  //登録画面表示ボタン用
  map.put("button.showEntry", "showEntry");
  //登録ボタン用
  map.put("button.entry", "entry");
  return map;
 }

 //登録画面表示ボタンが押された押された場合に呼び出される
 public ActionForward showEntry(
  ActionMapping map,
  ActionForm form,
  HttpServletRequest req,
  HttpServletResponse res) throws Exception {

  //データ入力画面に表示する初期値のセット
  req.setAttribute("defaultData", "データ入力画面の初期値");

  //データ入力画面への遷移識別子を返す
  return map.findForward("entry");

 }

 //データ入力画面で登録ボタンが押された場合に呼び出される
 public ActionForward entry(
  ActionMapping map,
  ActionForm form,
  HttpServletRequest req,
  HttpServletResponse res) throws Exception {

  //データ入力画面から送信されたデータが空の場合は
  //showEntryメソッドを呼び出し、入力画面をもう一度表示
  SampleFm submitData = (SampleFm)form;
  if(submitData.getData() == null ) {
   //SampleAcを呼び出す識別子を返す
   return map.findForward("return");
  } else {
   (登録などの処理)
   return null;
  }

 }

}


[ メッセージ編集済み 編集者: マシェ 編集日時 2005-11-18 09:26 ]
masa
大ベテラン
会議室デビュー日: 2005/05/11
投稿数: 108
投稿日時: 2005-11-18 09:41
こんにちは。

試してない & 質問を読み違えてるかもしれませんが、
req.setAttribute("method", "button.showEntry");
みたいな感じで、うまくいかないでしょうか。
マシェ
会議室デビュー日: 2005/10/12
投稿数: 13
投稿日時: 2005-11-18 11:57
返信ありがとうございます。
その方法は私も考え試してみたのですが、無理でした。
req.getParameter("method");
を実行するとボタン名(登録)を返すので
req.setParameter("method", "登録画面表示");
のようなメソッドがあればよいのですがAPIなどを調べても見つかりませんでした。
ご存知の方よろしくお願い致します。
masa
大ベテラン
会議室デビュー日: 2005/05/11
投稿数: 108
投稿日時: 2005-11-18 13:48
引用:

マシェさんの書き込み (2005-11-18 11:57) より:
返信ありがとうございます。
その方法は私も考え試してみたのですが、無理でした。
req.getParameter("method");
を実行するとボタン名(登録)を返すので
req.setParameter("method", "登録画面表示");
のようなメソッドがあればよいのですがAPIなどを調べても見つかりませんでした。
ご存知の方よろしくお願い致します。


んー、そうすると
Map reqMap = req.getParameterMap();
reqMap.put("method", "登録画面表示");
とかではどうでしょう。
また、根本的な作りが変わってしまいますが、登録処理など個別のActionを作成して、DispatchActionでは各ActionへのForwardだけを行うようにすれば解決できるかと思います。
マシェ
会議室デビュー日: 2005/10/12
投稿数: 13
投稿日時: 2005-11-18 15:57
masaさん、返信ありがとうございます。
早速、
Map reqMap = req.getParameterMap();
reqMap.put("method", "登録画面表示");
を試してみた所以下のエラーがでました。

【エラー内容】
java.lang.IllegalStateException: Cannot find message associated with key parameterMap.locked
org.apache.catalina.util.ParameterMap.put(ParameterMap.java:165)

Parameterは変更できないという意味なのかもしれませんが、この方法でもう少し
試してみます。
「個別のAction〜」は最終手段として使わせて頂きます。
また、他にも手段がありましたら助言よろしくお願い致します。
masa
大ベテラン
会議室デビュー日: 2005/05/11
投稿数: 108
投稿日時: 2005-11-18 19:55
こんばんは。

引用:

マシェさんの書き込み (2005-11-18 15:57) より:
【エラー内容】
java.lang.IllegalStateException: Cannot find message associated with key parameterMap.locked
org.apache.catalina.util.ParameterMap.put(ParameterMap.java:165)

Parameterは変更できないという意味なのかもしれませんが、この方法でもう少し
試してみます。
「個別のAction〜」は最終手段として使わせて頂きます。
また、他にも手段がありましたら助言よろしくお願い致します。


んー。これは駄目そうです。
何故かは分かりませんが、リクエストParameterは操作すんな。という仕様に基づい
た実装となっているのでしょう。
(操作してはいけない理由を知っている方がいましたら教えて下さい。)
ダウンキャストしてorg.apache.catalina.util.ParameterMapのsetLocked(false);
とかを叩けばもしかしたら動くかもしれませんが、Tomcat依存の実装になる
& どんな副作用が出るか分からないので、お勧めできません。
お役に立てず申し訳ありませんでしたm(__)m
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-11-18 20:01
リクエストパラメータをサーバ側で操作したい場合はサーブレットフィルタを使います。
マシェ
会議室デビュー日: 2005/10/12
投稿数: 13
投稿日時: 2005-11-19 23:09
返信ありがとうございます。
ukさんに教わったサーブレットフィルタで試してみたのですが、ActionBean内で
パラメータを変更しようとした場合と同じエラーが発生しました。
フィルタは以下の内容なのですが、記述が間違っているのでしょうか?

【サーブレットフィルタ】
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain)throws IOException, ServletException {

chain.doFilter(req,res);

Map reqMap = req.getParameterMap();
reqMap.put("method", "登録画面表示");

}

スキルアップ/キャリアアップ(JOB@IT)