* [[Ajax]] Asynchronous JavaScript+XMLでJavaScriptで非同期にデータを取りに行って表示しましょうといったもの。 Googleがつかって、注目を集めているらしい。XMLHttpRequestを使ってやっているみたいだけど、いままでもJavaScriptとiframeを使って 非同期にデータを取りにいってたりしていたので、ちょっとは便利になるかもれないが、ブラウザよっては動いたり動かなかったりする JavaScriptを使っている時点でどうなんだろ? MACのIEのJavaScriptの悪夢がよみがえりそうです。リッチアプリケーションというわけでもなく、 HTMLの貧弱さの抜本的な解決になっているわけではないので、ちょっと期待薄です。 とおもってたら、 Javascriptから直接Javaコードを呼び出せるDWR(Direct Web Remoting)というものや、 prototype.jsがあるので、もしやいけるかも... #contents ** 環境 ブラウザにXHTML、HTML、CSS、XSLTがサポートされていればいい。 ** サンプル <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <TITLE>test</TITLE> <script src="prototype.js"></script> <script> function test1() { new Ajax.Request('test.txt',{ onComplete : function (request) { $('idtest1').innerHTML = request.responseText; } }); } </script> </HEAD> <BODY> <div id="idtest1"> <p>テスト1</p> </div> <input type="button" value=Test1 onclick="test1();"><br> </BODY> </HTML> このtest.txtはUTF-8で保存。prototype.jsは[[JavaScript]]を参考に IEでうまくいかなったので、原因を調べているとhttp://clouder.jp/yoshiki/mt/archives/000437.htmlこちらの記事が大変参考になりました。ありがとうございます。 ** [[JSONIC>http://jsonic.sourceforge.jp/]] シンプルで高機能なJAVAのJSONエンコーダー/デコーダーライブラリだそうです。確かに簡単で、POJOを簡単に変換できるので、とても楽 ** DWR(Direct Web Remoting) Ajax対応のフレームワークです。サンプルはhttp://www.getahead.ltd.uk/dwr/のExamplesを見てみましょう。http://getahead.ltd.uk/dwr/downloadからまずdwr.warをダウンロードして、Tomcat 5.5のwebappsにコピーして、起動です。 ***サンプル tomcatのdocBaseをc:\dwrsampleとして、contextのpathを/dwrsampleとする。 c:\dwrsample\dwr.html <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis" /> <title>DWR</title> <!--ここは自動生成されるため、ファイルは見つからない--> <script type='text/javascript' src='dwr/interface/Testdwr.js'></script> <script type='text/javascript' src='dwr/engine.js'></script> <script type='text/javascript' src='dwr/util.js'></script> <script type='text/javascript'> <!-- function searchAddress () { var zipcode = DWRUtil.getValue("zipcode"); if (zipcode.length == 7) { Testdwr.getZipdata(result,zipcode); } } function result(data) { DWRUtil.setValues(data); } // --> </script> </head> <body> 住所検索<br> 郵便番号:<input type="text" id="zipcode" size="10" onkeyup="searchAddress()" maxlength="7"><br> 都道府県:<input type="text" id="pref" size="10"><br> 市区町村:<input type="text" id="city" size="10"><br> </body> </html> c:\dwrsample\WEB-INF\src\com\hidekazu\dwr\Testdwr.java package com.hidekazu.dwr; import java.util.HashMap; public class Testdwr { public HashMap getZipdata(String data) { HashMap map = new HashMap(); map.put("pref","北海道"); map.put("city","札幌市"); return map; } } c:\dwrsample\WEB-INF\dwr.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd"> <dwr> <allow> <create creator="new" javascript="Testdwr" scope="session"> <param name="class" value="com.hidekazu.dwr.Testdwr"/> </create> </allow> </dwr> c:\dwrsample\WEB-INF\web.xml <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app id="dwr"> <display-name>DWR (Direct Web Remoting)</display-name> <description>A demo of how to call Java on the server directly from Javascript on the client</description> <servlet> <servlet-name>dwr-invoker</servlet-name> <display-name>DWR Servlet</display-name> <description>Direct Web Remoter Servlet</description> <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping> </web-app> では、http://localhost:8080/dwrsample/dwr.htmlにアクセスです。ここで、http://localhost:8086/dwrsample/dwr/index.htmlにアクセスすると、利用可能なオブジェクトが見れます。見たくない場合は、<init-param>のdebugをfalseにします。 [[月刊 JavaWorld (ジャバ ワールド) 2006年4月号>http://www.amazon.co.jp/exec/obidos/ASIN/B000EHSMUO/worried-22]]を参考にさせていただきました。あれ?[[月刊 JavaWorld (ジャバ ワールド) 2005年9月号>http://www.amazon.co.jp/exec/obidos/ASIN/B0007WE5SO/worried-22]]にもあったのか...http://www.javaworld.jp/sample_source/sample_2005.htmlからDWRによるAJAXアプリケーション開発をダウンロードしました。Tomcat 5.5のwebappsにコピーしてtomcatを再起動すると、webapps\jw_0509_dwr\jw_0509_dwrになっているので、一階層上にコピーしてやって、http://localhost:8080/jw_0509_dwr/~ ここにも参考文献が[[JAVA PRESS Vol.44>http://www.amazon.co.jp/exec/obidos/ASIN/4774124834/worried-22]] ***セッション c:\dwrsample\WEB-INF\src\com\hidekazu\dwr\Testdwr.java package com.hidekazu.dwr; import java.util.HashMap; import javax.servlet.http.HttpSession; import uk.ltd.getahead.dwr.ExecutionContext; public class Testdwr { public HashMap getZipdata(String data) { //ServletContext context = ExecutionContext.get().getServletContext(); HttpSession session = ExecutionContext.get().getHttpServletRequest().getSession(); if (session.getAttribute("test2") == null) { session.setAttribute("test2",data); } HashMap map = new HashMap(); map.put("pref","北海道"); map.put("city","札幌市"); map.put("test2",session.getAttribute("test2")); return map; } } c:\dwrsample\dwr.html <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis" /> <title>DWR</title> <script type='text/javascript' src='dwr/interface/Testdwr.js'></script> <script type='text/javascript' src='dwr/engine.js'></script> <script type='text/javascript' src='dwr/util.js'></script> <script type='text/javascript'> <!-- var resData; function searchAddress () { var zipcode = DWRUtil.getValue("zipcode"); if (zipcode.length == 7) { Testdwr.getZipdata(result,zipcode); } } function result(data) { DWRUtil.setValues(data); resData = DWRUtil.toDescriptiveString(data, 2); //DWRUtil.setValue("test2","aa"); } function btnKakunin() { alert(resData); } // --> </script> </head> <body> 住所検索<br> 郵便番号:<input type="text" id="zipcode" size="10" onkeyup="searchAddress()" maxlength="7"><br> 都道府県:<input type="text" id="pref" size="10"><br> 市区町村:<input type="text" id="city" size="10"><br> テスト:<input type="text" id="test2" size="10"><br> <input type="button" value="確認" onclick="btnKakunin()"><br> </body> </html>***リンク http://www.javaworld.jp/enterprise/-/20862.html ** prototype.js prototype.jsを使ってやってみます。xoopsのテーブルusersのデータを表示します。 php4.3,mysql5でxoopsを動かしてます。prototype.jsのAjax.Requestを使い、複数データを取得します。 取得したデータをJSONを使って、動的にテーブルに追加してます。~ http://hidekazu.dhs1.sst.ne.jp/xoops/html/を表示し、ユーザID:hoge,パスワード:hogeでログインしてから[[サンプル>http://hidekazu.dhs1.sst.ne.jp/xoops/html/modules/hidegw/test1.php]]~ JSONで扱うフォーマットは、 {"data": [ {"test1":"admin", "test2":"管理人"}, {"test1":"hoge", "test2":"ほげ"} ], "count":"2" }; としてます。 test1.php <script type="text/javascript"><!-- function getData() { new Ajax.Request('test.php',{ method: 'get', onSuccess:getResponse }); } function getResponse(req) { eval("var dataObject = " + req.responseText); //一つめ $('target').innerHTML = dataObject.data[0].test1; //2つめ var target2data = ""; for(var intfor=0; intfor < dataObject.data.length; intfor++) { target2data += dataObject.data[intfor].test1 + dataObject.data[intfor].test2 + "<br>"; } $('target2').innerHTML = target2data; //カウント $('target3').innerHTML = dataObject.count; //テーブルに追加 var tbody = $('result'); for(var intfor=tbody.rows.length-1; intfor >=0 ; intfor--) { var tr=tbody.deleteRow(intfor); } for(var intfor=0; intfor < dataObject.data.length; intfor++) { //row追加 var tr=tbody.insertRow(intfor); //col追加 tr.insertCell(0).innerHTML = dataObject.data[intfor].test1; tr.insertCell(1).innerHTML = dataObject.data[intfor].test2; } } //--> </script> <input type="button" value="クリック" onclick="getData()" /> <div id='target'>JSONテスト1 1レコード目の1項目を表示</div> <div id='target2'>JSONテスト2 全レコードの全項目表示</div> <div id='target3'>カウント</div> <table> <thead> <tr> <th> test1 </th> <th> test2 </th> </tr> </thead> <tbody id="result"> </tbody> </table> test.php <?php echo '{"data":'; echo '['; $intCnt = 0; $sql = "SELECT * FROM ". $xoopsDB->prefix("users"); $result = $xoopsDB->query($sql); while ($myrow = $xoopsDB->fetchArray($result)) { if ($intCnt > 0) { echo ','; } $intCnt++; $uname = $myrow["uname"]; $name = mb_convert_encoding($myrow["name"], 'UTF-8',mb_internal_encoding()); echo '{"test1":"'.$uname.'", "test2":"'.$name.'"}'; } echo ']'; echo ',"count":"'.$intCnt.'"'; echo '};'; ?> さてJSONでやっていますが、XMLHttpRequestを使っている都合上、クロスドメイン(異なったドメイン)にはアクセスできません。そこでそのような場合は、 JSONPを使用することになります。~ 参考:http://at-shima.cocolog-nifty.com/blog/2007/03/javascriptjavas_79bb.html ** JSONP クロスドメインで公開したい場合は、XMLHttpRequestを使っている都合上、別の方法で回避することになります。 ようは、javascriptのファイルを使用する際に、 <script src="prototype.js" type="text/javascript"></script> って書いたりしますが、これが別のドメインでもいけるので、このようなscriptタグを生成してやって、そのコールバックで処理をしてやろうというものです。 ベタに書いていってもいいのですが、いいのがありますので、それを使います。 http://www.xml.com/pub/a/2005/12/21/json-dynamic-script-tag.htmlより、 http://www.xml.com/2005/12/21/examples/jsr_class.zipをダウンロードし、解凍し、JSONscriptRequestを使います。 下記はボタンが押された時に動くサンプルです。~ ボタンがクリックすることによって、getData()が呼ばれます。JSONscriptRequestでscriptタグを生成し、 srcにURLを設定しています。jsr_class.jsはとても短いので、一読してみましょう。 <html> <script src="prototype.js" type="text/javascript"></script> <script src="jsr_class.js" type="text/javascript"></script> <script type="text/javascript"> var oJsr; function getData() { var attr = 'zip=10'; oJsr = new JSONscriptRequest('http://www.hoge.com/hoge.php?'+attr+'&callback=hundler'); oJsr.buildScriptTag(); oJsr.addScriptTag(); } function hundler(dataobj) { if (dataobj.count > 0) { $('id1').value = dataobj.data[0].id1; } oJsr.removeScriptTag(); } </script> <body> <input type="button" value="クリック" onclick="getData()" /> <input name="id1" type="text" id="id12"/> </body> </html> http://www.hoge.com/hoge.phpが返すデータは、 hundler({data:[{id1:"05", id2:"10"}],count:"1"}); とJSONでのデータに関数で括ってやります。 *** リンク [[戯れ言++>http://www.baldanders.info/spiegel/remark/archives/000222.shtml]] とても参考にさせていただきました。 ** GoogleMap 自分のページに設置してみましょうということで、http://www.google.com/apis/maps/ からSign up for a Google Maps API keyをクリックしてサインアップします。 ではサンプルコードがあるので、設置してみましょう。 http://hidekazu.dhs1.sst.ne.jp/googlemap/index.htm~ あれ?IEでエラーがでてますね。 <scrip t src="http://maps.google.com/maps?file=api&v=1&key=hogehoge" type="text/javascript"></script> を <scrip t src="http://maps.google.com/maps?file=api&v=1&key=hogehoge" type="text/javascript" charset="utf-8"></script> にしてやりましょう。script にスペースはいりません。このサイトではscriptは許可していないので、エラーがでるのでスペースを空けているだけです。 ** リンク -http://www.openspc2.org/JavaScript/Ajax/~ -http://www.kawa.net/works/ajax/zip/ajaxzip.html~ -http://connect.seesaa.net/article/2477260.html~ -http://jsgt.org/mt/archives/01/000409.html~ ***[[■Ajax : 勉強用サンプル&解説>http://www.openspc2.org/JavaScript/Ajax/]] ***[[ajaxな住所入力フォーム >http://www.kawa.net/works/ajax/zip/ajaxzip.html]] ***[[【Ajax】暫定版Ajax用ライブラリ>http://jsgt.org/mt/archives/01/000409.html]] Ajax用のライブラリを公開されておられます。~ -http://jsgt.org/ajax/ref/lib/~ -[[まい・はうす>http://blogs.sun.com/takemura/date/20060703]]~ http://jsgt.org/ajax/ref/lib/ ***[[まい・はうす>http://blogs.sun.com/takemura/date/20060703]] AJAX Toolkit FrameworkとDojoについて大変参考になります。~ -[[Eclipse のための Ajax Toolkit Framework を知る>http://www-06.ibm.com/jp/developerworks/opensource/library/os-ecl-atf/index.shtml]]~ -[[Ajaxを勉強しよう>http://www.openspc2.org/JavaScript/Ajax/Ajax_study/index.html]]~ ***[[Eclipse のための Ajax Toolkit Framework を知る>http://www-06.ibm.com/jp/developerworks/opensource/library/os-ecl-atf/index.shtml]] ***[[Ajaxを勉強しよう>http://www.openspc2.org/JavaScript/Ajax/Ajax_study/index.html]] 大変丁寧なページです。出力したら本になるのではないでしょうか。 -[[AJAXの速度をアップする方法>http://gigazine.net/index.php?/news/comments/20060428_ajax/]]~ -[[AjaxDaddy>http://www.ajaxdaddy.com/]]~ ***[[AJAXの速度をアップする方法>http://gigazine.net/index.php?/news/comments/20060428_ajax/]] ***[[AjaxDaddy>http://www.ajaxdaddy.com/]] いろいろなサンプルがあります。http://www.ajaxdaddy.com/demo-interface-fisheye.htmlとかおもしろいなー~ ***[[JSON/XMLデータを簡単に編集する「JSON Editor」>http://www.moongift.jp/2008/11/json_editor/]] ** 参考書籍 [[10日でおぼえるAjax 入門教室>http://www.amazon.co.jp/exec/obidos/ASIN/4798112968/worried-22]]~ prototype.jsやクロージャーとかにもふれられており、初めて読むにはとてもいい本です。 ** コメント --#comment