先日Vaadinを勉強し始めたはいいが、プラグインがインストールできなくていきなりorz...となってしまった。今回はプラグインに頼らないために実験したことをメモ。
とりあえず、Webアプリには違いないのでこんなフォルダ構成にしてみた。
それでこれをEcliseで「新規」⇒「プロジェクト」⇒「Tomcatプロジェクト」を選択して、プロジェクトを作った。それがこれ。プロジェクト名は「vaadintest1」コンテキスト名も同じなので「http://localhost:8080/vaadintest1」でアクセスできる。
こっから先はweb.xmlの世界。Webアプリケーションとしてはweb.xmlのServlet-mappingタグから追っていけばいい話・・・とweb.xmlを見ると、あらら・・・たーくさんあって目移りしてしまう。でも良く見ると、ひとつのアプリケーションに沢山のサーブレットがあって、それぞれがVaadinのWindowになる起点となるらしい。少なくともダウンロードして起動すると立ち上がるデモは次のWindow(アプリケーション)の集合体。デモが起動したらコンテキストルートに、下記のアプリケーション?Window名を付加すれば起動する。
- PortletDemo
- VaadinApplicationRunner
- Reservr
- SimpleReserver
- CalendarDemo
- FeatureBrowser
- Sampler
- AddressBook
- HelloWorld
- Calc
- ColorPickerApplication
- VaadinTunesLayout
- Coverflow
- ReindeerThemeStyles
CodeZineの記事では、すべてのアクセスはこのcom.vaadin.terminal.gwt.server.ApplicationServletに送られてくるとなっていたので、url-patternタグの内容からservlet-mappingタグ⇒servletタグ⇒servlet-nameタグと見ていけば良い。ためしにサンプルにあったCalcサーブレットから追っていったら、ビンゴ!ApplicationServletに行き着いた。Vaadinも何のことはない、他のフレームワークと同じ構成。
あとは記事にあったようにサンプルのクラスをまず作り、
package jp.arcanum.test; import com.vaadin.Application; import com.vaadin.ui.Label; import com.vaadin.ui.Window; public class MyvaadinApplication extends Application { public void init() { Window mainwindow = new Window("バーディン!"); Label label = new Label("Hello world"); mainwindow.addComponent(label); setMainWindow(mainwindow); } }
つぎにweb.xmlを書く。これはVaadinのサンプルから最小限のものを抜き出したもの。
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>Vaadin Test</display-name> <description> Vaadin TestApplication </description> <context-param> <param-name>productionMode</param-name> <param-value>false</param-value> <description>Vaadin production mode</description> </context-param> <servlet> <servlet-name>Hoge</servlet-name> <servlet-class>com.vaadin.terminal.gwt.server.ApplicationServlet</servlet-class> <init-param> <param-name>application</param-name> <param-value>jp.arcanum.test.MyvaadinApplication</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>Hoge</servlet-name> <url-pattern>/*</url-pattern> <!-- Hint for the automatic deployment descriptor generator --> <!-- portlet style= --> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> </welcome-file-list> </web-app>
で、Tomcatの再起動して・・・
ヤッター!とりあえず画面に文字が出た!次に記事でも出ていた次の画面に突っ込んでみる。セッションの関係上か、再起動したあとは新しいブラウザを開いて実行したほうが無難。
package jp.arcanum.test; import com.vaadin.Application; import com.vaadin.event.MouseEvents.ClickEvent; import com.vaadin.event.MouseEvents.ClickListener; import com.vaadin.terminal.gwt.client.ui.ClickEventHandler; import com.vaadin.ui.Button; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.TextField; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; public class MyvaadinApplication extends Application { Label label = null; TextField field = null; public void init() { Window mainWindow = new Window("Myvaadin Application"); VerticalLayout layout = (VerticalLayout) mainWindow.getContent(); Label h1 = new Label("<h1>Vaadin Sample</h1>",Label.CONTENT_XHTML); layout.addComponent(h1); label = new Label("こんにちは!"); layout.addComponent(label); HorizontalLayout formlayout = new HorizontalLayout(); formlayout.setSpacing(true); layout.addComponent(formlayout); field = new TextField(); formlayout.addComponent(field); Button button = new Button("クリック"); button.addListener( new Button.ClickListener() { public void buttonClick(Button.ClickEvent event) { Object s = field.getValue(); label.setValue(s); } } ); formlayout.addComponent(button); setMainWindow(mainWindow); } }