2016-05-25 9 views
0

Ich hoffe, dies ist das richtige Unterforum, um dies zu posten. Ich bin sehr neu bei Maven, Vaadin und Java-Anwendungen im Allgemeinen, also hoffte ich, dass Sie mir dabei helfen könnten, da ich nicht sicher bin, wie ich am besten vorgehen könnte. Grundsätzlich habe ich ein Maven-Projekt (Java 7), das mit Javascript ein Popup-Fenster mit einem Formular innerhalb erstellt, können Sie eine Datei hochladen, zeigen Sie ihren Inhalt in einem Textfeld und senden Sie es (den Inhalt der Datei als String) über eine Ajax-Anfrage an den Server. Das war der einfache Teil. Was ich jetzt tun möchte, ist der Zugriff auf die Daten, die über Ajax gesendet werden (die Zeichenfolge, die die Daten der hochgeladenen Datei enthält) in Java, weil ich sie durch eine Validierung ausführen muss. Ich habe mich gut umgesehen, einschließlich des Buches Vaadin, und das Netz im Allgemeinen und in Anbetracht dessen, dass ich das noch nie gemacht habe, scheint es, dass ein Weg ein Stecker sein könnte, aber es sieht ein wenig zu kompliziert und auch aus es scheint - aus dem, was ich aus dem Buch von Vaadin https://vaadin.com/docs/-/part/framework/gwt/gwt-overview.html verstehe - dass ich nicht in der Lage sein werde, das in meinem Projekt zu implementieren, gegeben die Struktur, die ich habe - was anders ist als das, was da drin ist. Also, meine Frage an euch ist, da ich das Projekt habe (nur ein normales Maven-Projekt), was wäre der einfachste Weg für mich, um auf diese Daten von Java zuzugreifen? Hier ist ein Code aus dem Projekt, die Dinge in einen Kontext zu setzen:Zugriff Javascript-Daten von Java (Maven-Anwendung)

import javax.servlet.annotation.WebServlet; 
import com.vaadin.annotations.Theme; 
import com.vaadin.annotations.VaadinServletConfiguration; 
import com.vaadin.annotations.Widgetset; 
import com.vaadin.server.VaadinRequest; 
import com.vaadin.server.VaadinServlet; 
import com.vaadin.ui.Button; 
import com.vaadin.ui.Button.ClickEvent; 
import com.vaadin.ui.JavaScript; 
import com.vaadin.ui.Label; 
import com.vaadin.ui.UI; 
import com.vaadin.ui.VerticalLayout; 
import com.vaadin.client.ui.*; 

