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()メソッドを呼び出してリクエストを具体的に処理します.以下のコードがあります.
ActionServiceletのプロセス()メソッドで実際にユーザ要求を処理するのはRequestProcessorクラスのプロセス()メソッドである.Strutsフレームワークでは、アプリケーションにActionServiceletクラスが1つしか存在しませんが、各アプリケーションモジュールにはそれぞれのRequestProcessorクラスインスタンスがあります.ActionServiceletのプロセス()メソッドでは、正しいアプリケーションモジュールが選択されると、対応するモジュールRequestProcessorインスタンスのプロセス()メソッドが呼び出されて要求が処理されます.RequestProcessorクラスのプロセスメソッドは次のとおりです.
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にマッピングされます.
ActionServiceletのロードが開始します.Webコンテナは、最初の起動またはStrutsアプリケーションの最初のリクエストが到着したときにActionServiceletをロードします.一般的には
Webコンテナ、例えばtomcat起動時にActionServiceletクラスをロードし、
ロードします.
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にマッピングされます.