Java 関連のログ


Tomcat 終了時に致命的エラー

struts2.1.16 のWebアプリにて tomcat 6.0.24, 6.0.26 に上げると、tomcat終了時に org.apache.catalina.loader.WebappClassLoader clearThreadLocalMap がエラーを吐くケースがありました。

携帯サイトに 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を利用しています。

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

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

メンテナンス中画面(Java編)

メンテナンス中画面は、.htaccess が有効な場合は、RewriteEngineを利用するとうまくいきます。

例えば、.htaccessファイルに以下のような内容を記述しておき、メンテナンス作業を行う場合に、ファイルを設置すれば、リクエストはすべて /maintenance.html ページに遷移してくれます。
管理者のIPアドレスを除外しておけば、管理者だけはアクセスできるようにもできます。

dbcpコネクション張りっぱなし

commons-dbcp、commons-pool を利用してWEBアプリのフレームワークを作るとき、気を付けることがあります。

ホットデプロイでDBのコネクションが張られっぱなしになる事象が発生し調査したところ、dbcp は一度にコネクションを張ったら基本張られっぱなしになることが分かりました。

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を解析する必要がありよろしくありません。