मैं दो या दो से अधिक Servlets के बीच एक चर या वस्तु कैसे साझा कर सकते हैं?


39

मैं जानना चाहता हूं कि दो या दो से अधिक Servlets के बीच एक चर या ऑब्जेक्ट साझा करने का कोई तरीका है, मेरा मतलब कुछ "मानक" तरीका है। मुझे लगता है कि यह एक अच्छा अभ्यास नहीं है लेकिन प्रोटोटाइप बनाने का एक आसान तरीका है।

मैं अगर यह प्रौद्योगिकियों का प्रयोग पर निर्भर करता है पता नहीं है, लेकिन मैं बिलाव 5,5


इस्तेमाल करेंगे मैं एक साधारण वर्ग की वस्तुओं (सिर्फ सार्वजनिक गुण स्ट्रिंग की एक वेक्टर साझा करना चाहते हैं, इंट्स, आदि)। मेरा इरादा एक डीबी में एक स्थिर डेटा होना है, जाहिर है कि टॉमकैट बंद होने पर यह खो जाएगा। (यह सिर्फ परीक्षण के लिए है)

  0

यह काफी हद तक निर्भर करता है कि यह किस प्रकार की वस्तु/चर है। क्या चर एक वर्ग से संबंधित है, और आप बस पहुंच चाहते हैं? क्या यह स्थिर है? एक उदाहरण अच्छा होगा। 23 sep. 082008-09-23 20:34:14

  0

मेरी इच्छा है कि यह मदद करता है :) 23 sep. 082008-09-23 20:43:24

74

मुझे लगता है कि आप यहां क्या देख रहे हैं अनुरोध, सत्र या एप्लिकेशन डेटा है।

एक सर्वलेट में आप अनुरोध वस्तु, सत्र वस्तु या servlet संदर्भ वस्तु के लिए एक विशेषता के रूप में एक वस्तु जोड़ सकते हैं:

protected void doGet(HttpServletRequest request, HttpServletResponse response) { 
    String shared = "shared"; 
    request.setAttribute("sharedId", shared); // add to request 
    request.getSession().setAttribute("sharedId", shared); // add to session 
    this.getServletConfig().getServletContext().setAttribute("sharedId", shared); // add to application context 
    request.getRequestDispatcher("/URLofOtherServlet").forward(request, response); 
} 

आप अनुरोध वस्तु में डालते हैं तो यह सर्वलेट लिए उपलब्ध हो जाएगा कि जब तक अनुरोध समाप्त हो गया है अग्रेषित किया जाता है:

request.getAttribute("sharedId"); 

आप सत्र में डालते हैं तो यह सब सर्वलेट्स आगे जाने के लिए उपलब्ध हो जाएगा, लेकिन मूल्य उपयोगकर्ता से संबद्ध रहेगा:

request.getSession().getAttribute("sharedId"); 

जब तक सत्र उपयोगकर्ता की निष्क्रियता के आधार पर समाप्त नहीं हो जाता है।

आप द्वारा रीसेट है:

request.getSession().invalidate(); 

या एक सर्वलेट दायरे से निकालता है:

request.getSession().removeAttribute("sharedId"); 

आप सर्वलेट संदर्भ में डालते हैं तो यह उपलब्ध हो जाएगा, जबकि आवेदन चल रहा है:

this.getServletConfig().getServletContext().getAttribute("sharedId"); 

जब तक आप इसे हटा नहीं देते:

this.getServletConfig().getServletContext().removeAttribute("sharedId"); 
  0

क्या आप ServletContext के लिए अपना उत्तर बढ़ा सकते हैं? 23 sep. 082008-09-23 20:57:28

+1

या 'this.getServletConfig() के बजाय 'getServletContext()' प्राप्त करें। GetServletContext() ' 10 nov. 152015-11-10 08:55:26

  0

@ विलियम मैं स्ट्रिंग f.e से कुछ और कैसे पास कर सकता हूं। एक वर्ग से एक वस्तु मैंने खुद को बनाया? 26 nov. 152015-11-26 08:35:12

  0

@ डोंगो मैं ईमानदार रहूंगा क्योंकि यह लंबे समय से रहा है क्योंकि मैंने servlets के साथ काम किया है, लेकिन अगर मैं सही तरीके से याद करता हूं, उदाहरण के लिए मैंने स्ट्रिंग का उपयोग किया था तो यह कोई ऑब्जेक्ट हो सकता है। 27 nov. 152015-11-27 17:56:51


