2011-08-06 18 views
7

के साथ सहयोगी सरणी अनुरोध पैरामीटर पार्सिंग जावा सर्वलेट एपीआई के साथ इस तरह के अनुरोध से स्ट्रिंग कुंजियों को पार्स करना संभव है? कुंजी सरल वैश्विक कुंजी तार के रूप में व्याख्या कर रहे हैं यह संभव है,:जावा सर्वलेट

http://localhost:8080/?assocArray[key1]=value1&assocArray[key2]=value2&assocArray[key3]=value3 

getParameterValues("assocArray") returns ["value3","value1","value1"] 

लौटे सरणी में मानों के आदेश देने की कुंजी (नहीं है कि यह मायने रखती है)

हल के आदेश नहीं है। जावा उन्हें एक सरणी के रूप में नहीं पहचानता है। Regex

+3

"रेगेक्स का प्रयोग करें", मुझे माफ़ कर दो? – BalusC

उत्तर

10

नहीं सीधे है। [] HTTP अनुरोध पैरामीटर में कोई विशेष अर्थ नहीं है और Servlet API द्वारा सरणी कुंजियों के रूप में पहचाना नहीं गया है (आप शायद एक PHP प्रोग्रामर था जिसके लिए वास्तव में एक स्वामित्व पार्सर है?)। आपको एक लूप में स्वयं को पार्स और संग्रहित करने की आवश्यकता है।

उदाहरण के लिए,

Map<String, String> assocArray = new LinkedHashMap<String, String>(); 

for (Entry<String, String[]> entry : request.getParameterMap().entrySet()) { 
    String name = entry.getKey(); 

    if (name.startsWith("assocArray[")) { 
     String key = name.substring(name.indexOf('[') + 1, name.indexOf(']')); 
     assocArray.put(key, entry.getValue()[0]); 
    } 
} 
1

का उपयोग करें, AFAIK। http प्रोटोकॉल कुंजी केवल & मान निर्दिष्ट करता है, कोई key[key]=value

सूचकांक द्वारा स्ट्रिंग व्यवस्था का उपयोग करें - values[0], values[1], आदि

आप कुछ पूर्व प्रसंस्करण कर सकते हैं - request.getParameterMap(..) उपयोग करते हैं, पार्स foo[bar] खुद सिंटेक्स, और डाल दिया में एक Map<String, String>

17

आप एक ही पैरामीटर नाम के लिए कई मान हो सकता है:

http://localhost:8080/?param1=value1&param1=value2&param1=value3 

इस मामले में, getParameterValues("param1") एक String[] लौटाएगा जिसमें 3 तत्व होंगे: "value1", "value2" और "value3"

आपके द्वारा दिए गए उदाहरण में, आपने 3 अलग-अलग पैरामीटर परिभाषित किए हैं: assocArray[key1], assocArray[key2] और assocArray[key3]। सर्वलेट एपीआई उन्हें 3 पूरी तरह से अलग मानकों के रूप में मानी जाएगी जिनमें कुछ भी सामान्य नहीं है। आप इस प्रकार getParameter("assocArray[key1]") कॉल करने के लिए "value1", getParameter("assocArray[key2]") पाने के लिए "value2" प्राप्त करने के लिए, आदि

1

हल: यह संभव है कुंजी सरल वैश्विक कुंजी तार के रूप में व्याख्या कर रहे हैं। जावा उन्हें एक सरणी के रूप में नहीं पहचानता है। Regex

जावा उन्हें किसी सरणी के तत्व (तत्वों) के रूप में नहीं पहचानता है क्योंकि यूआरएल/यूआरआई चश्मा यह नहीं कहते कि वे एक सरणी का प्रतिनिधित्व करते हैं। आपको जावा (या अन्य) पुस्तकालयों को कस्टम सिंटैक्स को लागू करने की अपेक्षा नहीं करनी चाहिए जिन्हें आपने अनिवार्य रूप से हवा से बाहर निकाला है।

पार्सिंग इनपुट के लिए regexes का उपयोग आम तौर पर एक बुरा विचार बोल रहा है। यूआरएल (पूर्ण) यूआरएल के लिए यह एक बुरा विचार है क्योंकि यूआरएल को एन्कोड किए जाने के कई प्रकार के मुश्किल तरीके हैं, और यह एक रेगेक्स के लिए इसे लेना मुश्किल है।

(यदि आप एक अनुरोध पैरामीटर को अलग करने के लिए रेगेक्स का उपयोग कर रहे हैं, तो आपको ठीक होना चाहिए क्योंकि सर्वलेट इंफ्रास्ट्रक्चर पहले से ही प्राथमिक यूआरएल पार्सिंग और% -encoding आदि से निपटा होगा।)


मैं यह भी इंगित करना चाहता हूं कि आपकी क्वेरी स्ट्रिंग वाक्यविन्यास नाजुक है। आप उन्हें बचने के बिना '[' और ']' वर्णों का उपयोग कर रहे हैं। यूआरएल/यूआरआई चश्मे के मुताबिक वे "आरक्षित पात्र" हैं और "डेटा" के रूप में उपयोग किए जाने से बच जाना चाहिए। आप शायद अधिकांश संदर्भों में इसके साथ दूर हो जाएंगे, लेकिन जिन अनुप्रयोगों को सख्ती से अनुरूप यूआरआई की आवश्यकता है, वे आपके यूआरएल को अस्वीकार कर देंगे।

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