2013-10-23 9 views
14

कोड मैं वहाँ के साथ काम के ज्यादा में भयानक सामान की तरह है:क्या यूआरएल बनाने का कोई सही तरीका है?

String url = "../Somewhere/SomeServlet?method=AMethod&id="+object.getSomething()+ "&aParam="+object.getSomethingElse()); 

या - और भी बदतर:

String url = "Somewhere/Here/Something.jsp?path="+aFile.toString().replace("\\","/")+ "&aParam="+object.getSomethingElse()); 

करने का अधिकार तरीका नहीं है:

  1. बनाएँ नया यूआरएल (या यह एक यूआरआई है)।
  2. इसमें सही ढंग से बच निकले पैरामीटर जोड़ें।
  3. उन पैराम में अच्छी तरह से गठित फ़ाइल पथ जोड़ें।
  4. इसे एक स्ट्रिंग में हल करें।

अनिवार्य रूप से - यह ठीक से करने के लिए स्ट्रिंग बनाने के लिए बहुत आसान है। क्या ऐसा करने का कोई तरीका है ठीक से जो स्ट्रिंग बनाने के समान आसान है?

जोड़ा गया

स्पष्टता के लिए - मैं मैं की तरह कुछ के लिए देख रहा हूँ लगता है - और एक छोटे से सोचा के बाद:

String s = new MyThing() 
    .setPlace("Somewhere/Something.jsp") 
    .addParameter(aName,aValue) 
    .addParameter(aName,aFile) 
    .toString(); 
तो

है कि यह भागने और जोड़ने का वैमनस्य के सभी के साथ सौदा होगा "?"/"&" और फ़ाइलों के लिए "\" का उपयोग करने के बजाय "\" से "/" बदलना आदि।

अगर मुझे खुद को लिखना है (यानी अगर अपाचे कोई विकल्प नहीं है) क्या असली जावा है तकनीकों विभिन्न भागों से बचने के लिए es es। मेरा मतलब पैरामीटर में "" से बचने जैसी चीजें हैं। " जबकि अन्य स्थानों में "% 20" से बच निकला।

+1

मुझे लगता है कि यह समान लगता है। http://stackoverflow.com/questions/1861620/is-there-a-java-package-to-handle-building-urls –

+0

इसके अलावा, http://stackoverflow.com/questions/883136/is- वहां-एक-अच्छा-यूआरएल-बिल्डर-के लिए जावा – siledh

उत्तर

5

मैंने इसे लिखा है, आप इसे बदल सकते हैं जहां आप अतिरिक्त कार्यक्षमता चाहते हैं। यह किसी बाहरी संसाधन का उपयोग नहीं करता है, अगर मुझे कुछ देखा है तो मुझे बताएं!

यह मूल रूप से URI कक्षा के लिए एक रैपर है जो आपको यूआरआई में उपनिर्देशिका और पैरामीटर को अधिक आसानी से जोड़ने की अनुमति देता है। यदि आप कुछ चीजों में रूचि नहीं रखते हैं तो आप डिफ़ॉल्ट मान सेट कर सकते हैं।

संपादित करें: मैंने एक सापेक्ष यूआरआई (आपके प्रश्न के अनुसार) का उपयोग करने के लिए एक विकल्प जोड़ा है।

public class Test { 
    public static void main(String[] args) throws URISyntaxException, 
      MalformedURLException { 
     URLBuilder urlb = new URLBuilder("www.example.com"); 
     urlb.setConnectionType("http"); 
     urlb.addSubfolder("somesub"); 
     urlb.addSubfolder("anothersub"); 
     urlb.addParameter("param lol", "unknown"); 
     urlb.addParameter("paramY", "known"); 
     String url = urlb.getURL(); 
     System.out.println(url); 


     urlb = new URLBuilder(); 
     urlb.addSubfolder("servlet"); 
     urlb.addSubfolder("jsp"); 
     urlb.addSubfolder("somesub"); 
     urlb.addSubfolder("anothersub"); 
     urlb.addParameter("param lol", "unknown"); 
     urlb.addParameter("paramY", "known"); 
     String relUrl = urlb.getRelativeURL(); 
     System.out.println(relUrl); 
    } 
} 

