Java Servlet Lifecycle

Java Servlet Lifecycle – Java AppletsJava Servlets में मूल रूप से एक ही अन्तर है कि Java Applets ऐसे Java Programs होते हैं जो Client Side में किसी Java Enabled Web Browser में Run होते हैं जबकि Java Servlets ऐसे Java Programs होते हैं जो Server Side में किसी Host Computer पर Run होते हैं।

दोनों ही प्रकार के Programs का एक Lifecycle होता है, जिसके Execution के कुछ Specific Points होते हैं, जो कुछ Specific Events Trigger करते हैं और इन Events के Response में हम हमारी जरूरत के अनुसार Java Codes को Execute करने हेतु Attach कर सकते हैं।

परिणामस्वरूप जब कोई Java Servlet Program Run होता है, उसके प्रत्येक Execution Point पर एक Specific Event Trigger होता है और उस Trigger होने वाले Event के साथ Associated Java Code भी Execute हो जाता है क्‍योंकि इन Events के Trigger होने के Response में हमें जिन Java Codes को Execute करना होता है, उन्हें इन Events के साथ Associated कुछ Predefined Overridden Methods के रूप में Define किया जाता है। इन Predefined Methods को Callback Methods भी कहते हैं और ये Methods ही Servlet की Lifecycle को निश्चित करते हैं।

किसी Java Applet की Lifecycle के विभिन्न Methods init(), start(), paint(), stop() destroy() होते हैं, जिन्हें User द्वारा Perform किए गए Actions के Response में Java Enabled Web Browser में Exist Applet Runtime Environment द्वारा Call किया जाता है।

जबकि इन सभी Methods का Fundamental Implementation java.applet.Applet नाम की Base Class में पहले से ही Defined होता है, इसलिए इनमें से एक या अधिक Methods को Define न करने की स्थिति में भी हमारा Applet Minimum Level पर Normal तरीके के Execute होता है जबकि Applet द्वारा Extra Functionalities प्राप्त करने हेतु हम हमारी जरूरत के अनुसार इन Methods को Override करते हैं।

ठीक इसी तरह से Java Servlet Programs भी Servlet Engine द्वारा Managed अपने Request/Response Model के Context में Operate होते हैं और निम्नानुसार तरीके से काम करते हैं-

  • जब Web Server पर कोई Request आता है, तो Web Server उस Request को Fulfill करने के लिए किसी Servlet को Execution हेतु Memory में Load करता है।
  • फिर ये Servlet Engine Memory में Loaded Servlet Program के init() Method को Invoke करता है।
  • फिर Servlet के service() Method को Call करके आने वाले विभिन्न Incoming Requests को Handle करता है।
  • अन्त में जब Servlet को Shutdown करना होता है, तब यही Servlet Engine सभी Loaded Servlets के destroy() Method को Call करते हुए Servlets को Memory से Unload कर देता है।

जिस प्रकार से किसी Java Applet को Handle करने के लिए java.applet.Applet Class है, ठीक उसी तरह से Java Servlets को Handle करने के लिए भी javax.servlet.GenericServletjavax.servlet.http.HttpServlet नाम की दो Standard Base Classes हैं जो कि Servlet Programs से सम्बंधित Callback Methods को Implement करते हेतु जिम्मेदार हैं और Servlet Programming के अन्तर्गत इन्हीं Classes को Inherit करते हुए इनके कुछ Specific Event Handler Methods को Override किया जाता है, जो कि Servlet Program की Lifecycle को Represent करते हैं।

Servlet की Lifecycle से सम्बंधित Override किए जाने वाले विभिन्न Event Handler Methods का Basic Description निम्नानुसार है-

init() Method

जब Servlet Engine को किसी Servlet को Execute करने के लिए कोई Incoming Request प्राप्त होता है, तो Servlet Engine सबसे पहले इस बात को Check करता है कि वह Servlet Memory में पहले से Loaded है या नहीं।

यदि वह Servlet Memory में पहले से Loaded न हो, तो Servlet Engine एक Class Loader के माध्‍यम से सर्वप्रथम उस Particular Servlet को Memory में Load करके उसके Constructor को Invoke करता है। जब Servlet Memory में Load हो जाता है तब First Request को Serve करने से Just पहले Servlet Engine निम्नानुसार Signature वाले एक Initialization Method को Call करता है-

        public void init( ServletConfig config) throws ServletException

ये Method Servlet की पूरी Lifecycle में केवल एक ही बार Call होता है और Servlet के Service में Place किए जाने से Just पहले (यानी Servlet द्वारा First Request को Fulfill किए जाने की शुरूआत करने से Just पहले) Call होता है।

जबकि इस Method में Parameter की तरह Specified ServletConfig Class का config नाम का Object, Current Servlet के Context को Access करने की सुविधा Provide करता है, जिसके बारे में आगे विस्तार से Discuss किया जाएगा।

Servlet Context के Reference को Maintain करने के लिए config Object को एक Instance Variable में Stored होना जरूरी होता है, जो कि GenericServlet Class में Exist init(ServletConfig) Method द्वारा किया गया Task होता है। इस वजह से super.init(config) को किसी भी Inherited Servlet Class के init() Method में Call करना जरूरी होता है।

