Java 无法将AJAX响应用作文件名(而不是内容)
我正在向servlet发送一个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
$.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;