Struts機能の詳細-ActionServicelet

5380 ワード

ActionServiceletクラスはStrutsフレームワークの内蔵コアコントローラコンポーネントでありjavaxを継承する.servlet.http.HttpServiceletクラス.Strutsの起動は通常
ActionServiceletのロードが開始します.Webコンテナは、最初の起動またはStrutsアプリケーションの最初のリクエストが到着したときにActionServiceletをロードします.一般的には
Webコンテナ、例えばtomcat起動時にActionServiceletクラスをロードし、1ラベルを使用して起動を構成
ロードします.
ActionServiceletには、次の機能があります.
1:プロファイルStruts-configを読み込む.xml
ActionServiceletのロード時にStruts-configを読み込む.xmlファイルは、ファイルに対応するコンフィギュレーション情報をメモリに読み込み、ActionServiceletは異なるモジュールに基づいてModuleConfigクラスを初期化し、そのモジュールの各種コンフィギュレーション情報(ActionConfig、FormBeanConfigなど)をXXXXconfig集合で保存する.
たとえば、プロファイル内のActionマッピング定義はActionConfigコレクションに保存されます.これに応じて、ControlConfig集合、FormBeanConfig集合、ForwardConfig集合、MessageResourcesConfig集合などがある.
ここでのモジュールは、struts-configを異なるユーザが同時に使用するためのものである.xmlファイルが競合すると、各ユーザーは自分のプロファイルを定義し、コンテナによって自動的に構成を統合することができ、各プロファイルはモジュールに相当します.
2:クライアントhttpリクエストを切り取り、対応するアクションに配布する
初期化作業が完了すると、ActionServiceletは顧客要求を受信する準備をします.各リクエストに対して、メソッドprocess(HttpServeretRequest request,HttpServeretResponseresponse)が呼び出されます.このメソッドは、特定のモジュールを指定し、そのモジュールのRequestProcessorのプロセスメソッドを呼び出します.
実際には、サーブレットの原理に基づいて、ActionサーブレットのdoPost()メソッドまたはdoGet()メソッドを呼び出してユーザーリクエストを処理する必要がありますが、これらは実際にはprocess()メソッドを呼び出してリクエストを具体的に処理します.以下のコードがあります.
public void doGet(HttpServletRequest request,HttpServletResponse response)
        throws IOException, ServletException {

        process(request, response);

    }
public void doPost(HttpServletRequest request,HttpServletResponse response)
        throws IOException, ServletException {

        process(request, response);

    }
protected void process(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
		//             
        ModuleUtils.getInstance().selectModule(request, getServletContext());
        ModuleConfig config = getModuleConfig(request);
		//       RequestProcesser  
        RequestProcessor processor = getProcessorForModule(config);
        if (processor == null) {
           processor = getRequestProcessor(config);
        }
                   //  processor   process()      
        processor.process(request, response);

    }

ActionServiceletのプロセス()メソッドで実際にユーザ要求を処理するのはRequestProcessorクラスのプロセス()メソッドである.Strutsフレームワークでは、アプリケーションにActionServiceletクラスが1つしか存在しませんが、各アプリケーションモジュールにはそれぞれのRequestProcessorクラスインスタンスがあります.ActionServiceletのプロセス()メソッドでは、正しいアプリケーションモジュールが選択されると、対応するモジュールRequestProcessorインスタンスのプロセス()メソッドが呼び出されて要求が処理されます.RequestProcessorクラスのプロセスメソッドは次のとおりです.
//  RequestProcessor
      public void process(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException
       {
          //           Muiltipart      
          request = processMultipart(request);
          //               
          String path = processPath(request, response);
          
          if (path != null) 
           {
             if (log.isDebugEnabled())
             log.debug("Processing a '" + request.getMethod() + "' for path '" + path + "'");
            //    ,          Locale  
             processLocale(request, response);
             //    ,       no-caching  
             processContent(request, response);
             processNoCache(request, response);
             if (processPreprocess(request, response))
              {
                 processCachedMessages(request, response);
                 //         
                 ActionMapping mapping = processMapping(request, response, path);
                 if (mapping != null && processRoles(request, response, mapping)) 
                  {
                     //            ActionForm bean
                     ActionForm form = processActionForm(request, response, mapping);
                     processPopulate(request, response, form, mapping);
                     if (processValidate(request, response, form, mapping)&& processForward(request, response, mapping)&& processInclude(request, response, mapping)) 
                      {
                         //     Action         
                         Action action = processActionCreate(request, response, mapping);
                         if (action != null)
                          {
                             //  Action    
                             ActionForward forward = processActionPerform(request, response,action, form, mapping);
                             //      ActionForward  
                             processForwardConfig(request, response, forward);
                         }
                     }
                 }
             }
          }
      }

ActionServiceletは、ActionConfigでその要求に対応するActionサブクラスを探し出し、対応するActionがなければ、コントローラは直接要求をJSPまたは静的ページに転送する.そうでない場合、コントローラは要求を特定のアクションクラスに配布して処理します.
3:要求から取得したデータの埋め込みFormBean(必要に応じて)
コントローラが特定のActionのexecuteメソッドを呼び出す前に、ActionFormオブジェクトはHTTPリクエストのパラメータを使用して自分自身を埋めます(オプションのステップで、プロファイルで指定する必要があります).具体的なActionFormオブジェクトはActionFormのサブクラスオブジェクトであるべきであり、実際にはJavaBeanである.
特に、Strutsのプロファイルstruts-config.xmlはActionServiceletの初期化パラメータ値としてwebにある.xmlファイルで宣言します.なお、ActionServiceletのURL形式は*.doは、ブラウザアドレスに*という接尾辞を入力.doのURLの場合、システムはActionServiceletにマッピングされます.