SeamアプリでGETリクエストとPOSTリクエストとの適切な使い分けに関する注意点

画面遷移定義におけるJSFとSeamの思想の違いについてで述べた様に、Seamでは標準のJSF1.2と比較してGETリクエストのサポートが充実しています。つまり、JSFではGETで単純に画面を開くことしかできないのに対して、Seamの場合タグを使うことで、アクションを呼び出したり、会話を開始したり、さまざまな処理が可能となっています。通常のJSFのPOSTバックと比較して、これらのSeam固有のタグ*1を利用したGETリクエストのメリットとして

  • (リンクの場合)右クリックして別タブや別ウィンドウで内容を開ける
  • リンク先のURLがブックマーク可能となる
  • タグの外部で自由に使える

などがあります。
ただし、GETリクエストを濫用しないよう注意が必要です。特にGETリクエストはサーバー側の永続的な状態を更新するような操作で使うべきではありません。Seamの場合はステーフルなコンテキストを持つため、時々ちょっと迷うときもあるのですが、基本的にはGETリクエストは冪等な(idempotentな)操作に限定すべきで、少なくともともDBの状態を書き換えるとかショッピングカートのような非永続であってもアプリケーションの動作に重大な影響を与える状態を書き換えるような操作はPOSTで行うべきです。RESTの規約ということもありますが、このような操作をGETで行うとブックマークや検索エンジンクローラーなどに悪い影響が出ます。Seamタグを使うと意図せずこうした不適切な更新処理を簡単に実行できてしまうため要注意だと思います。(以前、 @DataModel/@DataModelSelectionを使った一覧選択機能の実装はアンチパターンか?で書いたこととちょっと矛盾するようですが、カートの商品の選択とかグリッドの行の直接削除リンクなどはGETで実装すべきでなく、@DataModelSelectionかパラメーター付きアクションメソッドバインディングを使うべきところです。)
あと、タグの制約としてAjax4jsfを使ったAjax化ができないということがあります。Ajax4jsfによるAjaxリクエストは基本的にPOSTバック処理となるようです。
http://seamframework.org/Community/AJAXSupportForSlink

*1:JSF2.0ではタグという標準タグがあり一部Seamの機能が取り入れられている。