@Theme("mytheme") 
@Widgetset("my.vaadin.apptest.MyAppWidgetset") 
@com.vaadin.annotations.JavaScript({"https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js" 

}) 
public class MyUI extends UI { 
    @Override 
    protected void init(VaadinRequest vaadinRequest) { 
     final VerticalLayout layout = new VerticalLayout(); 
     layout.addStyleName("myLayout");//add class to main div   
     Label label = new Label("Hello Vaadin user. Use this application to upload files."); 
     ... 
     //HERE IS THE JAVASCRIPT CREATING AND INSTANTIATING THE POPUP AND THE AJAX CALL 
     //CREATING POPUP 
     JavaScript.getCurrent().execute("" 
     +"var $HTMLpopup = $('<div class=\"popupContainer\">" 
      +"<span class=\"cancelBtn big\"></span>" 
      +"<div class=\"wrapper\">" 
       +"<form action=\"\" id=\"fileForm\">" 
        +"<div class=\"mask\">" 
         +"<input type=\"file\" title=\" \"name=\"uploadFile\" class=\"uploadFile\" accept=\".mol,.sdf\">/*filters files to upload*/" 
         +"<span class=\"pseudoBtn\">Browse</span>" 
         +"<input type=\"text\" name=\"displayFile\" class=\"displayFile\" placeholder=\"no file loaded\">" 
         +"<span class=\"cancelBtn small\"></span>" 
        +"</div>" 
        +"<textarea class=\"fileResult\"></textarea>" 
        +"<button type=\"submit\" class=\"submitBtn\">Upload</button>" 
        +"<div class=\"clear\"></div>" 
       +"</form>" 
      +"</div>" 
     +"</div>');" 
     //INSTANTIATING THE POPUP 
     +"$('.popupTriggerBtn').click(function(){" 
      +"/*console.log('button clicked!');*/" 
      +"var $body = $('body');" 
      +"$HTMLpopup.appendTo($body);" 
     +"});" 
     //HERE IS THE AJAX BIT 
     +"var $submitBtn = $HTMLpopup.find('.submitBtn');" 
     +"$submitBtn.click(function(e){" 
      +"e.preventDefault();/*prevent submission*/"     
      +"if(isFileUploadEmpty()){/*IF EMPTY*/" 
       +"/*alert('submit clicked');*/" 
       +"removeError();" 
       +"showError('empty');"      
      + "}" 
      +"else{/*IF NOT EMPTY*/" 
       +"/*AJAX OPS*/" 
       +"if (window.XMLHttpRequest){/*XMLHttpRequest SUPPORT?*/" 
        +"console.log('XMLHttpRequest supported!');" 
        +"var postData = returnFileAsString();/*returns the file as a string*/;"       
        +"/*console.log('here is the file as a string ' + postData);*/" 
        +"$.ajax({" 
         +"type:'post'," 
         +"url:'http://localhost:8080/apptest/'," 
         +"data:postData," 
         +"contentType: 'application/x-www-form-urlencoded'," 
         +"success: function(responseData, textStatus, jqXHR){" 
          +"/*alert('data saved');*/" 
          +"console.log('responseData is ' + responseData);" 
          +"console.log('text status is ' + textStatus);" 
          +"console.log('the data submitted is ' + postData);" 
         +"}," 
         +"error: function(jqXHR, textStatus, errorThrown){" 
          +"console.log(errorThrown);" 
          +"alert('an error has occurred!');" 
         +"}" 
        +"});" 
       +"}" 
      +"}" 
     +"});"  
    +""); 
    //ADDING COMPONENTS 
    layout.addComponents(label, button); 
    layout.setMargin(true); 
    layout.setSpacing(true); 

    setContent(layout); 
} 

Link Pastebin hier http://pastebin.com/mSEJq0HT Also, postdata enthält die Zeichenfolge, die ich an den Server weitergeleitet und ich möchte in Java zugreifen . Ich bin schon früher darauf gestoßen, was vielleicht ein anderer Weg ist, um damit umzugehen vaadin with ajax. Was denkt ihr? Jede Hilfe würde sehr geschätzt, danke

+0

Verwechseln Sie nicht den Vaddin Client <-> Server Kommunikation. Fügen Sie einfach ein 'valueChangeListener' zum entsprechenden Feld auf der Java-Seite hinzu und Sie werden informiert, wenn sich der Wert geändert hat. –

+0

ist dies ein reduziertes Beispiel? Wenn nicht, warum sollte man sich dann überhaupt mit Vaadin herumschlagen, wenn man nur einen riesigen Blob sendet, der JS-Strings zum Client schickt, um eine Jquery zu steuern, um eine Datei an einen anderen Endpunkt zu senden? Warum nicht ein vaadin Window, Upload, TextArea ... benutzen? – cfrick

+0

alle gültigen Punkte Jungs, aber der Grund, warum ich vaadin benutze ist, weil ich lerne und an diesem Punkt fühle ich mich ein bisschen sicherer mit JS als ich mit Java/Vaddin Komponenten und damit senden all diese JS-String. Stimme zu, es wäre besser mit Upload, TextAreas etc, aber das wird kommen, wenn ich es umgestalten, nachdem ich ein bisschen selbstsicherer fühle, das ist. Im Moment dachte ich, ich würde die Prinzipien der Verwendung von RPC usw. verstehen, deshalb mache ich es auf diese Weise, auch wenn es nicht der beste Weg ist ... – antobbo

Antwort

0

Nun, zuerst muss ich meine tiefe Sorge ausdrücken, dass Sie falsche Werkzeuge auf eine wirklich seltsame Weise verwenden, um Ihren gewünschten Effekt zu erreichen. Ich werde dieses Thema nicht vertiefen, sondern nur den Hauptzweck des Vaadin-Frameworks aufzeigen, dass Entwickler Komponenten in Java schreiben können (ähnlich wie Swing-Komponenten), um JavaScript-Probleme zu vermeiden. Ja, Sie können JavaScript mit Vaadin Framework ausführen, aber Sie sollten es so lange wie möglich vermeiden.

Ok jetzt lassen wir uns in hacken. Sie haben zwei Möglichkeiten, um Ihre Dateidaten (die eine Zeichenfolge ist, wie Sie sagten) von Ihrem Server abzufangen:

a) Werden Sie los, Ihre XMLHttpRequest von Hand zu konstruieren. Lass Vaadin das für dich regeln. Statt

