2012-08-02 10 views
8

Ho il mio ExportServlet, che genera file XLSX (Excel) che il mio utente richiede dall'applicazione GWT facendo clic su un pulsante di esportazione.Servlet di chiamata da GWT con dati di post e file di download generato dal servlet

Se utilizzo l'approccio GET, all'utente viene richiesto di scaricare il file. Il codice è simile al seguente:

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

questo è invocato dal client GWT nel modo seguente:

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

e all'utente viene richiesto di scaricare il file. Bene, questo è quello che voglio :)

Ma vorrei aggiungere molti dati nella richiesta, e afaik, c'è un limite alla quantità di dati che puoi inserire in un parametro URL ("ExportServlet? Data = ... "), quindi mi piacerebbe racchiuderlo in una richiesta POST.

Ho provato quanto segue da 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(""); 
    } 
}); 

e questo nel mio 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(); 
    } 
} 

ma l'utente non viene richiesto di scaricare il file. Il metodo doPost viene richiamato e i dati vengono ricevuti dal servlet, ma dovrei estrarre il file XLSX dalla risposta che ricevo nell'app GWT? e come posso farlo?

Apprezzo tutto l'aiuto o commenti :)

+2

ho trovato questo post: http://stackoverflow.com/questions/7282987/handle-attachment-in-response-with-requestbuilder-in-gwt che potrebbe rispondere alla mia domanda. Lo proverò e lo farò sapere ai ragazzi :) (non so come collegare/collegare il link con questa domanda SO) –

+1

hai appena fatto :) –

risposta

7

Ok, così sono andato con il 3 ° approccio nella legato SO domanda.

Creare un FormPanel, inserire i dati nei campi nascosti, impostare l'URL sul servlet, chiamare il metodo di invio al livello di programmazione sul modulo e il problema descritto in questa domanda SO verrà risolto.

I dettagli su come estrarre i dati dai campi nascosti:

Quindi il mio doPost è simile a questo:

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

Ho un campo nascosto nel mio modulo con il nome di "fieldName" , dove i dati vengono inseriti e inviati al servlet. Spero che questo aiuti :)

+1

Per favore, condividi i dettagli, se puoi. –

+0

Aggiunti ulteriori dettagli alla mia risposta –

1

Ciao ho lo stesso problema esattamente, e risolverlo utilizzando directlly chiamare la servlet utilizzando Window.Location.replace(URL.encode(servletUrl));

controllare questo link, nonché related Issue

Problemi correlati