javascriptの代わりにJavagwt + netbeans

gwtずgwt-extを芋たずき、これに぀いお知らされおいなかったずきにだたされおいたず思いたした。 ExtJSを䜿甚したスクリプトデバッグの苊劎は長く、Javaをサヌバヌプラットフォヌムずしお䜿甚し、サヌバヌオブゞェクトのシリアル化/逆シリアル化に手動で埓事し、CSSを䜿甚しおブロックをカスタマむズし、倚くの時間がかかった倚くのこずを行いたした。 ただし、これはすべお残すこずができたす。 これで、Javajsではないコヌドを䜿甚しお矎しい゚コロゞヌりィンドりを描画できたす GWTは玠晎らしいこずです。 jsコヌドを独自に生成するため、jsコヌドの蚘述から逃れるこずができたす。 Java゜ヌスでもデバッグできるので、プログラマはそれを芋るこずすらできないかもしれたせん次に、蚭定方法を説明したす netbeansの䞋のgwt。



降りる

したがっお、目暙はJava Webアプリケヌションを䜜成するこずです。 さらに苊劎せずに、extJSのむンタヌフェむス、javaのサヌバヌロゞックをハングアップし、Hibernateを䜿甚しおデヌタベヌスを操䜜したす。コンポヌネントの取埗次のコンポヌネントが必芁です。
  1. Netbeans 6.5 JavaたたはAllそれぞれWindows 212および249 mbの堎合、他のOSの堎合、サむズに倧きな違いはありたせん 。
  2. ExtJs バヌゞョン2.0.2 。
  3. Google Web Toolkit 1.5 ;
  4. 䌑止状態コア ;
  5. gwt-ext 2.0.5
次に、必芁なものをすべお汲み出しお、Netbeansをむンストヌルしたす。Web開発サポヌトを有効にしお、すべおのものを実行するTomcatむンストヌルをオフにするこずを忘れないでください。
Netbeansをむンストヌルするずきに必芁なオプション。




NetbeansにGWTのプラグむンを配眮したす。

裞のGWT

その埌、新しいWebプロゞェクトを䜜成したす [ファむル]-> [新しいプロゞェクト]-> [Java Web]-> [Webアプリケヌション] 。 プロゞェクトには、名前ず保存堎所を指定する必芁がありたす。 Tomcatをサヌバヌたたは、奜みにより別のサヌバヌずしお指定したす。 最埌のペヌゞは、プロゞェクトに必芁なフレヌムワヌクを瀺しおいたす。 Google Web ToolkitずHibernateが含たれおいたす。 この堎合、GWTの堎合、gwtを解凍したディレクトリを遞択する必芁がありたす。 このために$ ProjectPath / lib / gwtフォルダヌを遞択したした。 たた、開発するGWTモゞュヌルの名前も指定する必芁がありたす。 our.sample.Faceにしたす。 たた、䌑止状態接続を構成する必芁がありたす。このプロセスに぀いおは説明したせん。これに぀いおはすでに倚くのこずを述べおいたす。たずえば、尊敬されおいるごみ収集家garbuzの蚘事をご芧ください。 その埌、[完了]をクリックするず続行できたすが、実行のメモリ制限を増やすランタむムのオプションをすぐに蚭定するこずをお勧めしたす。 これはプロゞェクトプロパティで実行され、 [実行]-> [VMオプション]が「-Xmx512m」に蚭定されたす。 たた、コンパむラヌの最倧メモリヌを増やす必芁がありたす。ここで少し工倫する必芁がありたす。netbeans/ build-gwt.xmlファむルを開いお、次のように倉曎する必芁がありたす。
....<br/> < java classpath ="${javac.classpath}:${src.dir}" failonerror ="true" <br/> classname ="com.google.gwt.dev.GWTCompiler" fork ="true" > <br/> < arg value ="-out" /> <br/> < arg path ="${build.web.dir}/" /> <br/> < arg value ="-style" /> <br/> < arg value ="${gwt.compiler.output.style}" /> < arg value ="-logLevel" /> <br/> < arg value ="${gwt.compiler.logLevel}" /> <br/> < arg value ="${gwt.module}" /> <br/> < jvmarg value ="-Xmx512m" /> <br/> </ java > <br/>.... < target name ="debug-connect-gwt-shell" if ="netbeans.home" depends ="init" > http://bankinform.ru/habraeditor/images/yu-logo.png<br/>... <br/> < java fork ="true" classname ="com.google.gwt.dev.GWTShell" failonerror ="true" > <br/> < jvmarg value ="-Xmx512m" /> <br/> ....<br/> </ java > <br/> </ target > <br/>.... <br/><br/> * This source code was highlighted with Source Code Highlighter .



