2012-08-02 12 views
8

Tengo mi ExportServlet, que está generando archivos XLSX (Excel) que mi usuario solicitará desde mi aplicación GWT haciendo clic en un botón exportar.Llamar servlet desde GWT con datos de publicación y descargar archivo generado por el servlet

Si utilizo el enfoque GET, se solicita al usuario que descargue el archivo. El código es el siguiente:

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

Esta es invocado por el cliente GWT de la siguiente manera:

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

y se pide al usuario para descargar el archivo. Bueno, eso es lo que quiero :)

Pero me gustaría adjuntar una gran cantidad de datos en la solicitud, y afaik, hay un límite en la cantidad de datos que puede poner en un parámetro de URL ("ExportServlet? Data = ... "), entonces me gustaría envolverlo en una solicitud POST en su lugar.

He intentado lo siguiente de 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(""); 
    } 
}); 

y esto en mi 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(); 
    } 
} 

pero el usuario no se le pide que descargue el archivo. Se invoca el método doPost y el servlet recibe los datos, pero ¿se supone que debo extraer el archivo XLSX de la respuesta que recibo en la aplicación GWT? y ¿cómo se supone que debo hacer eso?

agradecería cualquier ayuda o comentarios :)

+2

me encontré con este post: http://stackoverflow.com/questions/7282987/handle-attachment-in-response-with-requestbuilder-in-gwt que podría responder mi pregunta. Voy a probarlo y les permito saber :) (no sé cómo vincular/relacionar el enlace con esta pregunta) –

+1

que acaba de hacerlo :) –

Respuesta

7

Ok, así que fui con la tercera enfoque en la cuestión de forma enlazada.

Cree un FormPanel, coloque sus datos en campos ocultos, establezca la URL a su servlet, llame al método de envío programáticamente en el formulario y se resuelva el problema descrito en esta pregunta SO.

detalles sobre cómo extraer los datos de los campos ocultos:

Así que mi doPost es similar a esto:

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

que tienen un campo oculto en mi formulario con el nombre "fieldName" , donde los datos se envían y se envían al servlet. Esperamos que esto ayude :)

+1

Por favor, comparta los detalles, si pudiera. –

+0

Se agregaron más detalles a mi respuesta –

1

Hola tengo exactamente el mismo problema y resolverlo utilizando directlly llamar al servlet utilizando Window.Location.replace(URL.encode(servletUrl));

verificación de este enlace, así related Issue

Cuestiones relacionadas