Apache Click 2.3.0がリリースされました

Apache Click 2.3.0がリリースされました。

今回も新機能・修正点が盛り沢山なので、リリースノートも半端ない量なのですが、気合いで翻訳してみました。
今回の目玉はなんといってもAjaxサポートでしょう。ページアクションもAjax専用というわけではありませんが、Ajaxを活用したアプリケーションで便利な機能だと思います。また、これまで(いろいろと問題が多く)実質的に使ってはいけない機能だったステートフルページが非推奨となり、代替手段としてStateful Controlがサポートされた点も大きいでしょう。タブ内のコントロールやテーブルの状態を保存するといった処理が手軽に実現できるようになります。
ClickIDEもClick 2.3.0への対応をしないといけないですね…。

大きな新機能

新しいドキュメント

新しいサンプル

  • サンプルAjaxサポートのショーケースを追加しました。サンプルの完全な一覧はAjax Menuを参照してください。
  • TabbedPanelにForm、Tableをどのように統合するかを示すサンプルを追加しました。
  • ステートフルなTabbedPanelのサンプルを追加しました。
  • FieldSeparatrorコントロールのサンプルと使用例を追加しました。

削除

  • JavaScriptからフォームを送信する場合の自動的なバリデーションのバイパス機能を削除。これは2.2.0で追加された新機能ですが、セキュリティ面での問題があるため2.3.0では削除されました。もし既存のアプリケーションでこの機能を使用している場合、安全な代替手段についてはアップグレードパスを参照してください。

非推奨

これまでのステートフルページには以下のような問題があります。

    • ステートフルページは複数のリクエストをまたがってページの状態を維持する手軽な手段です。しかしながら、ステートフルページの実装方法はステートレスなページクラスの実装方法と大きく異なり、これは統一性がなくメンテナンスしにくいアプリケーションを生み出す原因となっていました。
    • さらに、ステートフルページのサポートはこれまでフレームワークの内部において一貫したサポートが行われておらず、いくつかのコンポーネントは正しく動作していませんでした。
    • ステートフルページは粒度が粗く、どのオブジェクトがセッションに格納されるかをコントロールするのが難しいです。
    • ステートフルページはまた、フレームワークに不必要な複雑さ(それは段階的に廃止されます)を持ち込みました。

残念ながら、ステートフルページを使用したアプリケーションには直接的なアップグレードパスは存在しません。しかしながら、Table、Form、tabbedPanel、Field、AbstractLinkといった新しいコントロールにおけるステートフルサポートは大部分のユースケースを満たすでしょう。

新機能・修正点

  • Fieldはリクエストパラメータが送信された場合のみ処理されるようになりました。この改善はPOSTリクエストでFieldが追加される場合にそれらの値をバインドせず、バリデーションも行わないため、動的なフォームの実装を効率化します。その後のリクエストではFieldの入力パラメータが送信されるため、値はバインドされバリデーションも実行されます。また、動的に追加されるFieldの初期値は上書きされないという利点もあります。
  • GAEでのautomappingサポートを追加。ただしページテンプレートはpageもしくはpages配下に配置しなければなりません。
  • プラガブルなメッセージマップの実装をサポートするためのMessageMapServiceインターフェースを追加。
  • MessageMapを拡張・カスタマイズ可能なよう改善。
  • DateFieldの月と日の翻訳をJDKから取得するようにしました。
  • rolesが定義されていないMenuのサポートを追加しました。rolesが定義されていない場合、isUserInRolesメソッドはroleなしでのアクセスが許可されるかどうかを判断するためにhasAccessメソッドにnullの引数を渡します。
  • ポーランド語のサポートを追加しました。
  • name属性はFieldコントロールでのみ利用されるため、AbstractControlはではname属性をレンダリングしないように変更しました。
  • TableとSelectはonRendererイベント中にDataProviderを使用してデータを取得するように改善されました。この変更によってDataProviderがスローした例外をErrorPageで処理できるようになりました。
  • DateFieldはdate-format-patternをオンデマンドにロードするよう改善されました。この変更によってデフォルトのdate-format-patternをページクラスのプロパティファイルでオーバーライドできるようになりました。
  • click.xmlでページクラスの絶対クラス名で設定を行うことができるようになりました。絶対クラス名での指定にはIDEハイパーリンク機能が利用できるといった利点があります。
  • レンダリング時にID属性を除外するためにResourceElementにrenderIdプロパティが追加されました。
  • Locale.getISOCountries()を使用することでCountrySelectにより多くの国が含まれるようになりました。
  • コントロールのIDはピリオドの代わりにアンダースコアでレンダリングされるようになりました。
  • TabbedFormとCayenneTabbedFormのJavaScriptバリデーションが修正されました。
  • Ajaxサポートの一環としてコントロールの値と属性がXMLフレンドリーにエスケープするように修正されました。以前はすべてのHTML文字をエスケープしていましたが、現在は<、>、"、'、&のみエスケープするようになっています。
  • XML文字をエスケープするためのClickUtils.escape(String)が追加されました。
  • リクエストのエンコードが取得できない場合、ClickUtils.encodeUrlメソッドがデフォルトでUTF-8エンコードを行うようになりました。
  • ページヘッダをページクラスのコンストラクタからセットできるよう改善されました。
  • TableにセットされたControlLinkは親への参照を持たない問題が修正されました。
  • キャッシュされたMenuを複数スレッドからレンダリングした場合に発生するConcurrentModificationExceptionを修正しました。
  • キャッシュされたMenuの初期化処理が競合してしまう問題を修正しました。
  • Menuがセパレータをレンダリングしない問題を修正しました。
  • SubmitLinkはFormのnameではなくidを使用するように修正されました。
  • FormのJavaScriptバリデーションはフィールドのスタイル色を直接変更するのではなく、サーバサイドでのバリデーションと同様errorクラスを追加・削除するよう修正されました。
  • Context.createPageが重複したページ-クラスのマッピングを生成してしまう問題を修正しました。
  • AutoCompleteTextFieldが親ページに追加されない問題を修正しました。
  • Clickベースのアプリケーションをアンデプロイする際にメモリリークの可能性があるという問題を修正しました。
  • autobinding="default"と設定しておくと例外がスローされる問題を修正しました。
  • SelectがDataProviderから値がセットされた場合に初期値が設定されない問題を修正しました。
  • テーブルがソート可能な場合に不正なtitle属性を使用している問題を修正しました。
  • CayenneTemplateのジェネリクスCayenneのDataContextに従うよう修正されました。
  • 読み取り専用のCheckListはCheckboxにreadonly属性ではなくdisabled属性を付与するように修正されました。
  • XMLバリデーションエラーを引き起こすclick.dtdの#FIXED属性が削除されました。
  • Velocityを1.7にバージョンアップしました。
  • 次の依存JARをバージョンアップしました:log4j-1.2.16, freemarker-2.3.16, commons-codec-1.4, commons-lang-2.5
  • Velocity Tools 2.0 WebappResourceLoaderにバージョンアップしました。
  • EDU.oswego.cs.dl.util.concurrent.ConcurrentReaderHashMapをjava.util.concurrent.ConcurrentHashMapに置き換えました。
  • ognl.OgnlOpsの依存関係を取り除きました。