2017-12-06 4 views
0

(Disclaimer: Ich bin neu in Portlet-Entwicklung)Java-Portlet: Umleiten (serverseitig) zu serveResource?

Ich erstellte Portlet (in Liferay), um Dateien zu dienen. Aber Benutzer müssen zuerst kleines Formular (Name, etc.) ausfüllen und dann nach dem Klicken auf "Speichern" lege ich Daten in die Datenbank und sollte die Datei zum Download bereitstellen.

Ich weiß, wie Datei dienen mit:

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

und speichern Daten mit Aktion:

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

aber wissen nicht, wie von einem zum anderen Server.Transfer. Ich kann nicht einfach anrufen:

serveResource(actionRequest, actionResponse); 

, weil die Parameter nicht kompatibel sind.

Auch auf Fehler sollte ich tun:

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

die für resourceRequest/resourceResponse nicht verfügbar ist ...

Was für diese Art von Umleitungen in Portlets richtige/elegante Art und Weise ist?

Antwort

0

Für Formulare statt mit process speichern, können Sie direkt die serveResource anrufen und Form speichern und Methode selbst aus dienen Datei dienen.

Sie können auch Hilfe von Ajax-Anfrage, um Formular zu senden.

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

} 
+0

Es funktioniert, aber scheint es ist nicht das, was ich brauche: nach Download-Seite ist immer noch ein Formular - und es sollte wieder in der Dateiliste sein. Also ich denke, ich muss Daten in Aktion speichern, wenn erfolgreich - umleiten zurück mit Informationen, die Daten gespeichert wurden und ich kann eine Datei ... Danke, – Robert

+0

Dann müssen Sie 2 seroresource Anruf, einmal Formular einreichen und wenn Erfolg andere dazu bringt, Datei zu bekommen. – Rajesh

0

Dafür müssen Sie das Formular mit Ajax über ResourceUrl senden. Schreiben Sie den folgenden Code in die serverResource-Methode, um die Datei herunterzuladen.

PortletResponseUtil.sendFile(resourceRequest, resourceResponse, 
fileName, bytes, contentType); 
+0

Vielleicht habe ich es nicht richtig formuliert - I-Datei von Methode process dienen wollen, ohne Reise an den Client. Ich kann wohl Action-Daten aus dem Formular mit Ajax senden - wenn es notwendig ist ... – Robert