2011-07-13 35 views
6

Tôi đã thấy những ví dụ chứa những thứ như thế này:ResourceReferences trong Wicket là gì và chúng hoạt động như thế nào?

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

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

Nhưng Javadoc nói điều này cho các nhà xây dựng:

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

Vì vậy, khi bạn tạo một ResourceReference, bạn cung cấp cho nó một lớp. Tại sao? Thông thường bạn sẽ muốn phạm vi toàn cục hoặc phạm vi của đối tượng ResourceReference mà bạn vừa tạo, phải không?

Ngoài ra, name là gì? Có phải là sharedResourceKey không? Nếu không, thì resourceKey xuất phát từ đâu? Làm thế nào nó được tạo ra, và tại sao nó không phải là tên? Hoặc là name tra cứu trên đường dẫn lớp và được tải một cách kỳ diệu (giả sử rằng chỉ có một tệp có tên đó trên đường dẫn lớp; điều gì sẽ xảy ra nếu có nhiều?)? Nếu nó tải một tập tin với tên đó, tại sao nó không nói như vậy trong Javadoc?

Làm cách nào để bạn thực sự chỉ định nguồn lực vật lý cho số ResourceReference? Có một số getResource(), nhưng chúng dường như đã bỏ lỡ setResource(). Nếu bạn có, ví dụ: tệp hình ảnh trong thư mục webapp của bạn, cách bạn "đính kèm" tham chiếu đến tệp, đường dẫn của tệp hoặc thậm chí là luồng byte của nội dung của tệp? Nếu có một cách để đọc tài nguyên trong webapp, điều này có thể hữu ích, nhưng bạn không thể; nó chỉ trong classpath.

Tôi rất muốn có thể "gắn kết" nội dung của, ví dụ: webapp/games/someGame.swf để SWF trong ứng dụng web có thể được truy cập bởi các trang Wicket hoặc chỉ cần xử lý một số loại trên chúng.

Trả lời

3

Để mở rộng về câu trả lời của Andrew:

Một ResourceReference cho mỗi gia nhập là gì, nhưng một tài liệu tham khảo tới một tài nguyên có sẵn thông qua SharedResources. Bất kỳ loại nào của số Resource mà bạn thêm vào SharedResources (thường được thực hiện trong số Application#init()) có tên bạn xác định. Bất kỳ Component sử dụng tài nguyên nào có thể tham chiếu đến tài nguyên được chia sẻ này thông qua một tên ResourceReference với tên đó - do đó tham số được gọi là "tên". Trong trường hợp này tham số phạm vi (lớp) là không cần thiết.

Đây là trường hợp chung, để tham khảo mọi loại tài nguyên.

Trường hợp được hiển thị trong ví dụ của bạn và của Andrew là trường hợp đặc biệt hơn: ResourceReference của không tham chiếu đến Resource trước đây được thêm vào SharedResources. Ở đây, một cái gọi là PackageResource được khởi tạo một cách lười biếng và được thêm vào SharedResources.

PackageResource là công cụ thực sự thực hiện toàn bộ nội dung "tải tệp từ lớp học". Vì vậy, nếu bạn muốn chỉ tham chiếu đến một tập tin như một hình ảnh từ classpath của bạn, ví dụ của Andrew chỉ đơn giản là một phím tắt rất hữu ích để tránh tự mình tạo ra PackageResource. Như đã nói ở trên, có nhiều hơn để ResourceReference hơn chỉ là :-)

10

Tài nguyên như hình ảnh thường được liên kết với một trang web cụ thể. Vì vậy, nó có ý nghĩa để xác định vị trí hình ảnh đó trong cùng một vị trí như các tệp Java và HTML.

Tham số lớp đóng vai trò là cơ sở để tra cứu tài nguyên của bạn. Tham số thứ hai cho hàm tạo ResourceReference là tên của tài nguyên, liên quan đến thư mục chứa lớp đó.

Vì vậy, ví dụ bạn có thể có -

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

Bạn gán tài nguyên vật lý bằng cách đơn giản đặt tài nguyên trong thư mục chính xác khi ứng dụng của bạn được triển khai.

Có một chương về sử dụng tài nguyên trong sách "Wicket in Action".

+1

Điều này làm cho rất nhiều ý nghĩa, cảm ơn! Vì vậy, sau đó tên tham số không chính xác: nó sẽ được gọi là "đường dẫn" hoặc "tên tệp". Nếu đường dẫn có liên quan đến vị trí của lớp (có lẽ là/com/something/package), làm thế nào để tham chiếu đến các tệp trong ứng dụng web, đó là nơi chúng luôn được giữ lại (cho chúng tôi). Đây là mấu chốt - chúng tôi muốn có được một xử lý trên một tập tin swf trong thư mục trò chơi của webapp, và havent đã có thể tìm thấy bất kỳ cách nào để làm điều này: do đó quan tâm ban đầu trong ResourceReference. – wingnut

+0

Đúng, 'tên' là một đường dẫn liên quan đến vị trí của 'phạm vi' (lớp). Điều này được xác định bởi tên gói lớp, đối với nơi nó sống trên hệ thống tệp của bạn. Tham số tên không hỗ trợ những thứ thông minh như sử dụng ký hiệu '../ ..' để điều hướng thêm lên cây thư mục. Vì vậy, tài nguyên của bạn phải liên quan đến vị trí của tệp lớp. BTW Tôi thực sự khuyên bạn nên giữ cuốn sách mà tôi đã đề cập, nó rất tốt. –

+3

Lưu ý [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) là một lớp trừu tượng và không thể được khởi tạo. – TOUDIdel

Các vấn đề liên quan