2012-10-26 111 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

他想设置一个'