0

$.postファイルに保存する必要があるデータを送信して、サーブレットにリクエストを送信しています。サーブレットはデータを保存してから、ファイルへのパスを送り返します。responseメソッドのコールバック内で保持されているそのパスに移動しようとしていますが、何が起こっているのですか:

function saveData(){
    var path;

    $.post("SaveFileServlet", {data : JSON.stringify(jsonPieces)}, function(response) {
        path = response; // setting the path like this does NOT WORK - nothing happens           
        //path="storing/csv_uploads/test.csv"; // setting the path like this WORKS        

        alert (path); // shows: storing/csv_uploads/filename.csv - e.g. WHAT IT SHOULD

        $("body").append("<iframe src='" + path + "' style='display: none;' ></iframe>");       
    });        
}   

それを機能させる方法と、なぜ機能しないのですか? ありがとう。

さらに新しい編集

わかった!!!!!... それはサーブレットです: おそらくファイルを作成していません: 実際のパスはfilename.csvaではSystem.currentTimeMillis()+".csv"なく、サーバーに書き込みます。しかし、私はファイルを作成した後にのみ応答を送信しています(または私ですか?)...

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    response.setContentType("text/plain");
    response.setCharacterEncoding("UTF-8");
    String filename = "storing/csv_uploads/"+System.currentTimeMillis()+".csv";
    //String filename = "storing/csv_uploads/filename.csv"; //this works since it was previously there
    PrintWriter out = response.getWriter();

    try {
        Type type = new TypeToken<List<PieceFeeder>>(){}.getType();
        ArrayList<PieceFeeder> pieceFeeders = new Gson().fromJson(request.getParameter("data"), type);            

        DataManager dm = new DataManager();
        if (dm.exportPieces(pieceFeeders, filename)) {
            System.out.println("in SaveFileServlet: after exportPieces");
            File f = new File(filename);
            while (!f.exists()) {
                //waiting...I NEVER GET IN HERE
                System.out.println("in SaveFileServlet: waiting for file to exist");
            }
            out.write(filename);
        } else {
            out.write("error at creating file");
        }
    }...
}

そしてDataManager.exportPieces

public void exportPieces(ArrayList<PieceFeeder> pieceFeeders, String filename) {
    BufferedWriter bufferedWriter = null;
    try {
        bufferedWriter = new BufferedWriter(new FileWriter(filename));

        //write first line without "\n"
        if (pieceFeeders.size() > 0) {
            PieceFeeder pf = pieceFeeders.get(0);
            Piece p = pf.getPiece();
            bufferedWriter.write(p.getDescription() + ","
                    + pf.getStock() + ","
                    + p.getLength() + ","
                    + p.getWidth() + ","
                    + p.getLengthEdges() + ","
                    + p.getWidthEdges());
        }
        for (int i = 1; i < pieceFeeders.size(); i++) {
            PieceFeeder pf = pieceFeeders.get(i);
            Piece p = pf.getPiece();
            bufferedWriter.write("\n" + p.getDescription() + ","
                    + pf.getStock() + ","
                    + p.getLength() + ","
                    + p.getWidth() + ","
                    + p.getLengthEdges() + ","
                    + p.getWidthEdges());
        }
        return true;
    } catch (Exception ex) {
        Logger.getLogger(DataManager.class.getName()).log(Level.SEVERE, null, ex);
        return false;
    } finally {
        //Close the BufferedWriter
        try {
            if (bufferedWriter != null) {
                bufferedWriter.flush();
                bufferedWriter.close();
                System.out.println("in exportPieces: finally"); 
            }
        } catch (IOException ex) {
            Logger.getLogger(DataManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

私はいつも得る

"in exportPieces: finally"

"in SaveFileServlet: after exportPieces"

が呼び出され"in SaveFileServlet: waiting for file to exist"ないため、応答が送信される前にファイルが存在します

しかし、古いファイル (作成されたばかりではないファイル) を送信すると、動作します

新しい編集

明確にするために:もしそうなら:

  • window.location = path
  • $("body").append("<iframe src='" + path + "' ></iframe>");:display:none を与えるものを削除しましたが、ヘッダーには : にアクセスしようとしていることが示されているので、そこにあります404 errorThe requested resource () is not available.http://localhost:8080/optimizerwithservlet/storing/csv_uploads/filename.csv

編集

ユーザーが提案したように、私は Firebug をインストールしました。

<iframe style="display: none;" src="storing/csv_uploads/filename.csv">

それが機能することを意味します!でもなんで表示されないの…?

古い編集:

これが問題になる場合に備えて、私はそれを疑っていますが、サーブレットからの関連するコードは次のとおりです。

    response.setContentType("text/plain");
    response.setCharacterEncoding("UTF-8");
    String filename = "storing/csv_uploads/filename.csv";
    PrintWriter out = response.getWriter();
    out.write(filename);    
4

4 に答える 4

3

$.post非同期です。値が存在する前に値を警告しようとしています。それだけです。

jQuery API ドキュメントから

Ajax の最初の文字は「非同期」を表し、操作が並行して行われ、完了する順序が保証されないことを意味します。$.ajax() の async オプションのデフォルトは true で、リクエストが行われた後もコードの実行を続行できることを示します。このオプションを false に設定する (したがって呼び出しが非同期でなくなる) ことは、ブラウザーが応答しなくなる可能性があるため、強くお勧めしません。

于 2012-10-26T16:42:02.400 に答える
0

クラウディア:

サーブレットから取得する応答が、パスを含む単純な文字列であると確信していますか?その周りに空白などはありませんか?不明な場合は、に設定してみてdataTypeくださいtext

あなたへの私の提案は、あなたのファイルダウンロードパスに設定され<iframe>た属性であなたのページに置くことです。srcファイルにアクセスできることも確認してください。これは、相対パスの問題であるかどうかを少なくとも除外します。

を使用する代わりに、 -をalert()使用してデータ構造を保持し、適切に表示できるようにします。console.log()console.log()

編集

function saveData(){
    var path;

    $.post("SaveFileServlet", {dataType: 'text', data : JSON.stringify(jsonPieces)}, function(response) {
        path = response; // setting the path like this does NOT WORK - nothing happens           

        console.log (path); 

        $("body").append("<iframe src='" + path + "' style='display: none;' ></iframe>");       
    });        
}   
于 2012-10-26T17:11:12.227 に答える
0

編集:文字列が確実に返されるように、dataType を「テキスト」として指定する必要がある場合があります。

コールバックでは、 が文字列であると仮定responseすると、次のように簡単に実行できます。

window.location = response;

これにより、絶対 URL またはルート相対 (つまり、/ で始まる) であると仮定して、応答によって示されるパスにブラウザーがリダイレクトされます。

于 2012-10-26T16:46:28.737 に答える
-1

問題は実行順序です。Climage が指摘したように、ajax 呼び出しは非同期であるため、ブラウザは結果を待つ間も処理を続けます。

最も基本的なことは次のとおりです。

function doSomething() {
    $.post("SaveFileServlet", {data : JSON.stringify(jsonPieces)}, function(response) {
      alert('post done');
    }
    alert('doSomething done');
}

ほぼ 100% の確率で、最初に受け取るアラートは「post done」ではなく「doSomething done」です。

これは、JavaScript が ajax 呼び出しの完了を待たずに次のステップに進むためです。

于 2012-10-26T16:46:19.923 に答える