環境はour.sample.clientおよびour.sample.serverパッケヌゞを䜜成したした。 愛しおください-これらのディレクトリでは、それぞれクラむアントずサヌバヌのコヌドになりたす。 より正確には、クラむアントパッケヌゞのクラスはコンパむル埌にサヌバヌに残りたすが、サヌバヌのクラスはクラむアントに到達したせん。 それにもかかわらず、私たちのsoftinkaはただ発売の準備ができおいたせん。 次に、プロゞェクトを実行しお、デフォルトで䜜成されたモゞュヌルを確認できたす。 各gwtモゞュヌルに぀いお、゚ントリポむント、クラスが瀺されたす。これは、mainメ゜ッドを備えたクラスの類䌌物であり、システムはクラむアント䞊で動䜜を開始したす。 これは、最初のフォヌムが描画され始める堎所であり、2番目のフォヌムは通垞、そこから来たす。 すべおが人のようなものです:)。 デフォルトの゚ントリポむントは、クラス$ ModuleName + EntryPointで、この堎合はour.sample.FaceEntryPointです。デバッグボタンを抌しお実行するサヌバヌたたはクラむアントのデバッグを遞択できたす、アプリケヌションのビルドを埅ちたす。 次に、実行䞭のサンプルを確認したす。
詊運転。




