ソースコードを確認する
では、初期状態で用意されているファイルを見てみましょう。[Java リソース: src]フォルダを開くと、中に[com.example.myvaadin]というパッケージが用意されており、その中に[MyvaadinApplication.java]というJavaのソースコードファイルが置かれているはずです。これが、サンプルとして用意されるソースコードです。これを開くと、次のように記述されています。
package com.example.myvaadin; import com.vaadin.Application; import com.vaadin.ui.*; public class MyvaadinApplication extends Application { @Override public void init() { Window mainWindow = new Window("Myvaadin Application"); Label label = new Label("Hello Vaadin user"); mainWindow.addComponent(label); setMainWindow(mainWindow); } }
生成されているのは「MyvaadinApplication
」というクラスです。これは、com.vaadin.Applicationクラスを継承して作成されています。このApplicationは、Vaadinアプリケーションのベースとなるものです。Webアプリケーションにアクセスすると、このApplication継承クラスが呼び出され実行されます。
ここでは、「init
」というメソッドが1つだけ用意されています。これは、クラスが呼び出された際、最初に実行されるもので、必要な初期化処理などを行います。では、ここでは何を行っているのか、ざっと整理しましょう。
Windowインスタンスの用意
Window mainWindow = new Window("Myvaadin Application");
最初に行っているのは「Window
」というクラスのインスタンスを用意することです。ウインドウは、アプリケーションのウインドウとなるコンポーネントです。Vaadinでは、GUIの作成はまずWindowインスタンスを用意し、これに表示するコンポーネントを組み込んでいくのです。そして、最後にそのWindowをメインウインドウとして設定すると、それがWebブラウザのウインドウ内に表示される、という仕組みになっています。
Labelコンポーネントの作成
Label label = new Label("Hello Vaadin user");
Windowができたら、次に行うのは、このWindowに組み込むコンポーネントの準備です。ここでは「Label
」というコンポーネントを1つ作成しています。これは、テキストの表示を行うためのコンポーネントです。引数に、表示するテキストを指定してnew
します。
Windowにコンポーネントを組み込む
mainWindow.addComponent(label);
作成したコンポーネントは、表示したいWindowに組み込みます。これを行っているのが、Windowクラスの「addComponent
」です。引数にコンポーネントのインスタンスを渡して呼び出すことで、そのコンポーネントがWindowに組み込まれます。
Windowをメインウインドウに設定する
setMainWindow(mainWindow);
Windowが完成したら、最後にそれをメインウインドウに設定します。Applicationクラスの「setMainWindow
」メソッドを使い、引数にWindowインスタンスを指定することで、そのWindowがメインウインドウとなります。
こうしてメインウインドウとなったWindowが、実際にレンダリングされWebブラウザに表示されるのです。いかがでしょう、VaadinでのGUI関連の流れが大体わかってきたでしょうか。「Application」「Window」「コンポーネント」という3つの基本的なクラスさえしっかり押さえれば、Vaadinの画面表示を作成するのは、それほど難しいことではありません。
なぜ、MyvaadinApplicationが呼び出されるのか?
ソースコードの基本がわかったところで、もう1つ、自動生成されている「web.xml」を見てみましょう。ここに、Vaadinの秘密が隠されています。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>myvaadin</display-name> <context-param> <description>Vaadin production mode</description> <param-name>productionMode</param-name> <param-value>false</param-value> </context-param> <servlet> <servlet-name>Myvaadin Application</servlet-name> <servlet-class>com.vaadin.terminal.gwt.server.ApplicationServlet</servlet-class> <init-param> <description>Vaadin application class to start</description> <param-name>application</param-name> <param-value>com.example.myvaadin.MyvaadinApplication</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>Myvaadin Application</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <welcome-file-list> ……略…… </welcome-file-list> </web-app>
一部省略していますが、Vaadinでどのようにクラスが呼び出されているのか、その仕組みを知ることができます。Vaadinには、com.vaadin.terminal.gwt.server.ApplicationServletというサーブレットが用意されており、すべてのアクセスはこのサーブレットに送られるようになっていることが分かります。
そして、サーブレットへの初期パラメータとして、applicationパラメータの値にcom.example.myvaadin.MyvaadinApplicationを指定しています。ここで、MyvaadinApplicationがApplicationクラスとして使われるように設定されていたのです。これにより、ApplicationServletはMyvaadinApplicationを呼び出し、処理が実行されていたのです。
ということは、Applicationを継承したクラスを用意し、applicationというパラメータとしてそのクラスを渡せば、MyvaadinApplicationではないクラスを利用することもできる、というわけです。