DispatchAction vs URLによるコンポーネントメソッドの呼び出し
お題:ifを使用せずイベントを実行せよ。パラメータはURL又はフォームより渡す事。つまりイベント駆動型アクション?
※Strutsを隅々まで知り尽くしてない人が書いたものですので、ヘタレな実装かもしれません。
Strutsの場合
通常Actionクラスを実装すると、何をやっても呼ばれるメソッドはexecuteっぽいんですが、DispatchActionを継承したアクションクラスを作成すると任意のメソッドを実行できるようなので、ColdFusionと戦わせてみる(笑)とりあえずstruts-config.xmlにactionを定義する。
struts-config.xml <action path="/my_action_path" type="packageName.MyAction" name="ActionFormName" scope="request" parameter="event"> <forward name="success" path="/success.jsp" /> </action>
parameter="event"っていうのが肝。パラメータの名前をevent、値をメソッド名で渡すとアクションクラスの任意のメソッドが実行できる。パラメータを渡す方法は
- URLに?パラメータ名=メソッド名(例 /my_action_path?event=メソッド名)
- <input type="hidden" name="パラメータ名" value="メソッド名">
- <html:hidden property="パラメータ名" value="メソッド名" />
でいけました。ボタンが一杯ある時などはJavaScriptを使ってvalueにメソッド名を代入すればOKです。とりあえず危険な香りがぷんぷんしますね(笑)一応詳しくは書かない事にします(^_^;LookupDispatchActionについてはまた今度。
ColdFusionの場合
例: ultra_component.cfcコンポーネントのメソッドを呼び出すURL ultra_component.cfc?method=fireDance リンボーダンスとは違います。
以上っ!(爆)
余談1
ColdFusionの場合、cfscheduleで上記のようなURLを呼び出せば、スケジュールに従って任意のコンポーネントのメソッドを実行できます。ただ単にリクエストを飛ばすだけじゃなくて、ピンポイント射撃するのがミソですね。
余談2
よく見たのが?process=updateみたいにURLにパラメータくっつけて、サーバ側でそのパラメータを判定して処理を切り替える実装方法。これも直接メソッドを叩けないだけで、意図しない処理を意図しないタイミングで実行できる可能性がある。これを回避するには…いくつかありますが、この話題と離れるので気が向いた時に…(時に?)