Lookup Displatchアクションの使用


転載:http://hi.baidu.com/javajavajava/blog
org.apphe.structs.LookudisplatアクションカテゴリはDisplactionカテゴリのサブクラスであり、Dispache.structionに似ているのは、要求上のパラメータを通して、どの方法を実行するべきかを決めることですが、Lookupspactch Actionは情報リソースファイルを検索する機能が多くなりました。つまり、フォームの中に2つ以上の同名の送出ボタンが含まれている場合、クエリ情報リソースファイルを介して対応する動作を決定することができます。
直接例を挙げて説明します。Lookup Displatchアクションを継承した後、getKeyMethodMap()方法を再定義し、関連する処理方法を定義します。例えば、
コード:

package onlyfun.caterpillar; 
                                                                                 
import javax.servlet.http.*; 
import org.apache.struts.action.*; 
import org.apache.struts.actions.*; 
                                                                                 
public class ShoppingAction extends LookupDispatchAction { 
     protected Map getKeyMethodMap() { 
         Map map = new HashMap(); 
         map.put("button.continue", "continue"); 
         map.put("button.checkout", "checkout"); 
         return map; 
     } 

     public ActionForward continue(ActionMapping mapping, 
                               ActionForm form, 
                               HttpServletRequest request, 
                               HttpServletResponse response) 
     throws Exception { 
         // ...... 
     } 

      public ActionForward checkout(ActionMapping mapping, 
                               ActionForm form, 
                               HttpServletRequest request, 
                               HttpServletResponse response) 
     throws Exception { 
         // ...... 
     }                                                               
} 

メッセージリソースファイルには以下のメッセージが含まれていると仮定する。
コード:

button.continue=Continue 
button.checkout=Checkout 
Lookup Displatch Actionを使用するために、私達はDisplactのようにstruts-config.xmlに要求パラメータの中にある名前を定義します。
コード:

 <action path="/shopping" 
  type="onlyfun.caterpillar.ShoppingAction" 
  parameter="method" 
  name="cartForm"/> 
フォームページには以下の内容が含まれていると仮定します。
コード:

  <html:form action="/shopping"> 
         <html:submit property="method"> 
             <bean:message key="button.continue"/> 
         </html:submit> 
         <html:submit property="method"> 
             <bean:message key="button.checkout"/> 
         </html:submit> 
     </html:form> 
これらのStrutsの自己綴じは実行後、以下の内容が発生します。
コード:

<form name="cartForm" method="post" action="/HelloStruts/shopping.do"> 
     <input type="submit" name="method" value="Continue"/> 
     <input type="submit" name="method" value="Checkout"/> 
</form>
ボタンを押すと、要求パラメータにはmethod=Continueまたはmethod=Checkoutが含まれます。method=Continueと仮定します。
はい、Lookupsplatアクションはそれによってvalueとして情報ファイルで対応するkeyを見つけます。そしてkeyと
get KeyMethodMap()は、実行する方法がcontine()であることを知っています。
************************************************
Struts DisplatActのどのようにフォームにmethodパラメータを提出しますか?
DisplatchアクションはStrutsに含まれているもう一つの開発時間を大幅に節約できるアクションです。フォームから追加、修正、記録を削除する機能をDisplatchアクションで作りたいです。
<html:form action=「/MyDisplatchアクション」>
MyDisplatch Actionにはadd、alert、deleteなどの方法がありますが、問題はどのようにフォームを提出する時にパラメータを加えますか?
例えば、add buttonを押してMyDisplathActionを実現しますか?method=addという一回の提出ですか?
1.Displatchアクションを使う
DisplatchアクションはStrutsに含まれるもう一つの開発時間を大幅に節約できるアクションクラスです。他のアクションクラスとは単一のexecute()方法のみを提供して単一のサービスを実現するのとは違って、Displatch Actionは、単一のアクションクラスで複数の業務に関連する方法を作成することを可能にする。このように、アクションクラスの数を減らすことができ、関連する業務方法をまとめて維持することが容易になる。
Displatchアクションの機能を使うには、自分でクラスを作る必要があります。抽象的なDisplatchアクションを継承することで得られます。各提供するトラフィック方法には、特定の方法が必要である。例えば、買い物車に商品リストを追加する方法を提供したいです。このようなShopingCartDisplatActを作成して、次のような方法を提供します。
このタイプはお客様のショッピングカートから商品リストを削除するデレーテム()方法が必要かもしれません。また、カート(clearcart)方法でカートを掃除するなどです。このとき、これらの方法を単一のアクションクラスに集めてもいいです。各方法に一つのアクションクラスを提供する必要はありません。
ShopingCartDisplatアクションのいずれかの方法を呼び出すときは、URLにメソッド名をパラメータ値として提供するだけです。つまり、addItem()を呼び出す方です。ǖ?URLは以下のように見える。
http://myhost/storefront/action/cart?method=addItem
ここでmethodパラメータはShopingCartDisplatActで呼び出す方法を指定します。パラメータの名前は任意に設定できますが、ここで使用する「method」は一例です。パラメータの名称はStruts設定ファイルで自分で設定できます。
====================================================================================================================
2.Lookup Displatchアクションを使う
org.apphe.struts.actions.Lookudisplatアクション類:
通常はLookup Displatch Actionは一つのフォームに複数の提出ボタンがあり、これらのボタンに共通の名前がある場合、これらのボタンの名前と具体的なアクションMappingのparameter属性が対応しています。
LookupsplatActionを設定する場合は、「action」の要素の中で、parameter属性を「action」に設定し、「html:submit」のタグのproperty属性と一致させるべきです。
隠し変数を作ればいいです。
そしてJSで判断してください。

