Shinsuke SUGAYA
shins****@yahoo*****
2002年 12月 19日 (木) 17:57:02 JST
こんにちは、 私もさらに Turbine へ踏み込んでみました。 > 確かにrecycle()でUS-ASCIIにセットしていますが、そもそもrecycle()メソッ > ドを呼び出すのはPoolServiceで行われているようです。 recycle() は、普通に呼び出して使うものではないですね。 それと、目的とは違っていたような気がしています。 > Turbineのフレームワークを利用した場合、リクエストの受付は全てMVCで言う > ところのコントローラであるTurbineサーブレットが行っており、このTurbine > サーブレットでは、リクエストが来る度にRunDataFactoryを使ってRunDataを > 取得しています。これはTurbineサーブレットがRunDataを作り出すのではなく、 > ほとんどの場合RunDataServiceを通してPoolServiceからプールされている > RunDataを取り出しています。この時にRunDataServiceを通してPoolServiceか > らRunDataを取ってこれなかった場合のみに、 > > data.setParameterParser(new DefaultParameterParser()); > > としてDefaultParameterParserをnewしているようです。普通に > RunDataServiceを通じてRunDataを取得する場合にはTR.pに記述されている > ParameterParserをセットしています。 たしかにプールからとってくるのがメインで、new DefaultParameterParser() の 行は、たぶん、呼ばれないかもしれませんね。 > では、プールから取り出されて活性化したRunDataのParameterParserにある > characterEncodingという変数に値をセットするのは何時かというと、 > HelloAction.java等の中で、現在問題になっているコードである > > rundata.getParameters() > > という部分で、RunDataが保持しているRequest情報をParameterParserに渡す > ために、ParameterParserのsetRequest(HttpServletRequest req)メソッドを > 呼んでおり、このメソッドの中で渡されたRequest情報からCharacterEncoding > を取得してそれをセットしています。 > > ところが先のメールにも書いたように、このsetRequestメソッドでエンコーディ > ングを取得しようとしても、HTMLフォームの場合にはRequestヘッダの > Content-Typeフィールドにはapplication/x-www-form-urlencodedがあって、 > charsetの指定が含まれていないため、エンコーディングは常にUS-ASCIIになっ > てしまいます。 この辺のことをまとめると、たとえば、DefaultJetspeedParameterParser という のを作り、TR.p に登録すれば、解決されるのではないでしょうか。 このときのエンコーディング情報を取得する場所は、request からでなく、 media.xreg から取得するようにすると良いと思います。 かならずしも、UTF-8 ではないので、このファイルから使用しているメディアタイプの エンコーディングをとるのが安全だと思います。 でも、プールにないときの new DefaultParameterParser() をどのようなときに 実行されるのかが少し気になるところではありますが。 shinsuke __________________________________________________ Do You Yahoo!? Yahoo! BB is Broadband by Yahoo! http://bb.yahoo.co.jp/