【问题标题】:Post data with ajax to java servlet使用 ajax 将数据发布到 java servlet
【发布时间】:2013-10-21 03:59:43
【问题描述】:

首先,如果我的英语不好,请原谅我。我在使用 ajax 向我的 ExportServlet 发送数据时遇到了一些问题。

ExportServlet.java

public class ExportServlet extends HttpServlet {
private static final long serialVersionUID = 6715605810229670146L;

protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
    String fileName = req.getParameter("filename");

    //Create ZIP file
    try {
        res.setContentType("applicatin/zip");
        res.setStatus(HttpServletResponse.SC_OK);

        ZipOutputStream zos = new ZipOutputStream(res.getOutputStream());

        //Create TXT file
        zos.putNextEntry(new ZipEntry(fileName + ".txt"));
        zos.write(getOutputData());
        zos.closeEntry();

        zos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private byte[] getOutputData() {
    byte[] result = null;
    String tmp = "Text file content";
    result = tmp.getBytes();
    return result;
}
}

上面的 java 代码绝对完美。

然后我的 ajax 代码将数据发送到我的 ExportServlet(我以文件名为例):

//Post data to ExportServlet
        $.ajax({
            type: 'post',
            url: '/export.zip',
            data: "filename = myFile",
            success:function(data){alert(data);},
            error:function(){alert('error');}
        });

问题是,当触发 ajax 函数时,我得到一个错误回调。我还有一个链接可以下载 ExportServlet 生成的 ZIP 文件:

<a href="/export.zip">Download file</a>

确实,当我单击链接时,我会得到包含“null.txt”的 ZIP 文件。我该如何解决这个问题?

非常感谢!

【问题讨论】:

  • 你只为你的servlet实现了doGet,而不是doPost
  • 还有一点:你不能使用 ajax 触发文件下载。想象一下,一个恶意服务器在未经您许可的情况下开始将文件和应用程序下载到您的计算机中。
  • 是的,我知道,问题是当我将 doGet 更改为 doPost 时,我无法再下载该文件(ahref 不起作用)。我不想触发文件下载,我只想触发 ExportServlet 用 ajax 创建文件。然后当你点击下载文件链接时,它会下载创建的文件。
  • 请阅读我的第二条评论。
  • 来吧,伙计,在 ajax 中,您使用 POST 方法请求数据,而您刚刚在 servlet 中实现了 GET 方法。所以你给我一杯咖啡:D

标签: java jquery ajax servlets post


【解决方案1】:

当您单击链接时,将不会调用 ajax 代码,因此文件名参数不会包含在对 servlet 的请求中。 servlet 将以 filename = null 执行。这就是你得到的实际结果。

要解决这个问题,我认为您必须在第一次加载页面时调用 ajax 代码,以便您的 servlet 可以创建一个文件并将其放置在服务器上。然后你必须在你的链接中传递文件名参数,例如:

<a href="http://yourdomain.com/downloadFile?filename=myFile">Download file</a>

downloadFile servlet 将查找名为 myFile.txt 的文件,该文件是在您的页面第一次加载调用 ajax 时创建的,并为您提供该文件作为响应。

【讨论】:

  • 我不确定你的 servlet 做了什么 它正在触发文件下载(再次阅读问题并对其进行 cmets)。还有一次:您不能使用 ajax 触发文件下载。
  • 我已更改我的回复。谢谢
【解决方案2】:

试试这个:

<a href="javascript:;" onclick="downloadFile();">Download file</a>
<div style="display: none;">
   <iframe id="downloadFileFrame"></iframe>
</div>


function downloadFile() {
    $('#downloadFileFrame').attr('src','/export.zip?filename=myFile');
    return false;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 2011-12-25
    • 2015-05-29
    • 2013-11-15
    • 2013-01-08
    • 1970-01-01
    • 2013-11-22
    相关资源
    最近更新 更多