2010-02-02 16 views
80

क्या सर्वलेट वर्ग के कई उदाहरण हैं? जैसा कि मैंने "सर्वलेट का प्रत्येक उदाहरण" सुना है क्या कोई इस पर विस्तार कर सकता है?सर्वलेट के प्रत्येक उदाहरण और servlets में सर्वलेट के प्रत्येक थ्रेड के बीच अंतर?

+0

नहीं! वेब कंटेनर केवल नए अनुरोध() विधि को कॉल करके सर्व अनुरोध पर सर्वलेट का केवल एक उदाहरण बनाता है। –

उत्तर

177

जब सर्वलेट कंटेनर शुरू होता है, यह:

  1. web.xml पढ़ता है;
  2. क्लासपाथ में घोषित सर्वलेट ढूंढता है; और
  3. प्रत्येक Servlet लोड करता है और तत्काल को तुरंत चालू करता है।

मोटे तौर पर, इस तरह:

String urlPattern = parseWebXmlAndRetrieveServletUrlPattern(); 
String servletClass = parseWebXmlAndRetrieveServletClass(); 
HttpServlet servlet = (HttpServlet) Class.forName(servletClass).newInstance(); 
servlet.init(); 
servlets.put(urlPattern, servlet); // Similar to a map interface. 

उन सर्वलेट वे स्मृति में संग्रहीत और अनुरोध URL से मेल खाता है हर बार पुन: उपयोग किया जाता है सर्वलेट के url-pattern जुड़े। अपनी बारी पर

for (Entry<String, HttpServlet> entry : servlets.entrySet()) { 
    String urlPattern = entry.getKey(); 
    HttpServlet servlet = entry.getValue(); 
    if (request.getRequestURL().matches(urlPattern)) { 
     servlet.service(request, response); 
     break; 
    } 
} 

GenericServlet#service() फैसला करता HttpServletRequest#getMethod() के आधार पर लागू करने की जो doGet(), doPost(), आदि की ..: सर्वलेट कंटेनर तो के समान कोड निष्पादित करता है।

आप देखते हैं, servletcontainer प्रत्येक अनुरोध के लिए समान सर्वलेट उदाहरण का पुन: उपयोग करता है। दूसरे शब्दों में: सर्वलेट प्रत्येक अनुरोध के बीच साझा किए जाते हैं। यही कारण है कि सर्वलेट कोड थ्रेडसेफ तरीके लिखना बेहद जरूरी है - जो वास्तव में सरल है: बस अनुरोध अनुरोध या सत्र स्कोप्ड डेटा को सर्वलेट इंस्टेंस चर के रूप में असाइन करें, लेकिन विधि स्थानीय चर के रूप में। जैसे

public class MyServlet extends HttpServlet { 

    private Object thisIsNOTThreadSafe; 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     Object thisIsThreadSafe; 

     thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests! 
     thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe. 
    } 
} 
+21

+1। मैं बस जोड़ दूंगा कि यदि एक ही सर्वलेट वर्ग को web.xml में दो अलग-अलग यूआरएल में मैप किया गया है, तो दो उदाहरण बनाए गए हैं। लेकिन सामान्य सिद्धांत अभी भी है, एक उदाहरण कई अनुरोधों परोसता है। – Yoni

+1

@ बाल्लूसी, बस आश्चर्य है, क्या वेब ऐप से आरंभिक सर्लेट के सेट तक पहुंचने का कोई तरीका है? – shabunc

+1

क्या कक्षा में यह ISNOTThreadSafe वैरिएबल अलग-अलग उपयोगकर्ताओं को साझा किया जाता है या केवल उसी उपयोगकर्ता के विभिन्न पृष्ठों पर साझा किया जाता है। मेरा मतलब यह है कि अगर मैं अपने कंप्यूटर में इस पेज को ब्राउज़ करता हूं और आप अपने कंप्यूटर में चलाते हैं, तो क्या हम इस आईएसएनओटी थ्रेडसेफ के समान स्थान साझा करते हैं? धन्यवाद। – overshadow

27

