如何获取Wicket共享资源的URL?

时间:2010-11-01 17:42:33

标签: wicket

网页设计师给了我看起来像的HTML:

<div .... style="background: transparent url(xxx.png) 170px center no-repeat">

不幸的是,图像xxx.png的内容是由软件生成的,因此我将其设为WebResource并使用以下策略生成资源的URL,然后我将其嵌入{ {1}}属性使用Wicket style=

AttributeModifier

当我使用Eclipse在本地测试时,这可以正常工作,但是:

  • 当我在生产中安装它时,我想让Apache作为Jetty的代理,使得上下文根不可见,即Apache将// App initialization code String resourceName = ....; getSharedResources().add(resourceName, myWebResource); // Creating the widget String url = getServletContext().getContextPath() + "/resources/org.apache.wicket.Application/" + resourceName ; String style = "background: transparent url(" + url + ") 170px center no-repeat"; div.add(new AttributeModifier("style", new Model<String>(style))); 的请求转发到Jetty上/foo
  • 一般来说,我认为这不是很优雅。我确定我在这里复制Wicket代码?

我理解Wicket只使用相对URL解决了上下文根和Apache代理的问题。这将是我怀疑的最优雅的解决方案。但是如果我有例如/context-root/foo然后网址可以是任意长度,我不知道要包含多少IndexedParamUrlCodingStrategy才能返回..

编辑:当前的解决方案是使用上面的代码示例中的绝对URL,并在Apache(a)中将/resources重写为/context-root/*(b),就像之前一样然后将上下文根添加到所有请求(c)转发到Jetty。这样,大多数URL可以没有上下文根,但是某些URL(对我的资源)可以具有上下文根,并且没有问题。但我不喜欢这个解决方案!

2 个答案:

答案 0 :(得分:13)

如果从组件(或页面)内部调用代码:

urlFor(new ResourceReference("sharedResourceName"));

RequestCycle.get().urlFor(new ResourceReference("sharedResourceName"));

下面的示例应用程序。为简单起见,我使用了ByteArrayResource,但任何Resource子类都会这样做:

WicketApplication.java

package app1;

import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.request.target.coding.IndexedParamUrlCodingStrategy;
import org.apache.wicket.resource.ByteArrayResource;

public class WicketApplication extends WebApplication {
    @Override
    protected void init() {
        super.init();
        getSharedResources().add("testResource", new ByteArrayResource("text/plain", "This is a test".getBytes()));
        mount(new IndexedParamUrlCodingStrategy("home/very/deep/folder", getHomePage()));
    }
    public Class<HomePage> getHomePage() {
        return HomePage.class;
    }
}

HomePage.java

package app1;

import org.apache.wicket.PageParameters;
import org.apache.wicket.ResourceReference;
import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.WebPage;

public class HomePage extends WebPage {
    public HomePage(final PageParameters parameters) {
        CharSequence resourceHref = urlFor(new ResourceReference("testResource"));
        add(new Label("link", "Click me!")
            .add(new SimpleAttributeModifier("href", resourceHref)));
    }
}

HomePage.html

<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" >
    <body>
        <a wicket:id="link"></a>
    </body>
</html>

答案 1 :(得分:0)

我认为this answer中用于创建动态图片网址的策略将适用于此处。