2012-03-25 15 views
0

Ich versuche Plupload mit JSF auf die unabhängigste Weise zu integrieren, für die ich eine zusammengesetzte Komponente erstellt habe.Integration zwischen einem compositeComponent Attribut und einem Servlet in JSF

Um Plupload in meiner JSF Seite verwende ich einfach anrufen:

<comp:plupload ... value=#{MyBean.files} /> 

Wo MyBean.files eine Liste ist.

Wenn ich Dateien zur Plupload - Komponente hinzufüge und auf die Schaltfläche "Upload starten" klicke, lade ich alles in einen temporären Ordner und fülle das in "value" meiner zusammengesetzten Komponente angegebene Objekt mit diesen Dateieigenschaften (Pfad, z Beispiel).

Zum Hochladen der Dateien verwende ich ein Servlet, es hat nichts mit JSF zu tun, es funktioniert gut für den 1. Teil: es lädt alles in einen temporären Ordner. Mein Problem ist der zweite Teil, ich habe viel recherchiert, aber ich finde keine Möglichkeit, das Attribut "value" in meiner JSF-Composite-Komponente meinem Servlet mitzuteilen.

Plupload verwendet Javascript, alles zu konfigurieren, wird die Anforderung an die in den folgenden Code in das Attribut "url" angegebenen URL gesendet werden:

<composite:interface> 
    ... 
    <composite:attribute name="value" required="true" /> 
</composite:interface> 
<composite:implementation> 
    ... 
    <script type="text/javascript"> 
    // Convert divs to queue widgets when the DOM is ready 
    $(function() { 
     $("#uploader").pluploadQueue({ 
     // General settings 
     runtimes : '#{cc.attrs.runtimePreferences}', 
     url : '/plupload', 
     max_file_size : '#{cc.attrs.maxFileSize}', 
     ... 
     }); 
    }); 
    </script> 

    <div id="uploader"> 
    <p><h:outputText value="Your browser does not support this." /></p> 
    </div> 
</composite:implementation> 

I "/ Plupload" als URL angegeben wird, ist, dass meine Servlets URL (in web.xml).

kann ich über zwei mögliche Lösungen:

  1. Weiter dieses Servlet verwenden, die sich von FacesServlet völlig unabhängig ist, und einen Weg finden, das Attribut „Wert“ in meinem Verbundbauteil als Anforderung Attribut übergeben zu meinem Servlet. Aber wie kann ich das machen?

  2. Stoppen Sie die Verwendung eines neuen Servlets, ich sollte dies nicht tun, da ich JSF verwende, alles sollte von FacesServlet verarbeitet werden. Anstatt ein neues Servlet zu verwenden, könnte ich eine ManagedBean erstellen. Innerhalb dieser ManagedBean konnte ich eine Methode erstellen und die HttpRequest und HttpResponse wiederherstellen. Es ist einfacher, meine compositeComponent mit der Methode zu kommunizieren, die den Upload übernimmt, wenn es sich um eine managedBean handelt. Problem: Wie kann ich eine Methode von managedBean über eine URL referenzieren? Ich muss noch das Attribut "url" im JavaScript-Code ausfüllen. Gibt es etwas wie „/ faces/MyBean action = 'myMethod()'

Sie für jede Antwort im voraus danken;?)

Antwort

0

senden es als Anfrage pathinfo

url: '/plupload/' + encodeURIComponent('#{cc.attrs.value}'), // You might want to escape JS special characters like singlequotes, newlines, etc as well, depending on what the value can contain. 
.

wenn das Servlet auf /plupload/* abgebildet wird, dann können Sie es wie folgt erhalten:

String value = request.getPathInfo().substring(1); 
+0

Danke dafür BalusC Beantwortung es wäre perfekt funktionieren, wenn. Ich habe versucht, eine einfache Zeichenfolge an mein Servlet zu übergeben, aber ich möchte ein ganzes Objekt übergeben, ich glaube nicht, dass ich dies durch die URL tun kann. Wie gesagt, # {cc.attrs.value} ist eine Liste, die Ihren Code benutzt, um die Elemente der Liste in meiner HTML-Datei zu drucken. Da meine Liste leer ist, rendert JSF: url: '/ plupload /' + encodeURIComponent ('[]'). –

+0

Konvertieren Sie es in Zeichenfolge. Oder speichern Sie es als Sitzungsattribut mit einer eindeutigen ID und übergeben Sie diese ID stattdessen. – BalusC

+0

Umwandlung in String funktioniert nicht ... Ich brauche keine Kopie der Variablen, ich brauche einen Verweis darauf = /.Ich habe die Sitzungsidee ausprobiert, ich habe eine neue sitzungsspezifische Bean-Bean erstellt und sie mit einem Pre-Render-Event in meiner Composite-Komponente geladen. Es hat gut funktioniert;). Vielen Dank. Ich werde eine detaillierte Antwort schreiben und erzählen, was ich getan habe, um Menschen zu helfen, die in der Zukunft vielleicht ein ähnliches Problem haben. –

Verwandte Themen