Wicket Examples - stockquote編 -

「サンプルのソースを見る」の第4回、stockquote編。このサンプルでは、

がなんとなくわかります(^_^;)。ただ、わたしの環境では動きませんでしたが... orz

アプリケーションクラス(StockQuoteApplication.java)

まずは、アプリケーションクラスです。こちらは、ホームページクラスを返しているだけなので、割愛します。

Pageクラス(StockQuotePage.java)

次に、Pageクラスです。このサンプルでは、

を作成し、使用しています。StockQuoteLabelの方は、"IBM"の株式情報(株価?)を取得するパターンと、テキストボックスに入力されたシンボルの株式情報を取得するパターンがあります。StockQuoteLabel2の方は、"IBM"取得するパターンだけになります。

コンポーネントクラス(StockQuoteLabel.java)

次に、コンポーネントクラスです。こちらは、WebComponentというクラスを拡張しています。

public class StockQuoteLabel extends WebComponent

コンストラクタは3つありますが、最終的に、1つ目はWebComponent(String)、2つ目3つ目はWebComponent(String, IModel)を呼んでいます。

	public StockQuoteLabel(String id)
	public StockQuoteLabel(String id, String symbol)
	public StockQuoteLabel(String id, IModel model)

このコンポーネントでは、Modelに設定されたシンボル("IBM"や入力された値)の値を取得、その値の株式情報をSOAPで取得し、コンポーネントの要素本体を取得した値でレンダリングします。その処理をしているのがこれ。

	protected void onComponentTagBody(final MarkupStream markupStream, final ComponentTag openTag)
	{
		String symbol = getModelObjectAsString();
		StockQuote quote = new StockQuote(symbol);
		replaceComponentTagBody(markupStream, openTag, quote.getQuote());
	}

まず、Modelに設定された値を「文字列として」取得します。

		String symbol = getModelObjectAsString();

ここで、コンストラクタで指定された文字列の値、あるいは、コンストラクタで指定されたModelに設定された値が取得できます。次に、株式情報をSOAPで取得するクラス(StockQuote)のインスタンスを生成します。

		StockQuote quote = new StockQuote(symbol);

最後に、SOAPで株式情報を取得し、取得した値でコンポーネントの要素本体をレンダリングします。

		replaceComponentTagBody(markupStream, openTag, quote.getQuote());

コンポーネントクラス(StockQuoteLabel2.java)

次に、コンポーネントクラスです。こちらは、おなじみのLabelコンポーネントを拡張しています。

public class StockQuoteLabel2 extends Label

コンストラクタは1つで、Label(String, IModel)を呼んでいるのですが、ここではAbstractReadOnlyModelというModelの無名クラスを作成して設定しています。

	public StockQuoteLabel2(String id, final String symbol)
	{
		super(id, new AbstractReadOnlyModel()
		{
			public Object getObject(Component component)
			{
				final StockQuote quote = new StockQuote(symbol);
				return quote.getQuote();
			}
		});
	}

ここでは、Modelに設定された値を取得するメソッドである、getObjectをオーバーライドしています。取得したい内容は、シンボルに対応する株式情報ですので、StockQuoteLabel#onComponentTagBodyと同様にして株式情報を取得し、戻り値として返しています。

ユーティリティクラス(StockQuote.java)

次は、シンボルに対応する株式情報を取得するクラスです。このクラスはPOJOになっています。

public class StockQuote
{

内容は割愛しますが、やっていることは、

  • コンストラクタで指定されたシンボルを元に、リクエスト用のSOAPメッセージを作成
  • リクエスト用のSOAPメッセージを送信
  • レスポンス用のSOAPメッセージを受信
  • レスポンス用のSOAPメッセージから株価情報を取得

になります。

HTMLテンプレートファイル(StockQuotePage.html)

最後に、HTMLテンプレートファイルです。自作のコンポーネントを使用するわけですが、こんな風に使っています。

    	IBM stockquote (example 1): <span wicket:id="stockIBM">1.23</span>

    	<form wicket:id="form">
    		Type symbol: <input wicket:id="symbol" type="text" />
    		<input type="submit" />
    	</form>
    		Stock quote of <span wicket:id="symbol">symbol</span> is <span wicket:id="quote">quote</span>.

普通のLabelコンポーネントと同様に、wicket:id属性を持つspan要素の要素本体がレンダリングされます。wicket:id属性が"symbol"のTextField, Labelコンポーネントと、wicket:id属性が"quote"のStockQuoteLabelコンポーネントに、Pageクラスで同じModelが指定されていますので、テキストフィールドに入力された値が、LabelコンポーネントとStockQuoteLabelコンポーネントで使用されます。前者では入力された値を使ってそのままレンダリングし、後者ではその値をもとに株式情報を取得し、取得した株式情報を使ってレンダリングします。