2012-08-02 67 views
8

我有我的ExportServlet,它們正在生成XLSX文件(Excel),我的用戶將通過單擊導出按鈕從我的GWT應用程序請求這些文件。從GWT調用servlet和發佈數據並下載由servlet生成的文件

如果我使用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文件?我想怎麼做呢?

欣賞任何幫助或意見:)

+2

servlet的我發現這個職位是:http:/ /stackoverflow.com/questions/7282987/handle-attachment-in-response-with-requestbuilder-in-gwt這可能會回答我的問題。我會試試看,讓你們知道:)(不知道如何鏈接/關聯這個SO問題的鏈接) – 2012-08-02 13:22:24

+1

你只是做了:) – 2012-08-24 20:21:07

回答

7

好了,我在鏈接的SO問題的第3方法去。

創建一個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); 
      } 
     } 
    } 
    ... 

我在形式與名稱「字段名」隱藏字段,數據被放置並提交給servlet。希望這有助於:)

+1

請分享細節,如果可以的話。 – 2012-11-02 14:45:02

+0

在我的答案中增加了更多詳細信息 – 2012-11-05 08:42:46

1

您好我有同樣的問題準確,並且通過使用directlly解決它調用使用 Window.Location.replace(URL.encode(servletUrl));

檢查此鏈接,以及related Issue