2010年5月10日月曜日

KeyUp,Changeイベント

JavaScriptで文字列の制限をいれるような画面を作れないかということで、ネットさまよって以下のサンプルゲット。
動的にKeyUp,Changeのイベントを拾って画面に結果を表示する動きになっています。



   

文字数カウント

2010年5月9日日曜日

jsp サーブレット間の通信、session attributeについて

GAEでsessionのattributeを利用するときの注意。

ローカルではエラーがなく動きましたが、デプロイするとエラーがでることが出る。
エラーの内容は、
java.lang.RuntimeException: java.io.NotSerializableException: クラス名
なエラーです。


原因はSessionに対してsetAttributeしたときに、対象のクラスがシリアル化されていない場合にローカルではなんとなく動くようですが、デプロイ後は上記のエラーが発生する模様です。


シリアル化されているかどうかのポイントは
・ implements Serializable をクラスに対してつけているか
・private static final long serialVersionUID = 1L;を宣言しているかどうか
・全てのメンバーに対してgetter,setterがあること。
だそうです・・・

以下、対応したソースです。




package xxxxx;
import java.io.Serializable;
//①implements Serializableが必要
public class WordScore implements Serializable {
    //②serialVersionUIDが必要
    private static final long serialVersionUID = 1L; 
    
    private String word="";
    private String score = "";

    private static Random rnd;

    //③Setter、Getterの宣言
    public WordScore() {
    }
    public WordScore(String word,String score) {
        this.word = word;
        this.score = score;
    }
    public Integer getScoreInt(){
        return Integer.parseInt(score);
    }
    public String getScore() {
        return score;
    }
    public void setScore(String score) {
        this.score = score;
    }
    public String getWord() {
        return word;
    }
    public void setWord(String word) {
        this.word = word;
    }
}


あと、シリアル化失敗した状態で、GAEデプロイしてしまった後、なぜかバージョンあげるまで正常に動かない状態がありました。
デプロイ時のバージョンあげれば解決しました。
変なシリアル化された情報がサーバー上にのこっていたのかなと推測・・・