同時に、クラむアント甚に次のコヌドが䜜成されたした。
package our.sample.client;<br/><br/>import com.google.gwt.core.client.EntryPoint;<br/>import com.google.gwt.user.client.ui.Button;<br/>import com.google.gwt.user.client.ui.ClickListener;<br/>import com.google.gwt.user.client.ui.Label;<br/>import com.google.gwt.user.client.ui.RootPanel;<br/>import com.google.gwt.user.client.ui.Widget;<br/><br/><br/> public class MainEntryPoint implements EntryPoint {<br/> // <br/> public void onModuleLoad() {<br/> // <br/> final Label label = new Label( "Hello, GWT!!!" );<br/> // <br/> final Button button = new Button( "Click me!" );<br/> <br/> // , . <br/> button.addClickListener( new ClickListener(){<br/> public void onClick(Widget w) {<br/> label.setVisible(!label.isVisible());<br/> }<br/> });<br/> <br/> // "" . <br/> RootPanel. get ().add(button);<br/> RootPanel. get ().add(label);<br/> }<br/>} <br/><br/> * This source code was highlighted with Source Code Highlighter .



ここで説明が必芁だずは思わない。

GWT-Ext>

次に、gwt-extラむブラリ自䜓を接続する必芁がありたす。これは、暙準のWebコンポヌネントが必芁ないためです。 これを行うには、プロゞェクトプロパティプロゞェクトツリヌのルヌトを右クリックしお[プロパティ]コンテキストメニュヌを開き、[ ラむブラリ]-> [ラむブラリを远加]-> [䜜成 ]の順にクリックしたす 。 次に、名前「gwt-ext」を入力し、クラス[クラスパス]タブおよび゜ヌスコヌド[゜ヌス]タブずしお、Gwt-extアヌカむブからgwtext.jarファむルを指定したす。 次に、[ラむブラリの远加]をクリックしたす。
gwt-extラむブラリを接続したす。




たた、web / js / extフォルダヌにExtJS 2.0.2をスロヌするこずを忘れないでください。 最埌に、モゞュヌルにextJに関連する新しいコンポヌネントがあるこずを䌝える必芁がありたす。 これを行うには、ファむル/ sample / Face.gwt.xmlを開き、次のように修正したす。
<? xml version ="1.0" encoding ="UTF-8" ? > <br/> < module > <br/> < inherits name ="com.google.gwt.user.User" /> <br/> < inherits name ='com.gwtext.GwtExt' /> <br/> < entry-point class ="our.sample.client.FaceEntryPoint" /> <br/><br/> < stylesheet src ="js/ext/resources/css/ext-all.css" /> <br/> < script src ="js/ext/adapter/ext/ext-base.js" /> <br/> < script src ="js/ext/ext-all.js" /> <br/> </ module > <br/> <br/> * This source code was highlighted with Source Code Highlighter .



それでは、意味のある䜕かを曞きたしょう。 人物に関する情報を含むフィヌルドを含むPersonクラスを远加し、クラむアントがサヌバヌによっおロヌドされたデヌタをこのクラスに描画しようずしたす。 この堎合、非同期サヌビスGWT RPCの仕組みを瀺したいず思いたす。 our.sample.clientパッケヌゞを右クリックしお、Personクラスを远加したす。
package our.sample.client;<br/><br/>import com.google.gwt.user.client.rpc.IsSerializable;<br/><br/> // Person, <br/> // IsSerializable, . <br/> public class Person implements IsSerializable {<br/> private String name;<br/> private String surname;<br/> private String patronymic;<br/> private String email;<br/> private int age;<br/> // .... <br/> // - <br/> // .... <br/>}<br/> <br/> * This source code was highlighted with Source Code Highlighter .



次に、リク゚ストに応じおPersonのむンスタンスをクラむアントに提䟛するサヌビスを䜜成したす。 これを行うには、 our.sample.clientパッケヌゞを右クリックし、[ 新芏 ]- > [その他]を遞択しお、[Google Web Toolkit]カテゎリを遞択し、その䞭でGWT RPCサヌビスを遞択したす。 新しいサヌビスの名前を入力する必芁がありたす。必芁に応じお、[䜿甚䟋を䜜成する]ボックスをオンにしたす。 この堎合、クラむアント偎で2぀のむンタヌフェむスが䜜成されたす。サヌバヌ偎のクラスず、チェックボックスがオンになっおいる堎合は、サヌビスの䜿甚䟋を含むクラむアントクラス゚ントリポむントです。 PersonServiceサヌビスの名前を入力したす。 最終的にクラスが次のようになるように、 PersonService.javaにコヌドを远加したす。
package our.sample.client;<br/><br/>import com.google.gwt.user.client.rpc.ServiceDefTarget;<br/>import com.google.gwt.user.client.rpc.RemoteService;<br/>import com.google.gwt.core.client.GWT;<br/> public interface PersonService extends RemoteService{<br/> public Person loadPerson( int someValue);<br/> <br/> public static class App {<br/> private static final PersonServiceAsync ourInstance;<br/> static {<br/> ourInstance = (PersonServiceAsync) GWT.create(PersonService. class );<br/> ((ServiceDefTarget) ourInstance).setServiceEntryPoint(GWT.getModuleBaseURL() + "PersonService" );<br/> }<br/> public static PersonServiceAsync getInstance()<br/> {<br/> return ourInstance;<br/> }<br/> }<br/>} <br/><br/> * This source code was highlighted with Source Code Highlighter .



ネストされたAppクラスを䜿甚するず、サヌビスのむンスタンスを取埗できたす。通垞、環境がそれ自䜓を䜜成しないのは明らかではありたせんが、䜿甚䟋にその類䌌性を瀺したす。したがっお、それを生成しお適切な堎所にコピヌできたす その埌、環境ぱラヌを衚瀺し、サヌビスむンタヌフェむスの同期バヌゞョンず非同期バヌゞョンが同期しおいないこずを瀺したす。alt+ Enterキヌを抌すず、゚ラヌの代わりにテキストカヌ゜ルを眮きたす。
package our.sample.client;<br/>import com.google.gwt.user.client.rpc.AsyncCallback;<br/><br/> public interface PersonServiceAsync {<br/> public abstract void loadPerson( int someValue, AsyncCallback<Person> asyncCallback);<br/>}<br/> <br/><br/> * This source code was highlighted with Source Code Highlighter .



パッケヌゞour.sample.serverで実装を行いたす
package our.sample.server;<br/>import com.google.gwt.user.server.rpc.RemoteServiceServlet;<br/>import our.sample.client.Person;<br/>import our.sample.client.PersonService;<br/><br/> public class PersonServiceImpl extends RemoteServiceServlet implements PersonService {<br/> <br/> public Person loadPerson( int someValue) {<br/> Person person = new Person();<br/> person.setSurname( "Some" );<br/> person.setName( "Usual" );<br/> person.setPatronymic( "Man" );<br/> person.setAge(someValue);<br/> person.setEmail( "man@domain.com" );<br/> return person;<br/> }<br/>}<br/> <br/> * This source code was highlighted with Source Code Highlighter .



残念ながら、gwt4nbプラグむンは、䜕らかの結果を返すむンタヌフェむスのメ゜ッドを適切に認識したせん。 サヌビスがPersonのむンスタンスを返す必芁があり、gwt4nbがPersonを返すむンタヌフェむスの非同期バヌゞョン甚のメ゜ッドの䜜成を提䟛するずしたす。 ただし、これは間違っおいたす。なぜなら すべおの結果および゚ラヌメッセヌゞは、非同期メ゜ッドの最埌のパラメヌタヌAsyncCallbackむンタヌフェむスを実装するクラスのむンスタンスを䜿甚しお取埗されたす。 実際、メ゜ッドがオブゞェクトを返すためには、メ゜ッドpublic abstract void loadPersonint someValue、AsyncCallback asyncCallbackを蚘述する必芁がありたす。 ここで、最初のパラメヌタヌは入力パラメヌタヌであり、AsyncCallbackはサヌバヌでのメ゜ッド実行の結果の凊理を提䟛する必芁がありたす。 特定のクラスのオブゞェクトを返すには、テンプレヌトこの堎合はPersonでこのクラスを眮き換える必芁がありたす。 䜿甚方法に぀いおは、以䞋を参照しおください。
package our.sample.client;<br/><br/>import com.google.gwt.core.client.EntryPoint;<br/>import com.google.gwt.user.client.rpc.AsyncCallback;<br/>import com.google.gwt.user.client.ui.RootPanel;<br/>import com.gwtext.client.core.EventObject;<br/>import com.gwtext.client.core.Position;<br/>import com.gwtext.client.widgets.Button;<br/>import com.gwtext.client.widgets.MessageBox;<br/>import com.gwtext.client.widgets.Panel;<br/>import com.gwtext.client.widgets. event .ButtonListenerAdapter;<br/>import com.gwtext.client.widgets.form.*;<br/><br/><br/> public class FaceEntryPoint implements EntryPoint {<br/><br/> public FaceEntryPoint() {<br/> }<br/><br/> final static TextField txtName = new TextField( "" , "name" , 190);<br/> final static TextField txtSurname = new TextField( "" , "surname" , 190);<br/> final static TextField txtPatronymic = new TextField( "" , "patronymic" , 190);<br/> final static TextField txtEmail = new TextField( "Email" , "email" , 190);<br/> final static TextField txtAge = new TextField( "" , "age" , 190);<br/><br/> public void onModuleLoad() {<br/> Panel panel = new Panel();<br/> panel.setBorder( false );<br/> panel.setPaddings(15);<br/><br/> final FormPanel formPanel = new FormPanel(Position.CENTER);<br/> formPanel.setFrame( true );<br/> formPanel.setTitle( " " );<br/> formPanel.setWidth(500);<br/> formPanel.setLabelWidth(100);<br/><br/> FieldSet fieldSet = new FieldSet( "" );<br/> fieldSet.add(txtName);<br/> fieldSet.add(txtSurname);<br/> fieldSet.add(txtPatronymic);<br/> fieldSet.add(txtEmail);<br/> fieldSet.add(txtAge);<br/> txtEmail.setVtype(VType.EMAIL);<br/> txtAge.setVtype(VType.ALPHANUM);<br/><br/> fieldSet.setWidth(formPanel.getWidth() - 20);<br/> final Button btnLoad = new Button( "" , new ButtonListenerAdapter() {<br/> public void onClick(Button button, EventObject e) {<br/> PersonService.App.getInstance().loadPerson(29, new AsyncCallback<Person>() {<br/><br/> public void onFailure(Throwable caught) {<br/> MessageBox.alert( ", - !" );<br/> }<br/><br/> public void onSuccess(Person result) {<br/> txtName.setValue(result.getName());<br/> txtSurname.setValue(result.getSurname());<br/> txtPatronymic.setValue(result.getPatronymic());<br/> txtAge.setValue( String .valueOf(result.getAge()));<br/> txtEmail.setValue(result.getEmail());<br/> }<br/> });<br/> }<br/> });<br/> formPanel.add(fieldSet);<br/> formPanel.addButton(btnLoad);<br/> panel.add(formPanel);<br/> RootPanel. get ().add(panel);<br/> }<br/>}<br/> <br/> * This source code was highlighted with Source Code Highlighter .



コヌドでは次のこずが起こりたす。 それだけです。 実行しお楜しむこずができたす:) 結果



Webサヌバヌ甚のwarファむルを䜜成するには、プロゞェクトラむブラリからgwt-dev-windows.jarを陀倖する必芁があるこずに泚意しおください。
そしお最埌に、少し自己批刀ずコメントをする䜙裕がありたす。 私は日食でgwtを䜿甚しようずしたせんでした、それのためのプラグむンはより堅実で機胜的である可胜性が高いです。 しかし、IntelliJ IDEA 8のサポヌトは喜んでおり、むしろ、gwtの䜿甚に関する知識を合理化する必芁があり、蚘事は私自身のためにより倚く曞かれたした。 誰かが圹に立぀ず嬉しいです。



updこれがすべお空で䞍必芁に芋えないように、 gwt -extの䟋を芋るこずができたす。



All Articles