2016-05-25 1 views
0

これを投稿するには、これが正しいサブフォーラムであることを願っています。 私は、一般的に、Maven、Vaadin、Javaアプリケーションの新機能ですから、これについて私が助けてくれることを願っています。 基本的に私はjavascriptを使ってポップアップウィンドウを作成し、ファイルをアップロードし、その内容をテキストエリアに表示して(ファイルの内容を文字列として)送ることができるmavenプロジェクト(java 7)を持っています)をajaxリクエストを介してサーバーに送信します。それは簡単な部分でした。 私が今したいことは、Javaでいくつかの検証を実行する必要があるため、ajax(アップロードされたファイルのデータを含む文字列)を介して送信されたデータにアクセスすることです。 私はvaadinの本や一般的なネットを含めて周りの見栄えが良く、かつてこれをやったことがないと考えると、ある方法ではコネクタを持つことができるようですが、それは、私が持っている構造を考えれば私のプロジェクトでそれを実装することができないことを、私がバダンの書物https://vaadin.com/docs/-/part/framework/gwt/gwt-overview.htmlの本から理解しているところから現れます。 私の質問は皆さん、私が持っているプロジェクト(普通のメイプルプロジェクト)を見れば、Javaからこのデータにアクセスする最も簡単な方法は何でしょうか?ここで は、コンテキストに物を置くためのプロジェクトからいくつかのコードです:Javaからのjavascriptデータへのアクセス(mavenアプリケーション)

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

リンクをだからここhttp://pastebin.com/mSEJq0HT をペーストビンし、POSTDATAは、私は、サーバーに渡され、私はJavaでアクセスしたいのですが、その文字列が含まれています。 私は先にこれを見つけました。それはそれを扱う別の方法かもしれません。vaadin with ajax。皆さんはどう思いますか? ご協力いただきありがとうございます。ありがとうございました。ありがとうございます。

+0

Vaddinクライアントを混乱させないでください。<->サーバー通信。 java側の対応するフィールドに 'valueChangeListener'を追加するだけで、値が変更されたときに通知されます。 –

+0

これは削減された例ですか?そうでない場合は、その時点でvaadinを気にするのはなぜですか?あなたがしているのは、ファイルを別のエンドポイントに送信するためにいくつかのjqueryを操作するために、さもなければ、なぜvaadin Window、Upload、TextArea ...を使用しないのですか? – cfrick

+0

すべての有効なポイントの人たちですが、なぜ私が学習しているので、私がvaadinを使用している理由はJSとは少しばかり自信があります。それはアップロード、textAreasなどでより良いと同意するが、それは私が少し自信を持って感じた後、それをリファクタリングするときに来る。今のところ、私はRPCなどの使用の原則を理解すると思っていたので、それが最良の方法ではないにしても、この方法でやっています。 – antobbo

答えて

0

まず最初に、間違ったツールを使って間違ったツールを使って、あなたの望む効果を達成していることを深く心配する必要があります。私はその話題に詳しくは触れませんが、Vaadinフレームワークの主な目的は、開発者がJavaScript混乱を避けるためにコンポーネントをJavaで記述できることです(Swingコンポーネントと同様)。はい、Vaadin Frameworkを使用してJavaScriptを実行できますが、可能な限り避けてください。

ここで、ハッキングに入ることができます。サーバーによってファイルデータ(あなたが言ったとおりの文字列)をキャッチするには、2つの方法があります。

a)XMLHttpRequestを手作業で取り除きます。 Vaadinがあなたのためにそれを処理させてください。

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

だけのJavaScript関数を呼び出す代わりに、(:Vaadinを読んで)あなたがする必要がある

sendFileContentToTheServer(postData) 

さて、次のものがサーバー側でJavaScriptのコールバックを登録することであると言うことができます。どこかあなたのコードで(本当に重要ところ、ちょうどコードが少なくとも一度呼ばれていることを確認しますしない - 理想的に正確に一度)に置く:それです

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

を。 VaadinはRPC呼び出しを管理します。あなたのページは再ロードされず、サーバー側でデータを取得します。

b)第2のアプローチは、やや難解です。技術的には、手作業でXMLHttpRequestを構築し、Vaadinを使用してサーバー上でデータを受信することが可能です。あなたがする必要があるのは、JavaServlet(VaadinServletではなく)を登録することです。データをJavaServletに送信します。その後、いくつかのプロキシまたは参照呼び出しを介して存在していたVaadinUI。それはあなたがすでに非常にトリッキーなことをしているので、私はそれに深く関わることはありません。

+0

ありがとうございました。あなたの懸念については、はい、あなたは正しいですが、私が前に言ったように、計画はある時点ですぐにリファクタリングして、すべてのjを取り除き、Javaコードで置き換えることです。 私はこれをAjaxで実装する必要があります。恐れがあります。私はまた、第1の解決策についての質問を持っています。vaadinの本では、jsをjava部分と話すためにjavascriptコネクタを使用して、RPCを登録し、それが考慮すべきアプローチかどうか疑問に思っていましたか? – antobbo

+0

あなたもそうすることができます。しかしそれは単なる道のりです。これは、少なくともVaadinフレームワークの知識を必要とし、ウィジェットセットを再コンパイルして動作させる必要があるでしょう。私はあなたのコードにノイズを加えるだけなので、私の答えでこれをカバーしていません。より複雑なUIコンポーネントとJavaScriptとの堅牢な統合が必要な場合は、これが道のりです。今のところあなたはそれを必要としません。 あなたのAjaxの必要性について - あなたはRPCがAjaxをラップすることを知っていますので、結局は技術的にはまだajaxリクエストで終わっています。感謝します。http://stackoverflow.com/questions/13735602/ – kukis

+0

ありがとうございます。実際にはRPC呼び出しを使用することはかなり面白いでしょう。また、将来私はそれらをたくさん使いたいので、私はそれらに慣れておく必要があります。私はこれを達成するために様々なチュートリアルをオンラインで読んでいます。私はコードを大幅に更新しているので、おそらく別のスレッドに投稿します。 vaadinフレームワークの良い知識については、私は学ぶ必要があるので、私もそうであるかもしれません... – antobbo

関連する問題