tyoshikawa1106のブログ

- Force.com Developer Blog -

Force.com Webinar : アドバンスドVisualforce

Force.com Webinar : アドバンスドVisualforce見ました。
View Stateの管理方法について勉強になりました。

Force.com Webinar : アドバンスドVisualforce

http://www.youtube.com/watch?v=6fkBFcfwqTQ&feature=youtu.be

View Stateとは

Apexコントローラの状態やVisualforceページの状態をサーバリクエスト間も保持するための、Visualforceページ内に暗号化されたhiddenのinputフィールドのこと。このフィールドはapex:formタグがページ上にある場合のみ生成される。

View State:利点と課題

利点

  • 自動的にフィールドの値を保持してくれる
  • 簡単なAJAX機能を持ち合わせている(actionfuctionやrerender)
  • 非常に簡単に使えるre-renderページコンポーネントを持つ

課題

  • 巨大化し、パフォーマンスに影響を与える可能性
  • サイズ制限(135k)も持っている
  • 複雑なJAX機能に対応しづらい

View Stateを必要とするもの

主にapex:form内に記載する必要があるもの。
例)
apex:action*
apex:command*
apex:inlineEditSupport
apex:input*
apex:select*

View Stateの確認方法

ユーザの編集画面で設定可
①開発者モードにチェック
②開発者モードにビューステートを表示にチェック

View Stateの管理

管理方法

A.コンポーネントの数を減らす
B.transientキーワードを利用する
C.JavaScript Remotingを利用する
D.Sreaming APIを利用する。

A.コンポーネントの数を減らす

apexタグはHTMLタグに自動変換される。
apexタグでなくHTMLタグで直接記載すると変換する手間がなくなり、パフォーマンスが向上する。

※補足
apexタグはXSSなどの脆弱性に対して保護されているので、パフォーマンス的な問題がなければapexタグを利用した方がいいと思います。

Apex 開発および Visualforce 開発のセキュリティのヒント

https://login.salesforce.com/help/doc/ja/review_and_certification.htm

B.transientキーワードを利用する

transientキーワードを付けるとその変数はView Stateに値を保持しなくなる。
ページ間で値を保持したりしなくなる。
例)

transient public Account objAccount {get; set;}
transient public List<Account> objAccounts {get; set;}
transient public Set<String> hashTags {get; set;}

C.JavaScript Remotingを利用する

JavaScript RemotingとはステートレスにApexコントローラ内のMethodをJavascriptから呼ぶ方法。

ページ遷移がなく結果だけが同じページに出る場合は主にapex:actionFunctionを使用している。
JavaScript Remotingは自分でコールバックする必要があるが、actionFuntionに比べに早い。

※注意
@RemoteActionはpublic static メソッドでのみ使用できる。
ステートの管理や値の管理もJavascript内である程度ハンドリングする必要がある。
パフォーマンスが良くなる分、自分で管理する手間も増える。
使い分けが重要。

D.Sreaming APIを利用する。

Sreaming APIとはSalseforceインスタンスからポーリングをせずにほぼリアルタイムに更新を取得できる方法。
(ポーリング→ブラウザのリロード)

apex:actionPollerだとリクエストを投げる回数が増える。
Sreaming APIの方が効率よく更新できる。