Портлет Java: как перенаправить (на стороне сервера) на serveResource?

(отказ от ответственности: я новичок в разработке портлетов)

Я создал портлет (в liferay) для обслуживания файлов. Но пользователю сначала нужно заполнить небольшую форму (имя и т. д.), а затем, нажав «Сохранить», я помещаю данные в базу данных и должен предоставить файл для загрузки.

Я знаю, как обслуживать файл с помощью:

@Override
public void serveResource(ResourceRequest resourceRequest, ResourceResponse resourceResponse) 

и сохранить данные с действием:

@ProcessAction(name = "save")
public void save(ActionRequest actionRequest, ActionResponse actionResponse)

Но не знаю как сервер.переносить с одного на другой. Я не могу просто позвонить:

serveResource(actionRequest, actionResponse);

потому что параметры несовместимы.

Также при ошибке я должен сделать:

PortalUtil.copyRequestParameters(actionRequest, actionResponse);
actionResponse.setRenderParameter("mvcPath", "/myForm.jsp");

который недоступен для resourceRequest/resourceResponse...

Каков правильный/элегантный способ такого перенаправления в портлетах?


person tester.one    schedule 06.12.2017    source источник


Ответы (2)


Для сохранения форм вместо использования processAction вы можете напрямую вызывать serveResource и сохранять форму и обслуживать файл из самого метода serve.

Вы также можете воспользоваться помощью Ajax-запроса для отправки формы.

<form action="<portlet:resourceURL/>" method="POST">
...
</form>
@Override
public void serveResource(ResourceRequest resourceRequest, ResourceResponse resourceResponse){

//Save_form

  if(success){
      //serveFile
      String documentPath = document.getDocumentPath();

      File file = getFile(documentPath);

      String contentType = MimeTypesUtil.getContentType(file);

      long contentLength = file.length();

      is = new FileInputStream(file);

      ServletResponseUtil.sendFile(
          request, response, document.getDocumentName(), is, contentLength, contentType,
          HttpHeaders.CONTENT_DISPOSITION_INLINE);

  }else{

      response.getOutputStream("Error submitting form");
      response.getOutputStream().flush();
  }   

}
person Rajesh    schedule 06.12.2017
comment
Это работает, но, похоже, это не то, что мне нужно: после загрузки страница остается формой - и она должна вернуться в список файлов. Поэтому я думаю, что мне нужно сохранить данные в действии, в случае успеха - перенаправить обратно с информацией о том, что данные были сохранены, и я могу подать файл ... спасибо, - person tester.one; 06.12.2017
comment
Затем вам нужно сделать 2 вызова serveresource, один раз для отправки формы и, в случае успеха, сделать другой, чтобы получить файл. - person Rajesh; 06.12.2017

Для этого вы должны отправить форму, используя ajax через resourceUrl. Напишите ниже код в методе serveResource для загрузки файла.

PortletResponseUtil.sendFile(resourceRequest, resourceResponse,
fileName, bytes, contentType);
person Alok    schedule 06.12.2017
comment
Возможно я не правильно выразился - я хочу обслуживать файл из метода ProcessAction, не выезжая к клиенту. Я, вероятно, могу отправить данные действия из формы с помощью ajax - если это необходимо... - person tester.one; 06.12.2017