最近はAjax通信用のFrameworkがどんどん出てきているので、実際に自分でXMLHttpRequestオブジェクトを使っての通信は、減ってきているみたいですね。
でもそんなことやってたら、元はどうやって動いていたのか全然理解できなくなりそうなので、ちょっとActionを呼んで、単にそのResponseに値をつっこんでみた。
StrutsのAction側は以下のようにやってみた。
.NETと同じ要領だが、Responseオブジェクトに対して、OutputStreamを設定するとクライアントに設定した文字列が帰るって寸法だ。
ただし、これも.NETでも言える話だが、返すために作成したPrintWriterクラス(.NETではResponseクラス)のclose()メソッドを呼ぶこと。(.NETではEnd()メソッド)
これをしないともし遷移先のページが設定されてて、Fowordしちゃった場合、HTMLがごわっと画面に表示されちゃうので、それを防ぐために、close()メソッドを呼ぶ。
こうすればもうこれ以上はレスポンスしないですよ〜ってことになる。
package web.action; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; public class AjaxLoginAction extends Action{ public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { /*HttpServletRequestからセッション情報の取得*/ HttpSession session = null; String path = null; ActionForward forward = null; try { session = request.getSession(); path = mapping.getPath(); try { response.setContentType("text/html;charset=Shift_JIS"); response.flushBuffer(); PrintWriter out = new PrintWriter( new OutputStreamWriter(response.getOutputStream(), "Windows-31J")); out.print("Ajax受信成功!!"); out.println(); //フラッシュして終わったほうが良いみたい out.flush(); out.close(); } catch (IOException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } finally { session = null; path = null; } return null; } }
これがサーバー側です。
このActionでチェックするポイントは、戻り値のActionForwardをnullで返すところです。
これでFowardは働きません。
んでもって、クライアント側は、
<%@ page contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J" %> <html> <head> <meta HTTP-EQUIV="Content-Type" content="text/html; charset=Shift_JIS"> <script type="text/javascript" src="script/prototype.js"></script> <!-- 動的に埋め込むためのプレースホルダ --> <script type="text/javascript" charset="utf-8" id="import"></script> <script type="text/javascript"> // prototype.jsのAjax通信機能を使ってアクセスする処理 function JS_Ajax1(){ var ajaxOptions = { asynchronous: true, method: "post", evalScripts: true, onComplete: CallBackJson, parameters: "" } // 「aaa」が返ってくる new Ajax.Request("AjaxLoginAction.do", ajaxOptions); } // Ajax通信のコールバック関数 function CallBackJson(request){ if(request == null){ return; } // evalによってScriptとして認識させる。 $("content").innerText = request.responseText; } </script> </head> <body> ■普通のAjax通信(XMLHttpRequestオブジェクト使用) <br> <input type="button" value="Ajax1" onclick="JS_Ajax1();"/> <br> <br> ■Ajaxの戻り値が以下に表示される。 <br> <div id="content"></div> <br> </body> </html>
こんな感じです。
注意ですが、↑のJSPのコードではprototype.jsを使っていますので、忘れずに
ダウンロード してください。
バージョンはversion 1.5.0です。
■prototype.jsの使い方
・
prototype.js の開発者向けメモ ・
prototype.js リファレンス
↓のボタンでこのブログの記事をランダムに表示します。
●Homeへ戻る●