2011-06-17 14 views
6

मैं वर्तमान में इस तरह कोड के साथ लिंक का एक सेट बना रहा हूँ:मैं एक विकेट यूआरएल कैसे बना सकता हूं जो इसके पैरामीटर को छुपाता है?

BookmarkablePageLink<CheeseMain> havarti = 
    new BookmarkablePageLink<CheeseMain>("havarti", CheeseMain.class); 
havarti.setParameter("Title", "Havarti"); 
havarti.setParameter("Group", "cheeseName"); 
add(havarti); 

URL है, जो बाहर आता है प्रारूप https://mysite.com/;jsessionid=B85EE5CB0349CCA2FE37AF76AB5C30C1?wicket:bookmarkablePage=:com.mycompany.cheese.CheeseMain&Title=Havarti&group=cheeseName है।

मेरी समस्या यह है कि अब मैं इस लिंक के लिए यूआरएल को बुकमार्क करने योग्य नहीं चाहता हूं। आदर्श रूप में, मैं इसे https://mysite.com/cheese जैसे कुछ सरल बनाना चाहता हूं, लेकिन मैं एक बदसूरत यूआरएल के साथ रह सकता हूं। महत्वपूर्ण बात यह है कि पैरामीटर दिखाई नहीं दे रहे हैं।

मैं अपने लिंक उत्पन्न करने के तरीके को कैसे बदलूं? मैंने अलग-अलग यूआरएल एन्कोडिंग रणनीतियों को देखा है जो विकेट प्रदान करता है, लेकिन उनमें से कोई भी पैरामीटर को हटा नहीं देता है; वे सिर्फ उन्हें अलग प्रदर्शन करते हैं।

public class Havarti extends CheeseMain { 
    public Havarti() { 
     super(new PageParameters("Title=Havarti,Group=cheeseName")); 
    } 
} 

तो आप का उपयोग कर सकते हैं:: new BookmarkablePageLink<Void>("havarti", Havarti.class)

+0

"बुकमार्क करने योग्य" बिट को छोड़ दें, एक सरल 'पेजलिंक' का उपयोग करें। अगर मुझे सही याद है, तो इसे काम करना चाहिए। – biziclop

+0

@ बिज़िकलोप: मैं 'लिंक' का एक उप-वर्ग 'वास्तव में' मानक 'लिंक' का उपयोग करने की कोशिश कर रहा हूं, क्योंकि 'लिंक' सार है - लेकिन इसमें कई अन्य संशोधन शामिल हैं। 'पेजलिंक' को बहिष्कृत किया गया है, जावाडोक इसके बजाय 'बुकमार्क करने योग्य पेज लिंक्स' या 'लिंक' का उपयोग करने की सिफारिश करता है। – Pops

+0

@ लॉर्ड टोरगामस वेल, फिर 'लिंक' का उपयोग करें। :) या आप इसके साथ बहिष्कृत हो सकते हैं और 'पेजलिंक' का उपयोग कर सकते हैं। हालांकि मुझे नहीं लगता कि 'लिंक' का उपयोग करना कितना जटिल हो सकता है। क्या आप इसके बारे में कुछ और जानकारी जोड़ सकते हैं? हो सकता है कि हम 'लिंक की – biziclop

उत्तर

8

पैरामीटर केवल यूआरएल में दिखाई देते हैं यदि पेज बुकमार्क करने योग्य है, या विशिष्ट लिंक बुकमार्क करने योग्य है।

आप एक Link कि setResponsePage(Page) का उपयोग कर पृष्ठ पर जाने (एक पृष्ठ उदाहरण गुजर) setResponsePage(Class<Page>, PageParameters) के बजाय, लिंक बनाया पेज के बुकमार्क योग्य संस्करण को इंगित नहीं करेगा (एक पृष्ठ वर्ग गुजर), लेकिन स्टेटफुल को बनाते हैं उदाहरण।

इस काम को करने के लिए, आपको super(PageParameters) कन्स्ट्रक्टर को कॉल नहीं करना चाहिए (ताकि पृष्ठ में स्टेटलेस यूआरएल बनाने के लिए पर्याप्त जानकारी न हो)।

इस उदाहरण में, आप SecretPage पर दो अलग-अलग लिंक, एक स्टेटलेस, बुकमार्क करने योग्य और अन्य राज्य के माध्यम से नेविगेट कर सकते हैं।