init() Method के अन्दर Servlet विभिन्न प्रकार के Startup Tasks (जैसे कि Database Connection स्थापित करना या Host Computer पर Exist किसी File को Open करना आदि) Perform करता है तथा यदि Servlet किसी Request को Handle करने में सक्षम नहीं होता, तो उस स्थिति में वह UnavailableException Throw कर देता है। परिणामस्वरूप वह Specific Request, Servlet पर पहुंचने से पहले ही रूक जाता है।

service() Method

जब init() Method Successfully Complete हो जाता है, तब Servlet Web Server पर आने वाली विभिन्न Incoming Requests को Accept करने में सक्षम हो जाता है। Default रूप से Servlet का केवल एक Single Instance ही Create होता है और Servlet Engine, उस Servlet के लिए आने वाली विभिन्न Incoming Requests को Separate Threads के माध्‍यम से Processing के लिए उसी एक Instance पर Dispatch करता है। इस service() Method का Signature निम्नानुसार होता है-

        public void service( ServletRequest request, ServletResponse response )

                throws ServletException, IOException;

इस Signature में Specified ServletRequest Object को Servlet Engine द्वारा Create किया जाता है और ये Object Client व आने वाली Incoming Request से सम्बंधित Information को Hold करने वाले Wrapper की तरह काम करता है। साथ ही इसी Object के अन्दर ही Remote System की Identity, Request के साथ आने वाले Parameters तथा Input Streams से सम्बंधित अन्‍य Details भी होती हैं, जिन्हें जरूरत के अनुसार Servlet द्वारा Host Computer पर Access व Use किया जा सकता है।

इसी तरह से ServletResponse Object द्वारा उन Information को Access किया जा सकता है, जिन्हें Response के रूप में Request करने वाले Client Web Browser को Return किया जाना होता है। इसी Object के अन्दर Output Stream को Open करने से सम्बंधित Methods तथा Response के रूप में Return होने वाले Content TypeLength की Information होती है।

इस Method को बहुत ही कम Use किया जाता है, क्‍योंकि ज्यादातर Servlets को HTTP Environment में काम करने के लिए Design किया जाता है जिसके लिए javax.servlet.http नाम के Specialized Package को Develop किया गया है।

साथ ही javax.servlet.GenericServlet Class को Directly Inherit करने के स्थान पर ज्यादातर Servlets, javax.servlet.http.HttpServlet Class को Extend करते हैं। ये Subclass प्रत्येक HTTP Request Method को Handle करने के लिए Specialized Method Provide करता है। यानी-

  • GET Method पर आधारित HTTP Request को Handle करने के लिए हमें doGet() नाम के Method को Use करना होता है।
  • POST Method पर आधारित HTTP Request को Handle करने के लिए हमें doPost() नाम के Method को Use करना होता है।
  • HEAD Method पर आधारित HTTP Request को Handle करने के लिए हमें doHead() नाम के Method को Use करना होता है।
  • PUT Method पर आधारित HTTP Request को Handle करने के लिए हमें doPut() नाम के Method को Use करना होता है, आदि।

इन Specialized Methods का Signature निम्नानुसार होता है, जो कि service() Method की तरह ही RequestResponse से सम्बंधित दो Parameter Objects Accept करता है-

        public void do_ _ _( HttpServletRequest request, HttpServletResponse response )

                throws ServletException, IOException;

HttpServlet Class में service(Request, Response) Method के Request व Response Objects की Casting उनके HTTP-Specific Objects में हो जाती है और फिर Internally service(HttpServletRequest, HttpServletResponse) Method Call होता है जो कि Request को Examine करता है तथा Request में Used HTTP Method के आधार पर doGet(), doPost(), doPut() अथवा किसी अन्‍य Method को Call करता है और फिर service() Method को Override करने के स्थान पर इन Specific Methods में से किसी को Override करता है।

destroy() Method

Servlet Specification ये सुविधा देता है कि Servlet Engine किसी भी समय Servlet को Unload कर सकता है और वो ऐसा तब करता है जब System को किसी अन्‍य Program को आसानी से Execute करने के लिए अधिक Resources की जरूरत होती है अथवा जब Servlet Engine को Shutdown करना होता है और Servlet Engine सभी Loaded Servlets को Notify करने के लिए ही इस destroy() Method को Call करता है, ताकि सभी Servlets Memory से पूरी तरह से Unload होने के लिए तैयार हो जाऐं और अन्तिम काम के रूप में जो भी काम करने हों, उन्हें पूरा कर लें।

सरल शब्दों में कहें तो destroy() Method वास्तव में init() Method द्वारा Allocate किए गए Resources को Release करने का काम करता है।

साथ ही एक और ध्‍यान रखने वाली बात ये है कि हम कभी भी destroy() Method को Manually Call करके किसी Servlet को Unload नहीं कर सकते बल्कि इस Method को स्वयं Servlet Engine द्वारा ही Call किया जा सकता है।