2010-11-01 6 views
6

वेब डिजाइनर दिया है मुझे एचटीएमएल जो लगता है कि:एक विकेट साझा संसाधन के लिए यूआरएल कैसे प्राप्त करें?

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

जब मैं इसे स्थानीय स्तर पर ग्रहण का उपयोग कर का परीक्षण है, लेकिन यह ठीक काम करता है:

  • जब मैं उत्पादन में इस स्थापित करते हैं, मैं ऐसा है कि संदर्भ जड़ प्रतिसाद नहीं जेट्टी के लिए अपाचे एक प्रॉक्सी के रूप में करना चाहते हैं ' टी दिखाई नहीं दे रहा है, यानी अपाचे /foo का अनुरोध जेटी पर /context-root/foo के रूप में करता है।
  • सामान्यतः, मुझे नहीं लगता कि यह बहुत ही सुरुचिपूर्ण है। मुझे यकीन है कि मैं यहां विकेट कोड डुप्लिकेट कर रहा हूं?

मुझे लगता है कि विकेट संदर्भ-जड़ों और अपाचे प्रॉक्सी को केवल संबंधित यूआरएल का उपयोग करके हल करता है। मुझे संदेह है कि यह सबसे सुरुचिपूर्ण समाधान होगा। लेकिन अगर मेरे पास उदा। एक IndexedParamUrlCodingStrategy तो यूआरएल मनमाने ढंग से लंबाई का हो सकता है और मुझे नहीं पता कि पर /resources पर वापस जाने के लिए कितने शामिल हैं।

संपादित: वर्तमान समाधान ऊपर मेरी कोड उदाहरण के रूप में संपूर्ण URL के उपयोग करने के लिए है, और अपाचे में (क) को फिर से लिखने /* में /context-root/* (ख) तो पहले की तरह सभी अनुरोधों का संदर्भ जड़ जोड़ें (ग) आगे जेटी के लिए। इस तरह अधिकांश यूआरएल संदर्भ रूट के बिना हो सकते हैं लेकिन कुछ यूआरएल (मेरे संसाधनों में) में संदर्भ रूट हो सकता है और यह ठीक है। लेकिन मुझे यह समाधान पसंद नहीं है!

+1

यह नहीं करता है ' प्रश्न का उत्तर नहीं देते, लेकिन आप अंतिम पंक्ति को थोड़ा सा सरल बना सकते हैं: 'नया SimpleAttributeModifier ("शैली", शैली) ' – Jonik

+0

@ जोनिक, महान, +1 टिप के लिए धन्यवाद! –

उत्तर

12

कोड एक घटक (या पृष्ठ) के अंदर से कहा जाता है:

urlFor(new ResourceReference("sharedResourceName")); 

या

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

नमूना नीचे आवेदन। मैं सादगी के लिए एक ByteArrayResource इस्तेमाल किया, लेकिन किसी भी संसाधन उपवर्ग करना होगा:

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

धन्यवाद लेकिन। क्या होगा यदि वर्तमान धागे से जुड़े कोई अनुरोध चक्र नहीं था? –

+1

मैं विकेट 6 का उपयोग कर रहा हूं और यह अब और काम नहीं कर रहा है। संसाधन संदर्भ (स्ट्रिंग) कन्स्ट्रक्टर वहां नहीं है, संसाधन संसाधन संदर्भ अब सार है और इसे लागू करने की आवश्यकता है। क्या साझा संसाधन का URL प्राप्त करने का कोई और आसान तरीका है? –

0

मुझे लगता है कि गतिशील छवि यूआरएल बनाने के लिए this answer में उपयोग की जाने वाली रणनीति यहां लागू होगी।

+0

जहां तक ​​मैं देख सकता हूं कि विकेट के साथ संसाधन बनाता है और पंजीकृत करता है; मैं थोड़ा कर सकता हूँ। हालांकि मुझे नहीं पता कि मैं उस संसाधन के यूआरएल तक कैसे पहुंच सकता हूं, इसके अलावा मेरे उदाहरण में यूआरएल मैन्युअल रूप से उत्पन्न करने के अलावा। मुझे चिंता है कि क्या विकेट एक दिन संसाधनों के लिए यूआरएल के तरीके को बदलता है, मेरा कोड टूट जाएगा।विकेट के पास यूआरएल को संसाधनों के लिए कहीं भी काम करने के लिए कोड होना चाहिए, इसलिए मेरे लिए इसे फिर से कोड करने के बजाए इसका उपयोग करना संभव होना चाहिए ...? –