2010年5月10日月曜日

KeyUp,Changeイベント

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

  1. <script language="JavaScript">  
  2. <!--  
  3. var max=15; //制限文字数  
  4. function Limit(event){  
  5.  frmtxtareadocument.getElementById("twittertextarea");  
  6.  frmDispMsgdocument.getElementById("twitterdispmsg");  
  7.  txtOrgTextfrmtxtarea.value; //テキストエリアの文字  
  8.  txtLengthtxtOrgText.replace(/\n|\r\n/g,"");//改行を除く  
  9.  txtCntLengthtxtLength.length; //改行を含めない文字数  
  10.  intZansuu = (max - txtLength.length);  
  11.  Etype=event.type; //イベントのタイプを取得  
  12.   
  13.  if(Etype== "keyup"){//イベントのタイプが"Keyup"なら  
  14.   if(intZansuu<0){  
  15.     frmDispMsg.innerHTML=  
  16.     "<span style='font-weight: bold;color:red ;'>"+ intZansuu +"</span>文字";  
  17.    }else{  
  18.    frmDispMsg.innerHTML= //文字数のカウントを表示  
  19.     "<span style='font-weight: bold;color:blue ;'>"+ intZansuu +"</span>文字";  
  20.    }  
  21.   }   
  22.  if(Etype=="change") {  
  23.    //イベントのタイプが"onChange"で制限文字数を超えたらalert  
  24.    if(intZansuu <0 ){  
  25.     alert((txtCntLength-max)+"文字オーバーです.\n15文字以内にしてください");  
  26.     frmtxtarea.value=txtOrgText.substring(0,max);  
  27.     frmDispMsg.innerHTML=  
  28.     "<span style='font-weight: bold;color:blue ;'>"+max+"</span>文字";  
  29.    }  
  30.   }  
  31. }   
  32. // -->  
  33. </script>  
  34.   
  35.    <form><textarea cols="30" rows="2" id="twittertextarea" onchange="Limit(event)" onkeyup="Limit(event)"></textarea>  
  36.   
  37. <span id="twitterdispmsg">文字数カウント</span>  
  38.   
  39. </form>  

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があること。
だそうです・・・

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




  1. package xxxxx;  
  2. import java.io.Serializable;  
  3. //①implements Serializableが必要  
  4. public class WordScore implements Serializable {  
  5.     //②serialVersionUIDが必要  
  6.     private static final long serialVersionUID = 1L;   
  7.       
  8.     private String word="";  
  9.     private String score = "";  
  10.   
  11.     private static Random rnd;  
  12.   
  13.     //③Setter、Getterの宣言  
  14.     public WordScore() {  
  15.     }  
  16.     public WordScore(String word,String score) {  
  17.         this.word = word;  
  18.         this.score = score;  
  19.     }  
  20.     public Integer getScoreInt(){  
  21.         return Integer.parseInt(score);  
  22.     }  
  23.     public String getScore() {  
  24.         return score;  
  25.     }  
  26.     public void setScore(String score) {  
  27.         this.score = score;  
  28.     }  
  29.     public String getWord() {  
  30.         return word;  
  31.     }  
  32.     public void setWord(String word) {  
  33.         this.word = word;  
  34.     }  
  35. }  


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