45
次世代 ウェブフレームワーク の幕開け ~ステートフルはじめました 君が僕を望むなら僕は君を忘れない~ Yoshiori SHOJI

次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

Embed Size (px)

Citation preview

Page 1: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

次世代 ウェブフレームワーク

の幕開け~ステートフルはじめました

君が僕を望むなら僕は君を忘れない~

Yoshiori SHOJI

Page 2: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

自己紹介

Page 3: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

自己紹介

•庄司 嘉織

• http://yoshiori.org/

• mailto:[email protected]

• java-ja やってます

Page 4: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

注意このプレゼンに登場する

ステートフルなフレームワークは現在流行中の RESTful と

競合したり、敵対するのもではありません誤った認識でみてしまうと

本質を見落としてしまいがちになりますのでご注意ください。

Page 5: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

ステートって何?

Page 6: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

ステート = 状態

http://rest.blueoxen.net/cgi-bin/wiki.pl?RestFaq#nid5EC

A: 電話番号教えて

B: あんた誰?

A: ちょw 古い友達のフランクだよ!!

B: あ、そか、俺の番号は…

stateful

A: 電話番号教えて

B: あんた誰?

A: 古い友達のフランクだけど電話番号教えて

B: 俺の番号は…

stateless

Page 7: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

HTTP プロトコル

Page 8: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

HTTP プロトコル•プロトコルレベルではステートレス

•クライアント側との連携で擬似的に接続状態の維持をしている

•誤解を恐れずに言えば「プロトコルレベルではステートレスだけど実質的にはステートフル」とも言える

Page 9: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

すごくシンプルな例

ブラウザの戻る,進む

Page 10: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

クライアント側(ブラウザに限らず)は様々な情報を使ってサーバと状態のやりとりをする

Page 11: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

•cookie• 値を直接 cookie に

• サーバ側との一意なキー(実際の値はサーバ側で持っている)

•GET パラメータ

•POST パラメータ

•ヘッダ

Page 12: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

アプリケーション

Page 13: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

アプリケーション•ステートレスな処理もあればステートフルな処理もある

•ステートレスだけで済ませられればそれにこしたことは無い

•しかしステートレスだけで処理しようとすると問題もある

Page 14: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

よくある例

入力画面 確認画面 完了画面

入力画面で入力されたものを

ここまで持っていなければいけない

Page 15: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

今までのフレームワーク

Page 16: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

今までのフレームワーク•基本的にはプロトコルに準拠

•プロトコルレベルを薄くラップしてステートフルを実現

• session に値を保存

•もしくは hidden や GET パラメータなど

Page 17: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

フレームワーク

HTTP プロトコル

ステートレス

アプリケーション

ステートフル

フレームワーク

Page 18: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

簡単にいうと

•HTTP プロトコルはステートレス

•Web アプリケーションはステートを持つ必要がある

• session への保持や破棄は本来のロジック記述には不必要な作業

Page 19: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

ん?どこかで聞いたことのあるような台詞?

メモリ管理や GC などで散々議論されてきた話題とにていませんか?

Page 20: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

セキュリティ

Page 21: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

•cookie• 値を直接 cookie に

• サーバ側との一意なキー(実際の値はサーバ側で持っている)

•GET パラメータ

•POST パラメータ

•ヘッダ

クライアントに値を返してる

Page 22: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

入力画面 確認画面 完了画面

validate必要 validate必要

クライアントに値を返すと

ちょっとでもミスをすると……

こんにちは!こんにちは! こんにちは!

こんにちは!こんにちは!こんにちは!

こんにちは!こんにちは!

こんにちは!こんにちは!

こんにちは!こんにちは!

こんにちは!こんにちは!

こんにちは!こんにちは!

こんにちは!こんにちは!

こんにちは!こんにちは!

こんにちは!こんにちは!

こんにちは!こんにちは!

こんにちは!こんにちは!

表示画像と内容には一切関係はありません

Page 23: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

その他にも

Page 24: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

様々な問題の解決

•戻るボタン対策

•ダブルサブミット

•マルチウインドウ対策

• F5(更新)連打対策

Page 25: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

ステートフルなwebアプリケーションフレームワークは

開発者がビジネスロジックに

注力できる

Page 26: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

JBoss Seam

Page 27: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

JBoss Seam とは?•JBoss SeamはJBossによって開発された初めての Webアプリケーションフレームワークである

• JSR-299:WebBeans(2)

• Specification Lead Gavin King  JBoss, Inc.

Page 28: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~
Page 29: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~
Page 30: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

Seam は Glue(糊)

•JSF - View と Controller

•EJB3 - Model

Page 31: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

@Stateful @Name("hello") @Scope(CONVERSATION) public class HelloAction implements Hello,Serializable{ @In private User user; @Begin public String imput() { // ... return "success"; } @End public String save() { // ... return "success"; }}

Page 32: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

Wicket

Page 33: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

Wicket とは?

•Swing ライクなコーディング

• View と Controller

• コンポーネント

• (X)HTML と Java だけで簡潔

Page 34: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

public class ExamplePage extends WebPage { private static final long serialVersionUID = 1L; private String labelText;

public ExamplePage() { Form form = new Form("form"); form.add( new TextField("field", new PropertyModel(this,"labelText"))); form.add(new Button("nextButton") { private static final long serialVersionUID = 1L; protected void onSubmit() { setResponsePage(new NextPage(ExamplePage.this)); } }); super.add(form); } // ... }

Page 35: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

コスト

Page 36: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

session使いまくっていいの?

Page 37: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

すぐに移行すべきか

Page 38: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

Struts Ruby on Rails枯れた技術の集合

Page 39: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

ステートフルなフレームワークを

抽象的に理解することこそが

大事

Page 40: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

最後に

Page 41: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

今年のデブサミのテーマ「コードで世界を変える」

Page 42: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

「誰か」という人は存在しない

Page 43: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

みんなで変えていこう!

Page 44: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

• blog とかで何でもいいから発信を!

•ただ文句を言うだけでなくどうしたいかを!

•どんどん発表しよう!!Java-ja1000Speakers

Page 45: 次世代ウェブフレームワークの幕開け ~ステートフルはじめました/君が僕を望むなら僕は君を忘れない~

ご静聴ありがとうございました