- PR -

Ajaxの戻り値の取得がうまくいきません

1
投稿者投稿内容
ぱちぱち
常連さん
会議室デビュー日: 2007/03/05
投稿数: 31
投稿日時: 2007-04-15 05:28
こんにちは。

今、strutsベースのWebアプリの開発を行っています。
環境はWinXP Pro,Weblogic9.2,IE6です。

題名の通りですが、Ajaxでの値の取得がうまくいきません。
ソースはこのようになってます。

○JSP(JavascriptのAjax部)
function onclickPage(obj) {
 selectRow(obj);
 elements = obj.childNodes;
 document.forms[0].param1.value = elements(0).innerHTML;
 document.forms[0].param2.value = obj.name;
 doAJAXAction(PARAM, "PAR", false);
}
function doAJAXAction(id, action, isValidate) {

 alert("@");
 var xmlHttp = newXMLHttpRequest();//new ActiveXObject("Msxml2.XMLHTTP.3.0");

 //処理呼び出し
 callServer(xmlHttp, id + param + "Ajax.do");

 //受信完了
 if (xmlHttp.readyState == 4) {
// var ret = xmlHttp.responseText;
  var url="<%=(String)session.getAttribute("KEY")%>";
  alert("A"+url);
  sName = url.split( "," );
  document.forms[0].text1.value = sName[0];
  document.forms[0].text2.value = sName[1];
  document.forms[0].text3.value = sName[2];
  document.forms[0].text4.value = sName[3];
  document.forms[0].text5.value = sName[4];
  document.forms[0].text6.value = sName[5];

 }
}
function callServer(xmlHttp, rurl) {
 // Build the URL to connect to
 var root = "http://localhost:7001/webapp/";
 var url = root + rurl;
 // Open a connection to the server
 xmlHttp.open("GET", url, false);
 xmlHttp.send(null);
}
function newXMLHttpRequest() {
 /* Create a new XMLHttpRequest object to talk to the Web server */
 var xmlHttp = false;
 /*@cc_on @*/
 /*@if (@_jscript_version >= 5)
 try {
  xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
 } catch (e) {
  try {
   xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  } catch (e2) {
   xmlHttp = false;
  }
 }
 @end @*/
 if (!xmlHttp && typeof XMLHttpRequest != "undefined") {
  xmlHttp = new XMLHttpRequest();
 }
 return xmlHttp;
}

○JavaAction部(set部)
HttpSession session = request.getSession();
session.setAttribute("KEY", "a,b,c,d,e");


Ajax自体はじめての試みで、手探りの状態ですが、データ取得処理・Forward戻り先などのJavaソース部はブレークポイントでデバックして正常に処理されたのは確認しました。
また、javascriptでの
  alert("A"+url);
でnullが出るだけで、構文エラーにもなっていないので、記述ミスは無いと思います。

AjaxがxmlHttp.responseTextでしか取得できないのではないかと、struts-config.xmlから色々いじっても結果が同じだった為、変更箇所の少ないこのソースに戻して追求しているのですが、どうすればいいのか困ってしまいました。

何かお気つきになりましたらよろしくお願いします。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-04-15 09:51
同期モードで送信する場合、readyStateをチェックする必要はありません。

そもそも、
引用:

題名の通りですが、Ajaxでの値の取得がうまくいきません。


取得がうまくいかないとは、具体的にどういうことでしょうか?

Ajaxは単にブラウザから画面遷移を伴わないhttp通信を行っているだけですので、
開発自体は静的ページだけでも可能です。
ですので、もっとシンプルな構成にして通信部分の作りこみができるはずです。
ぱちぱち
常連さん
会議室デビュー日: 2007/03/05
投稿数: 31
投稿日時: 2007-04-15 12:05
ありがとうごおざいます。

>取得がうまくいかないとは、具体的にどういうことでしょうか?

Actionクラスでsessionに格納したデータを、先ほどのロジックで
取得できないという状態です。
多分、Javascriptの記述に問題があると思うのですが、Ajaxの基礎的な
知識が間違っているかもと思い、投稿しました。

シンプルな作りとはxmlHttp.readyStateを見ないとと言うことでしょうか?
知識不足で申し訳ありません。
 //受信完了
 if (xmlHttp.readyState == 4) {
// var ret = xmlHttp.responseText;
  var url="<%=(String)session.getAttribute("KEY")%>";
  alert("A"+url);
  sName = url.split( "," );
  document.forms[0].text1.value = sName[0];
  document.forms[0].text2.value = sName[1];
  document.forms[0].text3.value = sName[2];
  document.forms[0].text4.value = sName[3];
  document.forms[0].text5.value = sName[4];
  document.forms[0].text6.value = sName[5];
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-04-15 14:19
根本的に間違っています。
引用:

var url="<%=(String)session.getAttribute("KEY")%>";


この部分が、Ajaxでリクエストを送信するたびに変化すると勘違いしていませんか?

Ajaxでリクエストを送信するスクリプトが記述されたページを、
最初に表示するときに、サーバサイドによって書き出される部分です。

レスポンスが帰ってきた時に都度再取得されるものではありません。
クライアントサイドとサーバサイドの違いを意識しましょう。Ajax云々の問題ではありません。



Ajaxでの通信とは、そもそも単なるブラウザに組み込まれているHTTPのクライアントでの通信です。
単なるHTTPクライアントですから、受信に関しては単純にサーバからのレスポンスを処理するだけです。

・静的なページへリクエストを送信できるか
・リクエストに成功したら、レスポンスを受信できるか
・レスポンスを受信したら、その値を処理できるか
・ページを動的なページにして、正しく業務ロジックが実行できるか
という手順で開発できるので、静的ページでも開発が出来ると言ったんです。


突っついてばっかりでも悪いので例を書きますが、例えば、
コード:
test


と書かれたtest.htmlがあって、
コード:
var http = ....//XHRの生成は省略
http.open("test.html", "GET", false);
http.send(null);
alert(http.responseText);


と書かれたJavaScriptを実行してtestとアラートが出れば成功です。
非同期モードなら以下のようなコードになります。
コード:
var http = ....//XHRの生成は省略
http.open("test.html", "GET", true);
http.onreadystatechange = function(){
    if(http.readyState == 4){
        alert(http.responseText);
    }
}
http.send(null);


ではtest.htmlをxxxx.jspやらxxxx.do?xxx=xxx&yyy=yyyのようなURLに返れば、
動的ページとのやり取りができますよね?で、xxxx.doのアクションが以下のようなコードとします。
コード:
public void execute(...引数省略){
    request.getSession().setAttribute("KEY","a,b,c,d,e");
    return mapping.findForward("success");
}


で、xxxx.doからフォワードされるJSPが以下のようなコードとします。
コード:
<%=session.getAttribute("KEY")%>


このJSPの内容がhttp.responseTextに格納されるので、それを参照すればよいのです。

Ajaxはあくまでリクエストとレスポンスのやり取りでしかありませんので、
動的ページでセッションを使ったところで、JavaScript側からは知る事は出来ません。
レスポンスにセッションの内容を書き出す必要があります。
ぱちぱち
常連さん
会議室デビュー日: 2007/03/05
投稿数: 31
投稿日時: 2007-04-15 15:50
かつのりさん、丁寧なサンプルありがとうございました。
おかげさまで、データの取得に成功しました!
おっしゃるようにクライアントサイドとサーバサイドの認識が間違っていました。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)