2009-07-26 17 views
20

क्या (यदि कोई है) ServletContext में एक चर संग्रहीत करने के बीच अंतर है और इसे कक्षाओं में से किसी एक के सार्वजनिक स्थिर सदस्य के रूप में रखना है?सर्वलेट संदर्भ स्कोप बनाम वैश्विक चर

इसके बजाय लेखन के

:

// simplified (!) 
int counter = (Integer)getServletContext().getAttribute("counter"); 
counter++; 
this.getServletContext().setAttribute("counter", counter); 

क्यों नहीं बस है:

// in class MyServlet 
public static int counter = 0; 

// in a method somewhere 
MyServlet.counter++; 

मैं क्या बता सकते हैं (संगामिति मुद्दों, कृपया, यह सिर्फ एक गूंगा उदाहरण है ध्यान न दें) , ये दो विकल्प टोमकैट के समान व्यवहार करते हैं। क्या पहले विकल्प का उपयोग करने के बारे में कुछ बेहतर है?

उत्तर

17

वेब कंटेनर आपके सर्वलेट संदर्भ के बारे में जानता है, लेकिन आपके स्थिर चर के बारे में नहीं, जो skaffman says आपके क्लासलोडर के लिए निजी हैं।

कुछ भी जो एक अलग क्लासलोडर में एक अनुप्रयोग उदाहरण द्वारा दो अलग-अलग अनुरोधों को प्रस्तुत करने का कारण बनता है (यह सर्वर पुनरारंभ करना, वेब अनुप्रयोग पुनर्वितरण, या बहु-नोड सर्वर हो सकता है) आपके तर्क को तोड़ने का मामला होगा। सर्वलेट संदर्भ इन चीजों से बच जाएगा क्योंकि वेब कंटेनर इसके बारे में जानता है और इसे क्रमबद्ध कर सकता है या एक सामान्य भंडार कर सकता है।

14

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

+0

क्या हम किसी विशेष नाम के लिए में मूल्य को स्थायी रूप से संग्रहीत कर सकते हैं, ताकि उस परम के लिए अगली पहुंच अद्यतन मूल्य प्रदान करेगी यानी getServletContext() का अगला कॉल प्राप्त करें। GetInitParameters ("name"); अद्यतन कार्यक्रम जो अंतिम कार्यक्रम द्वारा किया गया था? – Ars

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