Struts2前の記事でIncludeクラスのエンコード設定がおかしいため、JspTemplateEngineで文字化けが発生する問題を取り上げましたが、今回はそれを回避するコードを書いてみました。IncludeクラスのInstanceを1回作成し、setDefaultEncodingを実行すればstaticなフィールドにデフォルトエンコードが設定されるのでContextListenerの中でそういったコードを書きます。ContextListenerの中でDispatcherへListenerを追加します。そのListenerの中で初期化処理を行います。いう風にするのかと言うと、Struts2のコントローラーはFilterで実装されています。ContextListenerで直接初期化処理を書いてしまうと、Filterの初期化よりも前に実行されてしまい、Struts2の初期化処理が行われていない状態で実行されてしまう事になるからです。Struts2結論から言うと、JSPを使ったカスタムタグを作るときにEncodingの指定を読み込めず(システムのデフォルトの文字コード)を使うようになって文字化けが発生するというバグが存在しました。Struts2.1.6でカスタムタグを作るときにデフォルトではFreeMarkerを使うようになっていますが、VelocityやJSPもテンプレートとして使うことができます。struts.xmlでデフォルトのエンジンを変更するか、自作のカスタムタグでテンプレート名を明示的に拡張子付きで指定してあげます。(例:hogehoge.jsp)さて、JspTemplateEngineはRequestDispatcherのIncludeを使って実装されています。このIncludeをする部分はカスタムタグのInclude(<s:include>)のstaticなメソッドであるincludeを呼んでいます。́Д`lll)エエ!!しかも、defaultEncodingとは別にencodingってフィールドも持っているのですがこれもstaticなわけです。これはひどい実装だ・・。分けている意味が分からない。defaultがstaticでencodingがnon-staticだったら意味はわかるのですが・・・。struts-default.xmlのBeanの定義には↓こう書いてある。/>staticなinjectionをしますよと書いてあるのにかかわらず、Setterはstaticではないのです!!誰がこんなコードを何のために修正したんだろうと思ってレポジトリ追ってみた。http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/Include.java?r1=554226&r2=577728ここで変更されたみたい。ちなみに、先に<s:include>タグを実行すると、インスタンス化されて普通に@Injectが走ってstaticフィールドに設定されて以降はその文字コードを使うようにします。WTPだとデフォルトでfile.encoding=UTF-8をつけるみたいで気がつきませんでした。11:45Struts2Struts2.0.11で拡張子無しのアクセスが上手くいきません・・・。標準ではstruts.action.extensionが"action"に設定されており、これを""に設定するとjspに直アクセスできなくなります。JSPに直アクセスするなら転送用のActionを挟むと思いますが、念のため調査しました。DefaultActionProxyをステップ実行させました。BugDBを見たら登録されており、既に修正済みとのこと。https://bugzilla.spamassassin.org/struts/browse/WW-2163Struts2.1.0のリリースに組み込まれるようなので、それまで待つ必要はありますが・・。バイナリはこちらからダウンロードできます。http://people.apache.org/builds/struts/2.1.0/なお、設定は""で設定しても上手く動きません。以下のように設定する必要があります。́・ω・)ちなみにStruts2.1は未リリースです。いつ頃出るのでしょうか・・。当然ながらStruts2はxworkがベースになっているためstruts2.1系はxworkも2.1系になります。Struts2.1に差し替えた時にEclipseのWTPではまったこと。サーバのCleanをしないと古いJARファイルも残っててかち合っちゃいました。22:52Struts2Struts2.0.11がリリースされてるううううぅ!メーリングリストの流れから察してそろそろ来るとは思っていましたが、2.0.9のソース精査が終わった直後にリリースとは・・・。やってくれますね(涙)2.0.11のリリースノートはこちらです。21:43Struts2台風が接近中です。struts2をお勉強というか、調査中です。調べれば調べるほど便利だなーと思うのですが、これをプロジェクトで使うためにどうやって周知しようかなと悩みどころです。Struts1はまったくの別物ですし・・。古くさい実装は殆ど排除されていてとても使いたい。Struts1を文句を垂れながら改造して使うよりも、最近の流行を取り込んでいるStruts2を勉強して使った方が良いと思うのですよ。今までのノウハウは使えませんけどね・・。設定ファイルベースのValidationが動作しないと1時間ほど悩んでいたのですが、原因がわかりました。設定ファイルの名前間違ってた・・・orz「アクションクラス名-validation.xml」、または「アクションクラス名-アクション名-validation.xml」と理解はしていたのですが、アクションクラス名が「SayHelloAction」、ファイル名を「SayHello-validation.xml」としていました。「SayHelloAction-validation.xml」が正しいのにね(ぐすん)このValidationの設定は他にもアノテーションを使う方法とアクションクラス内でロジックを書く方法があります。そのうちWikiに載せます。勉強といえば、この前の休みは情報処理の国家試験だったようですねー。誰か受けた人いないかな?最近の試験はどんなもんなんでしょ。私も今度受けてみようかな。