Java 无法将AJAX响应用作文件名(而不是内容)

Java 无法将AJAX响应用作文件名(而不是内容),java,jquery,ajax,servlets,Java,Jquery,Ajax,Servlets,我正在向servlet发送一个$.post请求,发送一些需要保存在文件中的数据。servlet保存数据,然后将路径发回文件。我试图导航到方法回调中的响应所持有的路径,但下面是发生的情况: function saveData(){ var path; $.post("SaveFileServlet", {data : JSON.stringify(jsonPieces)}, function(response) { path = response; // sett

我正在向servlet发送一个
$.post
请求,发送一些需要保存在文件中的数据。servlet保存数据,然后将路径发回文件。我试图导航到方法回调中的
响应所持有的路径,但下面是发生的情况:

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>");       
    });        
}   
以及
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);
        }
    }
}
意思是它能工作!但为什么它不显示

旧版编辑:

在这种情况下,这可能很重要,但我对此表示怀疑:以下是servlet中的相关代码:

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

$.post
是异步的。仅此而已,您正试图在该值存在之前发出警报

Ajax中的第一个字母代表“异步”,意思是 操作并行进行,完成顺序不一致 放心。$.ajax()的异步选项默认为true,表示 在发出请求后,代码可以继续执行。背景 此选项设置为false(从而使调用不再异步) 强烈反对,因为这可能会导致浏览器 反应迟钝


问题是执行的顺序。正如Grampage所指出的,ajax调用是异步的,因此浏览器在等待结果的过程中会继续执行一些操作

最基本的是:

function doSomething() {
    $.post("SaveFileServlet", {data : JSON.stringify(jsonPieces)}, function(response) {
      alert('post done');
    }
    alert('doSomething done');
}
几乎100%的时候,你会得到的第一个警告是“doSomething done”而不是“post done”


这是因为JavaScript没有等待ajax调用完成以继续进行下一步。

编辑:您可能需要将数据类型指定为“文本”,以确保返回字符串

在回调中,假设
response
是一个字符串,您只需执行以下操作:

window.location = response;
这将把浏览器重定向到响应指示的路径,假设它是绝对url或根相对的(即以/)开头。

Claudia:

您是否绝对确定从servlet得到的响应是一个带有路径的简单字符串?周围没有空白或类似的东西吗?如果不确定,请尝试将
数据类型
设置为
文本

我的建议是,在页面中添加
,并将
src
属性设置为文件下载路径。确保您甚至能够访问该文件。这至少可以排除它是否是一个相对路径问题

使用
console.log()
,而不是使用
alert()
,因为
console.log()
将保留数据结构并允许您正确查看它

编辑

函数saveData(){
var路径;
$.post(“SaveFileServlet”,{dataType:'text',data:JSON.stringify(jsonPieces)},函数(响应){
path=response;//这样设置路径不起作用-什么也不会发生
console.log(路径);
$(“正文”)。追加(“”);
});        
}   


nevermind。。我没看到第二个!这就解释了“未定义”的原因,我意识到我应该删除这行代码,因为它具有误导性。我真正的问题是
$内部发生了什么。post
:为什么我不能将响应设置为文件名?因为它显然存在,因为警报打印的很好。@BarryChapman我没有看到你的第一条评论,所以我假设我应该被冒犯一秒钟,然后不是真的。警报在回调中,只有在调用完成后才会执行。@freon他编辑了他的问题。他有一个在回调外部,一个在回调内部。如果你
警报(响应)
你得到预期的结果了吗?是的。。。您可以看到,我首先
alert(path=response)
,然后尝试使用它。。它打印得非常完美……如果将iframe的源设置为完整路径,会发生什么?如果使用Google Chrome,请键入ctrl+shift+J,然后查看javascript是否输出任何错误。如果是,请告诉我们是哪一个错误。@freon:使用Firefox但会安装chrome只是为了进行检查并返回。.他想设置
的源代码,OP说“我正在尝试导航到方法回调中响应所持有的路径…”没有关于
iframe
的任何具体内容,除了在代码中。不起作用。。我也试过,但不是因为这个。
iframe
的问题仅仅是因为我不想离开页面。您是否收到错误消息?浏览器显示它正在加载吗?@Mike McCaughan:不,没有错误,没有移动,什么都没有……已经提到了,这不是问题所在。。并删除了第二个警告,因为它在这里无关紧要并且具有误导性。所以你投票否决了我,因为我回答了你最初的问题?谢谢,但我不会再帮你了。我没有投你反对票:)没有足够的投票权。。。这不是我最初的问题。。正如您在标题中所看到的。如上所述,尝试手动编写路径,它可以工作,并且来自servlet的响应中没有空格:((设置为text/plain,如果有帮助的话)试试那段代码。看看它是否适合你。你有没有试过我放在编辑中的代码?看看新的编辑…萤火虫的东西…并且按照你说的做了:它打印得恰到好处…所以不是这样为什么不显示?不会是因为你有
display:none;
function doSomething() {
    $.post("SaveFileServlet", {data : JSON.stringify(jsonPieces)}, function(response) {
      alert('post done');
    }
    alert('doSomething done');
}
window.location = response;