Struts2 関連のログ


携帯サイトに Struts 2.1.8 を適用したら文字が見えない!

Struts 2.1.6 で作った携帯サイトに Struts 2.1.8 を適用してみたところ、 <s:property />で出力する文字がすべて見えない状態になっていました。
なお、pageEncoding は UTF-8 で、contentType は Windows-31J で出力しています。

JUnitでInterceptorのテスト

Struts2のInterceptorをJUnitでテストしてみました。
そのときちょっと面倒なのがActionInvocation づくり。
コレを使えば割と簡単です。

com.opensymphony.xwork2.mock.MockActionInvocation

HttpServletRequest を作りたいときはコレ。

org.springframework.mock.web.MockHttpServletRequest

もう、リクエストやらセッションやらいろいろ値を入れられます。

// アクションコンテキスト
HashMap<String, Object> contextMap = new HashMap<String, Object>();
  

明けましておめでとうございます!

明けましておめでとうございます。
今年もよろしくお願いいたします。

Java, PHPのフレームワーク構築に携わることが多くなってきました。
JavaはStrut2, PHPはKohanaを利用しています。

お客様によって重要視されるポイントが違うのでとても勉強になります!
いいところを全部集めたら最強のフレームワークができるかも !?

これまでの経験を十二分に発揮しさらなる高みを目指して頑張ります!

tokenSession を新たに作る

struts2 の tokenSession は シリアライズされていないオブジェクトを多数抱えたDefaultActionInvocation をセッションに入れてしまうため、tomcat クラスタリング構成では使えません。そこで、新しい tokenSession を自作することにしました。

StreamResult の getter では例外をキャッチすべし

CSVや画像等を出力する際に利用する StreamResult。
HttpServletResponse を直接操作しなくてもいいので便利ですね。
出力処理自体は、java.io.InputStream を返す getter に書くことになります。
しかし、その getter で例外を捕捉していないと、問題発生時に手間取ります。

getter のメソッドを throws Exception として、例外を外部に投げてしまうと、以下のようなIllegalArgumentException が出て、文句を言われます。

tokenSession は使えない?

struts2 の tokenSession は、トランザクショントークン処理を行ってくれます。
しかも、トークンが無効の場合に、セッションに保存したValueStackを再生し、result処理を行ってくれます。
二重ポストや、CSRFを防ぐことができて、なおかつ、エラー画面ではなく結果の画面も表示してくれるのでとても便利です。

しかーし、ここに落とし穴がありました。

セッションには、ValueStackのみならず、ActionInvocation を丸ごと保存しています。

package ごとの global-results が便利

Struts2 で Ajax向けやRESTといったサーバ側APIをアクションとして作成する場合等、出力がHTML以外の場合は、別 package にするとよいです。

例外が発生したとき、デフォルトの package で global-results に 例外用のページを用意すると思うのですが、API の場合、例外発生時に HTML でエラー内容を出力されても、呼び出し元がそのHTMLを解析する必要がありよろしくありません。

SessionToken を利用する Action は Serializable に。

SessionToken の内部処理を調べる機会があったので、備忘録として書いておきます。
SessionToken は hidden で渡ってきた、token と Session 上の token を比較し、同じであれば処理を続行します。
違っている場合、処理対象のアクションが過去に実行されていなければ、 token.invalid のエラーになりますが、過去に実行されていれば、 そのアクションの処理を実行せず、ページだけを再表示します。

Spring排除

Spring はアノテーションベースのビーンの生成や依存性の注入してくれますが、それほどコードの削減にはならないとのことでフレームワークから排除することになりました。
iBatis が Spring と親和性が高いので、Spring を排除した状態で Struts2 から利用できるようにするには、DAOのインスタンス化に工夫が必要でしたが、それでも Spring を排除できて、少し軽くなった気分です。あくまで気分ですけど。

@Resourceアノテーション使う?

あけましておめでとうございます。今年もよろしくお願いします。

struts2+Srping+iBATISで弊社お客様のフレームワークづくりをしています。
正月休み中に発見したTIPSを1つ。

アクションで@Resourceアノテーションを使って、DAOを初期化することができますが、これが使えるのはアクションクラスだけで、それ以外の共通部品でDBを呼びたいときは使えません。