<SCRIPT LANGUAGE="javascript"> 
<!-- 
function SetAction(opType) { 
document.name1.action.value = opType 
document.name1.submit(); 
} 
//--> 
</SCRIPT> 
</head> 
<body> 

<html:form name="name1" action="/Del" type="XX.XX.Del"> 
<html:hidden property="action" /> 
<html:button property="update" value="UDDATE" 
onclick="SetAction’updateDsp’);"></html:button> 
<html:button property="add" value="ADD" 
onclick="SetAction’addDsp’);"></html:button> 
</html:form> 
</body> 
</HTML> 
hiddenの要素を定義し、JSが提出するパラメータを制御します。
このタイプを使いすぎると乱雑になります。フォーマットのマッピングはあなたを煩わすことができます。
同様に上の階の兄の方法を使えばいいです。これは同じページで複数提出する時に使うのがいいです。
一つのページを一つずつ提出すれば、もっと簡単な方法があります。
<html:form action=「/MyDisplatchアクション?action=add」>
パラメータを追加すればいいじゃないですか?actionでこのパラメータを検証し、formがあればgetsset方法を追加して同じようにコメントを入れても問題が解決できます。
An abstract Act that dispatches to the subclass mapped execute method.This is is useful in cases where an HTML form has multiple submit buttons with the same name.The button name specifiredcreate an entry like this:
<action path=「/test」
type=「org.example.MyAction」
name=「MyForm」
scope=「request」
input=「/test.jsp」
parameter=「method」/>
which will use the value of the request parameter named“method”to locate the corese ponding key in Application Resource.For example,you might have the following Application Resoures.properties:
button.add=Add Record
button.delete=Delete Record
And your JSP would have the follwing format for submit buttons:
<html:form action=「/test」>
<):submit property=「method」
<bean:message key=「button.add」/>
<):submit>
<):submit property=「method」
<bean:message key=「button.delete」/>
<):submit>
<):form>
Your subclass must implement both getKey MethodMap and the methods defined in the map.An example of such implementation s are:
protected Map getKeyMethodMap()
Map map=new HashMap()
map.put(「button.add」);
map.put(「button.delete」、「delete」);
return map;
)
public Action Forward add(アクションMapping mapping、
アクションForm form、
HttpServlet Request request,
HttpServlet Response)
throws IOException、Servlet Exception{
//do add
return mappings.findForward(「success」);
)
public Action Forward delete(アクションMapping mapping、
アクションForm form、
HttpServlet Request request,
HttpServlet Response)
throws IOException、Servlet Exception{
//do delete
return mappings.findForward(「success」);
)
Notes-If duplicate values exist for the keys returned by
get Keys,only the first one found will be returned.Ifのcorereponding key
is found then an exception will be thrown.You can override the
method unspecified to provide a custom handler.If the submit
was cancelled(a):cancel button was presed)、the custom
handler cancelled will be used instead.