Struts 2構成Action

6506 ワード

Action処理クラスが実装されると、struts.xmlにそのActionを構成し、Struts 2フレームワークにどのActionがどの要求を処理するか、すなわちユーザ要求とActionクラスとの対応関係を確立させることができる.
Action基本構成
Struts 2はpackageパッケージを使用してActionを組織し、struts.xmlではpackageの下のaction要素を使用してActionを構成します.Actionを構成する場合は、action要素のnameとclassプロパティを指定する必要があります.
  • name属性:Actionの名前を指定する、すなわち、Actionが処理する要求のURLを示す.例えば、name属性値がloginの場合、Actionを要求するURLはlogin.action
  • である.
  • classプロパティ:アクションの実装クラスを指定します.このプロパティは必須ではありません.classプロパティの値が指定されていない場合は、デフォルトでActionSupportクラスが使用されます.

  • Action基本構成コードは次のとおりです.
    
        
    
    
    Actionは論理コントローラにすぎず、ユーザーリクエストに直接対応するものを生成しません.したがって、Actionがユーザ要求を処理した後、指定したビューリソースをユーザに提示する必要がある.すなわち、Actionを構成する場合、論理ビューと物理ビューリソースとのマッピングを構成する必要がある.
    論理ビューと物理ビューのマッピング関係を構成するには、要素によって定義されます.各要素は、論理ビューと物理ビューのマッピングを定義します.
    
        
        /success.jsp
        /error
    
    
    ダイナミックメソッド呼び出し
    1つのアクションに複数の制御処理ロジックを含める必要がある場合があります.例えば、同じフォームに対して、ユーザが異なるコミットボタンでコミットする場合、システムはActionの異なる方法でユーザ要求を処理する必要があり、その場合、Actionに複数の制御処理ロジックを含ませる必要がある.
    Struts 2フレームワークは、1つのアクションに複数の処理ロジックを含めることを可能にする.Struts 2で1つのActionにおける異なる処理論理メソッドを要求する方式はDMI(Dynamic Method Invocation,動的メソッド呼び出し)となり、その要求フォーマットは以下の通りである.
    (ActionName)!(methodName).action
    
  • ActionNameは、struts.xmlで構成されているActionの名前の名前です.
  • methodNameは、Action実装クラスで論理を処理するメソッド名です.

  • 動的メソッド呼び出しの例
    //  product  edit()  
    product!edit.action
    
    productList.jsp
    
    
    
    
        
    
    
        
    ID
    1001 128
    1002 100
    ```
    上記コードでは、商品リストの各商品にハイパーリンクを使用して編集、削除操作を行います.ハイパーリンクにおけるhref属性値は動的メソッド呼び出し方式でリンク要求を行い,製品IDをパラメータとしてActionに渡す.
    ProductAction.javaコードは次のとおりです.
    package com.qst.chapter03.action;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class ProductAction extends ActionSupport {
        private int productId;
    
        public int getProductId() {
            return productId;
        }
    
        public void setProductId(int productId) {
            this.productId = productId;
        }
    
        //     
        public String edit() {
            System.out.println("    " + productId);
            // ...           
            return "edit";
        }
    
        //     
        public String del() {
            System.out.println("    " + productId);
            // ...           
            return "del";
        }
    }
    
    上記のコードは、2つのビジネスメソッドedit()とdel()メソッドを作成します.ユーザーが異なるリンクをクリックすると、対応するメソッド処理に渡されます.
    次にedit.jspとdel.jspのページを作成します.
    
    
    
    
    
        
    
    
        ${param.productId}    
    
    
    
    
    
    
    
    
        
    
    
        ${param.productId}      !
    
    
    
    struts.xmlでProductActionコードを構成するには、次のようにします.
    
    
    
    
        
        
        
    
        
        
            
            
                /edit.jsp
                /del.jsp
            
        
    
    
    
    上記のプロファイルでは、定数struts.enable.DynamicMethodInvocationの値がtrueに設定されています.これにより、Struts 2は動的メソッド呼び出しを開始します.そうしないと、デフォルトでは動的メソッド呼び出しは開始されません.
    methodプロパティとワイルドカードの使用
    動的メソッド呼び出しに加えて、Struts 2は、Action処理クラスを複数の論理Actionとして定義する別の処理方法を提供する.この場合、要素を構成する場合は、name、class、methodプロパティを指定する必要があります.これにより、execute()メソッドではなく、Actionに指定されたメソッドを呼び出してユーザーリクエストを処理させることができます.
    たとえば、ProductActionクラスは、edit()メソッドとdel()メソッドを異なるActionにマッピングする2つの論理Actionとして定義できます.サンプルコードは次のとおりです.
    
        /edit.jsp
    
    
        /del.jsp
    
    
    上記のコードはeditproductとdelproductの2つの論理Actionを定義しており、この2つのActionに対応する処理クラスはProductActionであるが、処理ロジックは異なる.それぞれedit()メソッドとdel()メソッドに対応しています.
    上記の方式は実現できるが,2つの定義のほとんどは同じであり,冗長性の問題をもたらす.Struts 2では、この問題を解決するためにワイルドカード「*」も提供されています.ワイルドカードを使用して、アクションのnameプロパティを定義するときにモード文字列(すなわち、「*」で1つ以上の任意の文字列を表す)を使用します.次に、class、methodプロパティ、およびサブ要素で{N}の形式を使用して、前のN番目のアスタリスク「*」で一致するサブ列を表すことができます.
    *ワイルドカード
    
        
        
            
                /edit.jsp
                /del.jsp
            
        
    
    
    
    上記のコードActionのname属性値は「*product」でワイルドカードが使用されています.このとき定義されているのは普通のActionではなく、ユーザーが要求したURLが「*product.action」に合致する限り、一連の論理Actionが定義されています.のモードは、ProductActionで処理できます.また、ユーザー要求の指定方法としてmethod属性を指定するには、method属性を指定する必要があります.method属性では、name属性値の最初の「*」が指す値である式{1}を使用します.前述の構成規則では、動的呼び出しと同様の実行効果が得られます.
    さらにStruts 2では、classプロパティとmethodプロパティで式を同時に使用できます.たとえば、次のようになります.