[Wicket-ja-user 205] Re: 「直接アクセスできる静的なURLの画像」の生成は可能でしょうか?

Back to archive index

shinya okino shiny****@gmail*****
2008年 8月 7日 (木) 20:36:03 JST


沖野です。

静的っぽいURLでDynamicImageResourceを返せれば良いのでしたら
手間ですけど以下のような方法があります。

まず、respondメソッドでDynamicImageResource#onResourceRequestedを
実行するIRequestTargetインターフェースを実装したクラスを作成します。
public class ImageRequestTarget implements IRequestTarget {
	/** パラメータ */
	private String param;

	public ImageRequestTarget(String param) {
		this.param = param;
	}
	@Override
	public void respond(RequestCycle requestCycle) {
		DynamicImageResource imageResource = //パラメータからDynamicImageResourceを作成
		imageResource.onResourceRequested();
	}
	@Override
	public void detach(RequestCycle requestCycle) {
	}
	public String getParam() {
		return param;
	}
}

次にそのIRequestTarget実装クラスを返すdecodeメソッドを実装したAbstractRequestTargetUrlCodingStrategyを
継承したクラスを作成します。
public class ImageUrlCodingStrategy extends
		AbstractRequestTargetUrlCodingStrategy {

	public ImageUrlCodingStrategy(String path) {
		super(path);
	}

	@Override
	public IRequestTarget decode(RequestParameters requestParameters) {
		//パラメータ取り出し
		String param = Strings.afterLast(requestParameters.getPath(), '/');

		return new ImageRequestTarget(param);
	}
	@Override
	public CharSequence encode(IRequestTarget requestTarget) {
		//URL作成
		ImageRequestTarget target = (ImageRequestTarget) requestTarget;

		StringBuilder builder = new StringBuilder();
		builder.append(getMountPath());
		builder.append("/" + target.getParam());

		return builder.toString();
	}
	@Override
	public boolean matches(IRequestTarget requestTarget) {
		return requestTarget instanceof ImageRequestTarget;
	}

}

そのAbstractRequestTargetUrlCodingStrategy継承クラスをWebApplicationでマウントします。
public class ImageApplication extends WebApplication {

	@Override
	protected void init() {
		super.init();
		mount(new ImageUrlCodingStrategy("/image"));
	}
}

あとはWebPageクラスのurlForでurl生成できます。
public class ImagePage extends WebPage {

	public ImagePage() {
		Link link = ...
		add(link);

		ImageRequestTarget target = new ImageRequestTarget("hoge.jpg");
		String url = urlFor(target).toString();

		ContextImage image = new ContextImage("DYNAMIC_IMAGE", new Model(url));
		link.add(image);
	}
}

上記だとimage/hoge.jpgというurlが出力されます。
なんらかのパラメータからDynamicImageResourceが作成できるなら
IRequestTargetとIRequestTargetUrlCodingStrategyの組み合わせで自由なurlが作成できます。
もっと簡単な方法がありそうな気もしますが、いかがでしょうか。

もしやりたいことを勘違いしていたらすいません。


08/08/07 に tj_takehana<tgens****@gmail*****> さんは書きました:
> 竹花です。
>
> ブログパーツをWicketで作ってみようとしているのですが、
> 「直接アクセスできる静的なURLの画像」の生成は可能でしょうか?
>
> FRAMEタグが不可なページのブログパーツなので、以下のようなものを作りたいと思っています。
> 例としては「あわせて読みたい」のようなものをイメージしていただければ、と思います。
> <div>
> <a href="WICKET_PAGE">
>  <image src="DYNAMIC_IMAGE">
> </a>
> </div>
>
> ブログパーツクリック後の遷移先(WICKET_PAGE)はWicketのNice
> URLの機能を使えば問題ないのですが、動的に生成される画像へのリンク(DYNAMIC_IMAGE)を作る方法が思い浮かびません。
>
> DynamicImageResourceで生成した画像をSharedResourcesに追加する方法では、確かに静的なリンクの画像は作れますが、どうしても第一条件がページへのアクセスになってしまいますし(FRAMEタグが使えればコレでもいいのですが…)。
> 都合によりDBは使えないので「定期的にDBに保存しておいて表示」というわけにもいかないです。
>
> どなたか良い解法をご存知の方がいましたらご教授おねがいいたします。
>
> _______________________________________________
> Wicket-ja-user mailing list
> Wicke****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user
>


-- 
沖野信也
shiny****@gmail*****




Wicket-ja-user メーリングリストの案内
Back to archive index