サーブレットからテキストを取得しPanelに表示
では、前ページのサーブレットにアクセスしてテキストを取得し、Panelに表示させてみることにしましょう。MyvaadinApplicationクラスを次のように書き直してください(なお、ここではサーブレットのアドレスをアプリケーションと同階層の./dataにしてあります)。
package com.example.myvaadin;
import java.io.*;
import java.net.*;
import com.vaadin.Application;
import com.vaadin.ui.*;
public class MyvaadinApplication extends Application {
Window mainWindow = null;
@Override
public void init() {
Window mainWindow = new Window("Myvaadin Application");
setMainWindow(mainWindow);
VerticalLayout layout = (VerticalLayout) mainWindow.getContent();
layout.setMargin(true);
layout.setSpacing(true);
Panel panel = new Panel("※これがパネルです。");
panel.setWidth("300px");
panel.setHeight("200px");
VerticalLayout playout = (VerticalLayout) panel.getContent();
playout.setMargin(true);
playout.setSpacing(true);
layout.addComponent(panel);
String s = getData(this.getURL() + "/data");
Label label = new Label(s, Label.CONTENT_XHTML);
playout.addComponent(label);
}
String getData(String address){
String data;
data = "";
BufferedReader breader = null;
try {
URL url = new URL(address);
URLConnection con = url.openConnection();
con.setDoInput(true);
con.setDoOutput(false);
InputStreamReader reader = new InputStreamReader(con.getInputStream());
breader = new BufferedReader(reader);
while(true){
String s = breader.readLine();
if (s == null) break;
data += s;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
breader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return data;
}
}

ここでは、getDataメソッドで、引数に指定したアドレスにアクセスをし、テキストを取得しています。URLインスタンスを作成し、そこからURLConnectionを取得、getInputStreamでストリームを用意してテキストを受け取っています。特にVaadinならではという処理はなく、ごく一般的なサーバーサイドでの処理であることが分かるでしょう。
テーブルの表示
サーブレットにアクセスしてからテキストを取得する手法は、あまりスマートな方法とは言えません。では、Vaadinではサーバーサイドから必要なデータを取得するような仕組みは考えられていないのでしょうか。いいえ、単純なテキストデータなどの取得はあまり考えられていませんが、多量のデータを表示するためのコンポーネントなどでは、外部からデータを取得して表示するための仕組みがちゃんと備わっています。
例として、「Table」コンポーネントを使ってみましょう。Tableは、テーブルを表示するためのコンポーネントです。これは次のような形でデータを表示します。
public void init() {
Window mainWindow = new Window("Myvaadin Application");
setMainWindow(mainWindow);
VerticalLayout layout = (VerticalLayout) mainWindow.getContent();
layout.setMargin(true);
layout.setSpacing(true);
Table table = new Table("※テーブル");
table.addContainerProperty("地名",String.class,null);
table.addContainerProperty("前期売上",Integer.class,null);
table.addContainerProperty("後期売上",Integer.class,null);
table.addItem(new Object[]{"東京",12300,45600},1);
table.addItem(new Object[]{"大阪",9870,32100},2);
table.addItem(new Object[]{"名古屋",4560,23400},3);
table.setWidth("300px");
table.setHeight("100px");
layout.addComponent(table);
}

Tableは、「addItem」で組み込んだデータを一覧表示します。addContainerPropertyで列データを追加し、それからaddItemで表示する行データをObject配列として追加していきます。作成されたテーブルは、ヘッダー部分をクリックしてデータをソートできたり、各列の幅をマウスでドラッグして調整するなど、基本的な機能は最初から備わっています。
このTableのようなコンポーネントは、多量のデータを表示したり、必要に応じてダイナミックにサーバからデータを取得したりすることが多いものです。ソースコードにaddItemをずらっと書いて表示を作るという方法はあまりよくありません。もっとスマートにサーバからデータを取得する方法が必要です。
