IT技術Labo - HouseTect

Javaフリーエンジニアとしての苦悩や、アーキテクトになるための努力の軌跡を掲載しています。.NETとJavaに力を入れた技術情報発信ブログです。

スポンサーサイト


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

StrustのActionと純粋にAjax通信をさせる方法


最近はAjax通信用のFrameworkがどんどん出てきているので、実際に自分でXMLHttpRequestオブジェクトを使っての通信は、減ってきているみたいですね。

今続々と出てきてるAjaxFrameworkには、
・DWR
・jMaki
それくらい?

このうち、DWRは使って見た。
次回そのソースを公開します。

DWRだとStrutsともSpringともJSFとも連携ができるので、便利かもしれないが、まだわからない。

でもそんなことやってたら、元はどうやって動いていたのか全然理解できなくなりそうなので、ちょっと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へ戻る●

COMMENT

Name
E-mail
URL
Comment
Pass  *
Secret? (管理者にだけ表示)

Pickup Link!

COUNTER



RSSの登録はこちらからどうぞ。
RSS

ブログ内の検索

Google

プロフィール

Hisasann

Author:Hisasann
かなり走り書きなブログで申し訳ないです。個人のメモ程度に使っていますが、よかったら参考にしてくださいね。メールまってま~す。

相互リンク募集しています。 下記メアドまでメールください。
Rastaman@Mixi
Rastaman@コトノハ
Rastaman@テクノラティ

アクセスランキング

ブログパーツ

ブログランキング



ブロとも申請フォーム


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