नहीं, सर्वलेट का केवल एक उदाहरण है जिसे एकाधिक ग्राहकों से कई अनुरोधों के लिए पुन: उपयोग किया जाता है। यह दो महत्वपूर्ण नियमों की ओर जाता है:

  • , एक सर्वलेट में उदाहरण चर का उपयोग नहीं करते आवेदन चौड़ा मूल्यों, सबसे अधिक बार संदर्भ मानकों से प्राप्त के लिए छोड़कर।
  • एक सर्वलेट

3

वहाँ सर्वलेट वर्ग के कई उदाहरण नहीं हो सकता (समान सर्वलेट फिल्टर और JSPs के लिए चला जाता है) में तरीकों synchronized नहीं बनाते हैं। यहां तक ​​कि जब सर्वलेट का एक उदाहरण होता है, तो यह कई अनुरोधों को संभालने में सक्षम होता है। तो वर्ग स्तर चर का उपयोग नहीं करना बुद्धिमानी है।

9

जावा सर्वलेट विशिष्टता संस्करण 3.0 (पृ। 6-7) के अनुसार, वहाँ, JVM प्रति घोषणा प्रति एक उदाहरण हो जाएगा जब तक कि सर्वलेट SingleThreadModel लागू करता है जो मामले में JVM प्रति कई उदाहरण हो सकता है।

+0

सर्वलेट विशिष्टता 3. (पृष्ठ 6-7) धारा 2.2.1 एकल थ्रेड मॉडल के बारे में नोट, कहते हैं "सिंगल थ्रेड मॉडेल इंटरफ़ेस को विनिर्देश के इस संस्करण में बहिष्कृत किया गया है । " – Reva

3

उन लोगों के लिए जो वास्तविक जावास्क्रिप्ट (केवल इसकी एक लाइब्रेरी नहीं) जानते हैं, Servlets को फ़ंक्शन ऑब्जेक्ट्स के रूप में देखा जा सकता है। कार्यात्मक वस्तुओं के रूप में, उनमें से मुख्य कार्य करने के लिए की बजाय कुछ जानकारी को उनकी छाती में संग्रहीत करने के लिए करता है।ऐसी सभी तर्कसंगत वस्तुओं के एक से अधिक उदाहरणों को तुरंत चालू करने की आवश्यकता नहीं है, उसी वर्ग के सभी उदाहरणों के बीच जावा क्लास विधियों को साझा किया जाता है।

3

हालांकि पहले से ही कुछ अच्छे उत्तर हैं, उनमें से कोई भी वितरित वातावरण में तैनात जावा वेब एप्लिकेशन के बारे में बात नहीं करता है। यह एक व्यावहारिक परिदृश्य है जहां वास्तव में एक एकल सर्वलेट के कई उदाहरण बनाए जाते हैं। एक वितरित वातावरण में आपके पास अनुरोध को संभालने के लिए मशीनों का समूह होता है और अनुरोध इनमें से किसी भी मशीन पर जा सकता है। इनमें से प्रत्येक मशीन अनुरोध को संभालने में सक्षम होना चाहिए और इसलिए प्रत्येक मशीन में आपके JAwesomeServlet का JVM में एक उदाहरण होना चाहिए।

तो, सही कथन प्रत्येक सर्वलेट के लिए प्रति JVM प्रति केवल एक उदाहरण होगा, जब तक यह सिंगल थ्रेड मॉडेल लागू नहीं करता है।

सरल शब्दों में सिंगल थ्रेड मॉडेल का कहना है कि आपको सर्वलेट के प्रति उदाहरण केवल एक थ्रेड होना चाहिए, इसलिए मूल रूप से आपको इसे संभालने के लिए आने वाले अनुरोध के एक उदाहरण को बनाने की आवश्यकता है, जो मूल रूप से समानांतर फैशन में हैंडलिंग अनुरोधों की पूरी अवधारणा को मारता है और सर्वलेट ऑब्जेक्ट सृजन के रूप में एक अच्छा अभ्यास नहीं माना जाता है और अनुरोध को संसाधित करने के लिए तैयार होने से पहले प्रारंभिक समय लगता है।

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