戯言

つらつらと気づいたことを書いていきます。人狼とか。

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

IE8+jQuery+dwrでjQueryが動かない


jQueryとdwrを同一ページで併用している場合、jQueryを使用しているエレメントで「Null またはオブジェクトではありません」などと出力されて、jQueryが動作しない場合があります。

この問題は、次のようにdwr、jQueryの順で、スクリプトを読み込むことで、解決できます。
読み込む順番が重要です。





問題が起きるのはIE8のみのようで、IE10、Firefox、Chromeでは問題ないことが確認できました。 おそらく、$が衝突してるんですかね。jQueryのreadyを
$(function(){
//
// 処理
//
});
と書くのではなく、
jQuery(document).ready(function($){
//
// 処理
//
});
と書くことでも問題を回避できました。



スポンサーサイト

WebContextFactory.get()がnullを返す場合


DWRを利用している場合、ServletContext は次のように取り出せます。
import org.directwebremoting.WebContext;
import org.directwebremoting.WebContextFactory;

WebContext wctx = WebContextFactory.get();
ServletContext sctx = wctx.getServletContext();
HttpSession session = wctx.getSession();
ここで注意しないといけないのは、WebContextFactory.get()がnullを返す場合もあるって事です。WebContextFactory.get()は、自身の属すスレッドがDWRによって開始されていなかった場合には、nullを返します。DWRのクリエータ(dwr.xmlにとかって書いたらAjaxServiceです)のクラスがnewされて、そのクラス内から呼び出されれば問題ないです。まあ、DWRから始まったスレッドでなければ、WebContextFactory.get()なんて知らないのは当然といえば当然ですが。 別スレッドから、WebContextFactory.get()を取得しようとすると、nullが返って来て、ServletContext sctx = wctx.getServletContext();とかでコケます。

DWRのクリエータから別スレッドをnewした場合などは要注意です。
また、JSP内に記述したクリエータ以外のクラスなどからも当然呼び出せません。この場合はサーブレットですね。

dwr.utilとDWRUtil


DWRのサンプルコードを掲載している解説サイトを見ていると、setValue等の書き方が2パターンあることに気付きました。

dwr.util.setValue("id", bean.id);
DWRUtil.setValue("id", bean.id);

この2つに何か違いがあるのかなと思って、DWRのソースを眺めてみると、こんな記述が見当たりました。
/**
* Declare an object to which we can add real functions.
*/
if (dwr == null) var dwr = {};
if (dwr.util == null) dwr.util = {};
if (DWRUtil == null) var DWRUtil = dwr.util;

6行目にあるように、結局dwr.utilはDWRUtilに置き換えられているので、全く同じみたい。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。