2012-01-13 3 views
0

JSONオブジェクトを返すサーブレットがあります。このサーブレットを別のJavaプロジェクトで使用したいと思います。私は私に結果を取得し、この方法を持っている:JSONを返すサーブレット:受信時の混乱

public JSONArray getSQL(String aServletURL) 
{ 
JSONArray toReturn = null; 
String returnString = ""; 
try 
{ 
    URL myUrl = new URL(aServletURL); 
     URLConnection conn = myUrl.openConnection(); 
     conn.setDoOutput(true); 
     BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
     String s; 
     while ((s = in.readLine()) != null) 
     returnString += s; 
     in.close(); 

     toReturn = new JSONArray(returnString); 
} 
catch(Exception e) 
{ 
    return new JSONArray(); 
} 
     return toReturn; 
} 

これはかなり意志を動作しますが、私が直面しています問題は以下の通りです:私はいくつかの要求を同時に行うと 、結果がごちゃ混ぜと私は時々取得します送信したリクエストと一致しないレスポンス。

私は、私が応答を返す方法に関連していると思われます。Readerは接続のInputStreamからStringを読み込みます。

どのように私は1つの要求 - > 1つの対応する応答を得ることができますか? 私のサーブレットからJSONオブジェクトを取得する良い方法はありますか?

乾杯、 ティム

+0

これはAJAXコールですか?もしそうなら、responsestatusコードをチェックしていますか? – kosa

+0

このメソッドをsynchronizedとしてマークします。サーブレットをリクエストしている現在のプロジェクトのタイプ。 – adatapost

+0

'toReturn'はメソッド内で決して宣言されません。だから私は推測する:グローバル変数 - >並行性の問題。それともコピー/貼り付けが悪いのですか? – Grooveek

答えて

1

複数の同時リクエストを行うと、結果が混ざり合って、送信したリクエストと一致しないレスポンスが表示されることがあります。

サーブレットはスレッドセーフではありません。リクエストスコープのデータを、サーブレットのインスタンス変数またはクラス変数として直接的または間接的に不適切に割り当てたとします。これは一般的な初心者の間違いです。

このHow do servlets work? Instantiation, sessions, shared variables and multithreadingを慎重に読んで、それに応じてサーブレットコードを修正してください。この問題は今まで示したURLConnectionコードにはありませんが、で全く同じ仕事をしていることを示していますが、doGet()doPost()の両方がサーブレットの設計方法の匂いになっています。

0

setDoOutput(true)を削除してください、あなただけの入力のための接続を使用しているので、あなたはそれを使用しないでください。

編集:代わりにHttpClientを試してみてください。それは "生の" Javaを使用する方がはるかにいいです。

+0

何も変わっていません。 Javaで使用しているサーブレットはJavascriptでもJQUERYで使用されていますが、私が読んだJSONコールバックのことがあります。各JSONレスポンスを一意のIDでマークするために使用されます。私は何か似たものが必要なのでしょうか? – Tim

+0

サーブレットコードの関連部分を表示できますか? – Viruzzo

+0

ここにあります: 'code' statham = new JSONArray(); ... //結果を入力してください ... //結果を返すJSON 文字列callBack = request.getParameter( "jsoncallback"); if(callBack!= null) \t out.print(callBack + "(" + statham + ");"); else \t out.print(statham); out.close(); 'code' – Tim