class URLBuilder { 
    private StringBuilder folders, params; 
    private String connType, host; 

    void setConnectionType(String conn) { 
     connType = conn; 
    } 

    URLBuilder(){ 
     folders = new StringBuilder(); 
     params = new StringBuilder(); 
    } 

    URLBuilder(String host) { 
     this(); 
     this.host = host; 
    } 

    void addSubfolder(String folder) { 
     folders.append("/"); 
     folders.append(folder); 
    } 

    void addParameter(String parameter, String value) { 
     if(params.toString().length() > 0){params.append("&");} 
     params.append(parameter); 
     params.append("="); 
     params.append(value); 
    } 

    String getURL() throws URISyntaxException, MalformedURLException { 
     URI uri = new URI(connType, host, folders.toString(), 
       params.toString(), null); 
     return uri.toURL().toString(); 
    } 

    String getRelativeURL() throws URISyntaxException, MalformedURLException{ 
     URI uri = new URI(null, null, folders.toString(), params.toString(), null); 
     return uri.toString(); 
    } 
} 

आउटपुट:

निरपेक्ष

http://www.example.com/somesub/anothersub?param%20lol=unknown&paramY=known

सापेक्ष

/सर्वलेट/jsp/somesub/anothersub परम% 20lol = अज्ञात & paramY = जाना जाता

+0

