4

私は Wicket を使い始めたばかりで、リソース参照の使用に問題があります。私は wicket 1.5.4 を使用していますが、次の問題があります: ファイル システムに画像を保存しています。構成された rootFilePath (つまり、dir1/dir2/img1.png) に対するファイル パスの一部を保持するクラス ImageElement があります。ページで、次のように画像を追加します。

new Image("id",ImagesResourceReference.get(), pageParameters)

ここで、ページ パラメータには画像パス パラメータ (path="/dir1/dir2/img1.png") が含まれます。私の質問は次のとおりです。

  • ファイル システムから画像を提供する最も簡単な方法はありますか?
  • 静的メソッドで ResourceReference を使用しても問題ありませんか? または毎回新しい ResourceReference を構築する必要がありますか? 以前のバージョンでは new ResourceReference(globalId) を使用できましたが、現在はそうではないようです。もしそうなら、グローバルリソース参照は何ですか? 私が理解している限り、リソース参照はリソースのファクトリであると想定されているため、リソース要求ごとに新しいファクトリを作成するのはかなり奇妙です。
  • 最後の質問は、ImageResource で応答メソッドが呼び出されたら、インデックス付きパラメーターを連結してパスを作成する必要がないように、より良い方法で画像へのパスを渡すにはどうすればよいかということです。
  • 効率的かつ簡単な方法で動作させるための最良のシナリオは何でしょうか。「Wicket in action」の例を見ましたが、これはデータベースからの動的な画像生成を目的としており、私の場合に適しているかどうかはわかりません

「/images」パスの下のアプリケーションにマウントした ResourceReference の実装は次のようになります。

public class ImagesResourceReference extends ResourceReference {

private static String rootFileDirectory;

private static ImagesResourceReference instance;

private ImagesResourceReference() {
    super(ImagesResourceReference.class, "imagesResourcesReference");
}

public static ImagesResourceReference get() {
    if(instance == null) {
        if(StringUtils.isNotBlank(rootFileDirectory)) {
            instance = new ImagesResourceReference();
        } else {
            throw new IllegalStateException("Parameter configuring root directory " +
                    "where images are saved is not set");
        }
    }
    return instance;
}

public static void setRootFileDirectory(String rootFileDirectory) {
    ImagesResourceReference.rootFileDirectory = rootFileDirectory;
}

private static final long serialVersionUID = 1L;

@Override
public IResource getResource() {

    return new ImageResource(rootFileDirectory);
}

private static class ImageResource implements IResource {

    private static final long serialVersionUID = 1L;

    private final String rootFileDirectory;

    public ImageResource(String rootFileDirectory) {
        this.rootFileDirectory = rootFileDirectory;
    }

    @Override
    public void respond(Attributes attributes) {

         PageParameters parameters = attributes.getParameters();
         List<String> indexedParams = getAllIndexedParameters(parameters);
         if(!indexedParams.isEmpty() && isValidImagePath(indexedParams)) {
             String pathToRequestedImage = getImagePath(indexedParams);
             FileResourceStream fileResourceStream = new FileResourceStream(new File(pathToRequestedImage));
             ResourceStreamResource resource = new ResourceStreamResource(fileResourceStream);
             resource.respond(attributes);
         }
    }

    private boolean isValidImagePath(List<String> indexedParams) {
        String fileName = indexedParams.get(indexedParams.size() -1);
        return !FilenameUtils.getExtension(fileName).isEmpty();
    }

    private List<String> getAllIndexedParameters(PageParameters parameters) {
        int indexedparamCount = parameters.getIndexedCount();
        List<String> indexedParameters = new ArrayList<String>();
        for(int i=0; i<indexedparamCount ;i++) {
            indexedParameters.add(parameters.get(i).toString());
        }
        return indexedParameters;
    }

    private String getImagePath(List<String> indexedParams) {
        return rootFileDirectory + File.separator + StringUtils.join(indexedParams, File.separator);
    }

}

ヘルプやアドバイスをいただければ幸いです。前もって感謝します。

4

2 に答える 2

8

共有リソースとして使用できます。

    public class WicketApplication extends WebApplication {
        @Override
        public Class<HomePage> getHomePage() {
            return HomePage.class;
        }
        @Override
        public void init() {
            super.init();
            getSharedResources().add("downloads", new FolderContentResource(new File("C:\\Users\\ronald.tetsuo\\Downloads")));
            mountResource("downloads", new SharedResourceReference("downloads"));
        }
        static class FolderContentResource implements IResource {
            private final File rootFolder;
            public FolderContentResource(File rootFolder) {
                this.rootFolder = rootFolder;
            }
            public void respond(Attributes attributes) {
                PageParameters parameters = attributes.getParameters();
                String fileName = parameters.get(0).toString();
                File file = new File(rootFolder, fileName);
                FileResourceStream fileResourceStream = new FileResourceStream(file);
                ResourceStreamResource resource = new ResourceStreamResource(fileResourceStream);
                resource.respond(attributes);
            }
        }
    }
于 2012-02-10T18:30:07.040 に答える
0

グローバル ID で ResourceReferences を引き続き使用できます。SharedResourceReference を使用するだけです。これもまた良いのではないでしょうか。

add(new Image("image", new SharedResourceReference("mySharedResourceRef", parameters));

URL パラメーターからパスを作成することは避けたいと思います。これは簡単にセキュリティ リークにつながる可能性があります。

于 2012-02-12T17:14:05.587 に答える