Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ajax将数据发布到Javaservlet_Java_Jquery_Ajax_Servlets_Post - Fatal编程技术网

使用ajax将数据发布到Javaservlet

使用ajax将数据发布到Javaservlet,java,jquery,ajax,servlets,post,Java,Jquery,Ajax,Servlets,Post,首先,如果我的英语不好,请原谅。我在使用ajax将数据发送到ExportServlet时遇到一些问题 ExportServlet.java public class ExportServlet extends HttpServlet { private static final long serialVersionUID = 6715605810229670146L; protected void doGet(HttpServletRequest req, HttpServletRespons

首先,如果我的英语不好,请原谅。我在使用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代码工作得绝对完美

然后我有了将数据发送到ExportServlet的ajax代码(我使用了filename作为示例):

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

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

事实上,当我点击链接时,我会得到一个包含“null.txt”的ZIP文件。我怎样才能解决这个问题


提前多谢

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

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

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


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

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

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

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

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

尝试以下操作:

<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;
}

函数下载文件(){
$('downloadFileFrame').attr('src','/export.zip?filename=myFile');
返回false;
}
试试这个:

<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;
}

函数下载文件(){
$('downloadFileFrame').attr('src','/export.zip?filename=myFile');
返回false;
}

您只为servlet实现了
doGet
,而不是
doPost
。还有一件事:您不能使用ajax触发文件下载。想象一下,一个恶意服务器在未经您允许的情况下开始将文件和应用程序下载到您的计算机中。是的,我知道,问题是当我将doGet更改为doPost时,我无法再下载该文件(ahref将无法工作)。我不想触发文件下载,我只想触发ExportServlet,用ajax创建一个文件。然后,当您单击下载文件链接时,它将下载创建的文件。请阅读我的第二条评论。来吧,伙计,在ajax中,您使用
POST
方法请求数据,而您刚刚在servlet中实现了
GET
方法。所以你给我一杯咖啡:你只为你的servlet实现了
doGet
,而不是
doPost
。还有一件事:你不能使用ajax触发文件下载。想象一下,一个恶意服务器在未经您允许的情况下开始将文件和应用程序下载到您的计算机中。是的,我知道,问题是当我将doGet更改为doPost时,我无法再下载该文件(ahref将无法工作)。我不想触发文件下载,我只想触发ExportServlet,用ajax创建一个文件。然后,当您单击下载文件链接时,它将下载创建的文件。请阅读我的第二条评论。来吧,伙计,在ajax中,您使用
POST
方法请求数据,而您刚刚在servlet中实现了
GET
方法。所以你给了我一杯咖啡:我不确定你的servlet做了什么,因为它触发了一个文件下载(再次阅读这个问题并对其进行评论)。还有一次:您不能使用ajax触发文件下载。我已经更改了我的回复。谢谢,我不确定你的servlet做了什么,因为它触发了一个文件下载(再次阅读问题并对其进行评论)。还有一次:您不能使用ajax触发文件下载。我已经更改了我的回复。非常感谢。