मैंने अंततः इस तकनीक का एक संस्करण [इस तरह] का उपयोग किया (http://stackoverflow.com/a/19541585/823393)। – OldCurmudgeon

-2

recomendations

private final String BASE_URL = Properties.getProperty("base-url"); 

private Map propertiesMap; // = new HashMap<String,String>(); 

और यूआरएल के निर्माण के लिए कोड में।

public String buildURL(){ 
    StringBuilder builder = new StringBuilder(); 
    builder.append(BASE_URL); 
    //for each property, append it 

    return builder.toString(); 

} 
+0

डाउनवॉटिंग, क्योंकि यह केवल आधा बेक्ड कोड है जो पहिया को फिर से आविष्कार करता है। इसके अलावा यह ओपी की सभी आवश्यकताओं को संबोधित नहीं करता है। –

12

आप उपयोग कर सकते हैं Apache URIBuilder

नमूना कोड: Full Apache Example

UriBuilder builder = new UriBuilder() 
    .setScheme("http") 
    .setHost("apache.org") 
    .setPath("/shindig") 
    .addParameter("hello world", "foo&bar") 
    .setFragment("foo"); 
builder.toString(); 

आउटपुट: http://apache.org/shindig?hello+world=foo%26bar#foo

+0

कृपया अपडेट करें प्राधिकरण अब मान्य नहीं है – Olayinka

+0

यह 'यूआरआईबिल्डर 'है, न कि' उरीबिल्डर '। अंतिम यूआरएल मान्य नहीं है, और मैं उस उदाहरण के लिंक को हटा दूंगा। – ooi

1

मुझे @ जेरोन के सुझाव पसंद हैं, लेकिन मैंने भागों को इकट्ठा करने के अपने विचार का उपयोग करके ऐसा नहीं किया था, nd तो एक URI का उपयोग कर अंतिम परिणाम विकसित करने के लिए मैं एक साथ इस समाधान जो मैं क्या चाहते हो रहा है डाल:

public class URLBuilder { 
    // The scheme - http 
    private String scheme = null; 
    // The user - user 
    private String user = null; 
    // The host - example.com 
    private String host = null; 
    // The port - 8080 
    private int port = -1; 
    // The paths - /Path/To/Somewhere/index.jsp 
    private final ArrayList<String> paths = new ArrayList<String>(); 
    // The parameters - ?a=b&c=d 
    private final ArrayList<Pair<String, String>> queries = new ArrayList<Pair<String, String>>(); 
    // The fragment - #n 
    private String fragment = null; 

    public URLBuilder addQuery(String name, String value) { 
    queries.add(new Pair(name, value)); 
    return this; 
    } 

    public URLBuilder addQuery(String name, long value) { 
    addQuery(name, String.valueOf(value)); 
    return this; 
    } 

    public URLBuilder addQuery(String name, File file) { 
    addQuery(name, file.toURI().getPath()); 
    return this; 
    } 

    public URLBuilder addPath(String path) { 
    paths.add(path); 
    return this; 
    } 

    @Override 
    public String toString() { 
    // Build the path. 
    StringBuilder path = new StringBuilder(); 
    for (String p : paths) { 
     path.append("/").append(p); 
    } 
    // Build the query. 
    StringBuilder query = new StringBuilder(); 
    String sep = ""; 
    for (Pair<String, String> p : queries) { 
     query.append(sep).append(p.p).append("=").append(p.q); 
     sep = "&"; 
    } 
    String url = null; 
    try { 
     URI uri = new URI(
       scheme, 
       user, 
       host, 
       port, 
       path.length() > 0 ? path.toString() : null, 
       query.length() > 0 ? query.toString() : null, 
       fragment); 
     url = uri.toString(); 
    } catch (URISyntaxException ex) { 
     Logger.getLogger(URLBuilder.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    return url; 
    } 

    /** 
    * @param host the host to set 
    * @return this 
    */ 
    public URLBuilder setHost(String host) { 
    this.host = host; 
    return this; 
    } 

    /** 
    * @param scheme the scheme to set 
    * @return this 
    */ 
    public URLBuilder setScheme(String scheme) { 
    this.scheme = scheme; 
    return this; 
    } 

    /** 
    * @param user the user to set 
    * @return this 
    */ 
    public URLBuilder setUser(String user) { 
    this.user = user; 
    return this; 
    } 

    /** 
    * @param port the port to set 
    * @return this 
    */ 
    public URLBuilder setPort(int port) { 
    this.port = port; 
    return this; 
    } 

    /** 
    * @param fragment the fragment to set 
    * @return this 
    */ 
    public URLBuilder setFragment(String fragment) { 
    this.fragment = fragment; 
    return this; 
    } 

    public static void main(String args[]) { 
    try { 
     URLBuilder url = new URLBuilder(); 
     System.out.println(url.toString()); 
     url.setFragment("fragment"); 
     System.out.println(url.toString()); 
     url.setHost("host.com"); 
     System.out.println(url.toString()); 
     url.addPath("APath"); 
     System.out.println(url.toString()); 
     url.addPath("AnotherPath"); 
     System.out.println(url.toString()); 
     url.addQuery("query1", "param1"); 
     System.out.println(url.toString()); 
     url.addQuery("query 2", "param 2"); 
     System.out.println(url.toString()); 
     url.addQuery("file", new File("Hello World.txt")); 
     System.out.println(url.toString()); 
    } catch (Throwable t) { 
     t.printStackTrace(System.err); 
    } 
    } 

} 
+0

क्या आप स्पष्ट कर सकते हैं कि आपने कौन सी कार्यक्षमता को जोड़ा है? खुशी है कि मैं मदद कर सकता हूं :) –

+0

@JeroenVannevel - मैंने 'फाइल' को प्रश्नों के रूप में संभालने और 'यूआरआई' वर्ग का अधिक पूरा उपयोग जोड़ा। मैं आपके उत्तर को सही के रूप में चिह्नित करने की योजना बना रहा हूं क्योंकि यह मेरे निर्माता को प्रेरित करता है। मैं किसी भी देर से लेकिन प्रेरणादायक सुझावों की प्रतीक्षा कर रहा हूं। – OldCurmudgeon

4

तुम भी उपयोग कर सकते हैं वसंत UriComponentsBuilder

UriComponentsBuilder 
    .fromUriString(baseUrl) 
    .queryParam("name", name) 
    .queryParam("surname", surname) 
    .build().toUriString(); 
संबंधित मुद्दे