Выполнить отступающее бобовое действие с загрузкой?

Когда я вижу венгерское обсуждение, я рад видеть, что люди думают трудно о том, как сделать их код более ясным, и как к ошибкам более видимый. Это точно, что мы должны все делать!

, Но не забывают, что у Вас есть некоторые мощные инструменты в Вашем распоряжении помимо именования.

Метод Извлечения , Если Ваши методы становятся такими длинными, который Ваши объявления переменной прокрутили от вершины экрана, считайте создание Ваших методов меньшим. (Если Вы имеете слишком много методов, рассматриваете новый класс.)

Строгий контроль типов , Если Вы находите, что берете почтовый индекс с, сохраненная в целочисленной переменной, и присваиваете их размер обуви целочисленная переменная, рассмотрите создание класса для почтовых индексов и класса для размера обуви. Тогда Ваша ошибка будет поймана во время компиляции, вместо того, чтобы требовать тщательного контроля человеком. Когда я делаю это, я обычно нахожу набор почтового индекса - и определенная для размера обуви логика, которую я наперчил вокруг своего кода, который я могу тогда приблизиться к своим новым классам. Внезапно весь мой код становится более ясным, более простым, и защищенным от определенных классов ошибок. Ничего себе.

Для подведения: да, думайте трудно о том, как Вы используете имена в коде, чтобы выразить Ваши идеи ясно, но также и смотреть на другие мощные инструменты OO, к которым можно обратиться.

9
задан guerda 6 November 2009 в 12:37
поделиться

3 ответа

Вы также можете решить эту проблему в JSF 2.0, используя системные события компонентов, в частности PreRenderViewEvent.

Просто создайте представление загрузки (/download.xhtml), которое запускает прослушиватель загрузки перед рендерингом.

1236] Затем в вашем компоненте отчета (определенном с помощью JSR-299) вы отправляете файл и помечаете ответ как завершенный.

public @Named @RequestScoped class ReportBean {

   public void download() throws Exception {
      FacesContext ctx = FacesContext.getCurrentInstance();
      pushFile(
           ctx.getExternalContext(),
           "/path/to/a/pdf/file.pdf",
           "file.pdf"
      ); 
      ctx.responseComplete();
   }

   private void pushFile(ExternalContext extCtx,
         String fileName, String displayName) throws IOException {
      File f = new File(fileName);
      int length = 0; 
      OutputStream os = extCtx.getResponseOutputStream();
      String mimetype = extCtx.getMimeType(fileName);

      extCtx.setResponseContentType(
         (mimetype != null) ? mimetype : "application/octet-stream");
      extCtx.setResponseContentLength((int) f.length());
      extCtx.setResponseHeader("Content-Disposition",
         "attachment; filename=\"" + displayName + "\"");

      // Stream to the requester.
      byte[] bbuf = new byte[1024];
      DataInputStream in = new DataInputStream(new FileInputStream(f));

      while ((in != null) && ((length = in.read(bbuf)) != -1)) {
         os.write(bbuf, 0, length);
      }  

      in.close();
   }
}

Вот и все!

Вы можете либо указать ссылку на страницу загрузки (/ download.jsf) или используйте метатег HTML для перенаправления на него на странице-заставке.

15
ответ дан 4 December 2019 в 08:52
поделиться

Предыдущий ответ отправит форму и, возможно, изменит навигацию.

Используйте а затем window.onload = loadFunction;

7
ответ дан 4 December 2019 в 08:52
поделиться

На запрос можно отправить только один ответ. Вы не можете отправить два ответа (сама страница и файл загрузки) на запрос. Лучшее, что вы можете сделать, - это использовать Javascript для отправки (скрытой) формы после загрузки страницы.

window.onload = function() {
    document.formname.submit();
}
2
ответ дан 4 December 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: