2011-07-25 9 views
12

मैं सर्वलेट्स पर एक किताब पढ़ रहा था, उस किताब में एक संक्षिप्त व्याख्या सर्वलेट वर्ग, साथ ही HttpServlet वर्ग के बारे में दिया जाता है।क्या मुझे सेवा() या doPost() को ओवरराइड करना चाहिए?

उस फ़ॉर्म के लिए एक फॉर्म भरने के लिए एक उदाहरण है- सर्वलेट की doPost() विधि कक्षा द्वारा ओवरराइड की गई है। लेकिन लॉगिन फॉर्म के दूसरे उदाहरण के लिए, service() विधि इसके बजाय ओवरराइड है।

मैं जानता हूँ कि क्यों 2 अलग approaches- मैंने सोचा था कि आमतौर पर हम doPost() (या doGet()) में अपने कस्टम कोड डाल दिया और service() रहने के रूप में यह है बताना चाहते हैं। क्या 2 दृष्टिकोणों में से किसी एक का उपयोग करने के पीछे कोई कारण है, या क्या मैं किसी भी स्थिति में दोनों दृष्टिकोणों का उपयोग कर सकता हूं?

+2

मैं नहीं होगा: एनएसई रिज़ोल्यूशन)

इस तरह आप के मामले में सेवा ओवरराइड कर सकते हैं आप करना चाहते हैं आश्चर्यचकित है कि पुस्तक सिर्फ एक सर्वलेट का उपयोग करने के विभिन्न तरीकों के उदाहरण दिखाने की कोशिश कर रही थी, जैसा कि "आपको ऐसा करना चाहिए, या ऐसा करना चाहिए।" क्योंकि वास्तव में, यदि आप एक गंभीर ऐप विकसित कर रहे हैं, तो आप अंततः सर्वलेट स्तर पर चीजों को लागू करने के बजाय एमवीसी ढांचे (जैसे स्ट्रूट्स, स्प्रिंग या विकेट) का अध्ययन और कार्यान्वयन करना चाहते हैं। (भविष्य के पढ़ने के लिए बस एक सुझाव।) – Marvo

उत्तर

13

service() विधि ओवरराइड न करें। पसंदीदा दृष्टिकोण doPost() पोस्ट के लिए और doGet() प्राप्त करने के लिए उपयोग कर रहा है। प्रत्येक क्या करता है इस पर एक उत्कृष्ट पोस्ट है। http://www.jguru.com/faq/view.jsp?EID=47730

आपको लगता है कि HTTP प्रोटोकॉल का उपयोग नहीं कर रहा है एक ग्राहक द्वारा किए गए अनुरोध का जवाब चाहिए, तो आप सेवा का उपयोग करना चाहिए()।

1

आप शायद सबसे अधिक doXXX() विधि को ओवरराइड करते हैं जहां XXX HTTP विधि जैसे जीईटी, पोस्ट आदि के लिए खड़ा होता है। कंटेनर द्वारा service() विधि द्वारा लागू की गई विधि यह तय करेगी कि कौन से doXXX() को कॉल किया जाना है।

4

मैं आप खुद के लिए तय करने के लिए में प्रवाह को समझने की जरूरत है। service() के HttpServlet के लिए डिफ़ॉल्ट कार्यान्वयन अनुरोध विधि (जीईटी, पोस्ट, जो भी हो) के लिए उपयुक्त हैंडलर को कॉल करता है।

आपको service() ओवरराइड करने की आवश्यकता है जब आप सभी आने वाली विधियों को संभालने के लिए एक ही विधि चाहते हैं (इससे कोई फर्क नहीं पड़ता कि यह एक GET, PUT या POST अनुरोध है, तो आप इसका उत्तर देंगे)। यदि आप प्रत्येक विधि को अलग से इलाज करने में प्रसन्न हैं, तो डिफ़ॉल्ट सेवा() कार्यान्वयन के साथ जाएं और विशिष्ट हैंडलर ओवरराइड करें।

0

आप GET या POST एक HTTP प्रोटोकॉल ग्राहक (आमतौर पर एक ब्राउज़र) द्वारा किए गए अनुरोध का जवाब चाहिए HttpServlet का विस्तार करने और अपनी सुविधा के तरीकों का उपयोग करने के लिए संकोच नहीं करते। आपको लगता है कि HTTP प्रोटोकॉल का उपयोग नहीं कर रहा है एक ग्राहक द्वारा किए गए अनुरोध का जवाब चाहिए, तो आप सेवा()

1

service() प्रणाली के अंतर्गत आता है GenericServlet का उपयोग करना चाहिए और प्रोटोकॉल इस तरह के किसी भी प्रकार का समर्थन करने के अतिभारित किया जा सकता एचटीपी, एफटीपी आदि

फिर आपके पास एचटीपीप्रोटोकॉल को संभालने के लिए विशेष सर्लेट है, हम इसे एचटीपीएसआरलेट कहते हैं। HttpServlet सेवा() और doGet() और doPost() विधियों के लिए डिफ़ॉल्ट कार्यान्वयन भी प्रदान करता है।

क्यों हम service() प्रणाली पर हावी नहीं होना चाहिए?

के बाद से यह सेवा विधि ओवरराइड करने के लिए एक अच्छा अभ्यास नहीं है। अगर हम किसी भी doxxx विधि को कॉल करते हैं तो आंतरिक रूप से यह HttpServlet की सेवा विधि को कॉल करेगा। इसलिए आपको इसे स्पष्ट रूप से कॉल करने की आवश्यकता नहीं है।सेवा का निष्पादन() की

आदेश:

सेवा (ServletRequest, ServletResponse) ->

-> कॉल

-> सेवा (HttpServletRequest अनुरोध, HttpServletResponse रिज़ोल्यूशन)

-> कॉल

-> doGet/doPost (HttpServletRequest अनुरोध, HttpServletRespo

protected void service(HttpServletRequest req, HttpServletResponse resp) { 
String method = req.getMethod(); 

if (method.equals(METHOD_GET)) { 
     doGet(req, resp); 
} else if (method.equals(METHOD_HEAD)) { 
    doHead(req, resp); 
} else if (method.equals(METHOD_POST)) { 
    doPost(req, resp); 

} else if (method.equals(METHOD_PUT)) { 
    doPut(req, resp); 

} else if (method.equals(METHOD_DELETE)) { 
    doDelete(req, resp); 

} else if (method.equals(METHOD_OPTIONS)) { 
    doOptions(req,resp); 

} else if (method.equals(METHOD_TRACE)) { 
    doTrace(req,resp); 

} else { 
    resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg); 
}} 

कार्यान्वयन अतः समुदाय से टोमाज़ Nurkiewicz द्वारा दिए गए कोड केवल Overriding Service Method

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

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