※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

◆ エラー履歴

※今までハマったエラーを記入



forwardでNoSuchMethodError

jdkのバージョンの問題。
コンパイラとサーバのJDKのバージョンが違うと発生するらしい。
今回はservlet-api.jarのバージョンが違うのが問題だった。

FireFoxでjQueryのclone使うと、hiddenの値が返ってこない


FirefoxでSeasar2でSAStrutsでWebページを作ってます。
セレクトボックスをjQueryのcloneで複製して、
次の画面に遷移し、ブラウザのバックボタンで戻ってくると
hiddenの値が初期化される現象が発生しています。
formはjavascriptでsubmitを呼んでいます。

testページ作っても再現しないので、何か他の原因があるのかもー;;

とりあえず、clone使わなければちゃんとした値が返ってくるので
そっちでやる方向で。

一応こんな例もあるらしい。
Firefoxでclone使ったがバグった

chromeでのみ、Ajaxで中身を書き換えたhiddenの値が復元されない


Seasar2でSAStrutsの環境で、
FormにInstanceTypeを何も指定せずに
hiddenの値を書き換え、javascriptで
document.forms[0].action = "methodName";
document.forms[0].submit();
とやると発生する稀少なバグ。

chromeで戻る画面のURLが変わると別の画面に遷移するような
動作をするという仕様(?)らしい。

A画面では最初「go」というactionが定義されている。
それをJavascriptで「next」というaction名に書き換え、
submitして、B画面に遷移する。
そこでブラウザの戻るボタンを押下。
ブラウザではA画面のフォームのaction「next」と想定して
画面遷移するが、実際はaction「go」しかないので
別画面と勘違いし、復元せずに別画面に遷移したような動作になる。

…らしい。。

<form>内にaction名(Actionクラスのメソッド名)を
nameとvalueに書いたhiddenを用意して、
submitするとそこに遷移するらしいので、
それをやると正常に動作した。

<form>
<input type="hidden" name="next" value="next" id="actionName" />
<input type="button" value="次の画面へ" />
</form>

<script>
function submit() {
  // ここでこういう風にaction名を書き換えられる
  document.getElementById("actionName").name = "next";
  document.getElementById("actionName").value = "next";
  document.forms[0].submit();
}
</script>


DOCTYPEでcssのhoverとposition:absoluteの動作が変わる


IE7での動作を比較しました。

<html>タグの前に
◆互換モード
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
を指定した時は、座標指定は自由に設定できるが、
hover(マウスオーバーした時のデザインを変更するcss)がうまくいかない。
通常時のcssは反映されているが、
マウスカーソルを合わせてもデザインが変わらない。

◆標準モード
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
を指定した時は
hoverは正常に動作するが、position: absolute がうまくいかない。
relativeも使ってるけど、はずしてもおかしな座標に表示される。

恐らくhoverはIE7からaタグ以外で使えるようになったりなど、
関係しているかもしれないが…定かではない。



StrutsでActionMessageを表示しようとしてハマった、、

struts-config.xmlでpropertiesファイルを読み込んでるのに、
new ActionMessage("エラーメッセージ")
と書いて表示されず、ハマった…
propertiesがあるなら、そっちにコードと内容を書いて
それを使わないと、propertiesファイル内から
エラーメッセージ=エラーメッセージ内容
が書いてあるところを探して見つからず、表示されない。
正しくは、

Action or Form 内
new ActionMessage("error.message");  // saveErrorとかに渡してね
propertiesファイル (WEB-INF/classesの中とかにある筈、なければ作るとか)
error.message=エラーメッセージ内容
という感じで使う。
ActionMessageを発行すれば、servletが呼ばれ続ける限り
次の次の次の画面でもActionMessageを取得できる。

文字列をDate型に変換するのにハマった、、

まず、
Date date = DateFormat.getDateInstance().parse(str);
を間違えて
Date date = DateFormat.getInstance().parse(str);
って書いてて動かない~ってハマってたのと、
Thu, 06 Dec 2012 16:41:19  +0900
↑こんな型の文字列をDate型にしようとして
ParseExceptionが出てた。
SimpleDateFormat objFormat =
new   SimpleDateFormat(format, locale);
Date date = objFormat.parse(str);
フォーマットを指定して変換するのと、
↑の日付の場合、
format = "EEE, dd MMM yyyy HH:mm:ss  Z"
locale = Locale.ENGLISH
で指定しないと駄目っぽい。
あとjava.sql.Dateに変換するなら、こう。
new java.sql.Date(toDate(str, format, locale).getTime());
ちなみに+0900ってのはタイムゾーン。
±0000とか±000の形なら 'Z' でフォーマット指定すればいけるけど、
 +09:00はできなかった…(コロンが駄目っぽい)
