2011-07-13 26 views
6

私はこのようなものを含む例見てきた:WicketのResourceReferenceとは何ですか?どのように動作しますか?

mountSharedResource("/images/logo.gif", new ResourceReference(ImageScope.class, 
    "logo.gif").getSharedResourceKey()); 

mountSharedResource("/resource", 
    Application.class.getName() + "/" + resourceKey); 

をしかし、Javadocのコンストラクタのためにこれを言う:

ResourceReference(java.lang.Class<?> scope, java.lang.String name); 

あなたがResourceReferenceを作成するときに、あなたはそれをクラスを与えます。どうして?通常は、作成したばかりのオブジェクト(グローバルスコープまたはResourceReference)のスコープが必要ですか?

また、nameとは何ですか?それはsharedResourceKeyですか?そうでなければ、resourceKeyはどこから来たのですか?どのように生成され、なぜそれは名前ではないのですか?または、nameはクラスパスを検索し、魔法のように読み込まれます(クラスパスにその名前のファイルが1つしかないと仮定します;複数の場合はどうなりますか?)その名前のファイルを読み込んだ場合、Javadocではなぜそうは言いませんか?

実際に物理リソースをResourceReferenceに割り当てるのですか? getResource()がありますが、彼らはsetResource()を逃したようです。 webapp dirにイメージファイルがある場合は、ファイル、そのパス、またはファイル内容のバイトストリームに参照をどのように「添付」しますか? Webアプリケーションでリソースを読み取る方法があれば、これは便利かもしれませんが、できません。それはクラスパスの中だけです。

webapp/games/someGame.swfの内容を「マウント」できるようにして、WebアプリケーションのSWFにWicketページでアクセスできるようにするか、何らかのハンドルを取得することができます。

答えて

3

ResourceReference自体はSharedResourcesを介して利用可能なリソースへ参照以外の何ものでもありません。 (通常Application#init()で行われる)に追加するResourceの種類には、定義する名前があります。リソースを使用するComponentは、その名前のResourceReferenceを介してこの共有リソースを参照することができます。そのため、パラメータは「名前」と呼ばれます。この場合、scopeパラメータ(クラス)は必要ありません。

種類のリソースを参照するのが一般的です。

あなたとアンドリューの例に示されている場合は、より特殊なケースである:あなたのResourceReferenceさんnameは、以前SharedResourcesに追加Resourceを指すものではありません。ここでは、いわゆるPackageResourceが遅れて初期化され、SharedResourcesに追加されます。

PackageResourceは、実際には「load-file-from-classpath」の内容全体です。

クラスパスの画像のようなファイルを参照したいのであれば、Andrewの例は、自分でPackageResourceを作成するのを避けるための非常に便利なショートカットです。上記の通り、ResourceReferenceにはそれ以上のものがあります:-)

10

イメージなどのリソースは、通常、特定のWebページに関連付けられます。したがって、そのイメージをJavaおよびHTMLファイルと同じ場所に配置することは理にかなっています。

classパラメータは、リソースを検索するためのベースとして機能します。 ResourceReferenceコンストラクタの2番目のパラメータは、クラスを含むディレクトリに対するリソースの名前です。

したがって、たとえば、あなたが持っている可能性が -

new ResourceReference(AClass.class, "sub/directory/image.jpg"); 

をあなたのアプリケーションがデプロイされたときに、単に正しいディレクトリにそのリソースを配置することによって、物理リソースを割り当てます。

"Wicket in Action"という本でリソースを使用する章があります。アンドリューの答えに拡大すること

+1

これは感謝しています。したがって、パラメータ名は正しくないので、 "path"または "filename"と呼びます。パスがクラスの場所(おそらく/ com/something/package)の場所からの相対パスである場合、webapp内のファイルをどのように参照するのですか?常に保持されています(とにかく)。これは要点です。webappのgamesディレクトリにあるswfファイルのハンドルを取得したいのですが、これを行うための方法を見つけることはできませんでした。したがって、ResourceReferenceの初期の関心事です。 – wingnut

+0

'name'は 'scope'(クラス)の場所に相対的なパスです。これは、ファイルシステム上で物理的にどこに存在するかについて、クラスパッケージ名によって決まります。 nameパラメータは、ディレクトリツリーをさらに上に移動するための '../ ..'表記のような巧妙なものをサポートしていません。だからあなたのリソースは、クラスファイルの場所に相対的でなければなりません。 ところで私が言ったその本を手に入れることを本当に勧めます。それはとても良いことです。 –

+3

注[ResourceReference](http://www.jarvana.com/jarvana/view/org/apache/wicket/wicket/1.5-M1/wicket-1.5-M1-javadoc.jar!/org/apache/wicket/request /resource/ResourceReference.html)は抽象クラスであり、インスタンス化できません。 – TOUDIdel

関連する問題