アンケートご協力のお願いgihyo.jpでは,2010年度に向けて豪華プレゼントが当たる読者属性アンケートを実施しております。ご協力ください。

gihyo.jp » DEVELOPER STAGE » 特集 » Wicketで始めるオブジェクト指向ウェブ開発 » 第4回 WicketでTwitterアプリケーションを作る(後編)

Wicketで始めるオブジェクト指向ウェブ開発

第4回 WicketでTwitterアプリケーションを作る(後編)

前回までに,サブミットの受け付け方法が分かりましたので,実際にonSubmit()を実装してTwitterにログインする処理を記述したいところです。ですが,サンプルプログラムのコードを理解するには,Wicketにおけるユーザセッションの取り扱いについて理解する必要があります。

そこで今回は,このユーザセッションの取り扱いについて解説します。

ユーザセッションにアクセスする

サーブレットでプログラムを作るとき,ユーザごとに用意されるデータ格納領域としてHttpSessionオブジェクトを使用することができました。Wicketでも,同様の仕組みがあります。

とはいえ,Wicketではページ自身がフィールドを持つことができ,Wicketがページの状態を保存してくれます。あるページオブジェクトはユーザ固有のもので,同じページクラスから作られたページでも,ユーザが異なれば,別のオブジェクトが割り当てられます。このようなページの割り当てと保存は,Wicketが裏側で行います。

この仕組みがあるために,サーブレットに比べて,ユーザセッションの用途は限られています(必要な情報はページ自身に持てばよいのですから)。

しかしながら,アプリケーションにはページ内で完結する情報と,複数のページにまたがって,ユーザがログインしている間はずっと使いたい情報とがあります。後者の情報を扱うには,HttpSessionのような機能は便利です。

Wicketのユーザセッションは,Sessionクラスのサブクラスとして作成します。このサブクラスには,プログラマが自由にメソッドやフィールドを追加できます。サーブレットのHttpSessionはただ使うことができるだけで,情報の保存・取得はsetAttribute(),getAttribute()メソッドで行いました。どんな情報であれ,これらのメソッドで保存・取得していたため,アプリケーション全体でHttpSessionにどのような情報を格納しているのかを調べることは大変でした。

Wicketでは独自のSessionサブクラスに,自由にメソッドを追加できます。自分で作ったサブクラスを一瞥すれば,アプリケーション全体でSessionにどのような情報が保存されているのか,一目瞭然です。また,メソッドを定義することで,データの出し入れがJavaらしい型安全性を持つことになります。

独自のセッションクラスを設定する

サンプルプログラムでは「jp.gihyo.wicket.AppSession」という,Sessionクラスのサブクラスを用意しています。この独自のサブクラスをWicketに使わせる設定を行う必要があります。

Wicketでは,この設定もプログラムで行います。jp.gihyo.wicket.WicketApplicationクラス内に,次のメソッドを記述しています。

リスト1 newSessionメソッドのオーバーライド

@Override
public Session newSession(Request request, Response response) {
  return new AppSession(request);
}

WicketApplicationクラスは,今回のサンプルアプリケーションにおけるWebApplicationサブクラスです(※1)。WebApplicationクラスについては,第1回でもご紹介しました。

Wicketはユーザセッションをはじめて使用する時に,WebApplicationクラスのnewSession()メソッドを呼び出すことで,セッションオブジェクトを作成します。newSession()メソッドをオーバーライドすることで,独自のSessionサブクラスを生成することができます。

※1
Wicketが使用するWebApplicationクラスの指定は,web.xmlファイルにて行われています。Wicketが使用する,唯一のXML定義がWebApplicationクラスの指定です。

ログイン状態を保存する

ユーザがTwitterにログインできた場合,その状態はページをまたがって維持されるでしょう。そのため,Twitterへのログイン処理は,AppSessionクラスにプログラムします。HttpSessionと違って,ユーザセッションにメソッドを定義できる利点を生かします。

ユーザがログイン成功すると,twitter4jのTwitterオブジェクトをユーザセッション内に保存し,いつでもAppSessionから取り出せるようにします。次のコードがログイン処理です。

リスト2 Twitterオブジェクトの作成とログインチェック

private Twitter twitterSession;
private User twitterUser;
private String lastUnauthorizedMessage;

(中略)

public boolean login(String userName, String password) {
  Twitter client = new TwitterClient(userName, password);
  try {
    User user = client.verifyCredentials();
    if(user != null) {
      twitterUser = user;
      twitterSession = client;
      return true;
    }
  } catch (TwitterException ex) {
    if(ex.getStatusCode() == HttpServletResponse.SC_UNAUTHORIZED) {
      lastUnauthorizedMessage = ex.getMessage();
      return false;
    }
  }
  return false;
}

Twitterクラスは,今回Twitterにアクセスするために使うtwitter4jが用意しているクラスです。このオブジェクトを介して,Twitterのステータス情報を取得できます。