誰かやり方があるなら教えろください。。
名前:
コメント:

MySQLのエンコードがおかしい

MySQL接続のURLに
useUnicode=true&characterEncoding=utf8
をつけてなかったので、
ソースがUTF-8でサーバもUTF-8なのに
バグバグだった。

jquery→Action(Seasar)で配列を送りたい

javascript側は連想配列で送ろうとして、
Action(というかForm)では普通の配列で受け取ろうとして、
(panelList[])の設定に失敗しました。
理由はjava.lang.NumberFormatException: For input string: ""
と出ました。
でもweb.xmlを直接書くServletでは動くみたい。謎。
参考

追記
var list = {};
ajax(url: "method", data: { "fieldName", list })
で一応送れた。
list = {};でオブジェクトとして定義してやるのがミソらしい。
でもごちゃごちゃ書いてあるソースに移動したら途端に動かない、、(泣
あと、int[]では駄目で、String[]限定らしい。
この一連のExceptionはSeasarのバグらしい。

jqueryでプラグインの関数は、呼んだ分だけ設定される

diceプラグインで
$("#dice").dice();
を複数回呼ぶと、クリックした時に
↑を呼んだ回数分中の処理が実行されて
おかしなことになる。
clickとか複数回呼ばなくちゃいけない場合は、
("#dice").unbind('click');
unbindを呼んでから再度呼ぶ。

value=""(デフォルト)を書いて、前の画面のデータが表示されない

Servlet側とjspを自分で作る場合、初期値にvalue=""などを設定するのは必要だが、
Strutsでvalue=""をやってしまうと、初期値がテキストボックスに入力されない。
ちなみに前の画面で入力したデータをForm名と同じ名前でPOSTされる。

SQL文でorder byを途中に書いてエラー

order byは必ず最後に書かなければいけない。
SeasarのSQL文を作るフレームワークでも同じ。
ついでにlimit関数はOracleでも普通に使えます

プロジェクトをコピーして、実行してもページがないというエラーになる

eclipseでプロジェクトをコピーすると
いろいろなリンクがコピー前のプロジェクトになっていることがあります。
サーバを起動した時にアップロードしてるファイルパスを調べたり、
プロジェクトプロパティを開いて、パスを確認したりしましょう。

SingletonS2Container最強

Seasarでカスタムバリデートを作った時、
validate関数側でデータベース接続しようと思ってもできずに困ってました。
本来はデータベース接続して、validateを行いたい場合はFormに書いたりして、
validateでは文字列の中身をチェックしたりする為にあるらしいが。
でも、SingletonS2ContainerでConnectionクラスなどを直接呼び出して、
データベース接続することはできるようだ。
このやり方は結構使うべきでないところでも使えてしまうので、最終手段として残しておく。
本当に実装したいのに無理な時に使おう。

validate関数を作って、呼び出す時アノテーションが先に呼び出される

変数にアノテーションで@Requiredなどを書き、
関数に@Execute(validate="methodName", input="hoge.jsp")と書くと、
まずアノテーションチェックが通り、その後関数に登録したvalidate関数が呼ばれる。
※@Execute(valida tor =true)と@Execute(valida te ="method")は語尾が違うので注意
その為、A,B,Cをチェックしたい場合とCのみチェックしたい場合は
アノテーションでCのみ(毎回チェックするもののみ)チェックして、
自分で作った関数でAとBをチェックすれば実装できる。
エラーメッセージなどはエラーが発生する場合しか表示せず、
アノテーションで引っかかってると、元の画面に戻ってるのに
エラーメッセージが表示されないし、ログにも何も表示されないので
わかりにくいので注意。

検索機能を作った時、何度もできましたって言ったものの

こっち直したらこっちが壊れた…などで何回も呼んでしまった。
エラーチェックはちゃんとやろう。

入力チェックは、
  • 正常な値が入力された場合
  • 何も入力してない場合
  • 入力はされているが意図しない値が入力された場合(2byte文字や数字や記号など)

javascriptでエラーの見方が分からずに、ハマった。

FireFoxでツール→ウェブ開発ツール→エラーコンソールで
エラーを見ることができる。
関数の文字列もあってるし、include先の関数もちゃんとあるのに、エラーが出る場合は
type="text/javascript"などの決まり文句などもチェックしよう。
|