Frequently Asked Questions
- 助けてください。
- 商用サポートは?
- 開発用のツールは?
- Clickのコントロールが全てを生成するなら、GUIデザイナーはどうやってHTMLを触るのでしょうか?
- 同じHTMLテンプレートを使ったページをたくさん作りたいのですが。
- コントロールのリスナーがboolean値を返さなければいけないのは何故?
- フォームから外したいフィールドがあるのですが。
- ページやコントロールの国際化はどうすれば?
- ページで UTF-8を使うには?|
- アプリケーションで使用するキャラクターセットを指定するには?
- 二重ポストを防止するには?
- 拡張子htmlのClickページを使いたいのですが。
- 拡張子htm以外のURLにマッピングすることはできますか?
- ClickでCayenneを使うときに必要となるJARは?
- SpringをClickで使うには?
- ClickはJSPをサポートしていますか?
- Clickのパフォーマンスはどの程度ですか?
- Clickのページのユニットテストはどうやればよいのでしょう?
- ClickはどうしてロギングにCommons LoggingやLog4jを使っていないのですか?
- 出力部分でFreeMarker使っていないのは何故?
- 何故新しいWebアプリケーションフレームワークを開発したのですか?
助けてください。
まずはClickのドキュメントやExamplesを確認してみてください。それでもダメというときには、メーリングリストがあります。Clickプロジェクトにはclick-userとclick-developmentの2つのメーリングリストがあり、ここで質問することができます。これらのメーリングリストは、無料であり、フレンドリーで、たいていの場合迅速な返答が期待できます。
多くのユーザー/開発者がいくつもの質問を投げ、いろんなアイデアについて話し合っています。かなりオススメです。恥ずかしがらずに参加してみてはいかがでしょうか?
以下のリンクの先で、メーリングリスト参加の手続きができます。
- click-user - for Click usage discussions and help
- click-development - for Click framework development discussions
商用サポートは?
もしも商用サポート(Commercial Support)が必要でしたり、Clickのトレーニングを受けたい場合には、Avoka Technologiesです。
詳しいことはMalcolm Edgarまでemailで連絡を取ってください。
開発用のツールは?
以下オススメのClick開発用ツールです。
- - ClickIDE
- ClickIDEは Naoki Takezoeが開発した EclipseのWeb Tools Project(WTP) プラグインです。ClickIDEで、「Dynamic Web Project」を作成し、「Click」プロジェクトファセットを選択してください。
- - NBClick
- NBClickは、Geertjan WielengaとAhmed Mohombeによって開発中のNetBeans用プラグインです。
- - Velocitywebedit
- Velocitywebedit は、VelocityとHTML編集に使うEclipse用プラグインです。Velocity Web Editをインストール後、Eclicpseの設定を変更し、*.htmをVelocityEditorを使うようにしてください。設定は、メニューの「Window」→「Preferences」→「General」→「File Associations」です。
- - Veloeclipse
- Velocity and HTML Editor plugin for Eclipse
- - Veloedit
- Velocity and HTML Editor plugin for Eclipse
Clickのコントロールが全てを生成するなら、GUIデザイナーはどうやってHTMLを触るのでしょうか?
Clickは手動でのHTML作成を妨げることはありません。コントロールのHTML化を自動的に行う手段のひとつを提供しているだけなのです。
HTMLを生成するのにいくつかのアプローチがあり、それぞれに長所、短所があります。ここではそれを順にみていきます。
1.必要なHTMLを全部Clickのフォームとコントロールで済ます
これはいわゆる80/20のアプローチで、この方法を取れば迅速に開発をこなすことができますが、おそらくUI要求を全て満たすことはないでしょう。
もちろん、各種フォームコントロールには多くの自動レイアウトオプションがあります。この点に関してはclick-examplesの「Form Properties」をごらんになってください。
フォームコントロールは、きめ細かなCSSの制御によってHTML要素内の「form」「fields」「errors」「buttons」などの属性を出力します。
フィールド間の垂直間隔を変更するようなフォームを考えます。この場合、フォームの前にCSSのstyleを定義しておくのが一番簡単でしょう。
フィールドは、個々のフィールドが操作できるよう、「id」属性を持って出力されます。
2.HTML出力を調整するためにClickのFormやControlのサブクラスを作る
これは、Webアプリケーション内で共通のlook&feelを取りたいときに有効なアプローチです。ただしこれはがんばってコードを書くことになります。
3.Panelコントロールを使う
PanelコントロールはVelocityテンプレートをサポートしており、多くのページに含まれるような再利用可能なHTML部分を作成する理想的な手段のひとつです。Panelは、コントロールのネストにも対応しており、Panel上のコントロールの動作も問題ありません。
4.Verocityマクロを使う
これは、Webアプリケーション内での再利用を可能にする容易な手段です。
フォーム用のVelocityマクロの例をチェックしてみてください。また、click-examplesの「Velocity Macro」も要チェックです。
5.手でHTMLのレイアウトをする
表示することに関しては多分究極の手段です。ですが再利用性は全然無くなるでしょう。フォームの手動レイアウトの例を参照してください。
同じHTMLテンプレートを使ったページをたくさん作りたいのですが。
ページテンプレートの詳細については、こちら。
ページテンプレートの利用は、以下を含む多くのメリットがあるため、激しく推奨されています。
- メンテナンスの必要なHTMLがものすごく減る
- 共通のlook&feelが保障される
- テストしなければいけないコードが減るので、頑丈なアプリケーションになる
実際どんなものかは、click-examplesを動かして確認してください。
コントロールのリスナーがboolean値を返さなければいけないのは何故?
コントロールのリスナーは、処理を続けるかを示すboolean値を返さなければなりません。
処理を続けるためには、リスナーはtrueを返さなければいけませんし、停止するためにはfalseを返しすことになります。
途中で処理を停止する理由は、別のページへの直接遷移が可能になるからです。これは処理を継続することで時間を無駄にすることになってしまうことを回避します。この特徴を、breakやgotoステートメントのように使うことができます。
例:
詳細に関しては、Page Navigationの項目を参照してください。
フォームから外したいフィールドがあるのですが。
フォームに表示されているフィールドを除外するには、Form.removeFields()メソッドを使用します。これはページテンプレートの中でも利用可能です。Just make sure you call you call it before $form renders itself.
ページやコントロールの国際化はどうすれば?
Click はアプリケーションのローカライゼーション/国際化(I18N)に対するサポートが充実しています。
Page Messages
Pageクラスは、getMessage(String)メソッドを利用することで、ローカライズされた文字列を扱うことができます。Loginクラスというクラスパス上に3つのプロパティファイルを持つページがあるとします。
/com/mycorp/pages/Login.properties /com/mycorp/pages/Login_en.properties /com/mycorp/pages/Login_fr.properties
このLoginクラスの中で、getMessage() メソッドを使い、ローカライズされた文字列を取出すことができます。
そしてページテンプレート上でMessagesMapオブジェクトを利用してテンプレートにmessagesという名前で追加された文字列を利用できます。
また、FiledとActionLinkのラベルやタイトルの値などをページのプロパティファイル内に定義することができます。この際コントロール名から規約により属性値を取得します。このあたりの詳細に関しては以下のjavadocを参照してください。
Field Messages
Fileldコントロールは、以下のプロパティファイルを共用します。
/click-control.properties
フィールドのクラスは、いくつものgetMessage(String)を提供します。これは、ローカライズされた文字列とその整形をサポートするものです。コントロールに関する Message Propertiesの項目も参照してください。
ページでUTF-8を使うには?
ページをUTF-8でエンコードするには、WEB-INF/velocity.properties を作成し、以下のようにします。
これで、VerocityがUTF-8を使用するようになります。
また、ページのContent-TypeをUTF-8にする必要があります。アプリケーション内のページ全てでこれを適用するにはWEB-INF/click.xmlのheaders要素を利用します。
こうしておけば、ページのHttpServletResponseのContent-Typeは"text/html;charset=UTF-8"となります。また別の方法として、PageのgetContentType()をオーバーライドするという手もあります。
アプリケーションで使用するキャラクターセットを指定するには?
アプリケーションで使用するキャラクターセットは、WEB-INF/click.xmで指定することができます。
ここで指定しているキャラクターセットは、Velocityのinput encodingに使用され、レスポンスのContent-Typeとなります。ですので、 WEB-INF/click.xmでキャラクターセットを指定しているのなら、WEB-INF/velocity.propertiesを作成して指定する必要はありません。
ただVelocityテンプレートのなかでclick.xmlで指定したキャラクターセットとは別のものを利用したい場合には、WEB-INF/velocity.propertiesで背体を上書きしてください。このケースに関しては1つ前の節を参照してください。
二重ポストを防止するには?
Post Redirect Getパターンを使うことで、二重ポストを防ぐことができます。このパターンを使うことで、ユーザーが一度ポストすると別のページへリダイレクトされます。もしユーザーがrefreshボタンを押しても、そのリダイレクトされたページへのGETリクエストが発行されます。
この件に関するより詳しい情報に関しては「Redirect After Post」を参考にしてください。
ブラウザの戻るボタンを使ってフォームに対し再度送信を行うことを防ぐためには、FormのonSubmitCheck()メソッドを使います。
Post-Redirectや送信チェックに関しては、Click Examplesの「Page Flow」を参考にしてください。
拡張子htmlのClickページを使いたいのですが。
Clickは*.htmlファイルをClickページとして扱うことができません。これらのファイルはClickServletとして処理されることはなく、静的なWebページとして使うことにしています。
拡張子htm以外のURLにマッピングすることはできますか?
現在のところClickは*.htm拡張子のみサポートしています。別の拡張子を使用したテンプレートは作ることが出来ません。(例えば*.xmlなど)
その代わり、Url Rewrite Filterを利用してhtm以外の拡張子とのマッピングすることが出来ます。RESTのようなURLに書き換えることが可能です。
- http://www.mycorp.com/book.htm?id=324 を http://www.mycorp.com/book/324 に書き換える(idが324の本を検索)
- http://www.mycorp.com/books.htm を http://www.mycorp.com/booksに書き換える(本の一覧検索)
ClickでCayenneを使うときに必要となるJARは?
Cayenneを利用して幸せになるには、以下のJARがWEB-INF/libに必要です。
- ashwood-1.1.jar
- cayenne-nodeps-1.2.jar
- click-xx.jar
- click-extras-xx.jar
- log4j-1.2.13.jar
- oro-2.0.8.jar
CayenneのデフォルトのJARはVerlocityの1.3を含みますが、これはClickがVelocityの1.5-devを使っているので問題があります。なので、no dependencies なCayenneのJARを使用します。このnodepsなCayenneのJARを利用する際に、aswood、logrj、oroが必要になります。
SpringをClickで使うには?
SpirngをClickで使うには、通常のClickServletではなくSpringClickServletを利用します。SpringClickServletはExtrasライブラリに含まれています。
ただ、SpringのMVCフレームワークはClickと互換性がありません。SpringのフレームワークはStrutsやWebWorkのような低レベルでのコマンドパターンを使用しています。DispatcherServletを使い、リクエストをControllerオブジェクトに届けてModelAndViewに渡し、最終的に表示されます。
SpringのMVCでは、このControllerがintegration plugin pointsになります。
Clickは、ページやコントロールに焦点を当てたより高次の設計構想を持ちます。ClickServletがリクエストをページやコントロールにディスパッチします。このページやコントロールが、Clickのplugin pointsなのです。
ClickとSpringの連携方法についてはClickとSpringの連携を参照してください。
ClickはJSPをサポートしていますか?
ClickはJSPによるページをフルサポートしています。
JSPはclick.xmlの中で明示的に定義され、Velocityのテンプレート同様自動的にロードされます。
ページのモデルの値は、自動的にリクエストの属性として追加され、JSP内で利用できます。以下の値も、リクエストの属性として追加されます。
- context - the Servlet context path, e.g. /mycorp
- format - the Format object for formatting the display of objects
- forward - the page JSP resource (.jsp file)
- messages - the MessagesMap adaptor for the Page getMessage() method
- path - the mapped request path of the page. Note this will have a .htm not a .jsp extension
Clickのパフォーマンスはどの程度ですか?
Clickは高速です。
Clickフレームワークはリクエストを処理する際に、比較的少ない数のオブジェクトを生成します。1つのPage、1つのContext、1つのFormat、そしていくつかのControlです。ControlはいくつかのListやMap、Stringを含みます。
それほど多くない数の、寿命の短いオブジェクトの領域確保は、最近のJVMでは高速です。
IBMの記事を参照してください「Urban performance legends, revisited」。
Clickが実際に行っている作業も非常に小さなものです。
onProcess()メソッドで、コントロールのリストを走査しシンプルな操作を実施します。コントロールのtoString()メソッドはテーブルを表示する際に大きなStringBufferを使うかもしれませんが、フォームが4000文字を超えることはめったにないでしょう。新しいStringBufferを生成するときには、その最大値を推測します。これは追加のメモリ確保やメモリコピーを避けるためです。
Clickではリフレクションもそれほどありません。コントロールのコールバックリスナで使用されるだけです。
その次のステップはレスポンスを出力することになります。Velocityがこのステップでは重要になります。
そしてそのVelocityも高速です。
この領域に関しては正確なパフォーマンスの数値をあげるのは困難ですが、これまでVelocityは、JSPより高速だと考えられていました。しかし、最近のVelocityのメーリングリストでの議論によると、JSPは改善されがVelocityよりわずかに高速だということです。いずれにせよ、JSPはとても速く、Velocityも似たようなものです。
Clickのページのユニットテストはどうやればよいのでしょう?
Clickのページに対して、JUnitスタイルの自動ユニットテストは書かない方が良いのではないでしょうか。手間に対して得られるものが非常に少ないのです。
もしClickのページの中に複雑なビジネスロジックを埋め込んでしまったのなら、リファクタリングを行い、すぐにユニットテストができて再利用しやすいビジネスレベルのサービスクラスを抽出すべきです。
それでもなおClickページに対してユニットテストを書かなければいけないのでしたら、mockディレクトリ以下にある、 MockContext と MockRequestクラスを利用してください。
ClickはどうしてロギングにCommons LoggingやLog4jを使っていないのですか?
Clickは当初VelocityEngineのガベージコレクションに伴うan appender closing memory leakの問題のため、Log4JをVelocityと一緒に使いませんでした。この問題は最近のVelocity 1.5の開発版では解決されています。
Commons Loggingは、IBM WebSphereアプリケーションサーバー上で発生するクラスローダーの問題により、使用していません。
出力部分でFreeMarker使っていないのは何故?
FreeMarkerはVelocityとともにClickでの使用を評価されていた強力なテンプレートエンジンです。Velocityにはない多くの洗練された特徴がありましたが、Velocityは学習が容易であり、XMLスタイルのマークアップを使用していないことから、Velocityが選ばれました。
FreeMarkerがVelocityより強力な点のひとつがエラーレポート機能です。この点に関してはClickはVeloity 1.5の新しく拡張されたレポート機能を使うことで対応しています。
Clickは、以下のようなエラーが発生したソースコードを出力します。
何故新しいWebアプリケーションフレームワークを開発したのですか?
現存のフレームワークが、私の要求を満たさなかったからです。Strutsは余分なことが多すぎるし、Tapestryは複雑すぎます。
この件に関するもっと詳しい回答に関しては「Why Click」を参照してください。