$.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.csv
aでは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 error
The 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);