ここでは,Twitterクラスの代わりにTwitterクラスを独自にサブクラス化したTwitterClientクラス(完全修飾クラス名はjp.gihyo.wicket.TwitterClient)を生成しています。本記事の執筆段階ではtwitter4jのTwitterクラスにはシリアライズに関するバグがあり,セッションがシリアライズされた場合に正しく復元されません。TwitterClientクラスはそのバグを回避するために今回用意したサブクラスです。正しくシリアライズから復元できるようにしたこと以外には、もとのTwitterクラスと機能上の違いはありません。

Twitterへのログインチェックは,TwitterオブジェクトのverifyCredentials()メソッドで行います。ユーザ名とパスワードが正しければ,Userオブジェクトが返されます。逆にログインに失敗すれば,TwitterExceptionがスローされます。

login()メソッドはUserオブジェクトを取得できればログイン成功と見なしてtrueを返します。逆に,TwitterExceptionがスローされればログイン失敗と見なしてfalseを返します。

ポイントとして,ログイン成功時にも失敗時にも,生成された情報をAppSessionのフィールドに保存していることです。成功すればUserオブジェクトを保存しますし,失敗すれば失敗理由を保存します。

AppSessionには,保存された情報にアクセスするためのメソッドも用意されています。

お仕着せのHttpSessionをただ使うだけでなく,独自のオブジェクトとして作ることができることで,ユーザセッションのイメージがサーブレットから大きく変わっていることが分かるでしょうか。Wicketでは,ユーザセッションはHttpSessionのような,ただの入れ物ではありません。ユーザセッションはオブジェクトです。それはプログラム可能であり,メソッドを持つことができ,メソッド呼び出しによって状態が変化するのです。

著者プロフィール

矢野勉(やのつとむ)

フリーランスのプログラマ。Wicket-ja主催。

ウェブ・アプリケーションの開発を中心にさまざまな案件に関わってきました。現在はWicketによる開発を支援しています。

URLhttp://d.hatena.ne.jp/t_yano/

著書

  • オープンソース徹底活用 WicketによるWebアプリケーション開発

    オープンソース徹底活用 WicketによるWebアプリケーション開発(秀和システム)

コメント

コメントの記入

パスサポ

多数の情報処理技術者試験対策書籍の発行実績を誇る技術評論社がお届けする,資格試験合格サイト「めざせ! 情報処理試験 パスサポ」が開設されました。

ピックアップ

サクセスストーリーに続く,快適サーバー運用管理のヒント!

データの増大,煩雑な管理,システムダウン,セキュリティなど,迫りくる課題からシステム管理者の負担を軽くするポイントを解説します。

gihyo.jp インフラエンジニア情報局

ネットワークやITにかかわるあらゆる業種で必要とされるインフラエンジニアに向けた技術情報や心構え,その魅力について多角的に紹介。

テストエンジニア ステーション

いま,ITに関わるあらゆる開発業務で注目されつつあるテスト系エンジニアをターゲットにしたコンテンツサイトを展開します。

一行クイックアンケート

gihyo.jpで取り上げてほしいネタは?

※検索はページ右上の検索ボックスをご利用ください。

その他の連載

キーパーソンが見るWeb業界

本連載はWeb Site Expert/gihyo.jpとの連動企画です。阿部淳也, 長谷川敦士, 森田雄のお三方による,Web業界をテーマにした座談会です。

きたみりゅうじの聞かせて珍プレー

ソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。みなさんからの投稿もお待ちしてます!

ActionScript 3.0で始めるオブジェクト指向スクリプティング

野中文雄氏が,簡単なスクリプトは書いたことがあるという初級者を対象に,ActionScript 3.0の基本からクラス定義までを解説します。

まだ間に合う「ITパスポート」受験対策 原山先生の短期合格塾

この連載では,4月18日のITパスポート試験の受験に向けて,短い期間で効率良く受験対策を行う方法や,確実に得点するための裏ワザなどを伝授していきます。

Ubuntu Weekly Recipe

Ubuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。

C/C++プログラマのためのDTrace入門

よくカーネルのチューニングや解析で活用されるDTraceですが,実はユーザプログラムの開発においても非常に有用です。連載ではC/C++プログラマやテストに関わる方向けにDTraceの使い方を解説します。

Blogopolisから学ぶ計算幾何

計算幾何学は,図形に関するアルゴリズムを研究するコンピュータサイエンスの一分野です。本連載では,ビジュアルブログ検索エンジン「Blogopolis」で採用されている計算幾何のアプローチを例に取り上げながら,計算幾何の初歩を実践的に学習します。

検索エンジンはいかにして動くのか?

本連載では, 今や誰もが利用している検索エンジンの中身を,全体の仕組みやデータ構造,アルゴリズムから分散インデックスまで,最近の研究事例も交えて紹介します。

連載一覧

gihyo.jp

  • DEVELOPER STAGE
  • ADMINISTRATOR STAGE
  • WEB+DESIGN STAGE
  • LIFESTYLE STAGE
  • SCIENCE STAGE
  • NEWS & REPORT

書籍案内

  • 新刊書籍
  • 書籍ジャンル一覧
  • 書籍シリーズ一覧
  • 新刊ピックアップ
  • ロングセラー
  • 電脳会議

定期刊行物一覧

  • Software Design
  • WEB+DB PRESS
  • Web Site Expert
  • 組込みプレス