2012-08-02 8 views
8

Mam mój ExportServlet, który generuje pliki XLSX (Excel), które mój użytkownik będzie żądał od mojej aplikacji GWT, klikając przycisk eksportu.Serwlet wywołania z GWT z danymi pocztowymi i pobranym plikiem wygenerowanym przez serwlet.

Jeśli użyję metody GET, użytkownik zostanie poproszony o pobranie pliku. Kod wygląda następująco:

@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(); 
} 

ta wywoływana jest przez klienta GWT w następujący sposób:

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

a użytkownik jest proszony, aby pobrać plik. Dobrze, to jest to, czego chcę :)

Ale chciałbym załączyć dużo danych w żądaniu, a afaik, istnieje limit ilości danych, które można umieścić w parametrze adresu URL ("ExportServlet? Data = ... "), więc chciałbym zawrzeć to w żądaniu POST.

próbowałem następujących z 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(""); 
    } 
}); 

i to w moim apletu:

@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(); 
    } 
} 

ale użytkownik nie jest proszony, aby pobrać plik. Zostaje wywołana metoda doPost, a dane są odbierane przez serwlet, ale czy mam wyodrębnić plik XLSX z odpowiedzi, którą otrzymuję w aplikacji GWT? i jak mam to zrobić?

wdzięczni za każdą pomoc lub komentarze :)

+2

Znalazłem ten post: http://stackoverflow.com/questions/7282987/handle-attachment-in-response- with-requestbuilder-in-gwt, który może odpowiedzieć na moje pytanie. Wypróbuję to i pozwolę wam znać :) (nie wiem jak połączyć/powiązać link z tym pytaniem SO) –

+1

właśnie to zrobiłeś :) –

Odpowiedz

7

Ok, więc poszedłem z 3 podejścia połączonego SO pytanie.

Utwórz formularz FormPanel, umieść dane w ukrytych polach, ustaw adres URL serwletu, wywołaj metodę wysyłania programowo w formularzu, a opisany problem w tym zadaniu zostanie rozwiązany.

Szczegóły dotyczące sposobu wyodrębniania danych z ukrytych pól:

Więc moja doPost wygląda podobnie do tego:

@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); 
      } 
     } 
    } 
    ... 

mam ukryte pole w moim formularzu o nazwie „nazwa pola” , gdzie dane są umieszczane i przesyłane do serwletu. Nadzieję, że to pomaga :)

+1

Proszę, podziel się szczegółami, jeśli możesz. –

+0

Dodano dalsze szczegóły do ​​mojej odpowiedzi –

1

Witam mam ten sam problem dokładnie i rozwiązać go za pomocą directlly wywołać serwletu przy użyciu Window.Location.replace(URL.encode(servletUrl));

Sprawdź ten link, jak również related Issue