Отображение последней страницы с сообщением об ошибке при использовании @ResourceMapping - PullRequest
3 голосов
/ 07 марта 2012

У меня есть страница с одной кнопкой (для простоты).Кнопка просит сервер сгенерировать файл и вернуть его.Это работает безотказно.Когда на сервере возникает проблема с генерацией файла (по какой-либо причине), то вместо возврата пустого файла ничего не происходит.Это приводит к тому, что страница становится пустой (где-как раньше это была последняя страница, на которой я загружал файл).

Как я могу отправить сообщение об ошибке на предыдущую страницу (без использования AJAXна данный момент) от этой функции?Я не ищу пустую страницу с сообщением об ошибке.

controller.java

@ResourceMapping
public void getFile(ResourceRequest request, ResourceResponse response) {
    String zipName = "myfile.zip";

    try {
        //Do something that might throw an error

        response.setProperty("Content-Disposition", "attachment; filename=" + zipName);
        response.setContentType("application/zip");
        //Write to output stream here
    } catch(Exception e) {
        myLogger.error("Error from throwable: " + e.getMessage());

        //Send error message to user on the last page without getting a blank screen
    }

view.jsp

${lastError}
<form method="post" action="<portlet:resourceURL/>">
  <input type="checkbox" name="Modify File" value="true" />
  <input type="submit" value="Get File" />
</form>

Ответы [ 2 ]

2 голосов
/ 09 марта 2012

Вы получаете пустую страницу, потому что вы ничего не добавили в ответ.

Когда вы делаете ResourceRequest, ваш ответ всегда ТОЛЬКО из того, что вы положили в ResorceResponse, вы никогда не получите страницу портала в качестве ответа (даже не часть ее)).

То, что вы хотите сделать, как вы пытаетесь сейчас, не возможно.Вы должны изменить свой подход.

Самый простой (не лучший) обходной путь будет

<form method="post" action="<portlet:resourceURL/>" target="_blank">
   <input type="checkbox" name="Modify File" value="true" />
   <input type="submit" value="Get File" />
</form>

note target="_blank".

Ваш контроллер ...

@ResourceMapping
public void getFile(ResourceRequest request, ResourceResponse response) {
  String zipName = "myfile.zip";

  try {   

    response.setProperty("Content-Disposition", "attachment; filename=" + zipName);
    response.setContentType("application/zip");

    //Write to output stream here

  } catch(Exception e) {
    myLogger.error("Error from throwable: " + e.getMessage());
    // write the error message to the response stream here.
    response.setContentType("text/plain");
    response.getWriter().print("last error");
  }
}

Таким образом, вы получаете файл или ошибку в новом окне, оставляя страницу портала как есть.

Другие опции: AJAX или ваш ответ может быть html с javascript, который делает запрос к вашей странице портала с дополнительным параметромза ошибку ...

0 голосов
/ 07 марта 2012

Вам действительно нужна форма для этого?Разве вы не можете просто использовать ссылку с href, установленным на <portlet:resourceURL/>?

Кроме того, почему вы устанавливаете тип содержимого в виде простого текста при отправке zip-файла?Я надеюсь, что это только для сценария ошибки.

Я думаю, что вы можете разделить логику генерации ответов на основе результата try / catch.

@ResourceMapping
public void getFile(ResourceRequest request, ResourceResponse response) {
    String zipName = "myfile.zip";

    try {   

        response.setProperty("Content-Disposition", "attachment; filename=" + zipName);
        response.setContentType("application/zip");

        //Write to output stream here

    } catch(Exception e) {
        myLogger.error("Error from throwable: " + e.getMessage());
        // write the error message to the response stream here.
        response.setContentType("text/plain");
    }
}
...