2012-03-24 2 views
2

У меня есть сервлет в приложение Thats GWT создает PDF-файл с данными, приведенными с запросом на пост и отправляет responst назад:GWT: Показаны PDF создан как ответ POST

public void service(HttpServletRequest request, HttpServletResponse response) { 
     try { 
      String text = request.getParameter("text"); 
      if (text == null || text.trim().length() == 0) { 
       text = "no data"; 
      } 

      //PDF Creation with iText 
      Document document = new Document(); 
      ByteArrayOutputStream b = new ByteArrayOutputStream(); 
      PdfWriter.getInstance(document, b); 
      document.open(); 
      document.add(new Paragraph(text)); 
      document.close(); 

      response.setHeader("Expires", "0"); 
      response.setHeader("Cache-Control", 
        "must-revalidate, post-check=0, pre-check=0"); 
      response.setHeader("Pragma", "public"); 
      response.setContentType("application/pdf"); 

      response.setContentLength(b.size()); 
      OutputStream os = response.getOutputStream(); 
      b.writeTo(os); 
      os.flush(); 
      os.close(); 

     } catch (Exception ex) { 
      System.out.println(ex.toString()); 
     } 
    } 

Я хочу, чтобы показать созданный PDF для пользователя. Я получил это далеко на клиенте:

final RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, 
       GWT.getModuleBaseURL() + "PdfServlet"); 

    rb.setHeader("Content-type", "application/x-www-form-urlencoded"); 
    StringBuffer postData = new StringBuffer(); 
    postData.append(URL.encode("text")).append("=") 
      .append(URL.encode(Text)); 

     rb.setRequestData(postData.toString()); 
     rb.setCallback(new RequestCallback() { 

      @Override 
      public void onResponseReceived(Request request, 
        Response response) { 
       if (200 == response.getStatusCode()) { 
        //What to do here? 
       } else { 
        //TODO:Something 
       } 
      } 

      @Override 
      public void onError(Request request, Throwable exception) { 
       /TODO:... 

      } 
     }); 
     try { 
      rb.send(); 
     } catch (RequestException e) { 
      e.printStackTrace(); 
     } 

Так что мой вопрос: Как показать это PDF пользователю? Все, что я managaged сделать, это показать PDF с «нет данных» в нем ..

Спасибо Вам помочь :)

ответ

3

Вместо использования RequestBuilder, вы можете просто использовать Window.Location.setUrl(yourDowloadUrl?key=value) и включить свои параметры в запрос Строка. Обратите внимание, однако, что вы должны установить заголовок Content-disposition header: attachment, чтобы браузер попросил вас сохранить или открыть файл, а не заменить ваше приложение GWT. Лучше даже, создайте скрытый iframe на своей странице html и вызовите setUrl на этом виджете.

Недостаток использования этого подхода заключается в том, что он не позволяет вашему клиентскому коду захватывать обратную связь, если что-то не соответствует серверной стороне, а вместо pdf вызов возвращает HTML с строкой ошибок с вашего веб-сервера. Если это очень важно для вас, вы должны использовать механизм опроса, который запрашивает документ, который затем создается и сохраняется на сервере, и каждые 7 секунд проверяет, есть ли что-то для загрузки. Я реализовал что-то подобное, что также предотвращает проблемы с большим количеством документов. Дайте мне знать, если вам интересно

+0

Здравствуйте, спасибо за ответ :) Я случайно отправил код с некоторыми ошибками;) Я использую метод Post - так что я могу Не используйте URL-адрес для передачи данных на сервер. Вы знаете способ показать ответ на сообщение в качестве PDF-документа? – Morious

+0

Ну, вы можете использовать 'com.google.gwt.user.client.ui.FormPanel', который отправляет ваш запрос, используя метод POST. Вы можете поймать результат с помощью addSubmitCompleteHandler. Однако клиент ожидает результат строки, а не PDF. Вы можете сохранить сервер PDF-сервера и вернуть ему уникальный идентификатор, который затем использует GWT-клиент в регулярном запросе GET: someIFrame.setUrl (http://acme.com/servlet?id=12345) –

+0

Allright .. Я пойду с GET, как вы уже упоминали раньше. :) Это работает так. – Morious

3

вы должны создать pdf-файл с вашего сервлета и сохранить его где-нибудь на сервере. Вам необходимо вернуть путь к файлу, который вы сохранили на сервере. И теперь из GWT вы можете запросить окно для загрузки файла. Ниже приведен пример для загрузки файла с GWT:

Window.open(GWT.getHostPageBaseURL() + your return path from server, "", ""); 
+0

Спасибо :) Мне удалось открыть файл в браузере, не сохранив его на сервере. С кодом, показанным выше, и кодом youre, это хорошо работает. – Morious

+0

Hello Morious. Каково было ваше окончательное решение? Вы в конечном итоге использовали RequestBuilder? –

1

Я мог отображаться созданный PDF без необходимости, чтобы сохранить файл на сервере и сохранить уникальный ключ. Он работает в Chrome, но, по некоторым сообщениям, это может быть проблемой для некоторых старых браузеров.

Window.open ("data: application/pdf; base64", + результат, cRFTitle.replace ("", "_") + ".pdf", "enabled");

Как предложил Результат должен быть в кодировке Base64

B.

Смежные вопросы