1

क्या आप ऑब्जेक्ट को HttpSession में नहीं डाल सकते हैं और फिर प्रत्येक सर्लेट में इसके विशेषता नाम से इसका संदर्भ ले सकते हैं?

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

getSession().setAttribute("thing", object); 

... फिर एक और सर्वलेट में:

Object obj = getSession.getAttribute("thing"); 
  0

इस ऑब्जेक्ट को काम करने के लिए क्रमबद्ध करने योग्य नहीं है? 06 sep. 132013-09-06 16:56:04


7

डेटा के लक्षित उपयोग की गुंजाइश पर निर्भर करता है।

डेटा केवल उपयोगकर्ता लॉगिन जानकारी, पेज हिट गिनती, आदि जैसे, प्रति-उपयोगकर्ता के आधार पर प्रयोग किया जाता है सत्र वस्तु का उपयोग (httpServletRequest.getSession()। मिल/setAttribute (String [, वस्तु]))

यदि यह एकाधिक उपयोगकर्ताओं (कुल वेब पेज हिट, वर्कर थ्रेड, आदि) में एक ही डेटा है, तो ServletContext विशेषताओं का उपयोग करें। servlet.getServletCongfig()। getServletContext()। get/setAttribute (स्ट्रिंग [, ऑब्जेक्ट]))। यह केवल उसी युद्ध फ़ाइल/वेब आवेदकॉन के भीतर ही काम करेगा। ध्यान दें कि यह डेटा फिर से शुरू होने पर जारी नहीं है।

  0

ServletContext का उपयोग करके आप आसानी से परेशानी में पड़ सकते हैं यदि आप सावधान नहीं हैं। उदाहरण के लिए, आप इसका उपयोग मूर्खतापूर्ण तरीके से पृष्ठ हिट गिनती को लागू करने के लिए नहीं कर सकते: वर्तमान पृष्ठ को संदर्भ से हिट गिनती प्राप्त करें, इसे बढ़ाएं, और मान को संदर्भ में सेट करें। बहु थ्रेडिंग उस समाधान को मारता है। 23 sep. 082008-09-23 21:06:49

  0

मेटा आलोचक - सवाल कार्यक्षमता के लिए पूछ रहा है कि बैकिंग डेटा स्टोर को लेन-देन के माध्यम से संभालना चाहिए। एसीआईडी ​​के बारे में शिकायतें एसीआईडी ​​डेटा सेवा का उपयोग करनी चाहिए। ServletContext और सत्र किसी भी तरह से एसीआईडी ​​का उल्लंघन करते हैं। 24 sep. 082008-09-24 19:46:05


8

इसे 3 अलग-अलग क्षेत्रों में से एक में रखें।

अनुरोध - रहता अनुरोध के जीवन

सत्र - उपयोगकर्ता के सत्र की जीवन रहता है

आवेदन - रहता है जब तक applciation

बंद हो जाता है आप HttpServletRequest चर रहा है कि के माध्यम से ये क्षेत्र के सभी का उपयोग कर सकते HttpServlet class


2

एक और विकल्प, डेटा betwheen संदर्भ साझा करें ...

share-data-between-servlets-on-tomcat

<Context path="/myApp1" docBase="myApp1" crossContext="true"/> 
    <Context path="/myApp2" docBase="myApp2" crossContext="true"/> 

myApp1 पर:

ServletContext sc = getServletContext(); 
    sc.setAttribute("attribute", "value"); 

myApp2 पर:

ServletContext sc = getServletContext("/myApp1"); 
    String anwser = (String)sc.getAttribute("attribute"); 

0

यहाँ मैं कैसे जेट्टी के साथ ऐसा नहीं है।

https://stackoverflow.com/a/46968645/1287091

सर्वर संदर्भ है, जहां एक सिंगलटन एक एम्बेडेड जेट्टी सर्वर स्टार्टअप के दौरान करने के लिए लिखा गया है और सर्वर के जीवन के लिए सभी webapps बीच साझा किया जाता का उपयोग करता है। वेबपैप्स के बीच ऑब्जेक्ट्स/डेटा साझा करने के लिए भी इस्तेमाल किया जा सकता है मानते हैं कि संदर्भ में केवल एक लेखक है - अन्यथा आपको सहमति के बारे में सावधान रहना होगा।