ServletContext
যখন সার্লেট পাত্রে ( অ্যাপাচি টমক্যাটের মতো ) শুরু হবে, এটি তার সমস্ত ওয়েব অ্যাপ্লিকেশন স্থাপন এবং লোড করবে। যখন কোনও ওয়েব অ্যাপ্লিকেশন লোড হয়, সার্ভলেট ধারকটি ServletContextএকবার তৈরি করে সার্ভারের স্মৃতিতে রাখে। ওয়েব অ্যাপের web.xmlএবং এতে অন্তর্ভুক্ত সব web-fragment.xmlফাইল পার্স, এবং প্রতিটি <servlet>, <filter>এবং <listener>পাওয়া (অথবা প্রতিটি বর্গ সঙ্গে সটীক @WebServlet, @WebFilterএবং @WebListenerযথাক্রমে) একবার পাশাপাশি instantiated এবং সার্ভার এর মেমরি রাখা হয়। প্রতিটি তাত্ক্ষণিক ফিল্টারের জন্য, এর init()পদ্ধতিটি একটি নতুন দিয়ে ডাকা হয় FilterConfig।
যখন একটি Servletএকটি আছে <servlet><load-on-startup>বা @WebServlet(loadOnStartup)তুলনায় মান বৃহত্তর 0, তারপর তার init()পদ্ধতি একটি নতুন সঙ্গে সূচনার সময় প্রার্থনা করা হয় ServletConfig। এই সার্ভলেটগুলি সেই মান দ্বারা নির্দিষ্ট করা একই ক্রমে সূচনা করা হয় ( 11 ম হয়, 2দ্বিতীয় হয়, ইত্যাদি)। একই মান একাধিক সার্ভলেট জন্য নির্দিষ্ট করা থাকে, তাহলে সেই সার্ভলেট প্রতিটি একই আদেশ লোড হয় হিসাবে তারা প্রদর্শিত web.xml, web-fragment.xmlবা @WebServletclassloading। ইভেন্টটিতে "লোড-অন-স্টার্টআপ" মানটি অনুপস্থিত থাকলে, init()যখনই এইচটিটিপি অনুরোধটি প্রথমবারের জন্য সেই সার্লেটটিকে হিট করে তখনই পদ্ধতিটি চালু করা হবে।
উপরোক্ত বর্ণিত সমস্ত সূচনা পদক্ষেপের সাথে সার্ভলেট ধারক শেষ হয়ে গেলে, তখনই অনুরোধ করা ServletContextListener#contextInitialized()হবে।
যখন নিচে সার্ভলেট ধারক স্থবির, এটা সমস্ত ওয়েব অ্যাপ্লিকেশনের unloads, ডাকে destroy()তার সকল সক্রিয়া সার্ভলেট এবং ফিল্টার, এবং সমস্ত পদ্ধতি ServletContext, Servlet, Filterএবং Listenerদৃষ্টান্ত ট্র্যাশ করছে। শেষ পর্যন্ত ServletContextListener#contextDestroyed()প্রার্থনা করা হবে।
এইচটিটিপি সার্ভলেটআরকোয়েস্ট এবং এইচটিটিপি সার্ভেলিটেস্পোনস
সার্ভলেট ধারকটি একটি ওয়েব সার্ভারের সাথে সংযুক্ত রয়েছে যা একটি নির্দিষ্ট পোর্ট নম্বরে HTTP অনুরোধের জন্য শোনায় (পোর্ট 8080 সাধারণত বিকাশের সময় ব্যবহৃত হয় এবং 80 বন্দর উত্পাদন হয়)। যখন কোনও ক্লায়েন্ট (যেমন কোনও ওয়েব ব্রাউজার সহ ব্যবহারকারী বা প্রোগ্রামক্রমে ব্যবহার করেURLConnection ) কোনও এইচটিটিপি অনুরোধ প্রেরণ করে , সার্লেলেট ধারকটি নতুন HttpServletRequestএবং HttpServletResponseঅবজেক্ট তৈরি করে এবং Filterচেইনে সংজ্ঞায়িত যে কোনও মাধ্যমে এবং শেষ পর্যন্ত Servletউদাহরণটি দিয়ে যায়।
ফিল্টারগুলির ক্ষেত্রে , doFilter()পদ্ধতিটি চাওয়া হয়। সার্ভলেট ধারকের কোড কল chain.doFilter(request, response)করার সময়, পরবর্তী ফিল্টারটিতে অনুরোধ এবং প্রতিক্রিয়া অবিরত থাকে, বা যদি কোনও ফিল্টার না থাকে তবে সার্লেটকে চাপুন।
সার্লেলেটের ক্ষেত্রে , service()পদ্ধতিটি চাওয়া হয়। ডিফল্টরূপে, এই পদ্ধতিটি নির্ধারণ করে যে doXxx()পদ্ধতিগুলির মধ্যে কোনটির ভিত্তিতে অফ করা উচিত request.getMethod()। যদি নির্ধারিত পদ্ধতি সার্ভলেট থেকে অনুপস্থিত থাকে তবে প্রতিক্রিয়াতে একটি HTTP 405 ত্রুটি ফিরে আসে।
অনুরোধের অবজেক্টটি এইচটিটিপি অনুরোধ সম্পর্কিত সমস্ত তথ্যের অ্যাক্সেস সরবরাহ করে যেমন এর ইউআরএল, শিরোনাম, ক্যোয়ারী স্ট্রিং এবং বডি। প্রতিক্রিয়া অবজেক্টটি HTTP প্রতিক্রিয়াটি আপনি যেভাবে চান তা নিয়ন্ত্রণ এবং প্রেরণ করার ক্ষমতা সরবরাহ করে, উদাহরণস্বরূপ, আপনাকে শিরোনাম এবং বডি সেট করতে দেয় (সাধারণত কোনও জেএসপি ফাইল থেকে উত্পন্ন এইচটিএমএল সামগ্রী সহ)। যখন HTTP প্রতিক্রিয়া প্রতিশ্রুতিবদ্ধ এবং সমাপ্ত হয়, অনুরোধ এবং প্রতিক্রিয়া দুটিই পুনর্ব্যবহারযোগ্য এবং পুনরায় ব্যবহারের জন্য উপলব্ধ করা হয়।
HttpSession
যখন কোনও ক্লায়েন্ট প্রথমবার ওয়েবপৃষ্ঠায় যান এবং / অথবা এটি HttpSessionপ্রথমবারের মাধ্যমে পাওয়া যায় request.getSession(), সার্লেলেট ধারক একটি নতুন HttpSessionঅবজেক্ট তৈরি করে, একটি দীর্ঘ এবং অনন্য আইডি তৈরি করে (যা আপনি পেতে পারেন session.getId()) এবং এটি সার্ভারের মধ্যে সংরক্ষণ করে স্মৃতি. সার্ভলেট ধারক একটি সেট করে Cookieএ Set-Cookieসঙ্গে HTTP প্রতিক্রিয়া শিরোলেখ JSESSIONIDতার নাম এবং তার মান হিসাবে অনন্য সেশন আইডি হিসেবে।
অনুযায়ী HTTP- র কুকি স্পেসিফিকেশন (ক চুক্তি কোন ভদ্র ওয়েব ব্রাউজার এবং ওয়েব সার্ভার মেনে চলতে হবে), ক্লায়েন্ট (ওয়েব ব্রাউজার) এই কুকিতে পরবর্তী অনুরোধগুলিতে ফেরত পাঠাতে প্রয়োজন বোধ করা হয় Cookieযতদিন কুকি বৈধ হেডারের ( অর্থাত্ ইউনিক আইডি অবশ্যই একটি অপ্রয়োজনীয় সেশনের উল্লেখ করতে হবে এবং ডোমেন এবং পথটি সঠিক)। আপনার ব্রাউজারের অন্তর্নির্মিত HTTP ট্র্যাফিক মনিটর ব্যবহার করে, আপনি কুকিটি বৈধ কিনা তা যাচাই করতে পারেন (Chrome / ফায়ারফক্স 23+ / আই 9 + এ F12 টিপুন এবং নেট / নেটওয়ার্ক ট্যাবটি পরীক্ষা করুন )। সার্লেটের কন্টেইনারটি Cookieনাম সহ কুকির উপস্থিতির জন্য প্রতিটি আগত এইচটিটিপি অনুরোধের শিরোনামটি পরীক্ষা করবে JSESSIONIDএবং HttpSessionসার্ভারের স্মৃতি থেকে যুক্ত হওয়ার জন্য এর মান (সেশন আইডি) ব্যবহার করবে ।
HttpSessionথাকার বিষয়টি মতেই এটা না হওয়া পর্যন্ত জীবিত উল্লেখিত সময়সীমার মান বেশি অলস হয়েছে (যেমন একটি অনুরোধে ব্যবহৃত নয়) <session-timeout>, কোন সেটিংস web.xml। সময়সীমা মান 30 মিনিটের ডিফল্ট হয়। সুতরাং, যখন ক্লায়েন্ট নির্দিষ্ট সময়ের চেয়ে বেশি সময় ধরে ওয়েব অ্যাপটিতে যান না, সার্লেট ধারকটি সেশনটি ট্র্যাশ করে। পরবর্তী প্রতিটি অনুরোধ, এমনকি কুকি নির্দিষ্ট করে দেওয়া থাকলেও একই অধিবেশনটিতে আর অ্যাক্সেস থাকবে না; সার্লেট ধারক একটি নতুন সেশন তৈরি করবে।
ক্লায়েন্টের পক্ষে, সেশন কুকি যতক্ষণ ব্রাউজারের দৃষ্টান্তটি চলবে ততক্ষণ বেঁচে থাকে। সুতরাং, যদি ক্লায়েন্ট ব্রাউজারের উদাহরণটি বন্ধ করে দেয় (সমস্ত ট্যাব / উইন্ডো), তবে সেশনটি ক্লায়েন্টের পাশে ট্র্যাস করা হবে। নতুন ব্রাউজারের উদাহরণে, সেশনের সাথে সম্পর্কিত কুকির অস্তিত্ব থাকবে না, সুতরাং এটি আর প্রেরণ করা হবে না। এটি HttpSessionসম্পূর্ণ নতুন সেশন কুকি ব্যবহারের সাথে সম্পূর্ণ নতুন তৈরি হওয়ার কারণ ঘটায় ।
সংক্ষেপে
ServletContextযতদিন ওয়েব অ্যাপ্লিকেশন জীবন যেমন জন্য বেঁচে আছেন। এটি সমস্ত সেশনে সমস্ত অনুরোধগুলির মধ্যে ভাগ করা হয় ।
HttpSessionযতদিন ক্লায়েন্ট একই ব্রাউজারে নিদর্শনের সঙ্গে ওয়েব অ্যাপ্লিকেশন সাথে আলাপচারিতার হয়, এবং অধিবেশন সার্ভার সাইড এ সময় শেষ হয়েছে করেননি জন্য বেঁচে আছেন। এটি একই সেশনে সমস্ত অনুরোধগুলির মধ্যে ভাগ করা হয় ।
HttpServletRequestএবং HttpServletResponse, সময় সার্ভলেট ক্লায়েন্ট থেকে একটি HTTP অনুরোধ গ্রহণ করে থেকে লাইভ পর্যন্ত সম্পূর্ণ প্রতিক্রিয়া (ওয়েব পৃষ্ঠা) এসেছে। এটি অন্য কোথাও ভাগ করে নেওয়া হয় না ।
- সমস্ত
Servlet, Filterএবং Listenerদৃষ্টান্তগুলি যতক্ষণ না ওয়েব অ্যাপ্লিকেশন বেঁচে থাকে। তারা সমস্ত সেশনে সমস্ত অনুরোধের মধ্যে ভাগ করা হয় ।
- কোন
attributeযে সংজ্ঞায়িত করা হয় ServletContext, HttpServletRequestএবং HttpSessionপ্রশ্ন জীবনে অবজেক্ট হিসেবে যতদিন বেঁচে থাকবে। জেএসএফ, সিডিআই, স্প্রিং ইত্যাদির মতো শিম ম্যানেজমেন্ট ফ্রেমওয়ার্কগুলিতে অবজেক্টটি নিজেই "স্কোপ" উপস্থাপন করে Those ফ্রেমওয়ার্কগুলি তাদের স্কোপযুক্ত মটরশুটিটিকে attributeতার নিকটতম মিলের সুযোগ হিসাবে সংরক্ষণ করে store
থ্রেড সুরক্ষা
এটি বলেছিল, আপনার বড় উদ্বেগ সম্ভবত সুরক্ষা থ্রেড । আপনার এখন জানা উচিত যে সার্ভলেট এবং ফিল্টারগুলি সমস্ত অনুরোধের মধ্যে ভাগ করা আছে। এটি জাভা সম্পর্কে দুর্দান্ত জিনিস, এটি মাল্টিথ্রেডেড এবং বিভিন্ন থ্রেড (পড়ুন: HTTP অনুরোধগুলি) একই উদাহরণটি ব্যবহার করতে পারে। অন্যথায় এটি পুনরায় তৈরি করা খুব ব্যয়বহুল হবে init()এবং destroy()প্রতিটি অনুরোধের জন্য সেগুলি।
আপনার এও উপলব্ধি করা উচিত যে আপনার কোনও অনুরোধ বা সেশন স্কোপড ডেটা কোনও সার্লেট বা ফিল্টারের উদাহরণ ভেরিয়েবল হিসাবে বরাদ্দ করা উচিত নয় । এটি অন্যান্য সেশনে অন্যান্য সমস্ত অনুরোধগুলির মধ্যে ভাগ করা হবে। যে না থ্রেড-নিরাপদ! নীচের উদাহরণটি এটি চিত্রিত করে:
public class ExampleServlet 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.
}
}
আরো দেখুন: