2012-10-26 34 views
0

我發送$.post請求到一個servlet,發送一些數據,這些數據需要保存在一個文件中。該servlet保存數據,然後將路徑發送回該文件。我試圖導航到方法的回調中由response認爲路徑,但這裏的是怎麼回事:不能使用AJAX響應作爲文件名(不是內容)

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>");  
    });   
} 

如何使它工作,爲什麼不工作? 謝謝。

甚至較新的編輯

GOT IT !!!!! ......這是Servlet:這可能不是創建該文件:真正的路徑不是filename.csvSystem.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所以它的存在

編輯

爲用戶sugeested我安裝Firebug的,這裏是我得到的:

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

這意味着它的工作原理!但爲什麼不顯示...?

年長編輯:

的情況下,這可能無所謂,但我對此表示懷疑:這裏是從servlet有關的代碼:

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

之前,如果你'警報(響應)'你得到預期的結果'PATH = response'? –

+0

是的...你可以看到我先警告(路徑=響應),然後嘗試使用它......並且打印完美... –

+0

如果將iframe的源設置爲完整路徑? –

回答

3

$.post是異步的。您試圖在存在價值之前提醒它,就是這樣。

jQuery API documentation

Ajax中的第一個字母代表「異步」,這意味着在並行發生 操作和完成的順序並不 保證。 $ .ajax()的async選項默認爲true,表示 代碼執行可以在請求完成後繼續。將該選項設置爲 爲false(並因此使呼叫不再異步),因此強烈建議不要使用 ,因爲這可能會導致瀏覽器無法響應,因此可能導致瀏覽器變爲 。

+0

沒關係..我沒有看到第二個! –

+0

這解釋了「未定義」,我意識到,所以我應該刪除該行代碼,因爲它是誤導性的。我真正的問題是'$ .post'內發生了什麼:爲什麼我不能將響應設置爲文件名?因爲它顯然存在,因爲警報打印它就好了。 –

+0

@BarryChapman我沒有看到你的第一個評論,所以我會認爲我應該冒犯了大約一秒,然後不是 – climbage

-1

問題是執行順序。正如climbage指出的那樣,ajax調用是異步的,所以瀏覽器在等待結果時繼續執行。

在它的最基本的:

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

的時間幾乎100%,你會得到第一個警報將是「做DoSomething的」不「後做」。

這是因爲JavaScript並未等待ajax調用完成才能繼續執行下一步。

+0

已經提到,這不是問題..並刪除了第二次警報,因爲它在這裏是無關緊要,誤導。 –

+0

所以你投了我,因爲我回答了你的原始問題?謝謝,但我不會再幫你了。 –

+0

我沒有投票給你:)沒有足夠的權利,所以投票。 ..這不是我原來的問題..正如你可以在標題中看到的那樣。 –

0

編輯:您可能需要指定dataType爲「text」以確保字符串回來。

在回調,假設response是一個字符串,你可以簡單地做:

window.location = response; 

這將瀏覽器重定向到由響應指示的路徑,假設它是一個絕對URL或根目錄相對(即以/開頭)。

+0

他想設置一個'