从 GWT 调用 servlet 并使用 servlet 生成的 post 数据和下载文件

Posted

技术标签:

【中文标题】从 GWT 调用 servlet 并使用 servlet 生成的 post 数据和下载文件【英文标题】:Call servlet from GWT with post data and download file generated by the servlet 【发布时间】:2012-08-02 12:52:30 【问题描述】:

我有我的 ExportServlet,它正在生成 XLSX 文件 (Excel),我的用户将通过单击导出按钮从我的 GWT 应用程序中请求这些文件。

如果我使用 GET 方法,系统会提示用户下载文件。代码如下所示:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException

    try
    
        byte[] xlsx = createTest("");
        sendXLSX(resp, xlsx, "test.xlsx");
    
    catch (Exception e)
    
        e.printStackTrace();
    
 

void sendXLSX(HttpServletResponse response, byte[] bytes, String name)
        throws IOException

    ServletOutputStream stream = null;

    stream = response.getOutputStream();
    response.setContentType(CONTENT_TYPE_XLSX);
    response.addHeader("Content-Type", CONTENT_TYPE_XLSX);
    response.addHeader("Content-Disposition", "inline; filename=" + name);
    response.setContentLength((int) bytes.length);
    stream.write(bytes);
    stream.close();

这由 GWT 客户端以下列方式调用:

String url = GWT.getModuleBaseURL() + "ExportServlet";
Window.open(url, "", "");

并提示用户下载文件。很好,这就是我想要的:)

但是我想在请求中附加很多数据,而且 afaik,你可以在 URL 参数中放入多少数据是有限制的(“ExportServlet?data=...”),所以我会喜欢将其包装在 POST 请求中。

我从 GWT 尝试了以下方法:

String url = GWT.getModuleBaseURL() + "ExportServlet";
RequestBuilder builder = new RequestBuilder(
                            RequestBuilder.POST, url);
Request response = builder.sendRequest("test data", new RequestCallback() 

    @Override
    public void onResponseReceived(Request request, Response response)
    
        System.out.println("");
    

    @Override
    public void onError(Request request, Throwable exception)
    
        System.out.println("");
    
);

这在我的 servlet 中:

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException

    try
    
        String data = req.getReader().readLine();
        byte[] xlsx = createTest(data);
        sendXLSX(resp, xlsx, "test.xlsx");
    
    catch (Exception e)
    
        e.printStackTrace();
    

但不会提示用户下载文件。调用 doPost 方法并由 servlet 接收数据,但是我应该从 GWT 应用程序中收到的响应中提取 XLSX 文件吗?我该怎么做?

感谢任何帮助或 cmets :)

【问题讨论】:

我发现这篇文章:***.com/questions/7282987/… 可能会回答我的问题。我会尝试一下,让你们知道:)(不知道如何将链接与这个 SO 问题链接/关联) 【参考方案1】:

好的,所以我在链接的 SO 问题中采用了第三种方法。

创建一个 FormPanel,将您的数据放在隐藏字段中,将 URL 设置为您的 servlet,在表单上以编程方式调用 submit 方法,此 SO 问题中描述的问题将得到解决。

详细说明如何从隐藏字段中提取数据:

所以我的 doPost 看起来像这样:

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
    ServletFileUpload upload = new ServletFileUpload();
    FileItemIterator iterator = upload.getItemIterator(req);

    while (iterator.hasNext()) 
        FileItemStream item = iterator.next();
        if (item.isFormField()) 
            String name = item.getFieldName();
            if (name.equalsIgnoreCase("fieldName")) 
                data = Streams.asString(item.openStream(), ENCODING_UTF8);
            
        
    
    ...

我的表单中有一个名为“fieldName”的隐藏字段,数据被放置并提交给 servlet。希望这会有所帮助:)

【讨论】:

如果可以,请分享详细信息。 在我的回答中添加了更多详细信息【参考方案2】:

你好我有同样的问题,并通过使用直接调用servlet来解决它 Window.Location.replace(URL.encode(servletUrl));

也检查此链接related Issue

【讨论】:

以上是关于从 GWT 调用 servlet 并使用 servlet 生成的 post 数据和下载文件的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS 中找不到 Servlet

GWT 显示从 servlet 指定的图像

如何使用 servlet 获取图像并使用 GWT Image 类显示它?

是否可以通过 GWT RPC Servlet 上传文件?

gwt中会话超时时触发方法调用

未在 GWT 模块的 .html 文件上调用 Servlet 过滤器