Как получить URL-адрес общего ресурса Wicket? - PullRequest
7 голосов
/ 01 ноября 2010

Веб-дизайнер дал мне HTML, который выглядит так:

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

К сожалению, содержимое изображения xxx.png создается программным обеспечением, поэтому я сделал его WebResource и использую следующую стратегию, чтобы сгенерировать URL для ресурса, который я затем вставил в атрибут style=, используя калитка AttributeModifier.

// 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)));

Это прекрасно работает, когда я тестирую его локально с помощью Eclipse, но:

  • Когда я устанавливаю это в производство, я хочу использовать Apache в качестве прокси для Jetty, чтобы корневой контекст не был виден, то есть Apache перенаправляет запрос /foo на Jetty как /context-root/foo.
  • В общем, я не думаю, что это очень элегантно. Я уверен, что я дублирую код Wicket здесь?

Я понимаю, что Wicket решает эту проблему контекстных корней и прокси-серверов Apache, используя только относительные URL-адреса. Это было бы самое элегантное решение, которое я подозреваю. Но если у меня есть, например, IndexedParamUrlCodingStrategy тогда URL может быть произвольной длины, и я не знаю, сколько .. включить, чтобы вернуться к /resources.

Редактировать : Текущее решение состоит в том, чтобы использовать абсолютные URL-адреса, как в моем примере кода выше, и в Apache (a) переписать /context-root/* в /* (b), как и раньше, ДОБАВИТЬ корень контекста на все запросы (с) переслать на причал. Таким образом, большинство URL-адресов могут быть без корневого контекста, но некоторые URL-адреса (к моим ресурсам) могут иметь корневой контекст, и это нормально. Но мне не нравится это решение!

Ответы [ 2 ]

13 голосов
/ 19 ноября 2010

Если код вызывается изнутри компонента (или страницы):

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>
0 голосов
/ 02 ноября 2010

Я думаю, что тактика, использованная в этом ответе для создания динамических URL-адресов изображений, будет применяться здесь.

...