~~
~~ Copyright 2004-2010 the Seasar Foundation and the Others.
~~
~~ Licensed under the Apache License, Version 2.0 (the "License");
~~ you may not use this file except in compliance with the License.
~~ You may obtain a copy of the License at
~~
~~     http://www.apache.org/licenses/LICENSE-2.0
~~
~~ Unless required by applicable law or agreed to in writing, software
~~ distributed under the License is distributed on an "AS IS" BASIS,
~~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
~~ either express or implied. See the License for the specific language
~~ governing permissions and limitations under the License.
~~

  --------
  カスタマイズ
  --------
  baba
  --------
  2008-06-05
  --------

{目次}

 *{{{#リクエストのパース}リクエストのパース}}

  *{{{#RequestParser}RequestParser}}

  *{{{#提供されている_RequestParser}提供されている RequestParser}}

{リクエストのパース}

 リクエストパラメータは以下の順序でフォームオブジェクトにバインドされます。

 [[1]]リクエストをパースしてリクエストパラメータを Map\<String, Object\[\]\> へ変換

 [[2]]Map\<String, Object\[\]\> をフォームオブジェクトにバインド

 []

 ここでは1.のリクエストをパースして Map\<String, Object\[\]\> へ変換する処理をカスタマイズする方法について解説します。

 使用例として、RESTful サービスがあります。\
 ボディ部が XML である application/atom+xml 形式のリクエストを XML パーサをもつ独自のクラスでパースし、Map に変換することで
 XML の内容をフォームオブジェクトにバインドすることが可能になります。

*{RequestParser}

 コンテナに登録されている {{{cubby/apidocs/org/seasar/cubby/controller/RequestParser.html}RequestParser}}
 を実装したクラスがリクエストのパースを行います。\
 このインターフェイスにはリクエストを処理できるかを判断する
 {{{cubby/apidocs/org/seasar/cubby/controller/RequestParser.html#isParsable(javax.servlet.http.HttpServletRequest)}isParsable}}
 と、優先順位を返す
 {{{cubby/apidocs/org/seasar/cubby/controller/RequestParser.html#getPriority}getPriority()}}
 が定義されています。\
 複数のインスタンスがコンテナに登録された場合にリクエストを処理するインスタンスを決定するため、
 {{{cubby/apidocs/org/seasar/cubby/controller/RequestParser.html#getPriority}getPriority()}}
 で取得する優先順位が低い順に
 {{{cubby/apidocs/org/seasar/cubby/controller/RequestParser.html#isParsable(javax.servlet.http.HttpServletRequest)}isParsable}}
 でリクエストを判断し、最初に true を返したインスタンスによってリクエストを処理します。\
 標準の状態では
 {{{cubby/apidocs/org/seasar/cubby/controller/impl/DefaultRequestParserImpl.html}DefaultRequestParserImpl}}
 がコンテナに登録されて(cubby.dicon)いて、通常のリクエストはすべてこのインスタンスが処理します。

*{提供されている RequestParser}

 標準では以下の {{{cubby/apidocs/org/seasar/cubby/controller/RequestParser.html}RequestParser}} の実装クラスを提供しています。

**{{{cubby/apidocs/org/seasar/cubby/controller/impl/DefaultRequestParserImpl.html}DefaultRequestParserImpl}}

   デフォルトの RequestParser です。\
   特に何も設定を行わない場合にはこのクラスがすべてのリクエストをパースします。

   デフォルトとして動作するために、メソッド isParsable() は常に true を返し、
   メソッド getParameterMap() は、ServletRequest#getParameterMap() の結果をそのまま返します。\
   そして、優先順位を一番低くするために優先順位のデフォルト値として Integer#MAX_VALUE が設定されてます。

   このクラスは cubby.dicon に登録されているので常にコンテナに登録されます。

**{{{cubby/apidocs/org/seasar/cubby/controller/impl/MultipartRequestParserImpl.html}MultipartRequestParserImpl}}

   このクラスは {{{http://commons.apache.org/fileupload/}commons-fileupload}} によって multipart リクエストの解析を行います。\
   HTMLフォームからファイルをアップロードする時などに使用する multipart/form-data 形式のリクエストを処理するためにはこのクラスを使用してください。

   form タグの enctype が multipart/form-data のリクエストのときに isParsable() は true を返し、このクラスによってリクエストが解析されます。\
   優先順位のデフォルト値として {{{cubby/apidocs/org/seasar/cubby/controller/impl/DefaultRequestParserImpl.html}DefaultRequestParserImpl}}
   よりひとつ少ない値が設定されます。

   app-cubby.dicon に、このクラスと
   {{{http://commons.apache.org/fileupload/apidocs/org/apache/commons/fileupload/servlet/ServletFileUpload.html}ServerFileUpload}}、
   {{{http://commons.apache.org/fileupload/apidocs/org/apache/commons/fileupload/servlet/ServletRequestContext.html}ServletRequestContext}}
   を登録することで {{{http://commons.apache.org/fileupload/}commons-fileupload}} によるファイルアップロード使用可能になります。

   詳細な設定方法は {{{#diconファイル_WEB-INFclasses}diconファイル (WEB-INF/classes)}} を参照してください。
  