SecretPage में दो रचनाकार भी हैं। एक को PageParameters प्राप्त होता है और super इसे पास करता है। दूसरे को सीधे कॉन्स्ट्रूसर पैरामीटर के माध्यम से मान प्राप्त होता है, और इसे super तक पास नहीं करता है (यदि इसे super(new PageParameters().add("message",message) कहा जाता है, जैसा कि टिप्पणी की गई पंक्ति में है, तो यह स्वचालित रूप से एक बुकमार्क करने योग्य यूआरएल पर रीडायरेक्ट हो जाएगा)।

HomePage.java:

public class HomePage extends WebPage { 
    public HomePage(final PageParameters parameters) { 
     add(new BookmarkablePageLink<Void>("bookmarkable", SecretPage.class, 
      new PageParameters().add("message", "This message will appear in the URL"))); 
     add(new Link<Void>("instance") { 
      @Override 
      public void onClick() { 
       setResponsePage(new SecretPage("This message will NOT appear in the URL")); 
      } 
     }); 
    } 
} 

HomePage.html:

<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" > 
<body> 
    <p><a wicket:id="bookmarkable">Bookmarkable link (stateless)</a></p> 
    <p><a wicket:id="instance">Hidden parameters link (stateful)</a></p> 
</body> 
</html> 

SecretPage.java

public class SecretPage extends WebPage { 
    public SecretPage(PageParameters parameters) { 
     super(parameters); 
     init(parameters.get("message").toString("No message!")); 
    } 
    public SecretPage(String message) { 
     // super(new PageParameters().add("message", message)); // COMMENTED! 
     init(message); 
    } 
    private void init(String message) { 
     info(message); 
     add(new FeedbackPanel("feedback")); 
     add(new BookmarkablePageLink<Void>("back", getApplication().getHomePage())); 
    } 
} 

SecretPage.html

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

और, http://host/app/secret जैसे एक साधारण यूआरएल के लिए, आपको इसे माउंट करना होगा। आप इसे अपने WebApplication कक्षा में कर सकते हैं।

विकेट आवेदन।जावा

public class WicketApplication extends WebApplication { 
    @Override 
    protected void init() { 
     super.init(); 
     mountPage("home", getHomePage()); 
     mountPage("secret", SecretPage.class); 
    } 
    public Class<HomePage> getHomePage() { 
     return HomePage.class; 
    } 
} 

यह उदाहरण विकेट 1.5 (अभी भी RC4.2) का उपयोग करता है, और (कुछ तरीकों और वर्गों का नाम दिया गया, या विभिन्न संकुल में ले जाया गया) 1.4.x के साथ काम करने कुछ संशोधनों की जरूरत है, लेकिन यह विचार है वही।

+0

मैं वास्तव में विकेट 1.4.1 का उपयोग कर रहा हूं, इसलिए मुझे यह कोड बदलना पड़ा। यह बहुत मुश्किल नहीं था, लेकिन मैं पहले 'SecretPage' कन्स्ट्रक्टर की आखिरी पंक्ति से परेशान था। यह 'toString()' के लिए तर्क क्यों देता है? वह मेरे लिए भी संकलित नहीं होगा। – Pops

+0

एपीआई 1.5 में बदल गया। 1.4 में, समकक्ष 'पैरामीटर.getString (" संदेश "," कोई संदेश नहीं है! ")' – tetsuo

+0

ओह, वाह, 'toString()' के लिए एक जानबूझकर पैरामीटर होगा। मैंने उस पर भी विचार नहीं किया; मुझे लगा कि यह एक टाइपो था। उस फिक्स के साथ, यह वर्णन के रूप में काम करने के लिए प्रतीत होता है। अब, यह जानने के लिए कि मेरी परियोजना के लिए इसे कैसे संशोधित करें .... – Pops

0

आप अभी भी इस तरह के रूप अपनी पसंद के URL एन्कोडिंग रणनीति का उपयोग करें और एक विरासत वर्ग में अपने मानकों को संपुटित सकता है।

+0

इस रणनीति के साथ, यूआरएल अभी भी जानकारी छोड़ देगा। इसमें एक पृष्ठ को प्रतिस्थापित करने के लिए सैकड़ों नई कक्षाएं भी शामिल होंगी जो वास्तव में केवल पैरामीटर लेनी चाहिए और इसके साथ डीबी को कॉल करना चाहिए। (मेरा कोड सिर्फ एक उदाहरण है; मैं वास्तव में एक पनीर ऐप नहीं बना रहा हूं।) – Pops

+0

@ लॉर्ड यह * पैरामीटर दिखाए बिना इसे करने का एकमात्र तरीका है। दूसरी चीज जो आप कर सकते हैं वह URL बनाते समय पैरामीटर एन्क्रिप्ट करना है और उन्हें अपने कन्स्ट्रक्टर में डिक्रिप्ट करना है (एन्क्रिप्टेड मान अभी भी दिखाए जा रहे हैं)। मुझे वास्तव में पता नहीं है कि क्या आप एक पनीर ऐप एक्सडी कर रहे हैं, मैं बस चाहता हूं कि मेरा कोड आपके से संबंधित हो। – Marcelo

संबंधित मुद्दे