+"$.ajax({" 
+"type:'post'," 
+"url:'http://localhost:8080/apptest/'," 
... 

nur JavaScript-Funktion aufrufen, können sagen,

sendFileContentToTheServer(postData) 

Jetzt nächste, was Sie tun müssen, ist JavaScript Rückruf auf der Server-Seite (sprich: Vaadin) zu registrieren. Irgendwo in Ihrem Code (nicht wirklich wichtig, wo, so stellen Sie sicher, dass der Code mindestens einmal aufgerufen wird - im Idealfall genau einmal) setzen:

JavaScript.getCurrent().addFunction("sendFileContentToTheServer", new JavaScriptFunction() { 
    public void call(JSONArray arguments) throws JSONException { 
     System.out.println(arguments.getString(0)); 
     //do whatever you want with your data - its under arguments.getString(0) 
    } 
}); 

Das ist es. Vaadin wird den RPC-Anruf für Sie verwalten. Ihre Seite wird nicht neu geladen und Sie erhalten Ihre Daten auf der Serverseite.

b) Der zweite Ansatz ist es ein wenig komplizierter. Es ist technisch möglich, XMLHttpRequest manuell zu erstellen und Daten auf dem Server mit Vaadin zu empfangen. Was Sie tun müssen, ist JavaServlet (nicht VaadinServlet) zu registrieren. Senden Sie die Daten an das JavaServlet. Dann durch einen Proxy oder Verweis Aufruf der bestehenden VaadinUI. Es ist eine kompilierte Art, Dinge zu tun, die Sie bereits sehr schwierig gemacht haben, damit ich nicht tiefer darauf eingehen werde.

+0

danke dafür. Was Ihr Anliegen angeht, ja, Sie haben Recht, aber wie ich schon sagte, ist der Plan, irgendwann das zu ändern, das alles zu entfernen und es durch Java-Code zu ersetzen. Ich muss das mit Ajax umsetzen, fürchte ich. Ich habe auch eine Frage über die erste Lösung. Im Buch von Vaadin verwenden sie einen Javascript-Connector, um die js mit dem Java-Teil zu sprechen, und dann registrieren sie die RPC und ich fragte mich, ob das ein Ansatz ist zu prüfen? – antobbo

+0

Sie könnten das auch tun. Aber es wäre nur ein Weg mehr Arbeit. Es erfordert mindestens gute Kenntnisse des Vaadin-Frameworks und außerdem müssten Sie Widgetsets wahrscheinlich neu kompilieren, damit es funktioniert. Ich habe dies in meiner Antwort nicht behandelt, weil es Ihrem Code nur ein Rauschen hinzufügt. Sollten Sie komplexere ui-Komponenten und eine robuste Integration mit JavaScript haben, dann wäre das der richtige Weg. Für jetzt brauchst du es nicht. In Bezug auf Ihre Bedürfnisse von Ajax -did Sie wissen, dass RPC Ajax Wraps, so am Ende Sie immer noch am Ende mit einer Ajax-Anfrage enden. Lesen Sie http://StackOverflow.com/questions/13735602/ – kukis

+0

danke. Die Verwendung von RPC-Calls wäre in der Tat ziemlich interessant. Außerdem muss ich mich an sie gewöhnen, da ich sie in Zukunft sehr oft benutzen werde. Ich lese verschiedene Tutorials online, um dies zu erreichen, und ich werde wieder posten, wahrscheinlich in einem separaten Thread, da ich meinen Code erheblich aktualisiere. Was die gute Kenntnis des Vaadin-Rahmens angeht, muss ich lernen, also könnte ich auch ... – antobbo