« 2006年4月 | トップページ | 2007年11月 »

セッションに登録するObjectはSerializableでなければならない

Java/セッション/Serializable

自作クラスをセッションに登録している箇所で、偶然Exceptionが発生しているのを発見。
偶然、というのも、Exceptionが発生しているのが、どうやら『サーブレットコンテナが停止』するとき…今回だとTomcatを停止した時(厳密にはこの表現は違うのかな…最近こういうところで曖昧な知識しかない自分に気付いて凹)なので、わざわざログをチェックすることがなく、たまたまログに吐いてるSQLチェックしよーっと思って見たらException内容がダンプされていてΣ( ̄■ ̄)となった次第。

で、結論としてはセッションに登録するクラスはSerializableクラスをimplementしてないと駄目なんだぜ!ということらしいです。
こちらのページにとても分かりやすく纏められていたので御紹介。
ユーファームさん>コーディングの落とし穴>セッションに保存されるオブジェクトがシリアライズ可能でない
http://www.u-farm.jp/oto/srv_serialize.html
以下引用です。
======引用開始==============================================
【問題点】
セッションは画面遷移をまたいでオブジェクトを保存できる便利な「入れ物」ですが、基本的にメモリ領域の一部を割り当てて使っているため、 (1)割り当て領域が満杯になってしまったときや、(2)サーブレットコンテナを停止するときに、セッション上の保存オブジェクトをいったんDiskに書き出して退避させます。このようなオブジェクトのDisk書き出し処理をシリアライズといいます。 Javaではどんなオブジェクトもシリアライズできるわけではなくて、 java.io.Serializable を実装(implements)したクラスだけが対象となります。

Serializableを実装していないオブジェクトをセッションに保存した場合、最初のうちは問題ないかと思いますが、シリアライズが必要な局面でトラブルを起こします。(通常は NotSerializableException という例外を発生します。)
この問題は開発環境での一過性のテストでは発見しにくく、本番環境で連続稼動しているうちにトラブルの形で初めて発覚することが多いため、十分な注意が必要です。

======引用終了==============================================
解決方法も上記サイトに分かりやすく書かれていましたので御参照。
他の「落とし穴」は初心者さんには有用だな~と思われる内容で、逆説的にこれを知らなかった自分が初心者だということですね!orz

| | コメント (0) | トラックバック (0)

複数リソースファイル参照方法

Java+Struts+JSP

Strutsにおいて、JSPのタグには外部のメッセージリソースを
参照する機能があります。
で、これはリソースファイルが複数あってもOK。

(1)struts-config.xmlでの設定(※二つのファイルが存在する
場合)
<!-- ====== Message Resource 定義
================================ -->
<message-resources parameter="MessageResources"
key="message" />
<message-resources parameter="ApplicationResources"
key="application" />

(2)各JSPファイルで
<bean:message name="mess001" scope="request"
bundle="message" /><BR>

requestスコープに登録されているメッセージリソースファイ
ルに存在するmess001をキーとしたメッセージを表示する。

…スコープに登録、とかファイルに存在する、とか微妙な言葉
遣いが続きますね…(^^;)

| | コメント (0) | トラックバック (0)

javaのシステム情報取得(改行コードの取得について)

Windowsでの改行コードは、"\r\n" または "CR+LF"
UNIX機での改行コードは、"\n" または "LF"
Mac機での改行コードは、"\r" または "CR"

今回開発では、Windows XP + Tomcatで、本番環境は Linux + Tomcatでした。
Web上での表示のため、改行コードを<BR>タグに変換するシーンがあって、開発
時は、\r\n、または \n を<BR>に変換する、というロジックを組んでいたのです
が。
#\r\n、は private static final String NEW_LINE_CD = "\r\n"; のように定義

本番環境にソースをアップした時に、\マークがバックスラッシュではなくて本
当に\マークとしてしか扱われていないようで、改行コードがタグに変換されな
い事態が発生。
なんとか\マークをバックスラッシュに変換かけたいものの、Windows機上で記述
してアップしても意味がない。Windows機からUnix機にtelnetなどで接続して記
述しなおしてもダメ。
UNIX機上で修正すると、コンパイル時に文字化けが原因でコンパイルエラー…と
どないやねんな感じになっていたのですが、ひしだまさんのサイト
http://www.ne.jp/asahi/hishidama/home/tech/java/java.html
を見てあっさり解決。。。てことで、備忘録です。

private static final String NEW_LINE_CODE =
System.getProperty("line.separator");

Systemクラスかぁ……なるほどというか、元々知っていたのを忘れているのか知
らなかったのか…どちらにしてもダメな自分に脱力。
使用可能なプロパティ(主要なもののみ)はこんな感じ。

"file.separator" ファイルの区切り文字
"java.class.path" JavaのCLASSPATH
"java.class.version" Javaクラスのバージョン
"java.home" Javaがインストールされているディレクトリ
"java.vendor" Javaベンダー名
"java.vendor.url" JavaベンダーのURL
"java.version" Javaのバージョンナンバー
"line.separator" 行区切り文字
"os.name" オペレーティングシステムの名前
"os.version" オペレーティングシステムのバージョン
"path.separator" パスの区切り文字 (例) :
"user.dir" ユーザーの現在の作業ディレクトリ
"user.home" ユーザーのホームディレクトリ
"user.name" ユーザー名

詳しくはJavaでHello Worldさんのこのページを参照して下さい。
http://www.hellohiro.com/systemproperty.htm

| | コメント (0) | トラックバック (0)

« 2006年4月 | トップページ | 2007年11月 »